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> 2885cd328eb7134731a574436083fe3184f46717a4Marie Janssen#include <stdio.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 3030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 31d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "device/include/controller.h" 32d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/log.h" 33d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 34d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/time.h" 35d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 3749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "bt_utils.h" 3849a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_int.h" 3949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4384baa7f16e830394408278dbb8c508dd9fa02887Myles Watson#include "gatt_int.h" 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_SEC_MAX_COLLISION_DELAY (5000) 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 489e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool(APPL_AUTH_WRITE_EXCEPTION)(const RawAddress& bd_addr); 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 529ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * L O C A L F U N C T I O N P R O T O T Y P E S * 53ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 54911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SEC_SERV_REC* btm_sec_find_first_serv(bool is_originator, uint16_t psm); 55911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_SEC_SERV_REC* btm_sec_find_next_serv(tBTM_SEC_SERV_REC* p_cur); 56911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_SEC_SERV_REC* btm_sec_find_mx_serv(uint8_t is_originator, 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t psm, 58911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_proto_id, 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id); 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_sec_execute_procedure(tBTM_SEC_DEV_REC* p_dev_rec); 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_start_get_name(tBTM_SEC_DEV_REC* p_dev_rec); 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_start_authentication(tBTM_SEC_DEV_REC* p_dev_rec); 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_start_encryption(tBTM_SEC_DEV_REC* p_dev_rec); 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_collision_timeout(void* data); 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_restore_mode(void); 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_pairing_timeout(void* data); 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec); 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state); 70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic const char* btm_pair_state_descr(tBTM_PAIRING_STATE state); 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_check_pending_reqs(void); 749e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic bool btm_sec_queue_mx_request(const RawAddress& bd_addr, uint16_t psm, 75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_orig, uint32_t mx_proto_id, 76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id, 77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback, 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson void* p_ref_data); 79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_bond_cancel_complete(void); 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_send_link_key_notif(tBTM_SEC_DEV_REC* p_dev_rec); 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_check_prefetch_pin(tBTM_SEC_DEV_REC* p_dev_rec); 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic uint8_t btm_sec_start_authorization(tBTM_SEC_DEV_REC* p_dev_rec); 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_sec_are_all_trusted(uint32_t p_mask[]); 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_sec_send_hci_disconnect(tBTM_SEC_DEV_REC* p_dev_rec, 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason, 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t conn_handle); 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_sec_start_role_switch(tBTM_SEC_DEV_REC* p_dev_rec); 90911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state); 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_set_security_level(CONNECTION_TYPE conn_type, 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* p_name, uint8_t service_id, 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t sec_level, uint16_t psm, 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_proto_id, 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id); 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_dev_authenticated(tBTM_SEC_DEV_REC* p_dev_rec); 99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_dev_encrypted(tBTM_SEC_DEV_REC* p_dev_rec); 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_dev_authorized(tBTM_SEC_DEV_REC* p_dev_rec); 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_serv_trusted(tBTM_SEC_DEV_REC* p_dev_rec, 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec); 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_is_serv_level0(uint16_t psm); 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic uint16_t btm_sec_set_serv_level4_flags(uint16_t cur_security, 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator); 106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1079e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic bool btm_sec_queue_encrypt_request(const RawAddress& bd_addr, 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport, 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback, 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson void* p_ref_data, 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_ACT sec_act); 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_check_pending_enc_req(tBTM_SEC_DEV_REC* p_dev_rec, 113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport, 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t encr_enable); 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC* p_dev_rec); 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_is_master(tBTM_SEC_DEV_REC* p_dev_rec); 1187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 119d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen/* true - authenticated link key is possible */ 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic const bool btm_sec_io_map[BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = { 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OUT, IO, IN, NONE */ 122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OUT */ {false, false, true, false}, 123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* IO */ {false, true, true, false}, 124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* IN */ {true, true, true, false}, 125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* NONE */ {false, false, false, false}}; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_OUT 0 DisplayOnly */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IO 1 DisplayYesNo */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IN 2 KeyboardOnly */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_NONE 3 NoInputNoOutput */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_dev_authenticated 134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description check device is authenticated 136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true or false 138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_dev_authenticated(tBTM_SEC_DEV_REC* p_dev_rec) { 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) { 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_dev_encrypted 150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description check device is encrypted 152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true or false 154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 155ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_dev_encrypted(tBTM_SEC_DEV_REC* p_dev_rec) { 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) { 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_dev_authorized 166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 167ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description check device is authorized 168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true or false 170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_dev_authorized(tBTM_SEC_DEV_REC* p_dev_rec) { 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) { 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 180ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 181ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_dev_16_digit_authenticated 182ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 183ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description check device is authenticated by using 16 digit pin or MITM 184ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 185ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true or false 186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 187ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC* p_dev_rec) { 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) { 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde} 195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde/******************************************************************************* 197ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_serv_trusted 199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description check service is trusted 201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true or false 203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_serv_trusted(tBTM_SEC_DEV_REC* p_dev_rec, 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec) { 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec->service_id)) { 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecRegister 217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Application manager calls this function to register for 2199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * security services. There can be one and only one 2209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * application saving link keys. BTM allows only first 2219ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * registration. 222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if registered OK, else false 224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_SecRegister(tBTM_APPL_INFO* p_cb_info) { 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET16 temp_value = {0}; 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s application registered", __func__); 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LOG_INFO(LOG_TAG, "%s p_cb_info->p_le_callback == 0x%p", __func__, 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb_info->p_le_callback); 233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb_info->p_le_callback) { 234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__); 235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_Register(btm_proc_smp_cback); 236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if no IR is loaded, need to regenerate all the keys */ 237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) { 238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_reset_id(); 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LOG_WARN(LOG_TAG, "%s p_cb_info->p_le_callback == NULL", __func__); 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api = *p_cb_info; 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LOG_INFO(LOG_TAG, "%s btm_cb.api.p_le_callback = 0x%p ", __func__, 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_le_callback); 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s application registered", __func__); 248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 252ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecRegisterLinkKeyNotificationCallback 254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Application manager calls this function to register for 256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * link key notification. When there is nobody registered 257ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * we should avoid changing link key 258ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if registered OK, else false 260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_SecRegisterLinkKeyNotificationCallback( 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LINK_KEY_CALLBACK* p_callback) { 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_link_key_callback = p_callback; 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 266877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 267877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 268877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecAddRmtNameNotifyCallback 271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Any profile can register to be notified when name of the 273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * remote device is resolved. 274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if registered OK, else false 276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_SecAddRmtNameNotifyCallback(tBTM_RMT_NAME_CALLBACK* p_callback) { 279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.p_rmt_name_callback[i] == NULL) { 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_rmt_name_callback[i] = p_callback; 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 292ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecDeleteRmtNameNotifyCallback 294ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Any profile can deregister notification when a new Link Key 296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is generated per connection. 297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if OK, else false 299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 300ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_SecDeleteRmtNameNotifyCallback(tBTM_RMT_NAME_CALLBACK* p_callback) { 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.p_rmt_name_callback[i] == p_callback) { 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_rmt_name_callback[i] = NULL; 307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 315ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetSecurityFlags 317ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 318ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Get security flags for the device 319ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true or false is device found 321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3239e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool BTM_GetSecurityFlags(const RawAddress& bd_addr, uint8_t* p_sec_flags) { 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_flags = (uint8_t)p_dev_rec->sec_flags; 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM_GetSecurityFlags false"); 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 3337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 3347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetSecurityFlagsByTransport 338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Get security flags for the device on a particular transport 340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true or false is device found 342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3449e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool BTM_GetSecurityFlagsByTransport(const RawAddress& bd_addr, 345c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_sec_flags, 346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport) { 347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_BR_EDR) 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_flags = (uint8_t)p_dev_rec->sec_flags; 353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_flags = (uint8_t)(p_dev_rec->sec_flags >> 8); 3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM_GetSecurityFlags false"); 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 363ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 364ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetPinType 365ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 366ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Set PIN type for the device. 367ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 369ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_SetPinType(uint8_t pin_type, PIN_CODE pin_code, uint8_t pin_code_len) { 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d", 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pin_type, (char*)pin_code, pin_code_len); 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If device is not up security mode will be set as a part of startup */ 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.cfg.pin_type != pin_type) && 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson controller_get_interface()->get_is_ready()) { 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_pin_type(pin_type); 380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.cfg.pin_type = pin_type; 383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.cfg.pin_code_len = pin_code_len; 384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.cfg.pin_code, pin_code, pin_code_len); 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetPairableMode 390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Enable or disable pairing 392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters allow_pairing - (true or false) whether or not the device 394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * allows pairing. 395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connect_only_paired - (true or false) whether or not to 396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * only allow paired devices to connect. 397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_SetPairableMode(bool allow_pairing, bool connect_only_paired) { 402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SetPairableMode() allow_pairing: %u connect_only_paired: %u", 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson allow_pairing, connect_only_paired); 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_disabled = !allow_pairing; 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.connect_only_paired = connect_only_paired; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetSecureConnectionsOnly 413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Enable or disable default treatment for Mode 4 Level 0 4159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * services 416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameter secure_connections_only_mode - 4189ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * true means that the device should treat Mode 4 Level 0 4199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * services as services of other levels. 4209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * false means that the device should provide default 4219ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * treatment for Mode 4 Level 0 services. 422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_SetSecureConnectionsOnly(bool secure_connections_only_mode) { 427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("%s: Mode : %u", __func__, secure_connections_only_mode); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.secure_connections_only = secure_connections_only_mode; 430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode = BTM_SEC_MODE_SC; 431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_NO_AVAIL_SEC_SERVICES ((uint16_t)0xffff) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetSecurityLevel 437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Register service security level with Security Manager 439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4409ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: is_originator - true if originating the connection 441ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_name - Name of the service relevant only if 4429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * authorization will show this name to user. 4439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Ignored if BTM_SEC_SERVICE_NAME_LEN is 0. 4449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * service_id - service ID for the service passed to 4459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * authorization callback 446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sec_level - bit mask of the security features 447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * psm - L2CAP PSM 448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mx_proto_id - protocol ID of multiplexing proto below 449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mx_chan_id - channel ID of multiplexing proto below 450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if registered OK, else false 452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_SetSecurityLevel(bool is_originator, const char* p_name, 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t service_id, uint16_t sec_level, uint16_t psm, 456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_proto_id, uint32_t mx_chan_id) { 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson CONNECTION_TYPE conn_type; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) 461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson conn_type = CONN_ORIENT_ORIG; 462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson conn_type = CONN_ORIENT_TERM; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_sec_set_security_level(conn_type, p_name, service_id, sec_level, 466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson psm, mx_proto_id, mx_chan_id)); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_sec_set_security_level(is_originator, p_name, service_id, 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sec_level, psm, mx_proto_id, mx_chan_id)); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_set_security_level 476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Register service security level with Security Manager 478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4799ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: conn_type - true if originating the connection 480ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_name - Name of the service relevant only if 4819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * authorization will show this name to user. 4829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Ignored if BTM_SEC_SERVICE_NAME_LEN is 0. 4839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * service_id - service ID for the service passed to 4849ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * authorization callback 485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sec_level - bit mask of the security features 486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * psm - L2CAP PSM 487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mx_proto_id - protocol ID of multiplexing proto below 488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mx_chan_id - channel ID of multiplexing proto below 489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if registered OK, else false 491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_set_security_level(CONNECTION_TYPE conn_type, 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* p_name, uint8_t service_id, 495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t sec_level, uint16_t psm, 496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_proto_id, 497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id) { 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_srec; 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t index; 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t first_unused_record = BTM_NO_AVAIL_SEC_SERVICES; 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool record_allocated = false; 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_ucd; 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_type & CONNECTION_TYPE_ORIG_MASK) 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = true; 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = false; 510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_type & CONNECTION_TYPE_CONNLESS_MASK) { 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_ucd = true; 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_ucd = false; 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = conn_type; 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("%s : sec: 0x%x", __func__, sec_level); 521818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* See if the record can be reused (same service name, psm, mx_proto_id, 523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id, and mx_chan_id), or obtain the next unused record */ 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec = &btm_cb.sec_serv_rec[0]; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) { 528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if there is already a record for this service */ 529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_srec->security_flags & BTM_SEC_IN_USE) { 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_srec->psm == psm && p_srec->mx_proto_id == mx_proto_id && 532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id == p_srec->service_id && p_name && 533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!strncmp(p_name, (char*)p_srec->orig_service_name, 534c3829ac36e6547624a0ab2f603da98fa17790b78Martin Brabham /* strlcpy replaces end char with termination char*/ 535c3829ac36e6547624a0ab2f603da98fa17790b78Martin Brabham BTM_SEC_SERVICE_NAME_LEN - 1) || 536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !strncmp(p_name, (char*)p_srec->term_service_name, 537c3829ac36e6547624a0ab2f603da98fa17790b78Martin Brabham /* strlcpy replaces end char with termination char*/ 538c3829ac36e6547624a0ab2f603da98fa17790b78Martin Brabham BTM_SEC_SERVICE_NAME_LEN - 1))) 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_srec->psm == psm && p_srec->mx_proto_id == mx_proto_id && 541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id == p_srec->service_id) 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson record_allocated = true; 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Mark the first available service record */ 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (!record_allocated) { 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_srec, 0, sizeof(tBTM_SEC_SERV_REC)); 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson record_allocated = true; 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson first_unused_record = index; 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!record_allocated) { 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)", 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_MAX_SERVICE_RECORDS); 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (record_allocated); 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Process the request if service record is valid */ 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If a duplicate service wasn't found, use the first available */ 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (index >= BTM_SEC_MAX_SERVICE_RECORDS) { 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson index = first_unused_record; 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec = &btm_cb.sec_serv_rec[index]; 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->psm = psm; 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->service_id = service_id; 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->mx_proto_id = mx_proto_id; 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) { 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->orig_mx_chan_id = mx_chan_id; 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)p_srec->orig_service_name, p_name, 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_SERVICE_NAME_LEN + 1); 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* clear out the old setting, just in case it exists */ 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_ucd) { 582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->ucd_security_flags &= ~( 583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | 584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | BTM_SEC_FORCE_MASTER | 585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags &= ~( 590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | 591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | BTM_SEC_FORCE_MASTER | 592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Parameter validation. Originator should not set requirements for 596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * incoming connections */ 597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sec_level &= 598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | 599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN); 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SP || 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SC) { 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_level & BTM_SEC_OUT_AUTHENTICATE) sec_level |= BTM_SEC_OUT_MITM; 605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure the authenticate bit is set, when encrypt bit is set */ 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_level & BTM_SEC_OUT_ENCRYPT) sec_level |= BTM_SEC_OUT_AUTHENTICATE; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* outgoing connections usually set the security level right before 611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * the connection is initiated. 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * set it to be the outgoing service */ 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_ucd == false) 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_out_serv = p_srec; 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->term_mx_chan_id = mx_chan_id; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)p_srec->term_service_name, p_name, 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_SERVICE_NAME_LEN + 1); 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* clear out the old setting, just in case it exists */ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_ucd) { 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->ucd_security_flags &= 629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | 630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | BTM_SEC_FORCE_MASTER | 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | 632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ATTEMPT_SLAVE | BTM_SEC_IN_MIN_16_DIGIT_PIN); 633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags &= 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | 638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | BTM_SEC_FORCE_MASTER | 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | 640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ATTEMPT_SLAVE | BTM_SEC_IN_MIN_16_DIGIT_PIN); 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Parameter validation. Acceptor should not set requirements for outgoing 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * connections */ 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SP || 649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SC) { 651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_level & BTM_SEC_IN_AUTHENTICATE) sec_level |= BTM_SEC_IN_MITM; 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure the authenticate bit is set, when encrypt bit is set */ 655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_level & BTM_SEC_IN_ENCRYPT) sec_level |= BTM_SEC_IN_AUTHENTICATE; 656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_ucd) { 660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags |= (uint16_t)(BTM_SEC_IN_USE); 661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->ucd_security_flags |= (uint16_t)(sec_level | BTM_SEC_IN_USE); 662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags |= (uint16_t)(sec_level | BTM_SEC_IN_USE); 664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, " 668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "chan_id %d", 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson index, service_id, conn_type, psm, mx_proto_id, mx_chan_id); 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " : security_flags: 0x%04x, ucd_security_flags: 0x%04x", 673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags, p_srec->ucd_security_flags); 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API(" : service name [%s] (up to %d chars saved)", 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_name, BTM_SEC_SERVICE_NAME_LEN); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags |= (uint16_t)(sec_level | BTM_SEC_IN_USE); 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d", 684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson index, service_id, is_originator, psm, mx_proto_id, mx_chan_id); 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " : sec: 0x%x, service name [%s] (up to %d chars saved)", 689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (record_allocated); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 697ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecClrService 699ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Removes specified service record(s) from the security 7019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * database. All service records with the specified name are 7029ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * removed. Typically used only by devices with limited RAM so 7039ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * that it can reuse an old security service record. 704ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7059ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Note: Unpredictable results may occur if a service is 7069ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * cleared that is still in use by an application/profile. 707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters Service ID - Id of the service to remove. '0' removes all 7099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * service records (except SDP). 710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Number of records that were freed. 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t BTM_SecClrService(uint8_t service_id) { 715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_srec = &btm_cb.sec_serv_rec[0]; 716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_freed = 0; 717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) { 720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Delete services with specified name (if in use and not SDP) */ 721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_srec->security_flags & BTM_SEC_IN_USE) && 722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_srec->psm != BT_PSM_SDP) && 723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!service_id || (service_id == p_srec->service_id))) { 724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id); 725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags = 0; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->ucd_security_flags = 0; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_freed++; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (num_freed); 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 737ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 738ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_clr_service_by_psm 739ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 740ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Removes specified service record from the security database. 741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * All service records with the specified psm are removed. 742ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Typically used by L2CAP to free up the service record used 743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * by dynamic PSM clients when the channel is closed. 744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The given psm must be a virtual psm. 745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7469ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters Service ID - Id of the service to remove. '0' removes all 7479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * service records (except SDP). 748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Number of records that were freed. 750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 751ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_sec_clr_service_by_psm(uint16_t psm) { 753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_srec = &btm_cb.sec_serv_rec[0]; 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_freed = 0; 755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) { 758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Delete services with specified name (if in use and not SDP) */ 759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm)) { 760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id); 761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_srec->security_flags = 0; 762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_freed++; 763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, 766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_freed); 767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (num_freed); 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 772ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 773ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_clr_temp_auth_service 774ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 775ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Removes specified device record's temporary authorization 776ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * flag from the security database. 777ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 778ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters Device address to be cleared 779ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 780ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 781ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 782ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 7839e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_clr_temp_auth_service(const RawAddress& bda) { 784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bda); 787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("btm_sec_clr_temp_auth_service() - no dev CB"); 789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reset the temporary authorized flag so that next time (untrusted) service 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * is accessed autorization will take place */ 794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && 795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service) { 796c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " clearing device: " << bda; 797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID; 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 803ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 804ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_PINCodeReply 805ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 806ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called after Security Manager submitted 807ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PIN code request to the UI. 808ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 8099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: bd_addr - Address of the device for which PIN was 8109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * requested 8119ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * res - result of the operation BTM_SUCCESS 8129ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * if success 813ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pin_len - length in bytes of the PIN Code 814ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_pin - pointer to array with the PIN Code 8159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * trusted_mask - bitwise OR of trusted services 8169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (array of uint32_t) 817ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 818ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 8199e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid BTM_PINCodeReply(const RawAddress& bd_addr, uint8_t res, uint8_t pin_len, 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_pin, uint32_t trusted_mask[]) { 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d " 825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Result:%d", 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, 827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res); 828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If timeout already expired or has been canceled, ignore the reply */ 830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) { 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM_PINCodeReply() - Wrong State: %d", 832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state); 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 836c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (bd_addr != btm_cb.pairing_bda) { 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM_PINCodeReply() - Wrong BD Addr"); 838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM_PINCodeReply() - no dev CB"); 844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL)) 848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res = BTM_ILLEGAL_VALUE; 849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_SUCCESS) { 851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if peer started dd OR we started dd and pre-fetch pin was not used send 852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * negative reply */ 853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) || 854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))) { 856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * event */ 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_neg_reply(bd_addr); 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required = BTM_SEC_NONE; 864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 865818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (trusted_mask) 869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->pin_code_length = pin_len; 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pin_len >= 16) { 873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) && 878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.security_mode_changed == false)) { 879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* This is start of the dedicated bonding if local device is 2.0 */ 880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pin_code_len = pin_len; 881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.pin_code, p_pin, pin_len); 882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode_changed = true; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_auth_enable(true); 888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = 0xff; 890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if we rejected incoming connection request, we have to wait 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * HCI_Connection_Complete event */ 893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* before originating */ 894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) { 895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected " 897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "incoming connection"); 898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we change state little bit early so btm_sec_connected() will originate 899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * connection */ 900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* when existing ACL link is down completely */ 901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if we already accepted incoming connection from pairing device */ 904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) { 905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_PINCodeReply(): link is connecting so wait pin code request " 907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "from peer"); 908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { 910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; 912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) 914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ERR_AUTH_FAILURE); 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_SUCCESS; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_req_reply(bd_addr, pin_len, p_pin); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 929ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_bond_by_transport 930ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 931ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description this is the bond function that will start either SSP or SMP. 932ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 933ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device to bond 934ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pin_len - length in bytes of the PIN Code 935ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_pin - pointer to array with the PIN Code 9369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * trusted_mask - bitwise OR of trusted services 9379ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (array of uint32_t) 938ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 939ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: After 2.1 parameters are not used and preserved here not to change API 940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 9419e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, 942c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBT_TRANSPORT transport, uint8_t pin_len, 943c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_pin, uint32_t trusted_mask[]) { 944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status; 946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_features; 947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t ii; 948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p = btm_bda_to_acl(bd_addr, transport); 949c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " BDA: " << bd_addr; 950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d", transport); 952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Other security process is in progress */ 954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) { 955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM_SecBond: already busy in state: %s", 956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state)); 957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_or_alloc_dev(bd_addr); 961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->get_is_ready()) { 966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s controller module is not ready", __func__); 967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 969911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("before update sec_flags=0x%x", p_dev_rec->sec_flags); 971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Finished if connection is active and already paired */ 973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && 974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson transport == BT_TRANSPORT_BR_EDR && 975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) || 976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && 977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson transport == BT_TRANSPORT_LE && 978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))) { 979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM_SecBond -> Already Paired"); 980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Tell controller to get rid of the link key if it has one stored */ 984c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if ((BTM_DeleteStoredLinkKey(&bd_addr, NULL)) != BTM_SUCCESS) 985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save the PIN code if we got a valid one */ 988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) { 989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pin_code_len = pin_len; 990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->pin_code_length = pin_len; 991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.pin_code, p_pin, PIN_CODE_LEN); 992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 994c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda = bd_addr; 995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD; 997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE; 999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_originator = true; 1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (trusted_mask) 1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 1002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_LE) { 1004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_init_pseudo_addr(p_dev_rec, bd_addr); 1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_LE_MASK; 1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (SMP_Pair(bd_addr) == SMP_STARTED) { 1008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags = 0; 1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 1016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | 1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); 1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("after update sec_flags=0x%x", p_dev_rec->sec_flags); 1023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->supports_simple_pairing()) { 1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* The special case when we authenticate keyboard. Set pin type to fixed */ 1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* It would be probably better to do it from the application, but it is */ 1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* complicated */ 1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == 1028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_COD_MAJOR_PERIPHERAL) && 1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) && 1030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) { 1031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pin_type_changed = true; 1032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_pin_type(HCI_PIN_TYPE_FIXED); 1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) { 1037f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga p_features = p_dev_rec->feature_pages[ii]; 1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT(" remote_features page[%1d] = %02x-%02x-%02x-%02x", ii, 1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_features[0], p_features[1], p_features[2], p_features[3]); 1040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT(" %02x-%02x-%02x-%02x", 1041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_features[4], p_features[5], p_features[6], p_features[7]); 1042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x", 1045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4, p_dev_rec->hci_handle); 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1047d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE) 1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If connection already exists... */ 1052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) { 1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_start_authentication(p_dev_rec); 1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Mark lcb as bonding */ 1058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_update_lcb_4_bonding(bd_addr, true); 1059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4); 1063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->supports_simple_pairing() || 1064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sm4 == BTM_SM4_KNOWN)) { 1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_sec_check_prefetch_pin(p_dev_rec)) return (BTM_CMD_STARTED); 1066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 1068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 1069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SC) && 1070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { 1071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* local is 2.1 and peer is unknown */ 1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) { 1073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we are not accepting connection request from peer 1074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * -> RNR (to learn if peer is 2.1) 1075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 1076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); 10778bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He status = BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); 1078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We are accepting connection request from peer */ 1080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 10818bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He status = BTM_CMD_STARTED; 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("State:%s sm4: 0x%x sec_state:%d", 1084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), p_dev_rec->sm4, 1085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state); 10868bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He } else { 10878bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He /* both local and peer are 2.1 */ 10888bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He status = btm_sec_dd_create_conn(p_dev_rec); 1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) { 10928bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_TRACE_ERROR( 10938bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He "%s BTM_ReadRemoteDeviceName or btm_sec_dd_create_conn error: 0x%x", 10948bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He __func__, (int)status); 1095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 1096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecBondByTransport 1104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to perform bonding with peer device. 1106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the connection is already up, but not secure, pairing 1107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is attempted. If already paired BTM_SUCCESS is returned. 1108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device to bond 1110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * transport - doing SSP over BR/EDR or SMP over LE 1111ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pin_len - length in bytes of the PIN Code 1112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_pin - pointer to array with the PIN Code 11139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * trusted_mask - bitwise OR of trusted services 11149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (array of uint32_t) 1115ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1116ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: After 2.1 parameters are not used and preserved here not to change API 1117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 11189e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS BTM_SecBondByTransport(const RawAddress& bd_addr, 1119c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBT_TRANSPORT transport, uint8_t pin_len, 1120c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_pin, uint32_t trusted_mask[]) { 1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_DEVICE_TYPE dev_type; 1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE addr_type; 1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); 1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* LE device, do SMP pairing */ 1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) || 1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (transport == BT_TRANSPORT_BR_EDR && 1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) { 1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_ILLEGAL_ACTION; 1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, 1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson trusted_mask); 11337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecBond 1138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to perform bonding with peer device. 1140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the connection is already up, but not secure, pairing 1141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is attempted. If already paired BTM_SUCCESS is returned. 1142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device to bond 1144ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pin_len - length in bytes of the PIN Code 1145ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_pin - pointer to array with the PIN Code 11469ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * trusted_mask - bitwise OR of trusted services 11479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (array of uint32_t) 1148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: After 2.1 parameters are not used and preserved here not to change API 1150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 11519e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS BTM_SecBond(const RawAddress& bd_addr, uint8_t pin_len, 1152c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_pin, uint32_t trusted_mask[]) { 1153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_UseLeLink(bd_addr)) transport = BT_TRANSPORT_LE; 1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, 1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson trusted_mask); 11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecBondCancel 1161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to cancel ongoing bonding process 1163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with peer device. 1164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 11669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * transport - false for BR/EDR link; true for LE link 1167ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 11699e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS BTM_SecBondCancel(const RawAddress& bd_addr) { 1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SecBondCancel() State: %s flags:0x%x", 1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), 1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags); 1175f9c5752344ec459def74765f512d28fa0f402168Marie Janssen p_dev_rec = btm_find_dev(bd_addr); 1176c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (!p_dev_rec || btm_cb.pairing_bda != bd_addr) { 1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_UNKNOWN_ADDR; 1178f9c5752344ec459def74765f512d28fa0f402168Marie Janssen } 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) { 1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) { 1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Cancel LE pairing"); 1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (SMP_PairCancel(bd_addr)) { 1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_WRONG_MODE; 1188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, 1191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state); 1192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 1193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) { 1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pre-fetching pin for dedicated bonding */ 1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_bond_cancel_complete(); 1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SUCCESS; 1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this BDA is in a bonding procedure */ 1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) { 1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the HCI link is up */ 1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) { 1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If some other thread disconnecting, we do not send second command */ 1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) || 1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)) 1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the HCI link was set up by Bonding process */ 1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 1211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, 1212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle); 1213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_update_lcb_4_bonding(bd_addr, false); 1215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NOT_AUTHORIZED; 1217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /*HCI link is not up */ 1218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the HCI link creation was started by Bonding process */ 1220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) { 1221b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_create_conn_cancel(bd_addr); 1222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 1223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) { 1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CancelRemoteDeviceName(); 1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD; 1227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NOT_AUTHORIZED; 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_WRONG_MODE; 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecGetDeviceLinkKey 1239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to obtain link key for the device 1241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * it returns BTM_SUCCESS if link key is available, or 1242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_UNKNOWN_ADDR if Security Manager does not know about 1243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the device or device record does not contain link key info 1244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device 1246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * link_key - Link Key is copied into this array 1247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 12499e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS BTM_SecGetDeviceLinkKey(const RawAddress& bd_addr, 1250c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LINK_KEY link_key) { 1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 1252f9c5752344ec459def74765f512d28fa0f402168Marie Janssen p_dev_rec = btm_find_dev(bd_addr); 1253f9c5752344ec459def74765f512d28fa0f402168Marie Janssen if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) { 1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(link_key, p_dev_rec->link_key, LINK_KEY_LEN); 1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_UNKNOWN_ADDR); 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1262ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecGetDeviceLinkKeyType 1263ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to obtain link key type for the 1265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * device. 1266ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * it returns BTM_SUCCESS if link key is available, or 1267ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_UNKNOWN_ADDR if Security Manager does not know about 1268ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the device or device record does not contain link key info 1269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_LKEY_TYPE_IGNORE if link key is unknown, link type 1271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * otherwise. 1272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 12749e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType(const RawAddress& bd_addr) { 1275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) { 1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return p_dev_rec->link_key_type; 1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_LKEY_TYPE_IGNORE; 1281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetEncryption 1286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to ensure that connection is 1288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * encrypted. Should be called only on an open connection. 1289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Typically only needed for connections that first want to 1290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * bring up unencrypted links, then later encrypt them. 1291ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1292ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 1293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * transport - Link transport 1294ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_callback - Pointer to callback function called if 1295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * this function returns PENDING after required 12969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * procedures are completed. Can be set to 12979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * NULL if status is not desired. 12989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_ref_data - pointer to any data the caller wishes to 12999ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * receive in the callback function upon 13009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * completion. can be set to NULL if not used. 1301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sec_act - LE security action, unused for BR/EDR 1302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS - already encrypted 1304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_PENDING - command will be returned in the callback 1305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE- connection not up. 1306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY - security procedures are currently active 1307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_MODE_UNSUPPORTED - if security manager not linked in. 1308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 13109e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS BTM_SetEncryption(const RawAddress& bd_addr, 1311c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBT_TRANSPORT transport, 1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CBACK* p_callback, void* p_ref_data, 1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_ACT sec_act) { 1314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS rc = 0; 1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec || (transport == BT_TRANSPORT_BR_EDR && 1318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) || 1319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (transport == BT_TRANSPORT_LE && 1320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)) { 1321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Connection should be up and runnning */ 1322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("Security Manager: BTM_SetEncryption not connected"); 1323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) 1325c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_WRONG_MODE); 1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 1328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_BR_EDR && 1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) { 1332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: BTM_SetEncryption already encrypted"); 1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1334c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (*p_callback) 1335c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS); 1336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 1338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* enqueue security request if security is active */ 1341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)) { 1342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 1343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: BTM_SetEncryption busy, enqueue request"); 1344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, 1346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ref_data, sec_act)) { 1347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 1348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) 1350c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_NO_RESOURCES); 1351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NO_RESOURCES; 1352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = p_callback; 1356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_ref_data = p_ref_data; 1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required |= 1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_originator = false; 1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x " 1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Required:0x%x", 1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 1365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required); 1366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_LE) { 1368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p = btm_bda_to_acl(bd_addr, transport); 1369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p) { 1370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = btm_ble_set_encryption(bd_addr, sec_act, p->link_role); 1371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_WRONG_MODE; 1373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", 1374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = btm_sec_execute_procedure(p_dev_rec); 1378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) { 1381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) { 1382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = NULL; 1383c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_dev_rec->p_ref_data, rc); 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (rc); 1388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/******************************************************************************* 1391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * disconnect the ACL link, if it's not done yet. 1392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ******************************************************************************/ 1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_sec_send_hci_disconnect(tBTM_SEC_DEV_REC* p_dev_rec, 1394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason, 1395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t conn_handle) { 1396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t old_state = p_dev_rec->sec_state; 1397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_CMD_STARTED; 1398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x", 1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson conn_handle, reason); 1401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send HCI_Disconnect on a transport only once */ 1403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (old_state) { 1404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_STATE_DISCONNECTING: 1405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_handle == p_dev_rec->hci_handle) return status; 1406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_STATE_DISCONNECTING_BLE: 1411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_handle == p_dev_rec->ble_hci_handle) return status; 1412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_STATE_DISCONNECTING_BOTH: 1417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 1418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) 1421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? BTM_SEC_STATE_DISCONNECTING 1422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_SEC_STATE_DISCONNECTING_BLE; 1423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If a role switch is in progress, delay the HCI Disconnect to avoid 1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * controller problem */ 1429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && 1430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle == conn_handle) { 1431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect " 1433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "to delay disconnect"); 1434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; 1435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_SUCCESS; 1436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Tear down the HCI link */ 1438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 1439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_disconnect(conn_handle, reason); 1440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/******************************************************************************* 1446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * 1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Function BTM_ConfirmReqReply 1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * 1449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Description This function is called to confirm the numeric value for 1450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Simple Pairing in response to BTM_SP_CFM_REQ_EVT 1451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * 1452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Parameters: res - result of the operation BTM_SUCCESS if 1453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * success 1454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * bd_addr - Address of the peer device 1455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * 1456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ******************************************************************************/ 14579e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid BTM_ConfirmReqReply(tBTM_STATUS res, const RawAddress& bd_addr) { 1458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM_ConfirmReqReply() State: %s Res: %u", 1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), res); 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If timeout already expired or has been canceled, ignore the reply */ 1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) || 1465c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda != bd_addr)) 1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY)) { 1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_SUCCESS; 14727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res == BTM_SUCCESS) { 1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14792e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson } 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1481b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_conf_reply(bd_addr, true); 1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Report authentication failed event from state 1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */ 1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 1486b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_conf_reply(bd_addr, false); 1487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_PasskeyReqReply 1493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the passkey for 1495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Simple Pairing in response to BTM_SP_KEY_REQ_EVT 1496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: res - result of the operation BTM_SUCCESS if success 1498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * bd_addr - Address of the peer device 1499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * passkey - numeric value in the range of 15009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_MIN_PASSKEY_VAL(0) - 15019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 1502ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1503ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 15059e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid BTM_PasskeyReqReply(tBTM_STATUS res, const RawAddress& bd_addr, 1506c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint32_t passkey) { 1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_PasskeyReqReply: State: %s res:%d", 1508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), res); 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) || 1511c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda != bd_addr)) { 1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If timeout already expired or has been canceled, ignore the reply */ 1516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && 1517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (res != BTM_SUCCESS)) { 1518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 1523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE, 1524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle); 1525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SecBondCancel(bd_addr); 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) 1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (passkey > BTM_MAX_PASSKEY_VAL) res = BTM_ILLEGAL_VALUE; 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_SUCCESS) { 1542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed 1543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * event */ 1544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 1545b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_passkey_neg_reply(bd_addr); 1546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_SUCCESS; 1548b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_passkey_reply(bd_addr, passkey); 1549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1554ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SendKeypressNotif 1556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is used during the passkey entry model 1558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * by a device with KeyboardOnly IO capabilities 1559ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (very likely to be a HID Device). 15609ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * It is called by a HID Device to inform the remote device 15619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * when a key has been entered or erased. 1562ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1563ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 1564ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * type - notification type 1565ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1566ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 15689e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid BTM_SendKeypressNotif(const RawAddress& bd_addr, tBTM_SP_KEY_TYPE type) { 1569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* This API only make sense between PASSKEY_REQ and SP complete */ 1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY) 1571b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_send_keypress_notif(bd_addr, type); 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1576ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_IoCapRsp 1578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called in response to BTM_SP_IO_REQ_EVT 15809ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * When the event data io_req.oob_data is set to 15819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_OOB_UNKNOWN by the tBTM_SP_CALLBACK implementation, 15829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * this function is called to provide the actual response 1583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 1585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * io_cap - The IO capability of local device. 1586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * oob - BTM_OOB_NONE or BTM_OOB_PRESENT. 1587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * auth_req- MITM protection required or not. 1588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 15909e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid BTM_IoCapRsp(const RawAddress& bd_addr, tBTM_IO_CAP io_cap, 1591c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req) { 1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM_IoCapRsp: state: %s oob: %d io_cap: %d", 1593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap); 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS) || 1596c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda != bd_addr)) 1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) { 1600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.loc_auth_req = auth_req; 1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.loc_io_caps = io_cap; 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson auth_req = (BTM_AUTH_DD_BOND | (auth_req & BTM_AUTH_YN_BIT)); 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1606b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_io_cap_req_reply(bd_addr, io_cap, oob, auth_req); 1607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadLocalOobData 1613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local OOB data from 1615ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * LM 1616ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1617ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_ReadLocalOobData(void) { btsnd_hcic_read_local_oob_data(); } 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RemoteOobDataReply 1623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the remote OOB data for 1625ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Simple Pairing in response to BTM_SP_RMT_OOB_EVT 1626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 1628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * c - simple pairing Hash C. 1629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * r - simple pairing Randomizer C. 1630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 16329e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid BTM_RemoteOobDataReply(tBTM_STATUS res, const RawAddress& bd_addr, 1633c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski BT_OCTET16 c, BT_OCTET16 r) { 1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() - State: %s res: %d", __func__, 1635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), res); 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If timeout already expired or has been canceled, ignore the reply */ 1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) return; 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_SUCCESS) { 1643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed 1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * event */ 1645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rem_oob_neg_reply(bd_addr); 1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_SUCCESS; 1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rem_oob_reply(bd_addr, c, r); 1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1654ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1655ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BuildOobData 1656ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1657ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to build the OOB data payload to 1658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * be sent over OOB (non-Bluetooth) link 1659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: p_data - the location for OOB data 1661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * max_len - p_data size. 1662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * c - simple pairing Hash C. 1663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * r - simple pairing Randomizer C. 1664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * name_len- 0, local device name would not be included. 1665ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * otherwise, the local device name is included for 1666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * up to this specified length 1667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Number of bytes in p_data. 1669ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_BuildOobData(uint8_t* p_data, uint16_t max_len, BT_OCTET16 c, 1672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET16 r, uint8_t name_len) { 1673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = p_data; 1674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len = 0; 1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t name_size; 1676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; 1677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) { 1679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add mandatory part */ 1680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_STREAM(p, len); 1681b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski BDADDR_TO_STREAM(p, *controller_get_interface()->get_address()); 1682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = BTM_OOB_MANDATORY_SIZE; 1684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len -= len; 1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* now optional part */ 1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add Hash C */ 1689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t delta = BTM_OOB_HASH_C_SIZE + 2; 1690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_len >= delta) { 1691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = BTM_OOB_HASH_C_SIZE + 1; 1692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE; 1693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE); 1694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += delta; 1695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len -= delta; 1696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add Rand R */ 1699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson delta = BTM_OOB_RAND_R_SIZE + 2; 1700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_len >= delta) { 1701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = BTM_OOB_RAND_R_SIZE + 1; 1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE; 1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE); 1704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += delta; 1705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len -= delta; 1706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add class of device */ 1709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson delta = BTM_OOB_COD_SIZE + 2; 1710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_len >= delta) { 1711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = BTM_OOB_COD_SIZE + 1; 1712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = BTM_EIR_OOB_COD_TYPE; 1713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class); 1714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += delta; 1715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len -= delta; 1716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson name_size = name_len; 1718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (name_size > strlen(btm_cb.cfg.bd_name)) { 1719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson name_size = (uint16_t)strlen(btm_cb.cfg.bd_name); 1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson delta = name_size + 2; 1723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_len >= delta) { 1724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = name_size + 1; 1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = name_type; 1726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, name_size); 1727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += delta; 1728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len -= delta; 1729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update len */ 1731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_data; 1732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_STREAM(p, len); 1733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return len; 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1738ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1739ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BothEndsSupportSecureConnections 1740ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 17419ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to check if both the local device 17429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * and the peer device specified by bd_addr support BR/EDR 17439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Secure Connections. 1744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - address of the peer 1746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 17479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns true if BR/EDR Secure Connections are supported by both 17489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * local and the remote device, else false. 1749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 17519e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool BTM_BothEndsSupportSecureConnections(const RawAddress& bd_addr) { 1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((controller_get_interface()->supports_secure_connections()) && 1753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_PeerSupportsSecureConnections(bd_addr))); 1754899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 1755899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1756899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 1757ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1758ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_PeerSupportsSecureConnections 1759ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1760ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if the peer supports 1761ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BR/EDR Secure Connections. 1762ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1763ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - address of the peer 1764ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1765ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if BR/EDR Secure Connections are supported by the peer, 1766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * else false. 1767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 17699e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool BTM_PeerSupportsSecureConnections(const RawAddress& bd_addr) { 1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 1771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 1773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 1774c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(WARNING) << __func__ << ": unknown BDA: " << bd_addr; 1775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 1776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1777899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_dev_rec->remote_supports_secure_connections); 1779444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1780444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1781444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1782ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1783ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadOobData 1784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1785ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to parse the OOB data payload 1786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * received over OOB (non-Bluetooth) link 1787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: p_data - the location for OOB data 1789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * eir_tag - The associated EIR tag to read the data. 1790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * *p_len(output) - the length of the data with the given tag. 1791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns the beginning of the data with the given tag. 1793ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NULL, if the tag is not found. 1794ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1795ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* BTM_ReadOobData(uint8_t* p_data, uint8_t eir_tag, uint8_t* p_len) { 1797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = p_data; 1798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t max_len; 1799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t len, type; 1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_ret = NULL; 1801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t ret_len = 0; 1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data) { 1804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(max_len, p); 1805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_len >= BTM_OOB_MANDATORY_SIZE) { 1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) { 1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ret = p; /* the location for bd_addr */ 1808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ret_len = BTM_OOB_BD_ADDR_SIZE; 1809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p += BD_ADDR_LEN; 1811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len -= BTM_OOB_MANDATORY_SIZE; 1812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* now the optional data in EIR format */ 1813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while (max_len > 0) { 1814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = *p++; /* tag data len + 1 */ 1815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson type = *p++; 1816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (eir_tag == type) { 1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ret = p; 1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ret_len = len - 1; 1819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the data size of this tag is len + 1 (tag data len + 2) */ 1822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_len > len) { 1823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len -= len; 1824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len--; 1825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len--; 1826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p += len; 1827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_len = 0; 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_len) *p_len = ret_len; 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return p_ret; 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1840ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1841ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetOutService 1842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1843ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the service for 1844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * outgoing connections. 1845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the profile/application calls BTM_SetSecurityLevel 1847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * before initiating a connection, this function does not 1848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * need to be called. 1849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 18539e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid BTM_SetOutService(const RawAddress& bd_addr, uint8_t service_id, 1854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id) { 1855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 1856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0]; 1857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_out_serv = p_serv_rec; 1859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 1860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { 1862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) && 1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_serv_rec->service_id == service_id) && 1864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_serv_rec->orig_mx_chan_id == mx_chan_id)) { 1865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 1866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, " 1867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "chan_id %d", 1868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, 1869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec->orig_mx_chan_id); 1870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_out_serv = p_serv_rec; 1871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) p_dev_rec->p_cur_service = p_serv_rec; 1872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************ 1878ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * I N T E R N A L F U N C T I O N S 1879ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ************************************************************************/ 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_is_upgrade_possible 1883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function returns true if the existing link key 1885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * can be upgraded or if the link key does not exist. 1886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool 1888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC* p_dev_rec, 1891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator) { 1892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM; 1893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_possible = true; 1894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) { 1896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_possible = false; 1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->p_cur_service) { 1898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, " 1900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "flags: 0x%x", 1901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_dev_rec->p_cur_service->service_id, 1902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check, 1903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service->security_flags); 1904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x", __func__, 1907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check); 1908ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Already have a link key to the connected peer. Is the link key secure 1910b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski *enough? 1911b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski ** Is a link key upgrade even possible? 1912b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski */ 1913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->security_required & mtm_check) /* needs MITM */ 1914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) || 1915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) 1916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* has unauthenticated 1917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson link key */ 1918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */ 1919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps])) 1920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* authenticated 1921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson link key is possible */ 1922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* upgrade is possible: check if the application wants the upgrade. 1924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * If the application is configured to use a global MITM flag, 1925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * it probably would not want to upgrade the link key based on the 1926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * security level database */ 1927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_possible = true; 1928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, 1931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags); 1932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return is_possible; 1933ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1936ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1937ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_check_upgrade 1938ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1939ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if the existing link key 1940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * needs to be upgraded. 1941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1942ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1943ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1944ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC* p_dev_rec, 1946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator) { 1947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s()", __func__); 1948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only check if link key already exists */ 1950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) return; 1951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == true) { 1953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags); 1954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* upgrade is possible: check if the application wants the upgrade. 1955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * If the application is configured to use a global MITM flag, 1956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * it probably would not want to upgrade the link key based on the security 1957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * level database */ 1958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_UPGRADE evt_data; 1959c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski evt_data.bd_addr = p_dev_rec->bd_addr; 1960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.upgrade = true; 1961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_sp_callback) 1962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_sp_callback)(BTM_SP_UPGRADE_EVT, 1963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SP_EVT_DATA*)&evt_data); 1964ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("evt_data.upgrade:0x%x", evt_data.upgrade); 1966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (evt_data.upgrade) { 1967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if the application confirms the upgrade, set the upgrade bit */ 1968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 1969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Clear the link key known to go through authentication/pairing again */ 1971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 1972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED); 1973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED; 1974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("sec_flags:0x%x", p_dev_rec->sec_flags); 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1980ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_l2cap_access_req 1982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the L2CAP to grant permission to 1984ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * establish L2CAP connection to or from the peer device. 1985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1986ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 1987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * psm - L2CAP PSM 1988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is_originator - true if protocol above L2CAP originates 1989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection 1990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_callback - Pointer to callback function called if 1991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * this function returns PENDING after required 1992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * procedures are complete. MUST NOT BE NULL. 1993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1994ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns tBTM_STATUS 1995ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1996ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 19979e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS btm_sec_l2cap_access_req(const RawAddress& bd_addr, uint16_t psm, 1998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t handle, CONNECTION_TYPE conn_type, 1999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback, 2000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson void* p_ref_data) { 2001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 2002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec; 2003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t security_required; 2004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t old_security_required; 2005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool old_is_originator; 2006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS rc = BTM_SUCCESS; 2007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool chk_acp_auth_done = false; 2008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator; 2009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport = 2010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_TRANSPORT_BR_EDR; /* should check PSM range in LE connection oriented 2011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson L2CAP connection */ 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 2014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_type & CONNECTION_TYPE_ORIG_MASK) 2015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = true; 2016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 2017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = false; 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, 2020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ref_data); 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = conn_type; 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() is_originator:%d, 0x%x", __func__, is_originator, 2025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ref_data); 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find or get oldest record */ 2029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_or_alloc_dev(bd_addr); 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle = handle; 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the service record for the PSM */ 2034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec = btm_sec_find_first_serv(conn_type, psm); 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is no application registered with this PSM do not allow connection 2037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_serv_rec) { 2039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s() PSM: %d no application registerd", __func__, psm); 2040c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 2041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 2042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Services level0 by default have no security */ 2045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_sec_is_serv_level0(psm)) && 2046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!btm_cb.devcb.secure_connections_only)) { 2047c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS_NO_SECURITY); 2048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 2049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 2051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_type & CONNECTION_TYPE_CONNLESS_MASK) { 2052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SC) { 2053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required = btm_sec_set_serv_level4_flags( 2054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec->ucd_security_flags, is_originator); 2055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required = p_serv_rec->ucd_security_flags; 2057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_CMD_STARTED; 2060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) { 2061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 2062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == 2063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHENTICATE) && 2064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 2065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == 2066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && 2067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || 2068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && 2069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)))) { 2070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_SUCCESS; 2071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 2074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_IN_FLAGS) == 2075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_AUTHENTICATE) && 2076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 2077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_IN_FLAGS) == 2078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && 2079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || 2080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && 2081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)))) { 2082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // Check for 16 digits (or MITM) 2083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 2085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_MIN_16_DIGIT_PIN) && 2086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_16_digit_authenticated(p_dev_rec))) { 2087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_SUCCESS; 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 2094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_CMD_STARTED; 2095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2096899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (rc == BTM_SUCCESS) { 2098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) 2099c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, (void*)p_ref_data, BTM_SUCCESS); 21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 2106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SC) { 2107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required = btm_sec_set_serv_level4_flags( 2108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec->security_flags, is_originator); 2109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required = p_serv_rec->security_flags; 2111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: security_required 0x%04x, is_originator 0x%02x, psm 0x%04x", 2116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, security_required, is_originator, psm); 2117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4)) { 2119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool local_supports_sc = 2120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson controller_get_interface()->supports_secure_connections(); 2121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* acceptor receives L2CAP Channel Connect Request for Secure Connections 2122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Only service */ 2123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(local_supports_sc) || 2124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_dev_rec->remote_supports_secure_connections)) { 2125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d", 2126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "rmt_support_for_sc : %d -> fail pairing", __func__, 2127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson local_supports_sc, 2128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->remote_supports_secure_connections); 2129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) 2130c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, (void*)p_ref_data, 2131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* there are some devices (moto KRZR) which connects to several services at 2138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * the same time */ 2139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we will process one after another */ 2140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->p_callback) || 2141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)) { 2142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x", 2143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, psm, btm_pair_state_descr(btm_cb.pairing_state), 2144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode, p_dev_rec->sm4); 2145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("security_flags:x%x, sec_flags:x%x", security_required, 2146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags); 2147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_CMD_STARTED; 2148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_NONE || 2150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SM4_KNOWN == p_dev_rec->sm4) || 2153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == false))) { 2155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* legacy mode - local is legacy or local is lisbon/peer is legacy 2156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * or SM4 with no possibility of link key upgrade */ 2157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) { 2158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 2159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == 2160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHENTICATE) && 2161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_authenticated(p_dev_rec))) || 2162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == 2163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && 2164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_encrypted(p_dev_rec))) || 2165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && 2166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec)))) { 2167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_SUCCESS; 2168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 2171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == 2172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_AUTHENTICATE) && 2173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_authenticated(p_dev_rec)) || 2174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == 2175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && 2176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_encrypted(p_dev_rec)) || 2177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && 2178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_dev_authorized(p_dev_rec) || 2179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_serv_trusted(p_dev_rec, p_serv_rec))) || 2180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == 2181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && 2182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((btm_dev_authorized(p_dev_rec) || 2183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_serv_trusted(p_dev_rec, p_serv_rec)) && 2184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_authenticated(p_dev_rec))) || 2185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == 2186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && 2187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((btm_dev_authorized(p_dev_rec) || 2188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_serv_trusted(p_dev_rec, p_serv_rec)) && 2189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_encrypted(p_dev_rec))) || 2190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && 2191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_encrypted(p_dev_rec) && 2192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_dev_authorized(p_dev_rec) || 2193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_serv_trusted(p_dev_rec, p_serv_rec)))) { 2194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // Check for 16 digits (or MITM) 2195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 2197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_MIN_16_DIGIT_PIN) && 2198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_16_digit_authenticated(p_dev_rec))) { 2199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_SUCCESS; 2200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 2206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_CMD_STARTED; 2207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (rc == BTM_SUCCESS) { 2210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) 2211c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, (void*)p_ref_data, BTM_SUCCESS); 2212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 2213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sec_req_pending = true; 2217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 2218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save pointer to service record */ 2221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service = p_serv_rec; 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */ 2224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SC) { 2227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) { 2228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) { 2229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* SM4 to SM4 -> always authenticate & encrypt */ 2230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT); 2231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* acceptor */ 2232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 2233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* SM4 to SM4: the acceptor needs to make sure the authentication is 2234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * already done */ 2235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson chk_acp_auth_done = true; 2236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* SM4 to SM4 -> always authenticate & encrypt */ 2237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 2238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4)) { 2240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the remote features are not known yet */ 2241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", 2242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, (is_originator) ? "initiator" : "acceptor", 2243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags); 22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 |= BTM_SM4_REQ_PEND; 2246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__, 2252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, 2253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson chk_acp_auth_done); 22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson old_security_required = p_dev_rec->security_required; 2256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson old_is_originator = p_dev_rec->is_originator; 2257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required = security_required; 2258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_ref_data = p_ref_data; 2259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_originator = is_originator; 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 2262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_type & CONNECTION_TYPE_CONNLESS_MASK) 2263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_ucd = true; 2264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 2265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_ucd = false; 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* If there are multiple service records used through the same PSM */ 2269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* leave security decision for the multiplexor on the top */ 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 2271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((btm_sec_find_next_serv(p_serv_rec)) != NULL) && 2272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(conn_type & CONNECTION_TYPE_CONNLESS_MASK))) /* if not UCD */ 22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_sec_find_next_serv(p_serv_rec)) != NULL) 22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 2277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, 2278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson chk_acp_auth_done); 2279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) { 2280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", 2282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson psm); 2283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pre-Lisbon: restore the old settings */ 2284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required = old_security_required; 2285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_originator = old_is_originator; 2286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2287c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS); 2288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 2290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if the originator is using dynamic PSM in legacy mode, do not start any 2294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * security process now 2295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * The layer above L2CAP needs to carry out the security requirement after 2296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * L2CAP connect 2297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * response is received */ 2298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator && ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_NONE || 2300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && 2303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (psm >= 0x1001)) { 2304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm); 2306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* restore the old settings */ 2307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required = old_security_required; 2308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_originator = old_is_originator; 2309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2310c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS); 2311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 2313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (chk_acp_auth_done) { 2316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: " 2318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "x%x", 2319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), 2320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)); 2321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* SM4, but we do not know for sure which level of security we need. 2322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * as long as we have a link key, it's OK */ 2323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) || 2324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) { 2325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_DELAY_CHECK; 2326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 2327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2046 may report HCI_Encryption_Change and L2C Connection Request out of 2328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sequence 2329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson because of data path issues. Delay this disconnect a little bit 2330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LOG_INFO( 2332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LOG_TAG, 2333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s peer should have initiated security process by now (SM4 to SM4)", 2334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 2335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = p_callback; 2336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_DELAY_FOR_ENC; 2337c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, rc); 2338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SUCCESS; 2340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = p_callback; 2344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID || 2346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->last_author_service_id != 2347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service->service_id) { 2348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Although authentication and encryption are per connection 2349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** authorization is per access request. For example when serial connection 2350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** is up and authorized and client requests to read file (access to other 2351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** scn), we need to request user's permission again. 2352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED; 2354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) { 2357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 2359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case 2360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) { 2362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 2365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_AUTHENTICATED); 2367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __func__, p_dev_rec->sec_flags); 2368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we already have a link key to the connected peer, is it secure 2370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * enough? */ 2371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_check_upgrade(p_dev_rec, is_originator); 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d", 2377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 2378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = btm_sec_execute_procedure(p_dev_rec); 2381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (rc != BTM_CMD_STARTED) { 2382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = NULL; 2383c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_dev_rec->p_ref_data, (uint8_t)rc); 2384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (rc); 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_mx_access_request 2392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by all Multiplexing Protocols during 2394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * establishing connection to or from peer device to grant 2395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * permission to establish application connection. 2396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 2398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * psm - L2CAP PSM 2399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is_originator - true if protocol above L2CAP originates 2400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection 2401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mx_proto_id - protocol ID of the multiplexer 2402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mx_chan_id - multiplexer channel to reach application 2403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_callback - Pointer to callback function called if 2404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * this function returns PENDING after required 2405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * procedures are completed 2406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_ref_data - Pointer to any reference data needed by the 2407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the callback function. 2408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_CMD_STARTED 2410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 24129e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitBTM_STATUS btm_sec_mx_access_request(const RawAddress& bd_addr, uint16_t psm, 2413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator, uint32_t mx_proto_id, 2414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id, 2415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback, 2416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson void* p_ref_data) { 2417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 2418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec; 2419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS rc; 2420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t security_required; 2421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool transport = false; /* should check PSM range in LE connection oriented 2422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson L2CAP connection */ 2423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() is_originator: %d", __func__, is_originator); 2425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find or get oldest record */ 2426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_or_alloc_dev(bd_addr); 2427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the service record for the PSM */ 2429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec = 2430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_find_mx_serv(is_originator, psm, mx_proto_id, mx_chan_id); 2431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is no application registered with this PSM do not allow connection 2433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_serv_rec) { 2435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) 2436c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 2437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR( 2439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: MX service not found PSM:%d Proto:%d SCN:%d", psm, 2440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson mx_proto_id, mx_chan_id); 2441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NO_RESOURCES; 2442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && 2445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!btm_sec_is_serv_level0(psm))) { 2446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required = btm_sec_set_serv_level4_flags( 2447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_serv_rec->security_flags, is_originator); 2448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson security_required = p_serv_rec->security_flags; 2450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* there are some devices (moto phone) which connects to several services at 2453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * the same time */ 2454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we will process one after another */ 2455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->p_callback) || 2456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)) { 2457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() service PSM:%d Proto:%d SCN:%d delayed state: %s", 2458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, psm, mx_proto_id, mx_chan_id, 2459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state)); 2460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_CMD_STARTED; 2462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_NONE || 2465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SM4_KNOWN == p_dev_rec->sm4) || 2468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == false))) { 2470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* legacy mode - local is legacy or local is lisbon/peer is legacy 2471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * or SM4 with no possibility of link key upgrade */ 2472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) { 2473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 2474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == 2475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHENTICATE) && 2476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_authenticated(p_dev_rec))) || 2477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_OUT_FLAGS) == 2478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && 2479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_encrypted(p_dev_rec)))) { 2480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_SUCCESS; 2481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 2484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_IN_FLAGS) == 2485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_AUTHENTICATE) && 2486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_authenticated(p_dev_rec))) || 2487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && 2488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_dev_authorized(p_dev_rec) || 2489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_serv_trusted(p_dev_rec, p_serv_rec))) || 2490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == 2491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && 2492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((btm_dev_authorized(p_dev_rec) || 2493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_serv_trusted(p_dev_rec, p_serv_rec)) && 2494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_authenticated(p_dev_rec))) || 2495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_FLAGS) == 2496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && 2497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((btm_dev_authorized(p_dev_rec) || 2498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_serv_trusted(p_dev_rec, p_serv_rec)) && 2499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_encrypted(p_dev_rec))) || 2500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((security_required & BTM_SEC_IN_FLAGS) == 2501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && 2502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_encrypted(p_dev_rec)))) { 2503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // Check for 16 digits (or MITM) 2504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 2506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_MIN_16_DIGIT_PIN) && 2507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_dev_16_digit_authenticated(p_dev_rec))) { 2508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_SUCCESS; 2509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 2514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_CMD_STARTED; 2515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2516899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2517899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (rc == BTM_SUCCESS) { 2519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __func__); 2520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the 2521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * requirements in */ 2522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* btm_sec_execute_procedure */ 2523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((is_originator && 2524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) || 2525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!is_originator && 2526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE))) { 2527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: still need authorization", __func__); 2528ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_CMD_STARTED; 2529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2530899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2531899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check whether there is a pending security procedure, if so we should 2533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * always queue */ 2534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the new security request */ 2535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE) { 2536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: There is a pending security procedure", __func__); 2537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = BTM_CMD_STARTED; 2538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (rc == BTM_CMD_STARTED) { 2540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __func__); 2541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_queue_mx_request(bd_addr, psm, is_originator, mx_proto_id, 2542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson mx_chan_id, p_callback, p_ref_data); 2543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* rc == BTM_SUCCESS */ 2544899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* access granted */ 2546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) { 2547c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, (uint8_t)rc); 2548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __func__, 2552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc, btm_pair_state_descr(btm_cb.pairing_state)); 2553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return rc; 2554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) || 2557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.security_mode == BTM_SEC_MODE_SC))) { 2558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool local_supports_sc = 2559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson controller_get_interface()->supports_secure_connections(); 2560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* acceptor receives service connection establishment Request for */ 2561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Secure Connections Only service */ 2562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(local_supports_sc) || 2563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_dev_rec->remote_supports_secure_connections)) { 2564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,", 2565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "remote_support_for_sc %d: fail pairing", __func__, 2566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson local_supports_sc, 2567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->remote_supports_secure_connections); 2568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) 2570c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, (void*)p_ref_data, 2571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service = p_serv_rec; 2578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required = security_required; 2579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SC) { 2583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) { 2584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 2586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case 2587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) { 2589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 25905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 2593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_AUTHENTICATED); 2595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __func__, p_dev_rec->sec_flags); 2596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we already have a link key, check if that link key is good enough 2598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_check_upgrade(p_dev_rec, is_originator); 2600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_originator = is_originator; 2605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = p_callback; 2606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_ref_data = p_ref_data; 26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Although authentication and encryption are per connection */ 2609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* authorization is per access request. For example when serial connection */ 2610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* is up and authorized and client requests to read file (access to other */ 2611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* scn, we need to request user's permission again. */ 2612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED); 26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service " 2616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "ID:%d", 2617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, 2618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags, p_dev_rec->security_required, 2619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service->service_id); 26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rc = btm_sec_execute_procedure(p_dev_rec); 2622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (rc != BTM_CMD_STARTED) { 2623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) { 2624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = NULL; 2625c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, transport, p_ref_data, (uint8_t)rc); 26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return rc; 26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2633ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_conn_req 2635ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2636ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is when the peer device is requesting 2637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection 2638ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2639ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 26429e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_conn_req(const RawAddress& bda, uint8_t* dc) { 2643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda); 2644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Some device may request a connection before we are done with the HCI_Reset 2646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * sequence */ 2647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->get_is_ready()) { 2648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: connect request when device not ready"); 2649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE); 2650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 2651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Security guys wants us not to allow connection from not paired devices */ 26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if connection is allowed for only paired devices */ 2656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.connect_only_paired) { 2657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) { 2658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: connect request from non-paired device"); 2660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE); 2661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE) 2666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If non-discoverable, only allow known devices to connect */ 2667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) { 2668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 2669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: connect request from not paired device"); 2671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE); 2672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 2673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 2678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 2679c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == bda)) { 2680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: reject connect request from bonding device"); 26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* incoming connection from bonding device is rejected */ 2684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT; 2685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE); 2686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 2687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Host is not interested or approved connection. Save BDA and DC and */ 2690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pass request to L2CAP */ 2691c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.connecting_bda = bda; 2692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.connecting_dc, dc, DEV_CLASS_LEN); 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (l2c_link_hci_conn_req(bda)) { 2695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 2696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* accept the connection -> allocate a device record */ 2697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_alloc_dev(bda); 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 2700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 |= BTM_SM4_CONN_PEND; 2701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_bond_cancel_complete 2708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to report bond cancel complete 2710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * event. 2711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_bond_cancel_complete(void) { 2716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 2717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) || 2719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 2720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) || 2721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME && 2722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) { 2723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* for dedicated bonding in legacy mode, authentication happens at "link 2724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * level" 2725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * btm_sec_connected is called with failed status. 2726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * In theory, the code that handles is_pairing_device/true should clean out 2727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * security related code. 2728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * However, this function may clean out the security related flags and 2729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * btm_sec_connected would not know 2730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * this function also needs to do proper clean up. 2731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(btm_cb.pairing_bda); 2733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) p_dev_rec->security_required = BTM_SEC_NONE; 2734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 2735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify application that the cancel succeeded */ 2737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_bond_cancel_cmpl_callback) 2738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS); 2739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_create_conn_cancel_complete 2745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when the command complete message 2747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is received from the HCI for the create connection cancel 2748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * command. 2749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2751ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_create_conn_cancel_complete(uint8_t* p) { 2754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t status; 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(status, p); 2757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_create_conn_cancel_complete(): in State: %s status:%d", 2758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), status); 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if the create conn cancel cmd was issued by the bond cancel, 2761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** the application needs to be notified that bond cancel succeeded 2762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 2763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (status) { 2764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case HCI_SUCCESS: 2765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_bond_cancel_complete(); 2766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case HCI_ERR_CONNECTION_EXISTS: 2768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case HCI_ERR_NO_CONNECTION: 2769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 2770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify application of the error */ 2771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_bond_cancel_cmpl_callback) 2772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING); 2773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2778ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2779ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_check_pending_reqs 2780ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2781ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called at the end of the security procedure 27829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * to let L2CAP and RFCOMM know to re-submit any pending 27839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * requests 2784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2785ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_check_pending_reqs(void) { 2789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) { 2790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, resubmit L2CAP requests */ 2791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.sec_req_pending) { 2792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sec_req_pending = false; 2793c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski l2cu_resubmit_pending_sec_req(nullptr); 2794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Now, re-submit anything in the mux queue */ 2797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_t* bq = btm_cb.sec_pending_q; 2798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sec_pending_q = fixed_queue_new(SIZE_MAX); 2800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_QUEUE_ENTRY* p_e; 2802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_e = (tBTM_SEC_QUEUE_ENTRY*)fixed_queue_try_dequeue(bq)) != NULL) { 2803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check that the ACL is still up before starting security procedures */ 2804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL) { 2805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_e->psm != 0) { 2806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u", __func__, 2808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->psm, p_e->is_orig, p_e->mx_proto_id, p_e->mx_chan_id); 2809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_mx_access_request(p_e->bd_addr, p_e->psm, p_e->is_orig, 2811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->mx_proto_id, p_e->mx_chan_id, 2812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->p_callback, p_e->p_ref_data); 2813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback, 2815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->p_ref_data, p_e->sec_act); 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_e); 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_free(bq, NULL); 2822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2827ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_init 2828ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is on the SEC startup 2830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2833ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_init(uint8_t sec_mode) { 2835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode = sec_mode; 2836aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski btm_cb.pairing_bda = RawAddress::kAny; 2837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY; 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2841ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_device_down 2843ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function should be called when device is disabled or 2845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * turned off 2846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_device_down(void) { 2851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() State: %s", __func__, 2852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state)); 2853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_dev_reset 2859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function should be called after device reset 2861ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2862ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2863ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2864ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_dev_reset(void) { 2866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (controller_get_interface()->supports_simple_pairing()) { 2867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set the default IO capabilities */ 2868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS; 2869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add mx service to use no security */ 2870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(false, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX, 2871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0); 2872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode = BTM_SEC_MODE_SERVICE; 2874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode); 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2880ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_abort_access_req 2882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the L2CAP or RFCOMM to abort 2884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the pending operation. 2885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 2887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 28919e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_abort_access_req(const RawAddress& bd_addr) { 2892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) return; 28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) && 2897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)) 2898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 2901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = NULL; 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2905ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_dd_create_conn 2907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to create the ACL connection for 2909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the dedicated boding process 2910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec) { 2915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tL2C_LCB* p_lcb = 2916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_find_lcb_by_bd_addr(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); 2917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_lcb && (p_lcb->link_state == LST_CONNECTED || 2918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_lcb->link_state == LST_CONNECTING)) { 2919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s Connection already exists", __func__); 2920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 2921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 2922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure an L2cap link control block is available */ 2925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_lcb && 2926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_lcb = l2cu_allocate_lcb(p_dev_rec->bd_addr, true, 2927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_TRANSPORT_BR_EDR)) == NULL) { 2928c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(WARNING) << "Security Manager: failed allocate LCB " 2929c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << p_dev_rec->bd_addr; 2930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 2932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set up the control block to indicated dedicated bonding */ 2935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 2936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == false) { 2938c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(WARNING) << "Security Manager: failed create allocate LCB " 2939c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << p_dev_rec->bd_addr; 2940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_release_lcb(p_lcb); 2942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 2943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_update_busy_level(BTM_BLI_PAGE_EVT); 2946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2947c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << "Security Manager: " << p_dev_rec->bd_addr; 2948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); 2950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool is_state_getting_name(void* data, void* context) { 2955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(data); 2956cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 2957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) { 2958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 2959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 2961cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 2962cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2964ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_rmt_name_request_complete 2966b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski * 2967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when remote name was obtained from 2968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the peer device 2969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 29739e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr, 2974c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_bd_name, uint8_t status) { 2975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 2976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 2977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DEV_CLASS dev_class; 2978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t old_sec_state; 2979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_sec_rmt_name_request_complete"); 2981c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if ((!p_bd_addr && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda)) || 2982c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (p_bd_addr && !BTM_ACL_IS_CONNECTED(*p_bd_addr))) { 2983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_resubmit_page(); 2984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If remote name request failed, p_bd_addr is null and we need to search */ 2987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* based on state assuming that we are doing 1 at a time */ 2988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_bd_addr) 2989c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec = btm_find_dev(*p_bd_addr); 2990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 2991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson list_node_t* node = 2992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson list_foreach(btm_cb.sec_dev_rec, is_state_getting_name, NULL); 2993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (node != NULL) { 2994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(list_node(node)); 2995c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_bd_addr = &p_dev_rec->bd_addr; 2996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = NULL; 29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Commenting out trace due to obf/compilation problems. 3002b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski */ 3003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_bd_name) p_bd_name = (uint8_t*)""; 3004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 3006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 3007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s PairState: %s RemName: %s status: %d State:%d p_dev_rec: " 3008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%08x ", 3009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, btm_pair_state_descr(btm_cb.pairing_state), p_bd_name, status, 3010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state, p_dev_rec); 3011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s PairState: %s RemName: %s status: %d", __func__, 3013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), p_bd_name, 3014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status); 3015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 3018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson old_sec_state = p_dev_rec->sec_state; 3019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_SUCCESS) { 3020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)p_dev_rec->sec_bd_name, (char*)p_bd_name, 3021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_MAX_REM_BD_NAME_LEN); 3022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 3023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", 3024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags); 3025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify all clients waiting for name to be resolved even if it failed so 3027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * clients can continue */ 3028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name[0] = 0; 30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) 3032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify all clients waiting for name to be resolved */ 3035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { 3036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 3037c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*btm_cb.p_rmt_name_callback[i])(*p_bd_addr, p_dev_rec->dev_class, 3038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name); 30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dev_class[0] = 0; 3042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dev_class[1] = 0; 3043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dev_class[2] = 0; 30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify all clients waiting for name to be resolved even if not found so 3046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * clients can continue */ 3047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { 3048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 3049c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*btm_cb.p_rmt_name_callback[i])(*p_bd_addr, dev_class, (uint8_t*)""); 3050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we were delaying asking UI for a PIN because name was not resolved, ask 3056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * now */ 3057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr && 3058c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == *p_bd_addr)) { 3059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 3060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() delayed pin now being requested flags:0x%x, " 3061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "(p_pin_callback=0x%p)", 3062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, btm_cb.pairing_flags, btm_cb.api.p_pin_callback); 3063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0 && 3065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_pin_callback) { 3066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() calling pin_callback", __func__); 3067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 3068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_pin_callback)( 3069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name, 3070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->p_cur_service == NULL) 3071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? false 3072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : (p_dev_rec->p_cur_service->security_flags & 3073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_MIN_16_DIGIT_PIN)); 3074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set the same state again to force the timer to be restarted */ 3077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); 3078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if we were delaying bonding because name was not resolved */ 3082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) { 3083c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (p_bd_addr && btm_cb.pairing_bda == *p_bd_addr) { 3084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() continue bonding sm4: 0x%04x, status:0x%x", 3085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_dev_rec->sm4, status); 3086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) { 3087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_bond_cancel_complete(); 3088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS) { 3092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) 3095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 3096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 3097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status); 30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is 3102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * not reported */ 3103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { 3104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not 3105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * set.*/ 3106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If it is set, there may be a race condition */ 3107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s IS_SM4_UNKNOWN Flags:0x%04x", __func__, 3108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags); 3109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0) 3110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 |= BTM_SM4_KNOWN; 3111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d", 3114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_dev_rec->sm4, 3115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4), 3116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IS_SM4(p_dev_rec->sm4), 3117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)); 3118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BT 2.1 or carkit, bring up the connection to force the peer to request 3120b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski *PIN. 3121b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if 3122b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski *needed) 3123b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski */ 3124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || 3125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !btm_sec_check_prefetch_pin(p_dev_rec)) { 3126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if we rejected incoming connection request, we have to wait 3127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * HCI_Connection_Complete event */ 3128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* before originating */ 3129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) { 3130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 3131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: waiting HCI_Connection_Complete after rejecting connection", 3132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Both we and the peer are 2.1 - continue to create connection */ 3135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { 3136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s: failed to start connection", __func__); 31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31408bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He if (btm_cb.api.p_auth_complete_callback) { 3141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 3142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, 3143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 31448bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He } 31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s: wrong BDA, retry with pairing BDA", __func__); 31508bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He if (BTM_ReadRemoteDeviceName(btm_cb.pairing_bda, NULL, 31518bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BT_TRANSPORT_BR_EDR) != BTM_CMD_STARTED) { 31528bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_TRACE_ERROR("%s: failed to start remote name request", __func__); 31538bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He if (btm_cb.api.p_auth_complete_callback) { 31548bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He (*btm_cb.api.p_auth_complete_callback)( 31558bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 31568bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He HCI_ERR_MEMORY_FULL); 31578bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He } 31588bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He }; 3159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* check if we were delaying link_key_callback because name was not resolved 3164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 3165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->link_key_not_sent) { 3166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If HCI connection complete has not arrived, wait for it */ 3167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) return; 31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_not_sent = false; 3170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_send_link_key_notif(p_dev_rec); 31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If its not us who perform authentication, we should tell stackserver */ 3173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* that some authentication has been completed */ 3174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* This is required when different entities receive link notification and 3175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * auth complete */ 3176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) { 3177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) 3178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 3179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 3180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_SUCCESS); 3181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this is a bonding procedure can disconnect the link now */ 3185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 3186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) { 3187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("btm_sec_rmt_name_request_complete (none/ce)"); 3188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE); 3189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_start_post_bond_timer(p_dev_rec->hci_handle); 3190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) return; 31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If get name failed, notify the waiting layer */ 3196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS) { 3197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false); 3198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) { 3202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("waiting for remote features!!"); 3203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 32055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Remote Name succeeded, execute the next security procedure, if any */ 3207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = (uint8_t)btm_sec_execute_procedure(p_dev_rec); 32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If result is pending reply from the user or from the device is pending */ 3210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == BTM_CMD_STARTED) return; 32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* There is no next procedure or start of procedure failed, notify the waiting 3213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * layer */ 3214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, status, false); 32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_rmt_host_support_feat_evt 3220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when the 3222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received 3223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_rmt_host_support_feat_evt(uint8_t* p) { 3228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 32299e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress bd_addr; /* peer address */ 3230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BD_FEATURES features; 32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3232b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(bd_addr, p); 3233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_or_alloc_dev(bd_addr); 32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x", 3236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4, p[0]); 32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { 3239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 = BTM_SM4_KNOWN; 3240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE); 3241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_SSP_HOST_SUPPORTED(features)) { 3242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 = BTM_SM4_TRUE; 3243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 3245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", 3246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4, features[0]); 3247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3251ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3252ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_io_capabilities_req 3253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when LM request for the IO 3255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * capability of the local device and 3256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * if the OOB data is present for the device in the event 3257ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3258ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 32619e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_io_capabilities_req(const RawAddress& p) { 3262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_IO_REQ evt_data; 3263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = 0; 3264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 3265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_orig = true; 3266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t callback_rc = BTM_SUCCESS; 3267899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3268c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski evt_data.bd_addr = p; 32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* setup the default response according to compile options */ 3271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* assume that the local IO capability does not change 3272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * loc_io_caps is initialized with the default value */ 3273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.io_cap = btm_cb.devcb.loc_io_caps; 3274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.oob_data = BTM_OOB_NONE; 3275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req = BTM_DEFAULT_AUTH_REQ; 32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: State: %s", __func__, 3278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state)); 32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_or_alloc_dev(evt_data.bd_addr); 32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", 3283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, btm_cb.security_mode, p_dev_rec->num_read_pages); 32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && 3286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->num_read_pages == 0)) { 3287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: Device security mode is SC only.", 3288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "To continue need to know remote features.", __func__); 32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->remote_features_needed = true; 3291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 |= BTM_SM4_TRUE; 3295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: State: %s Flags: 0x%04x p_cur_service: 0x%08x", 3297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, btm_pair_state_descr(btm_cb.pairing_state), 3298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags, p_dev_rec->p_cur_service); 3299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->p_cur_service) { 3301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x", 3302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_dev_rec->p_cur_service->psm, 3303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service->security_flags); 3304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (btm_cb.pairing_state) { 3307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* initiator connecting */ 3308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_IDLE: 3309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // TODO: Handle Idle pairing state 3310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // security_required = p_dev_rec->security_required; 3311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 3312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* received IO capability response already->acceptor */ 3314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_INCOMING_SSP: 3315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_orig = false; 3316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) { 3318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* acceptor in dedicated bonding */ 3319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 3320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 3322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* initiator, at this point it is expected to be dedicated bonding 3324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson initiated by local device */ 3325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_PIN_REQ: 3326c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (evt_data.bd_addr == btm_cb.pairing_bda) { 3327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 3328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson err_code = HCI_ERR_HOST_BUSY_PAIRING; 3330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 3332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* any other state is unexpected */ 3334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 3335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson err_code = HCI_ERR_HOST_BUSY_PAIRING; 3336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __func__, 3337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state); 3338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 3339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_disabled) { 3342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pairing is not allowed */ 3343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __func__); 3344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (btm_cb.security_mode == BTM_SEC_MODE_SC) { 3346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool local_supports_sc = 3347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson controller_get_interface()->supports_secure_connections(); 3348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* device in Secure Connections Only mode */ 3349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(local_supports_sc) || 3350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_dev_rec->remote_supports_secure_connections)) { 3351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,", 3352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " remote_support_for_sc 0x%02x -> fail pairing", __func__, 3353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson local_supports_sc, 3354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->remote_supports_secure_connections); 3355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (err_code != 0) { 3361b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code); 3362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.is_orig = is_orig; 3366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 3368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* local device initiated the pairing non-bonding -> use p_cur_service */ 3369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 3370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service && 3371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) { 3372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SC) { 3373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* SC only mode device requires MITM protection */ 3374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req = BTM_AUTH_SP_YES; 3375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req = 3377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_MITM) 3378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? BTM_AUTH_SP_YES 3379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_AUTH_SP_NO; 3380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify L2CAP to increase timeout */ 3385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2c_pin_code_request(evt_data.bd_addr); 33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3387c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda = evt_data.bd_addr; 33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3389c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (evt_data.bd_addr == btm_cb.connecting_bda) 3390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 3391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); 3393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = BTM_SUCCESS; 3395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) { 3396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; 3397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* link key upgrade: always use SPGB_YES - assuming we want to save the link 3399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * key */ 3400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req = BTM_AUTH_SPGB_YES; 3401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (btm_cb.api.p_sp_callback) { 3402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the callback function implementation may change the IO capability... */ 3403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = (*btm_cb.api.p_sp_callback)(BTM_SP_IO_REQ_EVT, 3404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SP_EVT_DATA*)&evt_data); 3405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data)) { 3408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) { 3409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req = 3410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT)); 3411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_SC) { 3414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* At this moment we know that both sides are SC capable, device in */ 3415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* SC only mode requires MITM for any service so let's set MITM bit */ 3416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req |= BTM_AUTH_YN_BIT; 3417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 3418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: for device in \"SC only\" mode set auth_req to 0x%02x", __func__, 3419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.auth_req); 3420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if the user does not indicate "reply later" by setting the oob_data to 3423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * unknown */ 3424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send the response right now. Save the current IO capability in the 3425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * control block */ 3426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.loc_auth_req = evt_data.auth_req; 3427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.loc_io_caps = evt_data.io_cap; 3428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s: State: %s IO_CAP:%d oob_data:%d auth_req:%d", 3430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, btm_pair_state_descr(btm_cb.pairing_state), 3431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.io_cap, evt_data.oob_data, evt_data.auth_req); 3432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3433b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap, 3434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.oob_data, evt_data.auth_req); 3435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 34365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 34375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_io_capabilities_rsp 3441ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3442ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when the IO capability of the 3443ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * specified device is received 3444ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3445ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_io_capabilities_rsp(uint8_t* p) { 3449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 3450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_IO_RSP evt_data; 34515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3452b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(evt_data.bd_addr, p); 3453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(evt_data.io_cap, p); 3454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(evt_data.oob_data, p); 3455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(evt_data.auth_req, p); 34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Allocate a new device record or reuse the oldest one */ 3458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_or_alloc_dev(evt_data.bd_addr); 34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If no security is in progress, this indicates incoming security */ 3461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) { 3462c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda = evt_data.bd_addr; 34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_INCOMING_SSP); 34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure we reset the trusted mask to help against attacks */ 3467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 34685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* work around for FW bug */ 3470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_inq_stop_on_ssp(); 3471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 34725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify L2CAP to increase timeout */ 3474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2c_pin_code_request(evt_data.bd_addr); 34755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We must have a device record here. 3477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Use the connecting device's CoD for the connection */ 3478c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (evt_data.bd_addr == btm_cb.connecting_bda) 3479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 3480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* peer sets dedicated bonding bit and we did not initiate dedicated bonding 3482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 3483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state == 3484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */ 3485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && (evt_data.auth_req & 3486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_AUTH_DD_BOND)) /* and dedicated bonding bit is set */ 3487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 3488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD; 3489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save the IO capability in the device record */ 3492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rmt_io_caps = evt_data.io_cap; 3493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rmt_auth_req = evt_data.auth_req; 3494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_sp_callback) 3496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_sp_callback)(BTM_SP_IO_RSP_EVT, 3497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SP_EVT_DATA*)&evt_data); 34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3501ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3502ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_proc_sp_req_evt 3503ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3504ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to process/report 3505ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * HCI_USER_CONFIRMATION_REQUEST_EVT 3506ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * or HCI_USER_PASSKEY_REQUEST_EVT 3507ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * or HCI_USER_PASSKEY_NOTIFY_EVT 3508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_proc_sp_req_evt(tBTM_SP_EVT event, uint8_t* p) { 3513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_ERR_PROCESSING; 3514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_EVT_DATA evt_data; 35159e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress& p_bda = evt_data.cfm_req.bd_addr; 3516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 3517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* All events start with bd_addr */ 3519b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(p_bda, p); 3520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3521c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << " BDA: " << p_bda << " event: 0x" << std::hex << +event 3522c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " State: " << btm_pair_state_descr(btm_cb.pairing_state); 35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3524f9c5752344ec459def74765f512d28fa0f402168Marie Janssen p_dev_rec = btm_find_dev(p_bda); 3525f9c5752344ec459def74765f512d28fa0f402168Marie Janssen if ((p_dev_rec != NULL) && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 3526c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == p_bda)) { 3527c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski evt_data.cfm_req.bd_addr = p_dev_rec->bd_addr; 3528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)evt_data.cfm_req.bd_name, (char*)p_dev_rec->sec_bd_name, 3531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_MAX_REM_BD_NAME_LEN); 35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (event) { 3534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SP_CFM_REQ_EVT: 3535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Numeric confirmation. Need user to conf the passkey */ 3536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); 35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* The device record must be allocated in the "IO cap exchange" step */ 3539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT32(evt_data.cfm_req.num_val, p); 3540f618f83f094fd0ba1af7cf960077e7edae881e69Jack He BTM_TRACE_DEBUG("BTM_SP_CFM_REQ_EVT: num_val: %u", 3541f618f83f094fd0ba1af7cf960077e7edae881e69Jack He evt_data.cfm_req.num_val); 35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.cfm_req.just_works = true; 3544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* process user confirm req in association with the auth_req param */ 35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO) 3547f618f83f094fd0ba1af7cf960077e7edae881e69Jack He if (p_dev_rec->rmt_io_caps == BTM_IO_CAP_UNKNOWN) { 3548f618f83f094fd0ba1af7cf960077e7edae881e69Jack He BTM_TRACE_ERROR( 3549f618f83f094fd0ba1af7cf960077e7edae881e69Jack He "%s did not receive IO cap response prior" 3550f618f83f094fd0ba1af7cf960077e7edae881e69Jack He " to BTM_SP_CFM_REQ_EVT, failing pairing request", 3551f618f83f094fd0ba1af7cf960077e7edae881e69Jack He __func__); 3552f618f83f094fd0ba1af7cf960077e7edae881e69Jack He status = BTM_WRONG_MODE; 3553f618f83f094fd0ba1af7cf960077e7edae881e69Jack He BTM_ConfirmReqReply(status, p_bda); 3554f618f83f094fd0ba1af7cf960077e7edae881e69Jack He return; 3555f618f83f094fd0ba1af7cf960077e7edae881e69Jack He } 3556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) && 3557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) && 3558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || 3559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES))) { 3560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Both devices are DisplayYesNo and one or both devices want to 3561f618f83f094fd0ba1af7cf960077e7edae881e69Jack He authenticate -> use authenticated link key */ 3562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.cfm_req.just_works = false; 3563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 3566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth " 3567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "loc:%d, rmt:%d", 3568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, 3569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rmt_io_caps, btm_cb.devcb.loc_auth_req, 3570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rmt_auth_req); 35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req; 3573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req; 3574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps; 3575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps; 3576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SP_KEY_NOTIF_EVT: 3579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Passkey notification (other side is a keyboard) */ 3580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT32(evt_data.key_notif.passkey, p); 3581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_SP_KEY_NOTIF_EVT: passkey: %u", 3582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.key_notif.passkey); 35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 3585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 3588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SP_KEY_REQ_EVT: 3589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* HCI_USER_PASSKEY_REQUEST_EVT */ 3590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_KEY_ENTRY); 3591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_sp_callback) { 35968e89469b5e223a48e1915f16862e81a3f4581259Myles Watson status = (*btm_cb.api.p_sp_callback)(event, &evt_data); 3597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_NOT_AUTHORIZED) { 35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req 3601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * right now */ 3602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if ((event == BTM_SP_CFM_REQ_EVT) && 3603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (evt_data.cfm_req.just_works == true)) { 3604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* automatically reply with just works if no sp_cback */ 3605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_SUCCESS; 36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (event == BTM_SP_CFM_REQ_EVT) { 3609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("calling BTM_ConfirmReqReply with status: %d", status); 3610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ConfirmReqReply(status, p_bda); 36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 3613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (event == BTM_SP_KEY_REQ_EVT) { 3614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_PasskeyReqReply(status, p_bda, 0); 36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Something bad. we can only fail this connection */ 3621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 3622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SP_CFM_REQ_EVT == event) { 3624b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_conf_reply(p_bda, false); 3625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (BTM_SP_KEY_NOTIF_EVT == event) { 3626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do nothing -> it very unlikely to happen. 3627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson This event is most likely to be received by a HID host when it first 3628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson connects to a HID device. 3629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson Usually the Host initiated the connection in this case. 3630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson On Mobile platforms, if there's a security process happening, 3631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson the host probably can not initiate another connection. 3632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTW (PC) is another story. */ 3633f9c5752344ec459def74765f512d28fa0f402168Marie Janssen p_dev_rec = btm_find_dev(p_bda); 3634f9c5752344ec459def74765f512d28fa0f402168Marie Janssen if (p_dev_rec != NULL) { 3635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_disconnect(p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE); 3636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 3639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 3640b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_passkey_neg_reply(p_bda); 3641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif 36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3646ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3647ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_keypress_notif_evt 3648ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3649ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a key press notification is 3650ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * received 3651ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3652ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3653ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3654ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_keypress_notif_evt(uint8_t* p) { 3656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_KEYPRESS evt_data; 36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* parse & report BTM_SP_KEYPRESS_EVT */ 3659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_sp_callback) { 36609e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress& p_bda = evt_data.bd_addr; 36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3662b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(p_bda, p); 3663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.notif_type = *p; 36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_sp_callback)(BTM_SP_KEYPRESS_EVT, 3666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SP_EVT_DATA*)&evt_data); 3667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_simple_pair_complete 3673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3674ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when simple pairing process is 3675ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * complete 3676ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3677ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3678ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3679ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_simple_pair_complete(uint8_t* p) { 3681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_COMPLT evt_data; 3682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 3683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t status; 3684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool disc = false; 3685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = *p++; 3687b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(evt_data.bd_addr, p); 3688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(evt_data.bd_addr); 3690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 3691c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(ERROR) << __func__ << " with unknown BDA: " << evt_data.bd_addr; 3692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 3696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u", 3697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state); 36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.status = BTM_ERR_PROCESSING; 3700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_SUCCESS) { 3701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.status = BTM_SUCCESS; 3702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 3703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_ERR_PAIRING_NOT_ALLOWED) { 3705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* The test spec wants the peer device to get this failure code. */ 3706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_DISCONNECT); 3707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Change the timer to 1 second */ 370947616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski alarm_set_on_mloop(btm_cb.pairing_timer, BT_1SEC_TIMEOUT_MS, 371047616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski btm_sec_pairing_timeout, NULL); 3711c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski } else if (btm_cb.pairing_bda == evt_data.bd_addr) { 3712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* stop the timer */ 3713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(btm_cb.pairing_timer); 3714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) { 3716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the initiating side: will receive auth complete event. disconnect ACL 3717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * at that time */ 3718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson disc = true; 3719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 3721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson disc = true; 3722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Let the pairing state stay active, p_auth_complete_callback will report the 3725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * failure */ 3726c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski evt_data.bd_addr = p_dev_rec->bd_addr; 3727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 3728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_sp_callback) 3730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_sp_callback)(BTM_SP_COMPLT_EVT, 3731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SP_EVT_DATA*)&evt_data); 3732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (disc) { 3734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* simple pairing failed */ 3735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Avoid sending disconnect on HCI_ERR_PEER_USER */ 3736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status != HCI_ERR_PEER_USER) && 3737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) { 3738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE, 3739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle); 3740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_rem_oob_req 3747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to process/report 3749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * HCI_REMOTE_OOB_DATA_REQUEST_EVT 3750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3751ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3753ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_rem_oob_req(uint8_t* p) { 3755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_RMT_OOB evt_data; 3756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 3757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET16 c; 3758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET16 r; 37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37609e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress& p_bda = evt_data.bd_addr; 37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3762b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(p_bda, p); 37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3764c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << " BDA: " << p_bda; 3765f9c5752344ec459def74765f512d28fa0f402168Marie Janssen p_dev_rec = btm_find_dev(p_bda); 3766f9c5752344ec459def74765f512d28fa0f402168Marie Janssen if ((p_dev_rec != NULL) && btm_cb.api.p_sp_callback) { 3767c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski evt_data.bd_addr = p_dev_rec->bd_addr; 3768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 3769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)evt_data.bd_name, (char*)p_dev_rec->sec_bd_name, 3770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_MAX_REM_BD_NAME_LEN); 3771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); 3773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((*btm_cb.api.p_sp_callback)(BTM_SP_RMT_OOB_EVT, 3774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SP_EVT_DATA*)&evt_data) == 3775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_NOT_AUTHORIZED) { 3776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_RemoteOobDataReply(true, p_bda, c, r); 37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* something bad. we can only fail this connection */ 3782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 3783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rem_oob_neg_reply(p_bda); 37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_read_local_oob_complete 3789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when read local oob data is 3791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * completed by the LM 3792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3793ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3794ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3795ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_read_local_oob_complete(uint8_t* p) { 3797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SP_LOC_OOB evt_data; 3798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t status = *p++; 3799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_read_local_oob_complete:%d", status); 3801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_SUCCESS) { 3802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.status = BTM_SUCCESS; 3803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY16(evt_data.c, p); 3804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY16(evt_data.r, p); 3805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 3806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.status = BTM_ERR_PROCESSING; 38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38088e89469b5e223a48e1915f16862e81a3f4581259Myles Watson if (btm_cb.api.p_sp_callback) { 38098e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tBTM_SP_EVT_DATA btm_sp_evt_data; 38108e89469b5e223a48e1915f16862e81a3f4581259Myles Watson btm_sp_evt_data.loc_oob = evt_data; 38118e89469b5e223a48e1915f16862e81a3f4581259Myles Watson (*btm_cb.api.p_sp_callback)(BTM_SP_LOC_OOB_EVT, &btm_sp_evt_data); 38128e89469b5e223a48e1915f16862e81a3f4581259Myles Watson } 38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3816ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3817ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_auth_collision 3818ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3819ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when authentication or encryption 3820ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * needs to be retried at a later time. 3821ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3822ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3823ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3824ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_auth_collision(uint16_t handle) { 3826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 3827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.collision_start_time) 3829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.collision_start_time = time_get_os_boottime_ms(); 3830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((time_get_os_boottime_ms() - btm_cb.collision_start_time) < 3832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.max_collision_delay) { 3833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (handle == BTM_SEC_INVALID_HANDLE) { 3834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_find_dev_by_sec_state(BTM_SEC_STATE_AUTHENTICATING); 3835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) 3836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_find_dev_by_sec_state(BTM_SEC_STATE_ENCRYPTING); 3837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 3838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev_by_handle(handle); 3839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 3841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 3842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sec_auth_collision: state %d (retrying in a moment...)", 3843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state); 3844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We will restart authentication after timeout */ 3845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || 3846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) 3847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = 0; 3848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_collided_dev_rec = p_dev_rec; 385047616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski alarm_set_on_mloop(btm_cb.sec_collision_timer, BT_1SEC_TIMEOUT_MS, 385147616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski btm_sec_collision_timeout, NULL); 3852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38568fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra/****************************************************************************** 38578fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * 38588fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * Function btm_sec_auth_retry 38598fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * 38608fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * Description This function is called when authentication or encryption 38618fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * needs to be retried at a later time. 38628fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * 38638fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * Returns TRUE if a security retry required 38648fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra * 38658fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra *****************************************************************************/ 38668fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishrastatic bool btm_sec_auth_retry(uint16_t handle, uint8_t status) { 38678fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle); 38688fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra if (!p_dev_rec) return false; 38698fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra 38708fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra /* keep the old sm4 flag and clear the retry bit in control block */ 38718fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra uint8_t old_sm4 = p_dev_rec->sm4; 38728fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra p_dev_rec->sm4 &= ~BTM_SM4_RETRY; 38738fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra 38748fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra if ((btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) && 38758fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra ((old_sm4 & BTM_SM4_RETRY) == 0) && (HCI_ERR_KEY_MISSING == status) && 38768fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra BTM_SEC_IS_SM4(p_dev_rec->sm4)) { 38778fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra /* This retry for missing key is for Lisbon or later only. 38788fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra Legacy device do not need this. the controller will drive the retry 38798fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra automatically 38808fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra set the retry bit */ 38818fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra btm_cb.collision_start_time = 0; 38828fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra btm_restore_mode(); 38838fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra p_dev_rec->sm4 |= BTM_SM4_RETRY; 38848fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 38858fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra BTM_TRACE_DEBUG("%s Retry for missing key sm4:x%x sec_flags:0x%x", __func__, 38868fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra p_dev_rec->sm4, p_dev_rec->sec_flags); 38878fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra 38888fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra /* With BRCM controller, we do not need to delete the stored link key in 38898fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra controller. 38908fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra If the stack may sit on top of other controller, we may need this 38918fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra BTM_DeleteStoredLinkKey (bd_addr, NULL); */ 38928fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 38938fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra btm_sec_execute_procedure(p_dev_rec); 38948fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra return true; 38958fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra } 38968fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra 38978fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra return false; 38988fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra} 38998fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra 39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3901ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3902ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_auth_complete 3903ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3904ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is when authentication of the connection is 3905ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * completed by the LM 3906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 3908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_auth_complete(uint16_t handle, uint8_t status) { 3911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 3912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle); 3913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool are_bonding = false; 3914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 3916c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << "Security Manager: in state: " 3917c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << btm_pair_state_descr(btm_cb.pairing_state) 3918c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " handle:" << handle << " status:" << status 3919c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << "dev->sec_state:" << p_dev_rec->sec_state 3920c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " bda:" << p_dev_rec->bd_addr 3921c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << "RName:" << p_dev_rec->sec_bd_name; 3922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 3923c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << "Security Manager: in state: " 3924c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << btm_pair_state_descr(btm_cb.pairing_state) 3925c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " handle:" << handle << " status:" << status; 3926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* For transaction collision we need to wait and repeat. There is no need */ 3929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* for random timeout because only slave should receive the result */ 3930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || 3931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) { 3932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_auth_collision(handle); 3933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 39348fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra } else if (btm_sec_auth_retry(handle, status)) { 39358fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra return; 3936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 39378fb48ca4a0fddda6caf367d8a7de7ca56d571c3cMatadeen Mishra 3938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.collision_start_time = 0; 39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_restore_mode(); 39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if connection was made just to do bonding. If we authenticate 3943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson the connection that is up, this is the last event received. 3944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 3945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 3946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) { 3947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_start_post_bond_timer(p_dev_rec->hci_handle); 3950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) return; 39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 3955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 3956c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (p_dev_rec->bd_addr == btm_cb.pairing_bda)) 3957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson are_bonding = true; 39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 3960c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (p_dev_rec->bd_addr == btm_cb.pairing_bda)) 3961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) { 3964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS) && 3965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (old_state != BTM_PAIR_STATE_IDLE)) { 3966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr, 3967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->dev_class, 3968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, status); 39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* There can be a race condition, when we are starting authentication and 3974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** the peer device is doing encryption. 3975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** If first we receive encryption change up, then initiated authentication 3976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** can not be performed. According to the spec we can not do authentication 3977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** on the encrypted link, so device is correct. 3978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 3979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status == HCI_ERR_COMMAND_DISALLOWED) && 3980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) == 3981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) { 3982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = HCI_SUCCESS; 3983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Currently we do not notify user if it is a keyboard which connects */ 3985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* User probably Disabled the keyboard while it was asleap. Let her try */ 3986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) { 3987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* report the suthentication status */ 3988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((old_state != BTM_PAIR_STATE_IDLE) || (status != HCI_SUCCESS)) 3989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr, 3990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->dev_class, 3991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, status); 3992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 3995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this is a bonding procedure can disconnect the link now */ 3997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (are_bonding) { 3998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 3999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS) { 4001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((status != HCI_ERR_PEER_USER) && 4002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))) 4003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, 4004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle); 4005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL"); 4007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->new_encryption_key_is_p256 && 4008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_sec_use_smp_br_chnl(p_dev_rec)) 4009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* no LE keys are available, do deriving */ 4010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) || 4011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* or BR key is higher security than existing LE keys */ 4012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) && 4013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) { 4014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 4015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "link encrypted afer dedic bonding can use SMP_BR_CHNL"); 4016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_sec_is_master(p_dev_rec)) { 4018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // Encryption is required to start SM over BR/EDR 4019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // indicate that this is encryption after authentication 4020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL, 4021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0); 4022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_start_post_bond_timer(p_dev_rec->hci_handle); 40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If authentication failed, notify the waiting layer */ 4031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS) { 4032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false); 40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) { 4035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE, 4036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle); 40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->pin_code_length >= 16 || 4044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // If we have MITM protection we have a higher level of security than 4047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // provided by 16 digits PIN 4048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4050818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 4051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Authentication succeeded, execute the next security procedure, if any */ 4052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = btm_sec_execute_procedure(p_dev_rec); 40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is no next procedure, or procedure failed to start, notify the 4055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * caller */ 4056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) 4057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, status, false); 40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4061ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4062ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_encrypt_change 4063ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4064ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is when encryption of the connection is 4065ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * completed by the LM 4066ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4067ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 4068ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4069ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 4070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_encrypt_change(uint16_t handle, uint8_t status, 4071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t encr_enable) { 4072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle); 4073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl = NULL; 4074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t acl_idx = btm_handle_to_acl_index(handle); 4075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 4076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: encrypt_change status:%d State:%d, encr_enable = %d", 4077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable); 4078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("before update p_dev_rec->sec_flags=0x%x", 4079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec) ? p_dev_rec->sec_flags : 0); 4080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* For transaction collision we need to wait and repeat. There is no need */ 4082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* for random timeout because only slave should receive the result */ 4083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || 4084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) { 4085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_auth_collision(handle); 4086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.collision_start_time = 0; 40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) return; 40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status == HCI_SUCCESS) && encr_enable) { 4093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->hci_handle == handle) { 4094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED); 4095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->pin_code_length >= 16 || 4096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); 41027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 4103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* It is possible that we decrypted the link to perform role switch */ 4106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* mark link not to be encrypted, so that when we execute security next time 4107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * it will kick in again */ 4108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status == HCI_SUCCESS) && !encr_enable) { 4109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->hci_handle == handle) 4110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED; 4111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 4112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED; 4113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("after update p_dev_rec->sec_flags=0x%x", 4116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags); 4117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (acl_idx != MAX_L2CAP_LINKS) p_acl = &btm_cb.acl_db[acl_idx]; 4119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl != NULL) 4121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_check_pending_enc_req(p_dev_rec, p_acl->transport, encr_enable); 4122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl && p_acl->transport == BT_TRANSPORT_LE) { 4124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE || 4125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) { 4126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_KNOWN); 4127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 4128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable); 4130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BR/EDR connection, update the encryption key size to be 16 as always */ 4133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->enc_key_size = 16; 4134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("in %s new_encr_key_256 is %d", __func__, 4137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->new_encryption_key_is_p256); 4138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status == HCI_SUCCESS) && encr_enable && 4140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->hci_handle == handle)) { 4141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if BR key is temporary no need for LE LTK derivation */ 4142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool derive_ltk = true; 4143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->rmt_auth_req == BTM_AUTH_SP_NO && 4144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.loc_auth_req == BTM_AUTH_SP_NO) { 4145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson derive_ltk = false; 4146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: BR key is temporary, skip derivation of LE LTK", 4147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 4148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->new_encryption_key_is_p256) { 4150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_sec_use_smp_br_chnl(p_dev_rec) && btm_sec_is_master(p_dev_rec) && 4151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if LE key is not known, do deriving */ 4152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) || 4153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* or BR key is higher security than existing LE keys */ 4154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) && 4155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))) && 4156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson derive_ltk) { 4157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BR/EDR is encrypted with LK that can be used to derive LE LTK */ 4158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->new_encryption_key_is_p256 = false; 4159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->no_smp_on_br) { 4161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s NO SM over BR/EDR", __func__); 4162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s start SM over BR/EDR", __func__); 4164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_BR_PairWith(p_dev_rec->bd_addr); 41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // BR/EDR is successfully encrypted. Correct LK type if needed 4169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // (BR/EDR LK derived from LE LTK was used for encryption) 4170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((encr_enable == 1) && /* encryption is ON for SSP */ 4171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* LK type is for BR/EDR SC */ 4172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || 4173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 4174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) 4175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; 4176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ 4177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB; 4178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("updated link key type to %d", 4180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type); 4181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_send_link_key_notif(p_dev_rec); 4182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this encryption was started by peer do not need to do anything */ 4187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) { 4188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) { 4189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 4190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = NULL; 4191c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski l2cu_resubmit_pending_sec_req(&p_dev_rec->bd_addr); 41925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 41955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 4197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If encryption setup failed, notify the waiting layer */ 4198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS) { 4199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false); 4200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Encryption setup succeeded, execute the next security procedure, if any */ 4204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = (uint8_t)btm_sec_execute_procedure(p_dev_rec); 4205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is no next procedure, or procedure failed to start, notify the 4206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * caller */ 4207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) 4208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, status, false); 42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_connect_after_reject_timeout 4214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 42159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Connection for bonding could not start because of the 42169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * collision. Initiate outgoing connection 4217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the TLE struct 4219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 4221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_connect_after_reject_timeout(UNUSED_ATTR void* data) { 4222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_cb.p_collided_dev_rec; 42235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s", __func__); 4225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_collided_dev_rec = 0; 42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { 4228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("Security Manager: %s: failed to start connection", 4229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 42305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 42325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) 4234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 4235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 4236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ERR_MEMORY_FULL); 4237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 42385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_connected 4243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is when a connection to the peer device is 4245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * establsihed 4246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 4248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 42509e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_connected(const RawAddress& bda, uint16_t handle, uint8_t status, 4251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t enc_mode) { 4252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda); 4253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t res; 4254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_pairing_device = false; 4255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl_cb; 4256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t bit_shift = 0; 4257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_resubmit_page(); 4259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 4261c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << "Security Manager: in state: " 4262c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << btm_pair_state_descr(btm_cb.pairing_state) 4263c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " handle:" << handle << " status:" << status 4264c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << "enc_mode:" << enc_mode << " bda:" << bda 4265c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << "RName:" << p_dev_rec->sec_bd_name; 4266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4267c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << "Security Manager: in state: " 4268c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << btm_pair_state_descr(btm_cb.pairing_state) 4269c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " handle:" << handle << " status:" << status 4270c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << "enc_mode:" << enc_mode << " bda:" << bda; 4271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 4274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* There is no device record for new connection. Allocate one */ 4275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_SUCCESS) { 4276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_alloc_dev(bda); 4277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the device matches with stored paring address 4279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * reset the paring state to idle */ 4280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 4281c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda == bda) { 4282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 42845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* can not find the device record and the status is error, 4286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * just ignore it */ 4287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Update the timestamp for this device */ 4290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 4291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 : 0; 4292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->timestamp = btm_cb.dev_rec_count++; 4293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) { 4294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* tell L2CAP it's a bonding connection. */ 4295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 4296c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == p_dev_rec->bd_addr) && 4297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) { 4298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if incoming connection failed while pairing, then try to connect and 4299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * continue */ 4300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Motorola S9 disconnects without asking pin code */ 4301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status != HCI_SUCCESS) && 4302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) { 4303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 4304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: btm_sec_connected: incoming connection failed " 4305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "without asking PIN"); 4306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 4308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) { 4309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Start timer with 0 to initiate connection with new LCB */ 4310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* because L2CAP will delete current LCB with this event */ 4311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_collided_dev_rec = p_dev_rec; 431247616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski alarm_set_on_mloop(btm_cb.sec_collision_timer, 0, 431347616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski btm_sec_connect_after_reject_timeout, NULL); 4314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); 43168bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He if (BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, 43178bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BT_TRANSPORT_BR_EDR) != 43188bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_CMD_STARTED) { 43198bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_TRACE_ERROR("%s cannot read remote name", __func__); 43208bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 43218bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He } 4322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4323d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_DISC_DURING_RS == TRUE) 4324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, true); 43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* always clear the pending flag */ 4332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR; 43377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4338d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_DISC_DURING_RS == TRUE) 4339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 4345c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == bda)) { 4346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if we rejected incoming connection from bonding device */ 4347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((status == HCI_ERR_HOST_REJECT_DEVICE) && 4348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) { 4349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 4350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, " 4351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "sm4: 0x%x", 4352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags, p_dev_rec->sm4); 4353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; 4355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { 4356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 4357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); 43588bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He if (BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR) != 43598bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_CMD_STARTED) { 43608bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_TRACE_ERROR("%s cannot read remote name", __func__); 43618bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 43628bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He } 4363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4365ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if we already have pin code */ 4367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) { 4368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Start timer with 0 to initiate connection with new LCB */ 4369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* because L2CAP will delete current LCB with this event */ 4370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.p_collided_dev_rec = p_dev_rec; 437147616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski alarm_set_on_mloop(btm_cb.sec_collision_timer, 0, 437247616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski btm_sec_connect_after_reject_timeout, NULL); 4373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* wait for incoming connection without resetting pairing state */ 4378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (status == HCI_ERR_CONNECTION_EXISTS) { 4379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 4380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Security Manager: btm_sec_connected: Wait for incoming connection"); 4381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_pairing_device = true; 4385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If connection was made to do bonding restore link security if changed */ 4388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_restore_mode(); 43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if connection fails during pin request, notify application */ 4391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS) { 4392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If connection failed because of during pairing, need to tell user */ 4393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_pairing_device) { 4394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 4395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 4396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift); 4397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("security_required:%x ", p_dev_rec->security_required); 43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We need to notify host that the key is not known any more */ 4402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) { 4403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr, 4404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->dev_class, 4405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, status); 4406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 4409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson Do not send authentication failure, if following conditions hold good 4410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1. BTM Sec Pairing state is idle 4411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2. Link key for the remote device is present. 4412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 3. Remote is SSP capable. 4413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 4414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) && 4415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((status == HCI_ERR_AUTH_FAILURE) || 4416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_KEY_MISSING) || 4417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_HOST_REJECT_SECURITY) || 4418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_PAIRING_NOT_ALLOWED) || 4419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_UNIT_KEY_USED) || 4420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || 4421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || 4422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_ERR_REPEATED_ATTEMPTS)))) { 4423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 4424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift); 44255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#ifdef BRCM_NOT_4_BTE 4427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we rejected pairing, pass this special result code */ 4428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) { 4429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = HCI_ERR_HOST_REJECT_SECURITY; 4430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif 44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We need to notify host that the key is not known any more */ 4434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) { 4435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr, 4436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->dev_class, 4437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, status); 4438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_ERR_CONNECTION_TOUT || 4442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status == HCI_ERR_LMP_RESPONSE_TIMEOUT || 4443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT) 4444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_DEVICE_TIMEOUT, false); 4445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 4446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false); 44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If initiated dedicated bonding, return the link key now, and initiate 4452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * disconnect */ 4453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If dedicated bonding, and we now have a link key, we are all done */ 4454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_pairing_device && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) { 4455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->link_key_not_sent) { 4456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_not_sent = false; 4457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_send_link_key_notif(p_dev_rec); 44585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* remember flag before it is initialized */ 4463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 4464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res = true; 4465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 4466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res = false; 44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) 4469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 4470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 4471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_SUCCESS); 4472818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 4473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res) { 4476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Let l2cap start bond timer */ 4477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, true); 44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle = handle; 4484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* role may not be correct here, it will be updated by l2cap, but we need to 4486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 4487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* notify btm_acl that link is up, so starting of rmt name request will not */ 4488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set paging flag up */ 4489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR); 4490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl_cb) { 4491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT 4492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * event */ 4493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_BYPASS_EXTRA_ACL_SETUP == FALSE) 4494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* For now there are a some devices that do not like sending */ 4495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* commands events and data at the same time. */ 4496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set the packet types to the default allowed by the device */ 4497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported); 4498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_def_link_policy) 4500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); 4501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif 4502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_created(bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, 4504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR); 4505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initialize security flags. We need to do that because some */ 4507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* authorization complete could have come after the connection is dropped */ 4508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* and that would set wrong flag that link has been authorized already */ 4509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | 4510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) 4511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson << bit_shift); 4512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (enc_mode != HCI_ENCRYPT_MODE_DISABLED) 4514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= 4515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift); 4516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode == BTM_SEC_MODE_LINK) 4518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift); 4519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->pin_code_length >= 16 || 4521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift); 4524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_changed = false; 4527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* After connection is established we perform security if we do not know */ 4529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the name, or if we are originator because some procedure can have */ 4530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* been scheduled while connection was down */ 4531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("is_originator:%d ", p_dev_rec->is_originator); 4532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || 4533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->is_originator) { 4534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res = btm_sec_execute_procedure(p_dev_rec); 4535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_CMD_STARTED) 4536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, res, false); 4537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 45395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_disconnect 4544ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4545ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to disconnect HCI link 4546ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4547ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns btm status 4548ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 4550911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS btm_sec_disconnect(uint16_t handle, uint8_t reason) { 4551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle); 4552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* In some weird race condition we may not have a record */ 4554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 4555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_disconnect(handle, reason); 4556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 4557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we are in the process of bonding we need to tell client that auth failed 4560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 4561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 4562c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == p_dev_rec->bd_addr) && 4563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) { 4564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we are currently doing bonding. Link will be disconnected when done */ 4565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 4566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_BUSY); 4567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_sec_send_hci_disconnect(p_dev_rec, reason, handle)); 45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_disconnected 4575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4576ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is when a connection to the peer device is 4577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * dropped 4578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 4580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * 4581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ******************************************************************************/ 4582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_disconnected(uint16_t handle, uint8_t reason) { 4583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle); 4584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t old_pairing_flags = btm_cb.pairing_flags; 4585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int result = HCI_ERR_AUTH_FAILURE; 4586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback = NULL; 4587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If page was delayed for disc complete, can do it now */ 4590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.discing = false; 45917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_resubmit_page(); 45935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) return; 4595ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson transport = 4597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR : BT_TRANSPORT_LE; 4598ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4600ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_DISC_DURING_RS == TRUE) 4602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LOG_INFO(LOG_TAG, "%s clearing pending flag handle:%d reason:%d", __func__, 4603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle, reason); 4604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif 4606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear unused flags */ 4608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 &= BTM_SM4_TRUE; 4609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4610c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << " bd_addr: " << p_dev_rec->bd_addr 4611c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " name: " << p_dev_rec->sec_bd_name 4612c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " state: " << btm_pair_state_descr(btm_cb.pairing_state) 4613c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " reason: " << reason << " sec_req: " << std::hex 4614c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << p_dev_rec->security_required; 4615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, 4617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags); 4618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we are in the process of bonding we need to tell client that auth failed 4620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 4621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 4622c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == p_dev_rec->bd_addr)) { 4623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 4625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) { 4626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the disconnection reason is REPEATED_ATTEMPTS, 4627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson send this error message to complete callback function 4628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson to display the error message of Repeated attempts. 4629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson All others, send HCI_ERR_AUTH_FAILURE. */ 4630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (reason == HCI_ERR_REPEATED_ATTEMPTS) { 4631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = HCI_ERR_REPEATED_ATTEMPTS; 4632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { 4633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = HCI_ERR_HOST_REJECT_SECURITY; 4634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr, 4636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->dev_class, 4637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, result); 4638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4641c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, &p_dev_rec->bd_addr, 4642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_SUCCESS); 4643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* see sec_flags processing in btm_acl_removed */ 4644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_LE) { 4646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE; 4647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); 4648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->enc_key_size = 0; 4649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE; 4651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 4652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | 4653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED); 4654a6fae171647f1ac0f3b85c87bb4cbca1070e7156Myles Watson 4655a6fae171647f1ac0f3b85c87bb4cbca1070e7156Myles Watson // Remove temporary key. 4656a6fae171647f1ac0f3b85c87bb4cbca1070e7156Myles Watson if (p_dev_rec->bond_type == BOND_TYPE_TEMPORARY) 4657a6fae171647f1ac0f3b85c87bb4cbca1070e7156Myles Watson p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN); 4658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4660a6fae171647f1ac0f3b85c87bb4cbca1070e7156Myles Watson BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, 4661a6fae171647f1ac0f3b85c87bb4cbca1070e7156Myles Watson p_dev_rec->sec_flags); 4662a6fae171647f1ac0f3b85c87bb4cbca1070e7156Myles Watson 4663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) { 4664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) 4665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? BTM_SEC_STATE_DISCONNECTING 4666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_SEC_STATE_DISCONNECTING_BLE; 4667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 4670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required = BTM_SEC_NONE; 4671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_callback = p_dev_rec->p_callback; 4673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if security is pending, send callback to clean up the security state */ 4675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_callback) { 4676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = 4677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL; /* when the peer device time out the authentication before 4678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson we do, this call back must be reset here */ 4679c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, 4680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ERR_PROCESSING); 4681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4685ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_link_key_notification 4687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4688ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a new connection link key is 4689ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * generated 4690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 4692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 46949e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_link_key_notification(const RawAddress& p_bda, uint8_t* p_link_key, 46959e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski uint8_t key_type) { 4696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_or_alloc_dev(p_bda); 4697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool we_are_bonding = false; 4698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool ltk_derived_lk = false; 4699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4700c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << " BDA: " << p_bda << ", TYPE: " << +key_type; 4701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) && 4703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (key_type <= 4704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 4705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ltk_derived_lk = true; 4706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type -= BTM_LTK_DERIVED_LKEY_OFFSET; 4707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If connection was made to do bonding restore link security if changed */ 4709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_restore_mode(); 4710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (key_type != BTM_LKEY_TYPE_CHANGED_COMB) 4712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type = key_type; 4713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 4715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 4717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Until this point in time, we do not know if MITM was enabled, hence we 4718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * add the extended security flag here. 4719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 4720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->pin_code_length >= 16 || 4721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BR/EDR connection, update the encryption key size to be 16 as always */ 4727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->enc_key_size = 16; 4728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_dev_rec->link_key, p_link_key, LINK_KEY_LEN); 4729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 4731c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.pairing_bda == p_bda)) { 4732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 4733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson we_are_bonding = true; 4734444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 4735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save LTK derived LK no matter what */ 4739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ltk_derived_lk) { 4740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_link_key_callback) { 4741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() Save LTK derived LK (key_type = %d)", __func__, 4742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type); 4743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_link_key_callback)(p_bda, p_dev_rec->dev_class, 4744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, p_link_key, 4745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type); 4746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) || 4749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 4750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->new_encryption_key_is_p256 = true; 4751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s set new_encr_key_256 to %d", __func__, 4752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->new_encryption_key_is_p256); 4753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If name is not known at this point delay calling callback until the name is 4757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 4758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* resolved. Unless it is a HID Device and we really need to send all link 4759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * keys. */ 4760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) && 4761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != 4762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_COD_MAJOR_PERIPHERAL)) && 4763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !ltk_derived_lk) { 4764c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << " Delayed BDA: " << p_bda << " Type:" << +key_type; 4765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_not_sent = true; 4767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If it is for bonding nothing else will follow, so we need to start name 4769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * resolution */ 4770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (we_are_bonding) { 4771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rmt_name_req(p_bda, HCI_PAGE_SCAN_REP_MODE_R1, 4772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_MANDATARY_PAGE_SCAN_MODE, 0); 4773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", 4776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, 4777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->dev_class[1]) 4778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If its not us who perform authentication, we should tell stackserver */ 4782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* that some authentication has been completed */ 4783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* This is required when different entities receive link notification and auth 4784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * complete */ 4785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE) 4786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* for derived key, always send authentication callback for BR channel */ 4787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson || ltk_derived_lk) { 4788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) 4789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 4790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 4791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_SUCCESS); 4792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* We will save link key only if the user authorized it - BTE report link key in 4795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * all cases */ 47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE 4797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED) 47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 4800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_link_key_callback) { 4801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ltk_derived_lk) { 4802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 4803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sec_link_key_notification() LTK derived LK is saved already" 4804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " (key_type = %d)", 4805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type); 4806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 4807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_link_key_callback)(p_bda, p_dev_rec->dev_class, 4808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_bd_name, p_link_key, 4809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type); 4810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 48115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4816ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4817ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_link_key_request 4818ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4819ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when controller requests link key 4820ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4821ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 4822ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4823ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 48249e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_link_key_request(const RawAddress& bda) { 4825c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_SEC_DEV_REC* p_dev_rec = btm_find_or_alloc_dev(bda); 4826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4827c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << " bda: " << bda; 4828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) && 4830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.collision_start_time != 0) && 4831c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (btm_cb.p_collided_dev_rec->bd_addr == bda)) { 4832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 4833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sec_link_key_request() rejecting link key req " 4834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "State: %d START_TIMEOUT : %d", 4835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state, btm_cb.collision_start_time); 4836c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btsnd_hcic_link_key_neg_reply(bda); 4837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) { 4840c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btsnd_hcic_link_key_req_reply(bda, p_dev_rec->link_key); 4841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 48435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify L2CAP to increase timeout */ 4845c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski l2c_pin_code_request(bda); 48465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* The link key is not in the database and it is not known to the manager */ 4848c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btsnd_hcic_link_key_neg_reply(bda); 48495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 48505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_pairing_timeout 4854ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when host does not provide PIN 4856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * within requested time 4857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the TLE struct 4859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 4861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_pairing_timeout(UNUSED_ATTR void* data) { 4862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 4863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 48645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE) 4865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; 48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_YES; 48685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t name[2]; 4870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(p_cb->pairing_bda); 4872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s State: %s Flags: %u", __func__, 4874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(p_cb->pairing_state), 4875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->pairing_flags); 4876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->pairing_state) { 4878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_PIN_REQ: 4879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_bond_cancel_complete(); 4880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_LOCAL_PIN: 4883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) 4884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_neg_reply(p_cb->pairing_bda); 4885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We need to notify the UI that no longer need the PIN */ 4887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) { 4888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 4889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson name[0] = 0; 4890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)(p_cb->pairing_bda, NULL, name, 4891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ERR_CONNECTION_TOUT); 4892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 4893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 4894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 4895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ERR_CONNECTION_TOUT); 4896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 48985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: 4900b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_conf_reply(p_cb->pairing_bda, false); 4901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 4902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 49035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 4905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_KEY_ENTRY: 4906b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); 4907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 4908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 49095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */ 49105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: 4912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 4913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson auth_req |= BTM_AUTH_DD_BOND; 4914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4915b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski btsnd_hcic_io_cap_req_reply(p_cb->pairing_bda, btm_cb.devcb.loc_io_caps, 4916b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski BTM_OOB_NONE, auth_req); 4917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: 4921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rem_oob_neg_reply(p_cb->pairing_bda); 4922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_DISCONNECT: 4926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* simple pairing failed. Started a 1-sec timer at simple pairing 4927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * complete. 4928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * now it's time to tear down the ACL link*/ 4929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 4930c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(ERROR) << __func__ 4931c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: " 4932c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << p_cb->pairing_bda; 4933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE, 4936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle); 4937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: 4941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_GET_REM_NAME: 4942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We need to notify the UI that timeout has happened while waiting for 4943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * authentication*/ 4944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_auth_complete_callback) { 4946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 4947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson name[0] = 0; 4948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)(p_cb->pairing_bda, NULL, name, 4949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ERR_CONNECTION_TOUT); 4950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 4951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_auth_complete_callback)( 4952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 4953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ERR_CONNECTION_TOUT); 4954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 4958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s not processed state: %s", __func__, 4959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state)); 4960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4966ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_pin_code_request 4968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when controller requests PIN code 4970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 4972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 49749e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_sec_pin_code_request(const RawAddress& p_bda) { 4975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 4976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 4977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4978c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(2) << __func__ << " BDA: " << p_bda 4979c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " state: " << btm_pair_state_descr(btm_cb.pairing_state); 4980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) { 4982c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if ((p_bda == btm_cb.pairing_bda) && 4983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE)) { 4984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_neg_reply(p_bda); 4985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) || 49875f6ecfac764e2fd95fe266b2c25f9fafa4a4e405Jack He p_bda != btm_cb.pairing_bda) { 4988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("btm_sec_pin_code_request() rejected - state: %s", 4989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state)); 4990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_neg_reply(p_bda); 4991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 4992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_or_alloc_dev(p_bda); 4996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* received PIN code request. must be non-sm4 */ 4997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 = BTM_SM4_KNOWN; 4998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 4999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) { 5000c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda = p_bda; 5001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD; 5003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure we reset the trusted mask to help against attacks */ 5004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 5005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) { 5008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_sec_pin_code_request fixed pin replying"); 5009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 5010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_req_reply(p_bda, p_cb->cfg.pin_code_len, 5011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cfg.pin_code); 5012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 5013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Use the connecting device's CoD for the connection */ 5016c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if ((p_bda == p_cb->connecting_bda) && 5017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || 5018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->connecting_dc[2])) 5019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN); 50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We could have started connection after asking user for the PIN code */ 5022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pin_code_len != 0) { 5023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_sec_pin_code_request bonding sending reply"); 5024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_req_reply(p_bda, btm_cb.pin_code_len, p_cb->pin_code); 50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Mark that we forwarded received from the user PIN code */ 5027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pin_code_len = 0; 50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We can change mode back right away, that other connection being 5030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * established */ 5031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* is not forced to be secure - found a FW issue, so we can not do this 5032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_restore_mode(); */ 50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 5035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If pairing disabled OR (no PIN callback and not bonding) */ 5038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR we could not allocate entry in the database reject pairing request */ 5039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if ( 5040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->pairing_disabled || (p_cb->api.p_pin_callback == NULL) 50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR Microsoft keyboard can for some reason try to establish connection 5043b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski */ 5044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the only thing we can do here is to shut it up. Normally we will be 5045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson originator */ 5046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* for keyboard bonding */ 5047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson || (!p_dev_rec->is_originator && 5048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == 5049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_COD_MAJOR_PERIPHERAL) && 5050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD))) { 5051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 5052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev " 5053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Rec:%x!", 5054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec); 5055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_pin_code_neg_reply(p_bda); 5057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify upper layer of PIN request and start expiration timer */ 5059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 5060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); 5061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Pin code request can not come at the same time as connection request */ 5062c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_cb->connecting_bda = p_bda; 5063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); 5064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if the name is known */ 5066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Even if name is not known we might not be able to get one */ 5067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* this is the case when we are already getting something from the */ 5068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* device, so HCI level is flow controlled */ 5069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Also cannot send remote name request while paging, i.e. connection is not 5070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * completed */ 5071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) { 5072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_sec_pin_code_request going for callback"); 5073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 5075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->api.p_pin_callback) { 5076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb->api.p_pin_callback)( 5077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 5078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->p_cur_service == NULL) 5079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? false 5080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : (p_dev_rec->p_cur_service->security_flags & 5081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_MIN_16_DIGIT_PIN)); 5082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 5084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_sec_pin_code_request going for remote name"); 50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We received PIN code request for the device with unknown name */ 5087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* it is not user friendly just to ask for the PIN without name */ 5088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* try to get name at first */ 5089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rmt_name_req(p_dev_rec->bd_addr, HCI_PAGE_SCAN_REP_MODE_R1, 5090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_MANDATARY_PAGE_SCAN_MODE, 0); 50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5098ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5099ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_update_clock_offset 5100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to update clock offset 5102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 5104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_update_clock_offset(uint16_t handle, uint16_t clock_offset) { 5107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 5108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_INFO* p_inq_info; 51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev_by_handle(handle); 5111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) return; 51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr); 5116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq_info == NULL) return; 51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************** 5122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * S T A T I C F U N C T I O N S 5123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************/ 51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_execute_procedure 5128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start required security 5130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * procedure. There is a case when multiplexing protocol 5131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * calls this function on the originating side, connection to 5132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the peer will not be established. This function in this 5133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * case performs only authorization. 5134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS - permission is granted 5136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_CMD_STARTED - in process 5137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES - permission declined 5138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_sec_execute_procedure(tBTM_SEC_DEV_REC* p_dev_rec) { 5141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 5142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d", 5143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state); 5144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* There is a chance that we are getting name. Wait until done. */ 5146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state != 0) return (BTM_CMD_STARTED); 5147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If any security is required, get the name first */ 5149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) && 5150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) { 5151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: Start get name"); 5152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_sec_start_get_name(p_dev_rec)) { 5153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 5154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 5156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If connection is not authenticated and authentication is required */ 5159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start authentication and return PENDING to the caller */ 5160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) && 5161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->is_originator && 5162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) || 5163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!p_dev_rec->is_originator && 5164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))) || 5165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) && 5166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!p_dev_rec->is_originator && 5167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) && 5168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) { 5169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* 5170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use, 5171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the 5172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * BTM_SEC_AUTHENTICATED is used for both MITM and non-MITM 5173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * authenticated connections, hence we cannot distinguish here. 5174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 5175818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if incoming UCD packet, discard it */ 5178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec->is_originator && (p_dev_rec->is_ucd == true)) 5179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_FAILED_ON_SECURITY); 51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: Start authentication"); 51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 5185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * If we do have a link-key, but we end up here because we need an 5186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * upgrade, then clear the link-key known and authenticated flag before 5187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * restarting authentication. 5188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * WARNING: If the controller has link-key, it is optional and 5189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * recommended for the controller to send a Link_Key_Request. 5190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * In case we need an upgrade, the only alternative would be to delete 5191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * the existing link-key. That could lead to very bad user experience 5192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * or even IOP issues, if a reconnect causes a new connection that 5193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * requires an upgrade. 5194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 5195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) && 5196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) && 5197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!p_dev_rec->is_originator && 5198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) { 5199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags &= 5200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 5201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_AUTHENTICATED); 5202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_start_authentication(p_dev_rec); 5205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 5206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If connection is not encrypted and encryption is required */ 5209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start encryption and return PENDING to the caller */ 5210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) && 5211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->is_originator && 5212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) || 5213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!p_dev_rec->is_originator && 5214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) && 5215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) { 52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if incoming UCD packet, discard it */ 5218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec->is_originator && (p_dev_rec->is_ucd == true)) 5219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_FAILED_ON_SECURITY); 52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: Start encryption"); 5223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_start_encryption(p_dev_rec); 5225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 5226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 5229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { 5230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 5231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: Security Manager: SC only service, but link key type is 0x%02x -", 5232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "security failure", __func__, p_dev_rec->link_key_type); 5233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_FAILED_ON_SECURITY); 5234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If connection is not authorized and authorization is required */ 5237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start authorization and return PENDING to the caller */ 5238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) && 5239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_dev_rec->is_originator && 5240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) || 5241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!p_dev_rec->is_originator && 5242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) { 5243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 5244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "service id:%d, is trusted:%d", p_dev_rec->p_cur_service->service_id, 5245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 5246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service->service_id))); 5247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == false) && 5248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) && 5249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 5250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_cur_service->service_id) == 5251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson false)) { 5252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: Start authorization"); 5253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_sec_start_authorization(p_dev_rec)); 5254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* All required security procedures already established */ 5258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required &= 5259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE | 5260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE | 5261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT | BTM_SEC_FORCE_MASTER | 5262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 5263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: trusted:0x%04x%04x", 5265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]); 5266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Security Manager: access granted"); 5267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_start_get_name 5274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start get name procedure 5276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if started 5278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_start_get_name(tBTM_SEC_DEV_REC* p_dev_rec) { 5281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t tempstate = p_dev_rec->sec_state; 52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME; 52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 0 and NULL are as timeout and callback params because they are not used in 5286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * security get name case */ 52878bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He if ((btm_initiate_rem_name(p_dev_rec->bd_addr, BTM_RMT_NAME_SEC, 0, NULL)) != 52888bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_CMD_STARTED) { 5289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = tempstate; 5290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 5291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_start_authentication 5299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5300ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start authentication 5301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_start_authentication(tBTM_SEC_DEV_REC* p_dev_rec) { 5304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 5305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_auth_request(p_dev_rec->hci_handle); 53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5310ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_start_encryption 5311ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start encryption 5313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_start_encryption(tBTM_SEC_DEV_REC* p_dev_rec) { 5316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_set_conn_encrypt(p_dev_rec->hci_handle, true); 5317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_start_authorization 5323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start authorization 5325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5326ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if started 5327ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5328ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic uint8_t btm_sec_start_authorization(tBTM_SEC_DEV_REC* p_dev_rec) { 5330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t result; 5331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_service_name = NULL; 5332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t service_id; 53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || 5335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) { 5336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.api.p_authorize_callback) return (BTM_MODE_UNSUPPORTED); 5337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->p_cur_service) { 53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 5340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->is_originator) 5341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_service_name = p_dev_rec->p_cur_service->orig_service_name; 5342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 5343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_service_name = p_dev_rec->p_cur_service->term_service_name; 53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id = p_dev_rec->p_cur_service->service_id; 5346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 5347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id = 0; 5348ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send authorization request if not already sent during this service 5350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * connection */ 5351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID || 5352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->last_author_service_id != service_id) { 5353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING; 5354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = (*btm_cb.api.p_authorize_callback)( 5355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 5356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_service_name, service_id, p_dev_rec->is_originator); 5357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else /* Already authorized once for this L2CAP bringup */ 5360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 5361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 5362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sec_start_authorization: (Ignoring extra Authorization prompt " 5363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "for service %d)", 5364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id); 5365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 5366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5367ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == BTM_SUCCESS) { 5369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED; 5370ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save the currently authorized service in case we are asked again by 5372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * another multiplexer layer */ 5373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec->is_originator) 5374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->last_author_service_id = service_id; 5375ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 53775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (result); 5379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_start_get_name(p_dev_rec); 5381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5385ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5386ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_are_all_trusted 5387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called check if all services are trusted 5389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if all are trusted, otherwise false 5391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_sec_are_all_trusted(uint32_t p_mask[]) { 5394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t trusted_inx; 5395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; 5396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson trusted_inx++) { 5397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) return (false); 5398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_find_first_serv 5406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Look for the first record in the service database 5408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with specified PSM 5409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 5411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5413911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SEC_SERV_REC* btm_sec_find_first_serv(CONNECTION_TYPE conn_type, 5414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t psm) { 5415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0]; 5416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 5417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator; 54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (conn_type & CONNECTION_TYPE_ORIG_MASK) 5422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = true; 5423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 5424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = false; 54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator = conn_type; 54275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 54285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) { 5430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this is outgoing connection and the PSM matches p_out_serv, 5431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * use it as the current service */ 5432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return btm_cb.p_out_serv; 5433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* otherwise, just find the first record with the specified PSM */ 5436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { 5437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) && 5438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_serv_rec->psm == psm)) 5439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_serv_rec); 5440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 54425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5445ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_find_next_serv 5447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Look for the next record in the service database 5449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with specified PSM 5450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 5452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_SEC_SERV_REC* btm_sec_find_next_serv(tBTM_SEC_SERV_REC* p_cur) { 5455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0]; 5456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 5457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { 5459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) && 5460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_serv_rec->psm == p_cur->psm)) { 5461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cur != p_serv_rec) { 5462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_serv_rec); 5463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_find_mx_serv 5472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5473ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Look for the record in the service database with specified 5474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PSM and multiplexor channel information 5475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 5477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_SEC_SERV_REC* btm_sec_find_mx_serv(uint8_t is_originator, 5480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t psm, 5481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_proto_id, 5482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id) { 5483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_out_serv = btm_cb.p_out_serv; 5484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0]; 5485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 5486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s()", __func__); 5488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator && p_out_serv && p_out_serv->psm == psm && 5489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_out_serv->mx_proto_id == mx_proto_id && 5490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_out_serv->orig_mx_chan_id == mx_chan_id) { 5491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this is outgoing connection and the parameters match p_out_serv, 5492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * use it as the current service */ 5493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return btm_cb.p_out_serv; 5494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* otherwise, the old way */ 5497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { 5498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) && 5499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_serv_rec->psm == psm) && (p_serv_rec->mx_proto_id == mx_proto_id) && 5500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) || 5501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) { 5502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_serv_rec); 5503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_collision_timeout 5511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5512ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Encryption could not start because of the collision 5513ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * try to do it again 5514ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5515ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the TLE struct 5516ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5517ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_collision_timeout(UNUSED_ATTR void* data) { 5519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s()", __func__); 55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = btm_sec_execute_procedure(btm_cb.p_collided_dev_rec); 55225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If result is pending reply from the user or from the device is pending */ 5524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) { 5525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* There is no next procedure or start of procedure failed, notify the 5526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * waiting layer */ 5527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(btm_cb.p_collided_dev_rec, status, false); 5528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_link_key_request 5534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when controller requests link key 5536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 5538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_send_link_key_notif(tBTM_SEC_DEV_REC* p_dev_rec) { 5541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_link_key_callback) 5542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_link_key_callback)( 5543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 5544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key, p_dev_rec->link_key_type); 55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5548ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadTrustedMask 5550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Get trusted mask for the peer device 5552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5553ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device 5554ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns NULL, if the device record is not found. 5556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * otherwise, the trusted mask 5557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 55599e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint32_t* BTM_ReadTrustedMask(const RawAddress& bd_addr) { 5560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 5561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) return (p_dev_rec->trusted_mask); 5562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return NULL; 55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5566ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5567ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_restore_mode 5568ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5569ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function returns the security mode to previous setting 5570ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * if it was changed during bonding. 5571ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: void 5574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_restore_mode(void) { 5577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode_changed) { 5578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode_changed = false; 5579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, 5580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.security_mode == BTM_SEC_MODE_LINK)); 5581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_auth_enable( 5582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t)(btm_cb.security_mode == BTM_SEC_MODE_LINK)); 5583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pin_type_changed) { 5586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pin_type_changed = false; 5587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_pin_type(btm_cb.cfg.pin_type); 5588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool is_sec_state_equal(void* data, void* context) { 5592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(data); 5593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* state = static_cast<uint8_t*>(context); 5594cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 5595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == *state) return false; 5596cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 5597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 5598cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 5599cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_find_dev_by_sec_state 5603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Look for the record in the device database for the device 5605ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * which is being authenticated or encrypted 5606ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5607ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to the record or NULL 5608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5610911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state) { 5611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson list_node_t* n = list_foreach(btm_cb.sec_dev_rec, is_sec_state_equal, &state); 5612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (n) return static_cast<tBTM_SEC_DEV_REC*>(list_node(n)); 56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return NULL; 56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_change_pairing_state 5620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to change pairing state 5622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state) { 5625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() Old: %s", __func__, 5628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(btm_cb.pairing_state)); 5629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("%s() New: %s pairing_flags:0x%x", __func__, 5630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_pair_state_descr(new_state), btm_cb.pairing_flags); 56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state = new_state; 56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (new_state == BTM_PAIR_STATE_IDLE) { 5635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(btm_cb.pairing_timer); 56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags = 0; 5638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pin_code_len = 0; 56395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure the the lcb shows we are not bonding */ 5641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_update_lcb_4_bonding(btm_cb.pairing_bda, false); 56425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_restore_mode(); 5644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_check_pending_reqs(); 5645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_inq_clear_ssp(); 56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5647aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski btm_cb.pairing_bda = RawAddress::kAny; 5648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 5649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If transitioning out of idle, mark the lcb as bonding */ 5650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (old_state == BTM_PAIR_STATE_IDLE) 5651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_update_lcb_4_bonding(btm_cb.pairing_bda, true); 56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565347616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski alarm_set_on_mloop(btm_cb.pairing_timer, BTM_SEC_TIMEOUT_VALUE * 1000, 565447616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski btm_sec_pairing_timeout, NULL); 5655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_pair_state_descr 5661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Return state description for tracing 5663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic const char* btm_pair_state_descr(tBTM_PAIRING_STATE state) { 5666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (state) { 5667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_IDLE: 5668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("IDLE"); 5669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_GET_REM_NAME: 5670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("GET_REM_NAME"); 5671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_PIN_REQ: 5672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("WAIT_PIN_REQ"); 5673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_LOCAL_PIN: 5674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("WAIT_LOCAL_PIN"); 5675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: 5676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("WAIT_NUM_CONFIRM"); 5677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_KEY_ENTRY: 5678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("KEY_ENTRY"); 5679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: 5680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("WAIT_LOCAL_OOB_RSP"); 5681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: 5682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("WAIT_LOCAL_IOCAPS"); 5683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_INCOMING_SSP: 5684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("INCOMING_SSP"); 5685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: 5686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("WAIT_AUTH_COMPLETE"); 5687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_PAIR_STATE_WAIT_DISCONNECT: 5688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("WAIT_DISCONNECT"); 5689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ("???"); 56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5696ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_dev_rec_cback_event 5697ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function calls the callback function with the given 5699ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * result and clear the callback function. 5700ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5701ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: void 5702ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5703ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_dev_rec_cback_event(tBTM_SEC_DEV_REC* p_dev_rec, uint8_t res, 5705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_le_transport) { 5706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback = p_dev_rec->p_callback; 57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->p_callback) { 5709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_callback = NULL; 5710e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 5711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_le_transport) 5712c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, 5713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_ref_data, res); 5714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 5715c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, 5716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->p_ref_data, res); 5717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5718444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_check_pending_reqs(); 57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5723ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5724ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_queue_mx_request 5725ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5726ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Return state description for tracing 5727ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 57299e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic bool btm_sec_queue_mx_request(const RawAddress& bd_addr, uint16_t psm, 5730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_orig, uint32_t mx_proto_id, 5731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id, 5732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback, 5733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson void* p_ref_data) { 5734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_QUEUE_ENTRY* p_e = 5735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SEC_QUEUE_ENTRY*)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY)); 5736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->psm = psm; 5738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->is_orig = is_orig; 5739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->p_callback = p_callback; 5740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->p_ref_data = p_ref_data; 5741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->mx_proto_id = mx_proto_id; 5742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->mx_chan_id = mx_chan_id; 5743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->transport = BT_TRANSPORT_BR_EDR; 5744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->sec_act = 0; 5745c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_e->bd_addr = bd_addr; 5746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 5748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u", 5749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, psm, is_orig, mx_proto_id, mx_chan_id); 5750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_enqueue(btm_cb.sec_pending_q, p_e); 5752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_check_prefetch_pin(tBTM_SEC_DEV_REC* p_dev_rec) { 5757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t major = (uint8_t)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK); 5758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t minor = (uint8_t)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK); 5759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool rv = false; 5760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((major == BTM_COD_MAJOR_AUDIO) && 5762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || 5763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (minor == BTM_COD_MINOR_CAR_AUDIO))) { 5764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 5765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: " 5766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%02x", 5767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, major, minor); 5768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.security_mode_changed == false) { 5770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode_changed = true; 57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 5772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_auth_enable(true); 57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 5777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); 57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we got a PIN, use that, else try to get one */ 5780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.pin_code_len) { 5781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_PINCodeReply(p_dev_rec->bd_addr, BTM_SUCCESS, btm_cb.pin_code_len, 5782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pin_code, p_dev_rec->trusted_mask); 5783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 5784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pin was not supplied - pre-fetch pin code now */ 5785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_pin_callback && 5786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) { 5787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() PIN code callback called", __func__); 5788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL) 5789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 5790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.api.p_pin_callback)( 5791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 5792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->p_cur_service == NULL) 5793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? false 5794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : (p_dev_rec->p_cur_service->security_flags & 5795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SEC_IN_MIN_16_DIGIT_PIN)); 5796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rv = true; 5800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return rv; 58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5805444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 5806ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5807ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_auth_payload_tout 5808ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5809ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Processes the HCI Autheniticated Payload Timeout Event 5810ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * indicating that a packet containing a valid MIC on the 5811ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection handle was not received within the programmed 5812ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * timeout value. (Spec Default is 30 secs, but can be 5813ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * changed via the BTM_SecSetAuthPayloadTimeout() function. 5814ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5815ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_auth_payload_tout(uint8_t* p, uint16_t hci_evt_len) { 5817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t handle; 5818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(handle, p); 5820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle = HCID_GET_HANDLE(handle); 5821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Will be exposed to upper layers in the future if/when determined necessary 5823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 5824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s on handle 0x%02x", __func__, handle); 5825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 5826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5827444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 5828ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_queue_encrypt_request 5830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description encqueue encryption request when device has active security 5832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * process pending. 5833ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5834ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 58359e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic bool btm_sec_queue_encrypt_request(const RawAddress& bd_addr, 5836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport, 5837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_CALLBACK* p_callback, 5838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson void* p_ref_data, 5839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_ACT sec_act) { 5840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_QUEUE_ENTRY* p_e = 5841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SEC_QUEUE_ENTRY*)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1); 5842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->psm = 0; /* if PSM 0, encryption request */ 5844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->p_callback = p_callback; 5845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->p_ref_data = p_ref_data; 5846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->transport = transport; 5847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->sec_act = sec_act; 5848c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_e->bd_addr = bd_addr; 5849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_enqueue(btm_cb.sec_pending_q, p_e); 5850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 5852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 5853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5854444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 5855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_set_peer_sec_caps 5857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set sm4 and rmt_sec_caps fields 5859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * based on the available peer device features. 5860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5861ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 5862ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5863ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_set_peer_sec_caps(tACL_CONN* p_acl_cb, 5865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec) { 5866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 5867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 5868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.security_mode == BTM_SEC_MODE_SC) && 5869f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_feature_pages[1])) { 5870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 = BTM_SM4_TRUE; 5871f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga p_dev_rec->remote_supports_secure_connections = 5872f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_feature_pages[1])); 5873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 5874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sm4 = BTM_SM4_KNOWN; 5875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->remote_supports_secure_connections = false; 5876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", 5879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_dev_rec->sm4, 5880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->remote_supports_secure_connections); 5881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->remote_features_needed) { 5883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 5884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: Now device in SC Only mode, waiting for peer remote features!", 5885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 5886c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_io_capabilities_req(p_dev_rec->bd_addr); 5887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->remote_features_needed = false; 5888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5889899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 5890899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 5891899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 5892ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5893ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_is_serv_level0 5894ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 58959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to check if the service 58969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * corresponding to PSM is security mode 4 level 0 service. 5897ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5898ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if the service is security mode 4 level 0 service 5899ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5900ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_is_serv_level0(uint16_t psm) { 5902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (psm == BT_PSM_SDP) { 5903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __func__, psm); 5904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 5905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 5907444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 5908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 5910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_check_pending_enc_req 5912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 59139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to send pending encryption callback 59149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * if waiting 5915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 5917ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5918ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_sec_check_pending_enc_req(tBTM_SEC_DEV_REC* p_dev_rec, 5920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport, 5921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t encr_enable) { 5922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (fixed_queue_is_empty(btm_cb.sec_pending_q)) return; 5923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING; 5925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson list_t* list = fixed_queue_get_list(btm_cb.sec_pending_q); 5926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (const list_node_t* node = list_begin(list); node != list_end(list);) { 5927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_QUEUE_ENTRY* p_e = (tBTM_SEC_QUEUE_ENTRY*)list_node(node); 5928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson node = list_next(node); 5929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5930c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (p_e->bd_addr == p_dev_rec->bd_addr && p_e->psm == 0 && 5931c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_e->transport == transport) { 5932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR || 5933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->sec_act == BTM_BLE_SEC_ENCRYPT || 5934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_e->sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM || 5935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_e->sec_act == BTM_BLE_SEC_ENCRYPT_MITM && 5936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) { 5937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_e->p_callback) 5938c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_e->p_callback)(&p_dev_rec->bd_addr, transport, p_e->p_ref_data, 5939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res); 5940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_try_remove_from_queue(btm_cb.sec_pending_q, (void*)p_e); 5941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 5943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5944899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 5945899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 5946899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 5947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_set_serv_level4_flags 5949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 59509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to set security mode 4 level 4 59519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * flags. 5952ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5953ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns service security requirements updated to include secure 5954ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connections only mode. 5955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5956ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic uint16_t btm_sec_set_serv_level4_flags(uint16_t cur_security, 5958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_originator) { 5959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t sec_level4_flags = 5960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS; 5961899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 5962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return cur_security | sec_level4_flags; 5963444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 5964444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5966ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_clear_ble_keys 5968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to clear out the BLE keys. 5970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Typically when devices are removed in BTM_SecDeleteDevice, 5971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * or when a new BT Link key is generated. 5972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 5974ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5975ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sec_clear_ble_keys(tBTM_SEC_DEV_REC* p_dev_rec) { 5977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() Clearing BLE Keys", __func__); 5978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 5979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS)); 5980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 5982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_resolving_list_remove_dev(p_dev_rec); 5983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 59845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_is_a_bonded_dev 5989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Is the specified device is a bonded device 5991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true - dev is bonded 5993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5994ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 59959e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool btm_sec_is_a_bonded_dev(const RawAddress& bda) { 5996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda); 5997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_bonded = false; 5998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 5999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec && ((p_dev_rec->ble.key_type && 6000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN)) || 6001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) { 6002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_bonded = true; 6003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() is_bonded=%d", __func__, is_bonded); 6005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (is_bonded); 60065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 60075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6009ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6010ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_is_le_capable_dev 6011ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6012ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Is the specified device is dual mode or LE only device 6013ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6014ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true - dev is a dual mode 6015ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6016ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 60179e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool btm_sec_is_le_capable_dev(const RawAddress& bda) { 6018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda); 6019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool le_capable = false; 6020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 6021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec && 6022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE) 6023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_capable = true; 6024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return le_capable; 6025ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 6026ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6027ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 6028ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6029ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_use_smp_br_chnl 6030ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description The function checks if SMP BR connection can be used with 6032ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the peer. 6033ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Is called when authentication for dedicated bonding is 6034ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * successfully completed. 6035ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6036ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true - if SMP BR connection can be used (the link key is 6037ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * generated from P-256 and the peer supports Security 6038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Manager over BR). 6039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 6041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC* p_dev_rec) { 6042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t ext_feat; 6043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE]; 6044444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s() link_key_type = 0x%x", __func__, 6046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->link_key_type); 6047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) && 6049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 6050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 6051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!L2CA_GetPeerFeatures(p_dev_rec->bd_addr, &ext_feat, chnl_mask)) 6053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 6054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT)) return false; 6056444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 6058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6059444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6061ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6062ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_is_master 6063ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6064ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description The function checks if the device is BR/EDR master after 6065ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pairing is completed. 6066ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6067ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true - if the device is master. 6068ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6069ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 6070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool btm_sec_is_master(tBTM_SEC_DEV_REC* p_dev_rec) { 6071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p = btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); 6072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p && (p->link_role == BTM_ROLE_MASTER)); 6073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6074