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