btm_sec.c revision 82c8b9270ba962d5f271a833a3454baddbc063aa
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains functions for the Bluetooth Security Manager
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2544802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#define LOG_TAG "bt_btm_sec"
2644802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati
27899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#include <stdarg.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
2930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
3179ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h"
365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
3744802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE)
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gatt_int.h"
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#define BTM_SEC_MAX_COLLISION_DELAY     (5000)
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
546975b4d711142b885af479721cada448952c6b41Andre Eisenbach
556975b4d711142b885af479721cada448952c6b41Andre Eisenbach/********************************************************************************
566975b4d711142b885af479721cada448952c6b41Andre Eisenbach**              L O C A L    F U N C T I O N     P R O T O T Y P E S            *
576975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id,
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_chan_id);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec);
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec);
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle);
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_restore_mode(void);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state);
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char     *btm_pair_state_descr (tBTM_PAIRING_STATE state);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_check_pending_reqs(void);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 mx_proto_id, UINT32 mx_chan_id,
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tBTM_SEC_CALLBACK *p_callback, void *p_ref_data);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_bond_cancel_complete (void);
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec);
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8    btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN         btm_sec_are_all_trusted(UINT32 p_mask[]);
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle);
907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8           btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state);
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT32 mx_chan_id);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec);
987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec);
997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec);
1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec);
101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0 (UINT16 psm);
102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16  btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator);
1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request  (BD_ADDR bd_addr, tBT_TRANSPORT transport,
105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data);
106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport) ;
107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable);
109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_acceptor_rejects_bonding (tBTM_SEC_DEV_REC *p_dev_rec);
110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec);
112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec);
1137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] =
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*   OUT,    IO,     IN,     NONE */
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT  */ {FALSE,  FALSE,  TRUE,   FALSE},
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO   */ {FALSE,  TRUE,   TRUE,   FALSE},
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN   */ {TRUE,   TRUE,   TRUE,   FALSE},
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE,  FALSE,  FALSE,  FALSE}
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_OUT      0   DisplayOnly */
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IO       1   DisplayYesNo */
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IN       2   KeyboardOnly */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_NONE     3   NoInputNoOutput */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authenticated
1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authenticated
1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec)
1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)
1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_encrypted
1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is encrypted
1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec)
1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authorized
1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authorized
1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec)
1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
184818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Function         btm_dev_16_digit_authenticated
185818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
186818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Description      check device is authenticated by using 16 digit pin or MITM
187818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Returns          BOOLEAN TRUE or FALSE
189818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
190818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde*******************************************************************************/
191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bondestatic BOOLEAN btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC *p_dev_rec)
192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde{
193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used
194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    {
196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        return(TRUE);
197818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    return(FALSE);
199818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde}
200818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
201818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde/*******************************************************************************
202818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
2037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_serv_trusted
2047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check service is trusted
2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec)
2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id))
2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecRegister
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Application manager calls this function to register for
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  security services.  There can be one and only one application
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  saving link keys.  BTM allows only first registration.
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
230f8027005333c88a2f097cfd70d15c3d54c7764aeChris MantonBOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      temp_value = {0};
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
236f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
239f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    LOG_INFO("%s p_cb_info->p_le_callback == 0x%p", __func__, p_cb_info->p_le_callback);
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb_info->p_le_callback)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
242f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#if SMP_INCLUDED == TRUE
243f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__);
244f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      SMP_Register(btm_proc_smp_cback);
245f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#endif
246f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      /* if no IR is loaded, need to regenerate all the keys */
247f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
248f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      {
249f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton        btm_ble_reset_id();
250f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      }
251f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    }
252f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    else
253f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    {
254f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      LOG_WARN("%s p_cb_info->p_le_callback == NULL", __func__);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.api = *p_cb_info;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
260f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton     LOG_INFO("%s btm_cb.api.p_le_callback = 0x%p ", __func__, btm_cb.api.p_le_callback);
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
262f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
268877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function         BTM_SecRegisterLinkKeyNotificationCallback
269877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
270877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description      Application manager calls this function to register for
271877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  link key notification.  When there is nobody registered
272877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  we should avoid changing link key
273877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
274877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns          TRUE if registered OK, else FALSE
275877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
276877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/
277877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback)
278877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{
279877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    btm_cb.api.p_link_key_callback = p_callback;
280877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    return TRUE;
281877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
282877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
283877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
284877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecAddRmtNameNotifyCallback
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can register to be notified when name of the
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote device is resolved.
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == NULL)
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = p_callback;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecDeleteRmtNameNotifyCallback
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can deregister notification when a new Link Key
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is generated per connection.
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if OK, else FALSE
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == p_callback)
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = NULL;
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetSecurityFlags
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get security flags for the device
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BOOLEAN TRUE or FALSE is device found
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
3545344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
3597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_GetSecurityFlagsByTransport
3617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Get security flags for the device on a particular transport
3637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE is device found
3657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
3677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags,
3687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                tBT_TRANSPORT transport)
3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
3707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec;
3717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
3747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (transport == BT_TRANSPORT_BR_EDR)
3757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
3777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8);
3787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPinType
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set PIN type for the device.
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len)
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pin_type, (char *) pin_code, pin_code_len);
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If device is not up security mode will be set as a part of startup */
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.cfg.pin_type != pin_type)
40130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson         && controller_get_interface()->get_is_ready() )
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (pin_type);
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_type     = pin_type;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_code_len = pin_code_len;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len);
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPairableMode
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enable or disable pairing
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       allow_pairing - (TRUE or FALSE) whether or not the device
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      allows pairing.
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connect_only_paired - (TRUE or FALSE) whether or not to
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      only allow paired devices to connect.
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired)
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u", allow_pairing, connect_only_paired);
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_disabled    = !allow_pairing;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.connect_only_paired = connect_only_paired;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_SetSecureConnectionsOnly
436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      Enable or disable default treatment for Mode 4 Level 0 services
438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter        secure_connections_only_mode - (TRUE or FALSE) whether or not the device
440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  TRUE means that the device should treat Mode 4 Level 0 services as
441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  services of other levels. (Secure_connections_only_mode)
442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  FALSE means that the device should provide default treatment for
443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  Mode 4 Level 0 services.
444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode)
449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: Mode : %u", __FUNCTION__,
451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                   secure_connections_only_mode);
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
453899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    btm_cb.devcb.secure_connections_only = secure_connections_only_mode;
454c5c741075fbc36e373f0bec4c3520188d2ba9a38Srinu Jella    btm_cb.security_mode = BTM_SEC_MODE_SC;
455899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES   ((UINT16) 0xffff)
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetSecurityLevel
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      is_originator - TRUE if originating the connection, FALSE if not
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id,
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT32 mx_chan_id)
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    CONNECTION_TYPE conn_type;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_ORIG;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_TERM;
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (conn_type, p_name, service_id,
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (is_originator, p_name, service_id,
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_set_security_level
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      conn_type   - TRUE if originating the connection, FALSE if not
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT32 mx_chan_id)
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec;
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               index;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               first_unused_record = BTM_NO_AVAIL_SEC_SERVICES;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              record_allocated = FALSE;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_originator;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_ucd;
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_CONNLESS_MASK )
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = TRUE;
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = FALSE;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    BTM_TRACE_API("%s : sec: 0x%x", __func__, sec_level);
546818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if the record can be reused (same service name, psm, mx_proto_id,
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       service_id, and mx_chan_id), or obtain the next unused record */
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec = &btm_cb.sec_serv_rec[0];
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++)
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if there is already a record for this service */
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_srec->security_flags & BTM_SEC_IN_USE)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id    &&
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (!strncmp (p_name, (char *) p_srec->orig_service_name,
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN) ||
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 !strncmp (p_name, (char *) p_srec->term_service_name,
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN)))
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id)
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                record_allocated = TRUE;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark the first available service record */
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (!record_allocated)
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC));
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            record_allocated = TRUE;
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            first_unused_record = index;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!record_allocated)
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)",  BTM_SEC_MAX_SERVICE_RECORDS);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(record_allocated);
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Process the request if service record is valid */
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If a duplicate service wasn't found, use the first available */
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (index >= BTM_SEC_MAX_SERVICE_RECORDS)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        index = first_unused_record;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec = &btm_cb.sec_serv_rec[index];
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->psm         = psm;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->service_id  = service_id;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->mx_proto_id = mx_proto_id;
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->orig_mx_chan_id = mx_chan_id;
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S ((char *)p_srec->orig_service_name, sizeof(p_srec->orig_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN);
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Originator should not set requirements for incoming connections */
626818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE
627818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                | BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN );
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_OUT_AUTHENTICATE)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_OUT_MITM;
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_OUT_ENCRYPT)
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_OUT_AUTHENTICATE;
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* outgoing connections usually set the security level right before
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * the connection is initiated.
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set it to be the outgoing service */
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd == FALSE )
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_srec;
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->term_mx_chan_id = mx_chan_id;
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S ((char *)p_srec->term_service_name, sizeof(p_srec->term_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN);
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
663818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE
664818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              | BTM_SEC_IN_MIN_16_DIGIT_PIN);
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
671818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE
672818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              | BTM_SEC_IN_MIN_16_DIGIT_PIN);
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Acceptor should not set requirements for outgoing connections */
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM);
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
678899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
680899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_IN_AUTHENTICATE)
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_IN_MITM;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_IN_ENCRYPT)
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_IN_AUTHENTICATE;
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_ucd )
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags     |= (UINT16)(BTM_SEC_IN_USE);
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, conn_type, psm, mx_proto_id, mx_chan_id);
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_srec->ucd_security_flags);
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
7095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : service name [%s] (up to %d chars saved)",
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_name, BTM_SEC_SERVICE_NAME_LEN);
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
7195344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : sec: 0x%x, service name [%s] (up to %d chars saved)",
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(record_allocated);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecClrService
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record(s) from the security database.
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified name are removed.
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used only by devices with limited RAM so that it can
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reuse an old security service record.
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Note: Unpredictable results may occur if a service is cleared
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      that is still in use by an application/profile.
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id)
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) &&
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!service_id || (service_id == p_srec->service_id)))
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags = 0;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clr_service_by_psm
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record from the security database.
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified psm are removed.
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used by L2CAP to free up the service record used
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by dynamic PSM clients when the channel is closed.
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The given psm must be a virtual psm.
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm)
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) )
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_clr_temp_auth_service
810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Removes specified device record's temporary authorization
812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  flag from the security database.
813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters       Device address to be cleared
815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void.
817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda)
820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC   *p_dev_rec;
822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bda)) == NULL)
824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB");
826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */
830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service)
831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
836ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PINCodeReply
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after Security Manager submitted
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PIN code request to the UI.
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device for which PIN was requested
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res          - result of the operation BTM_SUCCESS if success
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  Result:%d",
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res);
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr");
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB");
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) )
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) ||
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) )
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (bd_addr);
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags   |= BTM_SEC_LINK_KEY_AUTHED;
905818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (pin_len >= 16) {
906818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
907818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.security_mode_changed == FALSE) )
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is start of the dedicated bonding if local device is 2.0 */
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
915818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->pin_code_length = pin_len;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = TRUE;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable (TRUE);
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = 0xff ;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*  before originating  */
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we change state little bit early so btm_sec_connected() will originate connection */
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*   when existing ACL link is down completely */
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we already accepted incoming connection from pairing device */
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.api.p_auth_complete_callback)
9477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE);
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_SUCCESS;
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
9575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if this was not pre-fetched, save the PIN */
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len == 0)
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pin_code_len_saved = pin_len;
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin);
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_sec_bond_by_transport
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      this is the bond function that will start either SSP or SMP.
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device to bond
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Note: After 2.1 parameters are not used and preserved here not to change API
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
9807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                       UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS      status;
9843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            *p_features;
9853aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            ii;
9867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN        *p= btm_bda_to_acl(bd_addr, transport);
9875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x",
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport);
9917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Other security process is in progress */
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10006975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL)
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10026975b4d711142b885af479721cada448952c6b41Andre Eisenbach        return(BTM_NO_RESOURCES);
10037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Finished if connection is active and already paired */
10087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR
10097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
10107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
10117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE
10127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))
10137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
10147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         )
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell controller to get rid of the link key if it has one stored */
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS)
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the PIN code if we got a valid one */
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0))
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
1029818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->pin_code_length = pin_len;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN);
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN);
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD;
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE;
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = TRUE;
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10426975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
10437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1045e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        btm_ble_init_pseudo_addr (p_dev_rec, bd_addr);
10467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK;
10477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (SMP_Pair(bd_addr) == SMP_STARTED)
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
10527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_CMD_STARTED;
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.pairing_flags = 0;
10577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(BTM_NO_RESOURCES);
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
10627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  | BTM_SEC_ROLE_SWITCHED  | BTM_SEC_LINK_KEY_AUTHED);
10637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
106630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing())
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* The special case when we authenticate keyboard.  Set pin type to fixed */
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* It would be probably better to do it from the application, but it is */
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* complicated */
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED))
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pin_type_changed = TRUE;
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED);
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10803aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++)
10813aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    {
10823aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        p_features = p_dev_rec->features[ii];
10835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("  remote_features page[%1d] = %02x-%02x-%02x-%02x",
10843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                         ii, p_features[0], p_features[1], p_features[2], p_features[3]);
10855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("                              %02x-%02x-%02x-%02x",
10863aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                             p_features[4], p_features[5], p_features[6], p_features[7]);
10873aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    }
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection already exists... */
10967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE)
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark lcb as bonding */
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (bd_addr, TRUE);
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
110930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing()
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->sm4 == BTM_SM4_KNOWN))
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( btm_sec_check_prefetch_pin (p_dev_rec) )
1113899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1115899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
1116899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
1117899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
1118899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local is 2.1 and peer is unknown */
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0)
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we are not accepting connection request from peer
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * -> RNR (to learn if peer is 2.1)
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
11277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We are accepting connection request from peer */
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d",
11357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_CMD_STARTED;
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* both local and peer are 2.1  */
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_dd_create_conn(p_dev_rec);
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBondByTransport
11537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  transport    - doing SSP over BR/EDR or SMP over LE
11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
11677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                    UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE
11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_DEVICE_TYPE     dev_type;
11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBLE_ADDR_TYPE      addr_type;
11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
11747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* LE device, do SMP pairing */
11757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
11767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0))
11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
11787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_ILLEGAL_ACTION;
11797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
11807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBond
11877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
12007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
12017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
12027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
12037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_UseLeLink(bd_addr))
12047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        transport = BT_TRANSPORT_LE;
12057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
12067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
12077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
12087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
12097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecBondCancel
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to cancel ongoing bonding process
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with peer device.
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the peer device
12167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                         transport    - FALSE for BR/EDR link; TRUE for LE link
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr)
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SecBondCancel()  State: %s flags:0x%x",
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags);
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_UNKNOWN_ADDR;
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
12317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE)
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING)
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("Cancel LE pairing");
12367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (SMP_PairCancel(bd_addr))
12377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
12387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return BTM_CMD_STARTED;
12397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_WRONG_MODE;
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags)
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pre-fetching pin for dedicated bonding */
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_bond_cancel_complete();
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this BDA is in a bonding procedure */
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the HCI link is up */
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If some other thread disconnecting, we do not send second command */
1262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) ||
1263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH))
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_CMD_STARTED);
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link was set up by Bonding process */
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_update_lcb_4_bonding(bd_addr, FALSE);
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /*HCI link is not up */
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link creation was started by Bonding process */
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btsnd_hcic_create_conn_cancel(bd_addr))
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return BTM_CMD_STARTED;
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_NO_RESOURCES;
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
1285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1286ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                BTM_CancelRemoteDeviceName();
1287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD;
1288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return BTM_CMD_STARTED;
1289ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_WRONG_MODE;
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecGetDeviceLinkKey
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to obtain link key for the device
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  it returns BTM_SUCCESS if link key is available, or
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the device or device record does not contain link key info
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  link_key     - Link Key is copied into this array
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key)
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN);
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_UNKNOWN_ADDR);
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         BTM_SecGetDeviceLinkKeyType
1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to obtain link key type for the
1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  device.
1329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  it returns BTM_SUCCESS if link key is available, or
1330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the device or device record does not contain link key info
1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          BTM_LKEY_TYPE_IGNORE if link key is unknown, link type
1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  otherwise.
1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1337444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr)
1338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return p_dev_rec->link_key_type;
1344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return BTM_LKEY_TYPE_IGNORE;
1346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetEncryption
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to ensure that connection is
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  encrypted.  Should be called only on an open connection.
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically only needed for connections that first want to
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bring up unencrypted links, then later encrypt them.
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed.  Can be set to NULL
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  if status is not desired.
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - pointer to any data the caller wishes to receive
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  in the callback function upon completion.
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*                                   can be set to NULL if not used.
1365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  transport  -    TRUE to encryption the link over LE transport
1366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                                  or FALSE for BR/EDR transport
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS   - already encrypted
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_PENDING   - command will be returned in the callback
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE- connection not up.
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY      - security procedures are currently active
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback,
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               void *p_ref_data)
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS rc = 0;
13797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1380444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
13817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!p_dev_rec ||
13827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
13837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
13847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)
13857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
13867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        )
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Connection should be up and runnning */
13895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected");
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_BR_EDR &&
13987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags &  BTM_SEC_ENCRYPTED))
13997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
14007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         || (transport == BT_TRANSPORT_LE &&
14017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta           (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED))
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta          )
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted");
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
14087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* enqueue security request if security is active */
1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE))
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request");
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data))
1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_CMD_STARTED;
1421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (p_callback)
1425444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES);
1426444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_NO_RESOURCES;
1427444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = FALSE;
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->security_required);
14387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
14407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1442444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tACL_CONN *p = btm_bda_to_acl(bd_addr, transport);
1443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p)
1444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role);
1446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            rc = BTM_WRONG_MODE;
1450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__);
1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = btm_sec_execute_procedure (p_dev_rec);
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (rc != BTM_CMD_STARTED && rc != BTM_BUSY)
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
14627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc);
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet.
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle)
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8       old_state = p_dev_rec->sec_state;
1475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS status = BTM_CMD_STARTED;
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
14787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                      conn_handle, reason);
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* send HCI_Disconnect on a transport only once */
1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    switch (old_state)
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING:
1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->hci_handle)
1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BLE:
1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->ble_hci_handle)
1493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
1497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BOTH:
1499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return status;
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        default:
1503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ?
1504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
1505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1506444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */
1510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle)
1511444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1512444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
1513444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji              p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
1514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        status = BTM_SUCCESS;
1515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1516444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Tear down the HCI link */
1517444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else if (!btsnd_hcic_disconnect (conn_handle, reason))
1518444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1519444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         /* could not send disconnect. restore old state */
1520444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         p_dev_rec->sec_state = old_state;
1521444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         status = BTM_NO_RESOURCES;
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1523444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1524444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return status;
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ConfirmReqReply
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to confirm the numeric value for
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_CFM_REQ_EVT
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res           - result of the operation BTM_SUCCESS if success
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr       - Address of the peer device
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr)
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s  Res: %u",
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM)
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) )
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (res == BTM_SUCCESS)
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
1560818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, TRUE);
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, FALSE);
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PasskeyReqReply
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the passkey for
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_KEY_REQ_EVT
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res     - result of the operation BTM_SUCCESS if success
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr - Address of the peer device
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey - numeric value in the range of
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey)
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s  res:%d",
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), res);
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) )
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1601444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1602444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec != NULL)
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
16077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_SecBondCancel(bd_addr);
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN);
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY)
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (passkey > BTM_MAX_PASSKEY_VAL)
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply (bd_addr);
1630444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_reply (bd_addr, passkey);
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SendKeypressNotif
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is used during the passkey entry model
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by a device with KeyboardOnly IO capabilities
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (very likely to be a HID Device).
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is called by a HID Device to inform the remote device when
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a key has been entered or erased.
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type - notification type
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type)
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This API only make sense between PASSKEY_REQ and SP complete */
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY)
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_send_keypress_notif (bd_addr, type);
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_IoCapRsp
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called in response to BTM_SP_IO_REQ_EVT
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by the tBTM_SP_CALLBACK implementation, this function is
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  called to provide the actual response
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  io_cap  - The IO capability of local device.
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  oob     - BTM_OOB_NONE or BTM_OOB_PRESENT.
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  auth_req- MITM protection required or not.
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req)
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS)
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX)
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = auth_req;
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = io_cap;
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT));
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req);
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadLocalOobData
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local OOB data from
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  LM
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void)
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_read_local_oob_data() == FALSE)
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_NO_RESOURCES;
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RemoteOobDataReply
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the remote OOB data for
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_RMT_OOB_EVT
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr     - Address of the peer device
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c           - simple pairing Hash C.
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r           - simple pairing Randomizer  C.
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r)
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1729444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__,
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP)
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_neg_reply (bd_addr);
1743444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_reply (bd_addr, c, r);
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BuildOobData
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to build the OOB data payload to
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  be sent over OOB (non-Bluetooth) link
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_len - p_data size.
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c       - simple pairing Hash C.
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r       - simple pairing Randomizer  C.
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  name_len- 0, local device name would not be included.
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            otherwise, the local device name is included for
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            up to this specified length
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of bytes in p_data.
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c,
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BT_OCTET16 r, UINT8 name_len)
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len = 0;
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  name_size;
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE)
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mandatory part */
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
178130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address);
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = BTM_OOB_MANDATORY_SIZE;
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_len -= len;
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* now optional part */
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Hash C */
1789444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        UINT16 delta = BTM_OOB_HASH_C_SIZE + 2;
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_HASH_C_SIZE + 1;
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE;
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE);
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Rand R */
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_RAND_R_SIZE + 2;
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_RAND_R_SIZE + 1;
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE;
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE);
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add class of device */
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_COD_SIZE + 2;
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_COD_SIZE + 1;
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_COD_TYPE;
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class);
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        name_size = name_len;
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (name_size > strlen(btm_cb.cfg.bd_name))
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_size = (UINT16)strlen(btm_cb.cfg.bd_name);
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = name_size + 2;
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_size + 1;
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_type;
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size);
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update len */
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p_data;
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1846899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_BothEndsSupportSecureConnections
1847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1848899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if both the local device and the peer device
1849899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  specified by bd_addr support BR/EDR Secure Connections.
1850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1851899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1852899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1853899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by both local
1854899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  and the remote device.
1855899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1858899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr)
1859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1860899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return ((controller_get_interface()->supports_secure_connections()) &&
1861899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_PeerSupportsSecureConnections(bd_addr)));
1862899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
1863899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1864899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
1865899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1866899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_PeerSupportsSecureConnections
1867899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1868899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the peer supports
1869899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  BR/EDR Secure Connections.
1870899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1871899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1872899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1873899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by the peer,
1874899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1875899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1876899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
1877899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr)
1878899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
1879899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    tBTM_SEC_DEV_REC    *p_dev_rec;
1880899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1881899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL)
1882899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
1883899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__,
1884899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3],
1885899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[4]<< 8) + bd_addr[5]);
1886899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return FALSE;
1887899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
1888899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1889899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return (p_dev_rec->remote_supports_secure_connections);
1890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1892444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1893444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadOobData
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to parse the OOB data payload
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received over OOB (non-Bluetooth) link
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  eir_tag - The associated EIR tag to read the data.
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  *p_len(output) - the length of the data with the given tag.
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the beginning of the data with the given tag.
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  NULL, if the tag is not found.
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len)
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  max_len;
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   len, type;
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_ret = NULL;
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ret_len = 0;
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data)
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(max_len, p);
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= BTM_OOB_MANDATORY_SIZE)
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag)
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ret = p; /* the location for bd_addr */
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ret_len = BTM_OOB_BD_ADDR_SIZE;
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += BD_ADDR_LEN;
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                max_len -= BTM_OOB_MANDATORY_SIZE;
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* now the optional data in EIR format */
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                while (max_len > 0)
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len     = *p++; /* tag data len + 1 */
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    type    = *p++;
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (eir_tag == type)
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_ret = p;
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        ret_len = len - 1;
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* the data size of this tag is len + 1 (tag data len + 2) */
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (max_len > len)
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len -= len;
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len--;
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        len--;
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p += len;
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len = 0;
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_len)
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = ret_len;
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ret;
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetOutService
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the service for
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  outgoing connections.
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the profile/application calls BTM_SetSecurityLevel
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  before initiating a connection, this function does not
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  need to be called.
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id)
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_out_serv = p_serv_rec;
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1984444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->service_id == service_id)
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->orig_mx_chan_id == mx_chan_id))
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, p_serv_rec->orig_mx_chan_id);
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_serv_rec;
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec)
19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->p_cur_service = p_serv_rec;
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**              I N T E R N A L     F U N C T I O N S
20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_upgrade_possible
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function returns TRUE if the existing link key
2008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  can be upgraded or if the link key does not exist.
20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2010ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          BOOLEAN
20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM;
2016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN             is_possible = TRUE;
20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2020ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        is_possible = FALSE;
20217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if(p_dev_rec->p_cur_service)
20227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2023444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x",
2024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type,
2025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags);
20267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
20277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
20287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x",
2030444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
20317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Already have a link key to the connected peer. Is the link key secure enough?
20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** Is a link key upgrade even possible?
20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
2035899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & mtm_check)    /* needs MITM */
2036899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) ||
2037899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256))
2038899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* has unauthenticated
2039899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key */
2040899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX)  /* a valid peer IO cap */
2041899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps]))
2042899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* authenticated
2043899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key is possible */
20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* upgrade is possible: check if the application wants the upgrade.
20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * If the application is configured to use a global MITM flag,
20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * it probably would not want to upgrade the link key based on the security level database */
2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            is_possible = TRUE;
2049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags);
2052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return is_possible;
2053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_check_upgrade
2058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is called to check if the existing link key
2060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  needs to be upgraded.
2061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2062ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
2063ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2064ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
2065ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
2066ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
2069ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2070ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Only check if link key already exists */
2071ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
2072ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
2073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE)
2075ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
20765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
2077ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* upgrade is possible: check if the application wants the upgrade.
2078ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * If the application is configured to use a global MITM flag,
2079ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * it probably would not want to upgrade the link key based on the security level database */
2080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SP_UPGRADE evt_data;
2081ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
2082ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.upgrade = TRUE;
2083ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btm_cb.api.p_sp_callback)
2084ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
2085ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade);
2087ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (evt_data.upgrade)
2088ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2089ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* if the application confirms the upgrade, set the upgrade bit */
2090ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2091ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2092ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Clear the link key known to go through authentication/pairing again */
2093ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
2094ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
20955344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags);
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_l2cap_access_req
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP to grant permission to
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establish L2CAP connection to or from the peer device.
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are complete. MUST NOT BE NULL.
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tBTM_STATUS
21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_OUT_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHORIZE)
21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_IN_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)
21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2121899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_OUT_LEVEL4_FLAGS   (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | \
2122899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_OUT_MITM | BTM_SEC_MODE4_LEVEL4)
2123899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2124899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_IN_LEVEL4_FLAGS    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | \
2125899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                    BTM_SEC_IN_MITM | BTM_SEC_MODE4_LEVEL4)
2126899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle,
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      CONNECTION_TYPE conn_type,
21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      tBTM_SEC_CALLBACK *p_callback,
21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      void *p_ref_data)
21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         security_required;
21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         old_security_required;
21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       old_is_originator;
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS   rc = BTM_SUCCESS;
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       chk_acp_auth_done = FALSE;
21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
21407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN     transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data);
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data);
21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_first_serv (conn_type, psm);
21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm);
21677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_MODE_UNSUPPORTED);
21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2171899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Services level0 by default have no security */
2172899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only))
21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags,
2183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                               is_originator);
2184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2187899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->ucd_security_flags;
2188899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_originator)
21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rc = BTM_SUCCESS;
21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2208818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                // Check for 16 digits (or MITM)
2209818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2210818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) &&
2211818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                     btm_dev_16_digit_authenticated(p_dev_rec))) {
2212818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    rc = BTM_SUCCESS;
2213818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                }
22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2220899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2222899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rc == BTM_SUCCESS)
22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_callback)
22267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2234899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2235899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2236899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2237899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                                is_originator);
2238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2239899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2240899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2241899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->security_flags;
2242899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2243899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2244899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2245899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm  0x%04x",
2246899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    __FUNCTION__, security_required, is_originator, psm);
2247899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2248899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4))
2249899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2250899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2251899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */
2252899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2253899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d",
2255899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__,
2256899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc,
2257899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            p_dev_rec->remote_supports_secure_connections);
2258899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2259899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2260899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                    BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2261899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2262899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2263899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto KRZR) which connects to several services at the same time */
22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x", __func__,
2271ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                          psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4);
22725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
2274899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2275899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2276899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2277899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2278899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2279899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_originator)
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
22867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
22877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) ||
22887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec)  && btm_dev_encrypted(p_dev_rec))) )
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rc = BTM_SUCCESS;
22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
22967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) ||
22977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) ||
22987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
22997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
23007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) ||
23017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS)  && btm_dev_encrypted(p_dev_rec) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))))
23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2303818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    // Check for 16 digits (or MITM)
2304818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2305818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                       (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) {
2306818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        rc = BTM_SUCCESS;
2307818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    }
23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2311899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2312899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2313899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2314899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2315899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2316899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (rc == BTM_SUCCESS)
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_callback)
23207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_SUCCESS);
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.sec_req_pending = TRUE;
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save pointer to service record */
23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service = p_serv_rec;
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2332899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */
2333899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2334899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2335899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2337899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2339899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (is_originator)
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT);
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2344899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else /* acceptor */
23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                chk_acp_auth_done = TRUE;
23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
2350899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth           }
2351899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2352899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4))
2353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2354899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the remote features are not known yet */
2355899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__,
2356899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags);
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2358899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
2359899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__,
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done);
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_security_required        = p_dev_rec->security_required;
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_is_originator            = p_dev_rec->is_originator;
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = security_required;
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = TRUE;
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = FALSE;
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are multiple service records used through the same PSM */
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* leave security decision for the multiplexor on the top */
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */
23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!BTM_SEC_IS_SM4(p_dev_rec->sm4))
23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pre-Lisbon: restore the old settings */
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = old_security_required;
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->is_originator     = old_is_originator;
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* if the originator is using dynamic PSM in legacy mode, do not start any security process now
2403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * The layer above L2CAP needs to carry out the security requirement after L2CAP connect
2404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * response is received */
2405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (is_originator &&
2406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001))
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24125344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* restore the old settings */
24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required = old_security_required;
24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_originator     = old_is_originator;
24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (chk_acp_auth_done)
24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SM4, but we do not know for sure which level of security we need.
24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * as long as we have a link key, it's OK */
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rc = BTM_DELAY_CHECK;
24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence
24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            because of data path issues. Delay this disconnect a little bit
24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
2436f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            LOG_INFO("%s peer should have initiated security process by now (SM4 to SM4)", __func__);
24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback        = p_callback;
24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state         = BTM_SEC_STATE_DELAY_FOR_ENC;
24397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, rc);
24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_SUCCESS;
24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2447ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
2448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id)
2449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Although authentication and encryption are per connection
2451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** authorization is per access request.  For example when serial connection
2452ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** is up and authorized and client requests to read file (access to other
2453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** scn), we need to request user's permission again.
2454ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        */
2455ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED;
2456ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2460899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2461899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2462899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2463899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2464899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2465899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2466899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2467899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2468899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2469899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      BTM_SEC_AUTHENTICATED);
2470899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2471899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2472899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2473899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2474899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* If we already have a link key to the connected peer, is it secure enough? */
2475899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_check_upgrade(p_dev_rec, is_originator);
2476899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d",
2480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
24867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc);
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_mx_access_request
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by all Multiplexing Protocols during
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establishing connection to or from peer device to grant
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  permission to establish application connection.
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id   - protocol ID of the multiplexer
25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id    - multiplexer channel to reach application
25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed
25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - Pointer to any reference data needed by the
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  the callback function.
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED
25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator,
25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT32 mx_proto_id, UINT32 mx_chan_id,
25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS        rc;
2522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16             security_required;
25237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN transport   = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */
25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2525444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator);
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id);
25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
25367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id);
25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NO_RESOURCES;
25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2543899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm)))
2544899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2545899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2546899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                           is_originator);
2547899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2548899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
2549899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2550899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = p_serv_rec->security_flags;
2551899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2552899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto phone) which connects to several services at the same time */
25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2557444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed  state: %s", __func__,
25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state));
25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rc = BTM_CMD_STARTED;
2561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2563899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2564899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2565899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2566899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2567899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
2568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
2571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (is_originator)
2572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
25747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    rc = BTM_SUCCESS;
2579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
2582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
25847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
25867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
25877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))&& btm_dev_encrypted(p_dev_rec))) ||
25887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2591818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    // Check for 16 digits (or MITM)
2592818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2593818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                       (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) {
2594818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        rc = BTM_SUCCESS;
2595818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    }
2596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2599899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2600899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2601899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2602899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2603899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2604899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (rc == BTM_SUCCESS)
2606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__);
2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */
2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* btm_sec_execute_procedure */
2610899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) ||
2611899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE)))
2612899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__);
2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2616899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2617899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2618899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Check whether there is a pending security procedure, if so we should always queue */
2619899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* the new security request */
2620899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)
2621899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__);
2623899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (rc == BTM_CMD_STARTED)
2626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2627899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__);
2628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_queue_mx_request (bd_addr, psm,  is_originator, mx_proto_id,
2629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      mx_chan_id, p_callback, p_ref_data);
2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else /* rc == BTM_SUCCESS */
2632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2633899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* access granted */
2634899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             if (p_callback)
2635899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc);
2637899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2638899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2639899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2640899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc,
2641899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                          btm_pair_state_descr(btm_cb.pairing_state));
2642899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return rc;
2643899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2644899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2645899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) ||
2646899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (btm_cb.security_mode == BTM_SEC_MODE_SC)))
2647899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2648899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2649899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives service connection establishment Request for */
2650899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Secure Connections Only service */
2651899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2652899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2653899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,",
2654899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "remote_support_for_sc %d: fail pairing",__FUNCTION__,
2655899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
2656899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2657899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2658899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2659899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                               BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2660899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2661899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service     = p_serv_rec;
2666899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    p_dev_rec->security_required = security_required;
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2668899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2669899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2670899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2674899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2675899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2676899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2677899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2678899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                {
2680899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2681899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                }
2682899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2683899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2684899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                          BTM_SEC_AUTHENTICATED);
2685899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2686899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2687899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
2688899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2689899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* If we already have a link key, check if that link key is good enough */
2690899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                btm_sec_check_upgrade(p_dev_rec, is_originator);
2691899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Although authentication and encryption are per connection */
27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization is per access request.  For example when serial connection */
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* is up and authorized and client requests to read file (access to other */
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* scn, we need to request user's permission again. */
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2705444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
2706444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2707444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
27147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc);
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rc;
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_conn_req
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when the peer device is requesting
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc)
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bda);
27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some device may request a connection before we are done with the HCI_Reset sequence */
273630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->get_is_ready())
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: connect request when device not ready");
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Security guys wants us not to allow connection from not paired devices */
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection is allowed for only paired devices */
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.connect_only_paired)
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))
27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device");
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE
27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If non-discoverable, only allow known devices to connect */
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE)
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from not paired device");
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN)))
27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device");
27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* incoming connection from bonding device is rejected */
27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Host is not interested or approved connection.  Save BDA and DC and */
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* pass request to L2CAP */
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN);
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_dc,  dc,  DEV_CLASS_LEN);
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2c_link_hci_conn_req (bda))
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* accept the connection -> allocate a device record */
27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec)
27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 |= BTM_SM4_CONN_PEND;
27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_bond_cancel_complete
28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to report bond cancel complete
28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void)
28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) ||
28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
2816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) ||
2817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME &&
2818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta          BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags))
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* for dedicated bonding in legacy mode, authentication happens at "link level"
28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * btm_sec_connected is called with failed status.
28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * In theory, the code that handles is_pairing_device/TRUE should clean out security related code.
28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * However, this function may clean out the security related flags and btm_sec_connected would not know
28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * this function also needs to do proper clean up.
28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         */
28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL)
28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify application that the cancel succeeded */
28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_bond_cancel_cmpl_callback)
28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS);
28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_create_conn_cancel_complete
28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the command complete message
28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the HCI for the create connection cancel
28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command.
28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p)
28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       status;
28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (status, p);
28525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s  status:%d",
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), status);
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if the create conn cancel cmd was issued by the bond cancel,
28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the application needs to be notified that bond cancel succeeded
28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (status)
28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_SUCCESS:
28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_CONNECTION_EXISTS:
28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_NO_CONNECTION:
28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify application of the error */
28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_bond_cancel_cmpl_callback)
28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING);
28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_check_pending_reqs
28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called at the end of the security procedure
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to let L2CAP and RFCOMM know to re-submit any pending requests
28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void)
28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_QUEUE_ENTRY    *p_e;
28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BUFFER_Q                bq;
28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First, resubmit L2CAP requests */
28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.sec_req_pending)
28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_req_pending = FALSE;
28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (NULL);
28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now, re-submit anything in the mux queue */
28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bq = btm_cb.sec_pending_q;
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_init_q (&btm_cb.sec_pending_q);
29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL)
29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check that the ACL is still up before starting security procedures */
2905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL)
29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2907444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_e->psm != 0)
2908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u",
2910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    __FUNCTION__, p_e->psm, p_e->is_orig,
2911444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    p_e->mx_proto_id, p_e->mx_chan_id);
29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2913444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig,
29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->mx_proto_id, p_e->mx_chan_id,
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->p_callback, p_e->p_ref_data);
2916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
2917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else
2918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback,
2920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                      p_e->p_ref_data);
2921444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (p_e);
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_init
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is on the SEC startup
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode)
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.security_mode = sec_mode;
29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN);
29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY;
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_device_down
29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called when device is disabled or
29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  turned off
29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void)
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2957444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_reset
29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called after device reset
29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void)
29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
297230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_simple_pairing())
29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set the default IO capabilities */
29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS;
29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mx service to use no security */
29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX,
29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0);
29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_abort_access_req
29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP or RFCOMM to abort
29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the pending operation.
29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr)
30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING)
30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING))
30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback = NULL;
30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dd_create_conn
30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to create the ACL connection for
30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the dedicated boding process
30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec)
30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3027ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
3028ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    if (p_lcb && (p_lcb->link_state == LST_CONNECTED || p_lcb->link_state == LST_CONNECTING))
3029ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    {
3030ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella       BTM_TRACE_WARNING("%s Connection already exists", __func__);
3031ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella       return BTM_CMD_STARTED;
3032ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    }
30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure an L2cap link control block is available */
3035ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    if (!p_lcb && (p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL)
30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up the control block to indicated dedicated bonding */
30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed create  [%02x%02x%02x%02x%02x%02x]",
30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_lcb(p_lcb);
30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_name_request_complete
30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when remote name was obtained from
30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer device
30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status)
30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int              i;
30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS        dev_class;
30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sec_state;
30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete");
30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda))
30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr)))
30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_acl_resubmit_page();
30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If remote name request failed, p_bd_addr is null and we need to search */
30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* based on state assuming that we are doing 1 at a time */
30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bd_addr)
30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = btm_find_dev (p_bd_addr);
30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = &btm_cb.sec_dev_rec[0];
30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME))
31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_bd_addr = p_dev_rec->bd_addr;
31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (i == BTM_SEC_MAX_DEVICE_RECORDS)
31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = NULL;
31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_bd_name)
31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bd_name = (UINT8 *)"";
31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: 0x%08x ",
31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status, p_dev_rec->sec_state, p_dev_rec);
31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d",
31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status);
31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
31365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        old_sec_state = p_dev_rec->sec_state;
31385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN);
31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
31425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */
31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_bd_name[0] = 0;
31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)
31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved */
31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3156831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class,
31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                 p_dev_rec->sec_bd_name);
31595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[0] = 0;
31645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[1] = 0;
31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[2] = 0;
31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved even if not found so clients can continue */
31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3170831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)"");
31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we were delaying asking UI for a PIN because name was not resolved, ask now */
31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr
31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) )
31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback);
31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) &&
31845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) &&
31855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_pin_callback)
31865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback");
31885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
3189818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name,
3190818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (p_dev_rec->p_cur_service==NULL) ? FALSE
3191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                     : (p_dev_rec->p_cur_service->security_flags & BTM_SEC_IN_MIN_16_DIGIT_PIN));
31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the same state again to force the timer to be restarted */
31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we were delaying bonding because name was not resolved */
32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
32015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0)
32035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
3205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD)
3206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
3207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_sec_bond_cancel_complete();
3208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return;
3209ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
3210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != HCI_SUCCESS)
32125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
32145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_cb.api.p_auth_complete_callback)
32167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
32177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                            p_dev_rec->sec_bd_name, status);
32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */
32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/
32257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* If it is set, there may be a race condition */
32265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete  IS_SM4_UNKNOWN Flags:0x%04x",
32277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                   btm_cb.pairing_flags);
32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 |= BTM_SM4_KNOWN;
32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__,
32357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
32367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
32377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN.
32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed)
32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec))
32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  before originating  */
32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
32475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Both we and the peer are 2.1 - continue to create connection */
32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
32525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection");
32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    if (btm_cb.api.p_auth_complete_callback)
32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR);
32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if we were delaying link_key_callback because name was not resolved */
32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->link_key_not_sent)
32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If HCI connection complete has not arrived, wait for it */
32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = FALSE;
32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_send_link_key_notif(p_dev_rec);
32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If its not us who perform authentication, we should tell stackserver */
32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* that some authentication has been completed                          */
32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is required when different entities receive link notification and auth complete */
32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, HCI_SUCCESS);
32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)");
33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (old_sec_state != BTM_SEC_STATE_GETTING_NAME)
33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If get name failed, notify the waiting layer */
33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event  (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND)
33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("waiting for remote features!!");
33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remote Name succeeded, execute the next security procedure, if any */
33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_CMD_STARTED)
33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is no next procedure or start of procedure failed, notify the waiting layer */
33297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_sec_dev_rec_cback_event  (p_dev_rec, status, FALSE);
33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_host_support_feat_evt
33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the
33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received
33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p)
33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR         bd_addr;        /* peer address */
33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_FEATURES     features;
33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (bd_addr, p);
33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
33505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x", p_dev_rec->sm4, p[0]);
33525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 = BTM_SM4_KNOWN;
33563aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE);
33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (HCI_SSP_HOST_SUPPORTED(features))
33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 = BTM_SM4_TRUE;
33605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
33615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
33625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_req
33685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when LM request for the IO
33705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  capability of the local device and
33715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if the OOB data is present for the device in the event
33725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p)
33775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_REQ  evt_data;
33795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           err_code = 0;
33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         is_orig = TRUE;
33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           callback_rc = BTM_SUCCESS;
33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
33855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* setup the default response according to compile options */
33875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* assume that the local IO capability does not change
33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * loc_io_caps is initialized with the default value */
33895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.io_cap = btm_cb.devcb.loc_io_caps;
33905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.oob_data = BTM_OOB_NONE;
33915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
33925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3393899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state));
33945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
3396899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__,
3398899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                      btm_cb.security_mode, p_dev_rec->num_read_pages);
3399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0))
3401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Device security mode is SC only.",
3403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         "To continue need to know remote features.", __FUNCTION__);
3404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = TRUE;
3406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return;
3407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
34095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 |= BTM_SM4_TRUE;
34105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
3412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state),
3413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     btm_cb.pairing_flags, p_dev_rec->p_cur_service);
34145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->p_cur_service)
34165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x",
3418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, p_dev_rec->p_cur_service->psm,
3419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         p_dev_rec->p_cur_service->security_flags);
3420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    switch (btm_cb.pairing_state)
3423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator connecting */
3425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_IDLE:
3426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //TODO: Handle Idle pairing state
3427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //security_required = p_dev_rec->security_required;
3428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* received IO capability response already->acceptor */
3431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_INCOMING_SSP:
34325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_orig = FALSE;
34335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD)
3435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* acceptor in dedicated bonding */
34375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
3438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator, at this point it is expected to be dedicated bonding
3442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        initiated by local device */
3443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_WAIT_PIN_REQ:
3444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN))
34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
34475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
34485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
34495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                err_code = HCI_ERR_HOST_BUSY_PAIRING;
34515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3453899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* any other state is unexpected */
3455899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        default:
34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err_code = HCI_ERR_HOST_BUSY_PAIRING;
3457899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__,
3458899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             btm_cb.pairing_state);
3459899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_disabled)
3463899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3464899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* pairing is not allowed */
3465899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__);
34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3467899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3468899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3469899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3470899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
3471899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* device in Secure Connections Only mode */
3472899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
3473899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3474899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,",
3475899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__,
3476899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
3477899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3478899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3479899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3480899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (err_code != 0)
34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code);
34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.is_orig = is_orig;
34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_orig)
34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local device initiated the pairing non-bonding -> use p_cur_service */
34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_cur_service &&
34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE))
35005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3501899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3502899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* SC only mode device requires MITM protection */
3504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_AUTH_SP_YES;
3505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
3507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3508899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags &
3509899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                     BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO;
3510899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
35165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
35215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: False-positive: evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
35225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS);
35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    callback_rc = BTM_SUCCESS;
35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_UPGRADE)
35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE;
35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */
35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.auth_req = BTM_AUTH_SPGB_YES;
35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.api.p_sp_callback)
35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* the callback function implementation may change the IO capability... */
35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data))
35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (callback_rc == BTM_SUCCESS)
35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT));
35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3553899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3554899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3555899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* At this moment we know that both sides are SC capable, device in */
3556899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* SC only mode requires MITM for any service so let's set MITM bit */
3557899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            evt_data.auth_req |= BTM_AUTH_YN_BIT;
3558899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x",
3559899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             __FUNCTION__, evt_data.auth_req);
3560899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* if the user does not indicate "reply later" by setting the oob_data to unknown */
3563899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* send the response right now. Save the current IO capability in the control block */
35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = evt_data.auth_req;
35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = evt_data.io_cap;
35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3567899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
3568899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap,
3569899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         evt_data.oob_data, evt_data.auth_req);
35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap,
35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    evt_data.oob_data, evt_data.auth_req);
35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_rsp
35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the IO capability of the
35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  specified device is received
35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p)
35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_RSP evt_data;
35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.io_cap, p);
35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.oob_data, p);
35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.auth_req, p);
35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a new device record or reuse the oldest one */
35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no security is in progress, this indicates incoming security */
36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP);
36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* work around for FW bug */
36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_stop_on_ssp();
36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We must have a device record here.
36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * Use the connecting device's CoD for the connection */
36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFALSE-POSITIVE error from Coverity test-tool. evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */
36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */
36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (evt_data.auth_req & BTM_AUTH_DD_BOND) )            /* and dedicated bonding bit is set */
36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD;
36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the IO capability in the device record */
36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_io_caps  = evt_data.io_cap;
36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_auth_req = evt_data.auth_req;
36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_proc_sp_req_evt
36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_USER_CONFIRMATION_REQUEST_EVT
36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_REQUEST_EVT
36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_NOTIFY_EVT
36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p)
36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_ERR_PROCESSING;
36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_EVT_DATA evt_data;
36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_bda = evt_data.cfm_req.bd_addr;
36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All events start with bd_addr */
36605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5],
36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      event, btm_pair_state_descr(btm_cb.pairing_state));
36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL)
36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S ((char *)evt_data.cfm_req.bd_name, sizeof(evt_data.cfm_req.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN);
36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_CFM_REQ_EVT:
36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Numeric confirmation. Need user to conf the passkey */
36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM);
36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* The device record must be allocated in the "IO cap exchange" step */
36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p);
36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.just_works = TRUE;
36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* process user confirm req in association with the auth_req param */
36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO)
36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO)
36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO)
36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) )
36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Both devices are DisplayYesNo and one or both devices want to authenticate
36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       -> use authenticated link key */
36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    evt_data.cfm_req.just_works = FALSE;
36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps,
36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req);
37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_auth_req   = btm_cb.devcb.loc_auth_req;
37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_auth_req   = p_dev_rec->rmt_auth_req;
37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_io_caps    = btm_cb.devcb.loc_io_caps;
37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_io_caps    = p_dev_rec->rmt_io_caps;
37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_NOTIF_EVT:
37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Passkey notification (other side is a keyboard) */
37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.key_notif.passkey, p);
37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT:  passkey: %u", evt_data.key_notif.passkey);
37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_REQ_EVT:
37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* HCI_USER_PASSKEY_REQUEST_EVT */
37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY);
37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_sp_callback)
37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data);
37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != BTM_NOT_AUTHORIZED)
37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */
37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) )
37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* automatically reply with just works if no sp_cback */
37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event == BTM_SP_CFM_REQ_EVT)
37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status);
37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ConfirmReqReply (status, p_bda);
37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (event == BTM_SP_KEY_REQ_EVT)
37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_PasskeyReqReply(status, p_bda, 0);
37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Something bad. we can only fail this connection */
37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SP_CFM_REQ_EVT == event)
37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (p_bda, FALSE);
37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (BTM_SP_KEY_NOTIF_EVT == event)
37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do nothing -> it very unlikely to happen.
37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        This event is most likely to be received by a HID host when it first connects to a HID device.
37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Usually the Host initiated the connection in this case.
37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        On Mobile platforms, if there's a security process happening,
37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        the host probably can not initiate another connection.
37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTW (PC) is another story.  */
37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (NULL != (p_dev_rec = btm_find_dev (p_bda)) )
37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE);
37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply(p_bda);
37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_keypress_notif_evt
37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a key press notification is
37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received
37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid  btm_keypress_notif_evt (UINT8 *p)
37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_KEYPRESS    evt_data;
37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse & report BTM_SP_KEYPRESS_EVT */
37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bda = evt_data.bd_addr;
38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_BDADDR (p_bda, p);
38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.notif_type = *p;
38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_simple_pair_complete
38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when simple pairing process is
38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete
38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p)
38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_COMPLT  evt_data;
38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status;
38235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         disc = FALSE;
38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = *p++;
38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL)
38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (evt_data.bd_addr[0]<<24) + (evt_data.bd_addr[1]<<16) + (evt_data.bd_addr[2]<<8) + evt_data.bd_addr[3],
38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]);
38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),  status, p_dev_rec->sec_state);
38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.status = BTM_ERR_PROCESSING;
38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_PAIRING_NOT_ALLOWED)
38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The test spec wants the peer device to get this failure code. */
38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT);
38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Change the timer to 1 second */
38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT);
38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0)
38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop the timer */
38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_stop_timer (&btm_cb.pairing_tle);
38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* the initiating side: will receive auth complete event. disconnect ACL at that time */
38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                disc = TRUE;
38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc = TRUE;
38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Let the pairing state stay active, p_auth_complete_callback will report the failure */
38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
38755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (disc)
38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* simple pairing failed */
3880db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        /* Avoid sending disconnect on HCI_ERR_PEER_USER */
3881db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))
3882db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
3883db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
3884db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_rem_oob_req
38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_REMOTE_OOB_DATA_REQUEST_EVT
38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p)
39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_RMT_OOB  evt_data;
39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      c;
39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      r;
39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bda = evt_data.bd_addr;
39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
39135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) &&
39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btm_cb.api.p_sp_callback)
39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S((char *)evt_data.bd_name, sizeof(evt_data.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN+1);
3920ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.bd_name[BTM_MAX_REM_BD_NAME_LEN] = 0;
39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP);
39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((*btm_cb.api.p_sp_callback) (BTM_SP_RMT_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data) == BTM_NOT_AUTHORIZED)
39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_RemoteOobDataReply(TRUE, p_bda, c, r);
39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* something bad. we can only fail this connection */
39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_rem_oob_neg_reply (p_bda);
39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_read_local_oob_complete
39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when read local oob data is
39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p)
39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_LOC_OOB evt_data;
39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status = *p++;
39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status);
39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.c, p);
39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.r, p);
39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_ERR_PROCESSING;
39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */
39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_collision
39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when authentication or encryption
39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  needs to be retried at a later time.
39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle)
39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btm_cb.collision_start_time)
3980c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati        btm_cb.collision_start_time = GKI_get_os_tick_count();
39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3982c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    if ((GKI_get_os_tick_count() - btm_cb.collision_start_time) < btm_cb.max_collision_delay)
39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (handle == BTM_SEC_INVALID_HANDLE)
39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL)
39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING);
39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_find_dev_by_handle (handle);
39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec != NULL)
39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We will restart authentication after timeout */
39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_state = 0;
39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_collided_dev_rec = p_dev_rec;
40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_collision_tle.param = (UINT32) btm_sec_collision_timeout;
40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT);
40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_complete
40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when authentication of the connection is
40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status)
40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sm4;
40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state   = btm_cb.pairing_state;
40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             are_bonding = FALSE;
40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d  dev->sec_state: %u  Bda:%08x, RName:%s",
40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status,
40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_state,
40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (p_dev_rec->bd_addr[2]<<24)+(p_dev_rec->bd_addr[3]<<16)+(p_dev_rec->bd_addr[4]<<8)+p_dev_rec->bd_addr[5],
40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d",
40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status);
40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection was made just to do bonding.  If we authenticate
40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       the connection that is up, this is the last event received.
40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec
40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))
40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* keep the old sm4 flag and clear the retry bit in control block */
40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_sm4 = p_dev_rec->sm4;
40715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= ~BTM_SM4_RETRY;
40725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
40745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        are_bonding = TRUE;
40775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4078e11f228d1a18486cd00c36487812a763487a236fSrinu Jella    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
4079e11f228d1a18486cd00c36487812a763487a236fSrinu Jella          &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
4080e11f228d1a18486cd00c36487812a763487a236fSrinu Jella        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS)
40855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             &&  (old_state != BTM_PAIR_STATE_IDLE) )
40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be a race condition, when we are starting authentication and
40955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the peer device is doing encryption.
40965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If first we receive encryption change up, then initiated authentication
40975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** can not be performed.  According to the spec we can not do authentication
40985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** on the encrypted link, so device is correct.
40995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_COMMAND_DISALLOWED)
41015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) ==
41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)))
41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HCI_SUCCESS;
41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Currently we do not notify user if it is a keyboard which connects */
41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* User probably Disabled the keyboard while it was asleap.  Let her try */
41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_auth_complete_callback)
41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* report the suthentication status */
41115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state != BTM_PAIR_STATE_IDLE)
41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
41135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
41205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (are_bonding)
41215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != HCI_SUCCESS)
4125db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
4126db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
4127db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
4128db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL");
4132e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec))
4133e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* no LE keys are available, do deriving */
4134e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4135e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4136e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) &&
4137e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL");
41405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (btm_sec_is_master(p_dev_rec))
4142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
4143e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // Encryption is required to start SM over BR/EDR
4144e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // indicate that this is encryption after authentication
4145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL);
4146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
4147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
4149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4150e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If authentication failed, notify the waiting layer */
41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((old_sm4 & BTM_SM4_RETRY) == 0)
41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* allow retry only once */
41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION)
41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this retry for missing key is for Lisbon or later only.
41675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * Legacy device do not need this. the controller will drive the retry automatically */
41685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4))
41695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
41735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* With BRCM controller, we do not need to delete the stored link key in controller.
41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                If the stack may sit on top of other controller, we may need this
41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_DeleteStoredLinkKey (bd_addr, NULL); */
41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sm4 & BTM_SM4_RETRY)
41815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_execute_procedure (p_dev_rec);
41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
41845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
41885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
41905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
41925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
41975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4199818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4200818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4201818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        // If we have MITM protection we have a higher level of security than
4202818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        // provided by 16 digits PIN
4203818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4204818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4205818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Authentication succeeded, execute the next security procedure, if any */
42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_execute_procedure (p_dev_rec);
42085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
42117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
42125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
42135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
42155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_encrypt_change
42175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when encryption of the connection is
42195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
42205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
42225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
42245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable)
42255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
4227ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
42287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN       *p_acl = NULL;
42297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8           acl_idx = btm_handle_to_acl_index(handle);
4230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
42315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
42325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
42335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
42345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
42365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
4237e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) ||
4238e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
42395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
42415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
42445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
42465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && encr_enable)
42497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
4250818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        if (p_dev_rec->hci_handle == handle) {
42517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
4252818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            if (p_dev_rec->pin_code_length >= 16 ||
4253818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4254818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4255818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4256818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            }
4257818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
42587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
4259818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        {
42607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
4261818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
42627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
42635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* It is possible that we decrypted the link to perform role switch */
42655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* mark link not to be encrypted, so that when we execute security next time it will kick in again */
42665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && !encr_enable)
42677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
42687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->hci_handle == handle)
42697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
42707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
42717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
42727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
42735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
4275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
42765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4277e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (acl_idx != MAX_L2CAP_LINKS)
42787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_acl = &btm_cb.acl_db[acl_idx];
4279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, p_acl->transport, encr_enable);
4281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
42827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_acl && p_acl->transport == BT_TRANSPORT_LE)
42835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4284e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE ||
4285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)
4286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4287d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN);
4288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
4289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4290dea4f9b42fd373d8a46565d933ec49a6583a9117Satya Calloji        btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable);
42915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4294e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    {
42955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* BR/EDR connection, update the encryption key size to be 16 as always */
42965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->enc_key_size = 16;
4297e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    }
4298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4299e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun     BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d",
4300e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                       __func__, p_dev_rec->new_encryption_key_is_p256);
4301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle))
4303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec->new_encryption_key_is_p256)
4305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_sec_use_smp_br_chnl(p_dev_rec) &&
4307e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                btm_sec_is_master(p_dev_rec) &&
4308e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* if LE key is not known, do deriving */
4309e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4310e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4311e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
4312e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* BR/EDR is encrypted with LK that can be used to derive LE LTK */
4315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                p_dev_rec->new_encryption_key_is_p256 = FALSE;
4316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4317e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                if (p_dev_rec->no_smp_on_br)
4318e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4319e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__);
4320e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4321e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                else
4322e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4323e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__);
4324e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    SMP_BR_PairWith(p_dev_rec->bd_addr);
4325e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
4329e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        {
4330e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // BR/EDR is successfully encrypted. Correct LK type if needed
4331e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // (BR/EDR LK derived from LE LTK was used for encryption)
4332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((encr_enable == 1)  && /* encryption is ON for SSP */
4333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* LK type is for BR/EDR SC */
4334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 ||
4335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                 p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)
4338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB;
4339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */
4340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB;
4341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type);
4343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                btm_send_link_key_notif(p_dev_rec);
4344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4347444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else
4348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable);
4349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */
43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this encryption was started by peer do not need to do anything */
43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING)
43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state)
43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If encryption setup failed, notify the waiting layer */
43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Encryption setup succeeded, execute the next security procedure, if any */
43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
43757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connect_after_reject_timeout
43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Connection for bonding could not start because of the collision
43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Initiate outgoing connection
43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_connect_after_reject_timeout (TIMER_LIST_ENT *p_tle)
43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec;
43915cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()");
43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.sec_collision_tle.param = 0;
43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_collided_dev_rec = 0;
43965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection");
44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (btm_cb.api.p_auth_complete_callback)
44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connected
44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establsihed
44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode)
44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda);
44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            res;
44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          is_pairing_device = FALSE;
44245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN        *p_acl_cb;
44257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8            bit_shift = 0;
44265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
44285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x RName:%s",
44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x ",
44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no device record for new connection.  Allocate one */
44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4456bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            /* If the device matches with stored paring address
4457bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella             * reset the paring state to idle */
4458bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
4459bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella                (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0))
4460bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            {
4461bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella                btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
4462bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            }
4463bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella
44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* can not find the device record and the status is error,
44655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * just ignore it */
44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else    /* Update the timestamp for this device */
44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
44727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
44737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0;
44747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->timestamp = btm_cb.dev_rec_count++;
44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell L2CAP it's a bonding connection. */
44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if incoming connection failed while pairing, then try to connect and continue */
44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Motorola S9 disconnects without asking pin code */
44855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ))
44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
44875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
44885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
44905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* Start timer with 0 to initiate connection with new LCB */
44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* because L2CAP will delete current LCB with this event  */
44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.p_collided_dev_rec = p_dev_rec;
44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout;
44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0);
44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
45017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                        BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR);
45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
45045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
45055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE);
45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
45125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always clear the pending flag */
45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
45155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
45197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
45207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
45217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
45225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
45235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
45245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4527ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
45295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) )
45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection from bonding device */
45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((status == HCI_ERR_HOST_REJECT_DEVICE)
45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT))
45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
45365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags, p_dev_rec->sm4);
45375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
45395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
45437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR);
45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if we already have pin code */
45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Start timer with 0 to initiate connection with new LCB */
45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* because L2CAP will delete current LCB with this event  */
45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.p_collided_dev_rec = p_dev_rec;
45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout;
45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0);
45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
45585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* wait for incoming connection without resetting pairing state */
45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (status == HCI_ERR_CONNECTION_EXISTS)
45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection");
45635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
45645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_pairing_device = TRUE;
45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if connection fails during pin request, notify application */
45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
45745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If connection failed because of during pairing, need to tell user */
45765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_pairing_device)
45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
45805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required );
45815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
45835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
45855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
45895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /*
45937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta     Do not send authentication failure, if following conditions hold good
45947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      1.  BTM Sec Pairing state is idle
45957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      2.  Link key for the remote device is present.
45967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      3.  Remote is SSP capable.
45977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta  */
45987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else if  ((p_dev_rec->link_key_type  <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
45997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (((status == HCI_ERR_AUTH_FAILURE)                      ||
46005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_KEY_MISSING)                         ||
46015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_HOST_REJECT_SECURITY)                ||
46025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_NOT_ALLOWED)                 ||
46035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_UNIT_KEY_USED)                       ||
46045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)           ||
46067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (status == HCI_ERR_REPEATED_ATTEMPTS))))
46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
46097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
46107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
46117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
46127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE
46137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* If we rejected pairing, pass this special result code */
46147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY)
46157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
46167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                status = HCI_ERR_HOST_REJECT_SECURITY;
46177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
46187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT  ||
46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status == HCI_ERR_UNSPECIFIED     || status == HCI_ERR_PAGE_TIMEOUT)
46317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE);
46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
46337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If initiated dedicated bonding, return the link key now, and initiate disconnect */
46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If dedicated bonding, and we now have a link key, we are all done */
46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_pairing_device
46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) )
46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->link_key_not_sent)
46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->link_key_not_sent = FALSE;
46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_send_link_key_notif(p_dev_rec);
46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remember flag before it is initialized */
46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = TRUE;
46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = FALSE;
46565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( res )
46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Let l2cap start bond timer */
46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE);
46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* role may not be correct here, it will be updated by l2cap, but we need to */
46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify btm_acl that link is up, so starting of rmt name request will not */
46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set paging flag up */
46787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_acl_cb)
46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */
46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* For now there are a some devices that do not like sending */
46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* commands events and data at the same time. */
46855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the packet types to the default allowed by the device */
46865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
46875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.btm_def_link_policy)
46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
46905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR);
46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize security flags.  We need to do that because some            */
46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization complete could have come after the connection is dropped */
46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* and that would set wrong flag that link has been authorized already    */
46977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
46987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift);
46995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
47017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
47025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
47047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
47055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4706818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4707818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4708818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4709818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift);
4710818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4711818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->link_key_changed = FALSE;
47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* After connection is established we perform security if we do not know */
47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the name, or if we are originator because some procedure can have */
47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* been scheduled while connection was down */
47175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator);
47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator)
47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
47217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnect
47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to disconnect HCI link
47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          btm status
47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason)
47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* In some weird race condition we may not have a record */
47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_disconnect (handle, reason);
47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
47445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
47485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
47495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
47505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we are currently doing bonding.  Link will be disconnected when done */
47525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
47535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_BUSY);
47545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
47575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnected
47625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
47645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dropped
47655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
47675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason)
47705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
47725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8             old_pairing_flags = btm_cb.pairing_flags;
47735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               result = HCI_ERR_AUTH_FAILURE;
4774ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    tBTM_SEC_CALLBACK   *p_callback = NULL;
47757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT      transport = BT_TRANSPORT_BR_EDR;
47765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If page was delayed for disc complete, can do it now */
47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.discing = FALSE;
47795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
47815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
47835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
47845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    transport  = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE;
47867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
4787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
4790f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    LOG_INFO("%s clearing pending flag handle:%d reason:%d", __func__, handle, reason);
47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear unused flags */
47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= BTM_SM4_TRUE;
47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4797f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr;
4798f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x"
4799f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            "  remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state),
4800f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            reason, bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5], p_dev_rec->sec_bd_name);
48015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4802f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
48035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
48055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
48065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0))
48075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
48095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
48105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
48115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
48125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the disconnection reason is REPEATED_ATTEMPTS,
48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               send this error message to complete callback function
48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               to display the error message of Repeated attempts.
48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               All others, send HCI_ERR_AUTH_FAILURE. */
48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (reason == HCI_ERR_REPEATED_ATTEMPTS)
48175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
48185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_REPEATED_ATTEMPTS;
48195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
48205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
48215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
48225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_HOST_REJECT_SECURITY;
48235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
48245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,     p_dev_rec->dev_class,
48255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, result);
48265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
48275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
483024adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS);
48315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* see sec_flags processing in btm_acl_removed */
48327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
48337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
48347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
48357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
48367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED);
483782c8b9270ba962d5f271a833a3454baddbc063aaNitin Arora        p_dev_rec->enc_key_size = 0;
48387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
48397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
48405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
48417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
48427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
4843818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
4844818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                | BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED);
48457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
48465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)
4849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ?
4851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
4852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return;
4853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4854444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
48557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
48565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_NONE;
4857ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4858ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    p_callback = p_dev_rec->p_callback;
4859ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4860ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    /* if security is pending, send callback to clean up the security state */
4861ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    if(p_callback)
4862ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    {
4863ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before
4864ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach                                         we do, this call back must be reset here */
48657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
4866ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    }
4867ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4868f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_notification
48745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a new connection link key is
48765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  generated
48775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
48795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type)
48825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
4884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         we_are_bonding = FALSE;
4885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         ltk_derived_lk  = FALSE;
48865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_notification()  BDA:%04x%08x, TYPE: %d",
48885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5],
48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      key_type);
48905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) &&
4892444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256))
4893444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        ltk_derived_lk = TRUE;
4895444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        key_type -= BTM_LTK_DERIVED_LKEY_OFFSET;
4896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
48985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
48995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type != BTM_LKEY_TYPE_CHANGED_COMB)
49015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_type = key_type;
49025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
4904818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
4905818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    /*
4906818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     * Until this point in time, we do not know if MITM was enabled, hence we
4907818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     * add the extended security flag here.
4908818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     */
4909818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4910818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4911818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4912818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4913818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4914818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
4915ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
4916ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* BR/EDR connection, update the encryption key size to be 16 as always */
4917ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->enc_key_size = 16;
4918ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
49195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN);
49205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
49225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
49235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
49255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            we_are_bonding = TRUE;
49265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
49275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
49285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* save LTK derived LK no matter what */
4931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (ltk_derived_lk)
4932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_cb.api.p_link_key_callback)
4934444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4935444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)",
4936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                  __FUNCTION__, p_dev_rec->link_key_type);
4937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_dev_rec->sec_bd_name,
4939444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_link_key, p_dev_rec->link_key_type);
4940444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4941444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
4943444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) ||
4945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4947e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun             p_dev_rec->new_encryption_key_is_p256 = TRUE;
4948444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji             BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d",
4949e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                               __func__, p_dev_rec->new_encryption_key_is_p256);
4950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If name is not known at this point delay calling callback until the name is   */
49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* resolved. Unless it is a HID Device and we really need to send all link keys. */
49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
4956e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        &&  ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL))
4957e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        && !ltk_derived_lk)
49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_link_key_notification()  Delayed BDA: %08x%04x Type:%d",
4960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3],
4961444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[4] << 8) + p_bda[5], key_type);
49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = TRUE;
49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If it is for bonding nothing else will follow, so we need to start name resolution */
49665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (we_are_bonding)
49675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0)))
49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_inq_rmt_name_failed();
49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1])
49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If its not us who perform authentication, we should tell stackserver */
49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* that some authentication has been completed                          */
49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This is required when different entities receive link notification and auth complete */
4979e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)
4980e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        /* for derived key, always send authentication callback for BR channel */
4981e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun         || ltk_derived_lk)
49825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
49845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
49865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We will save link key only if the user authorized it - BTE report link key in all cases */
49895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE
49905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
49915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
49925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_link_key_callback)
49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4995e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (ltk_derived_lk)
4996e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4997e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                BTM_TRACE_DEBUG ("btm_sec_link_key_notification()  LTK derived LK is saved already"
4998e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                    " (key_type = %d)", p_dev_rec->link_key_type);
4999e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
5000e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            else
5001e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
5002e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
5003e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_dev_rec->sec_bd_name,
5004e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_link_key, p_dev_rec->link_key_type);
5005e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda)
50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_request()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5026b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
5027b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (btm_cb.collision_start_time != 0) &&
5028b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) )
5029b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    {
5030b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req "
5031b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta            "State: %d START_TIMEOUT : %d",
5032b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta             btm_cb.pairing_state, btm_cb.collision_start_time);
5033b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        btsnd_hcic_link_key_neg_reply (p_bda);
5034b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        return;
5035b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    }
50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key);
50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (p_bda);
50445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The link key is not in the database and it is not known to the manager */
50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_link_key_neg_reply (p_bda);
50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pairing_timeout
50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when host does not provide PIN
50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  within requested time
50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
50595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle)
50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE)
50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_NO;
50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_YES;
50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name[2];
50715cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->pairing_tle.param = 0;
50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */
50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[UNUSED_VALUE] pointer p_dev_rec is actually used several times... This is a Coverity false-positive, i.e. a fake issue.
50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (p_cb->pairing_bda);
50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pairing_timeout()  State: %s   Flags: %u",
50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags);
50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->pairing_state)
50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:
50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:
50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0)
50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda);
50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that no longer need the PIN */
50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
51005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
51015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
51035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:
51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE);
51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:
51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda);
51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */
51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:
51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                auth_req |= BTM_AUTH_DD_BOND;
51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps,
51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         BTM_OOB_NONE, auth_req);
51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:
51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda);
51335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */
51365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:
51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* simple pairing failed. Started a 1-sec timer at simple pairing complete.
51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * now it's time to tear down the ACL link*/
51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec == NULL)
51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
51425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3],
51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]);
51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:
515205bb84c66dc4813b5da13a7d2db27e80fb613293Srinu Jella        case BTM_PAIR_STATE_GET_REM_NAME:
51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that timeout has happened while waiting for authentication*/
51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
51725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state));
51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pin_code_request
51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests PIN code
51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda)
51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
51895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB          *p_cb = &btm_cb;
51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
519257bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#ifdef PORCHE_PAIRING_CONFLICT
519357bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    UINT8 default_pin_code_len = 4;
519457bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath    PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30};
519557bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#endif
51965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pin_code_request()  State: %s, BDA:%04x%08x",
51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),
51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5] );
51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0)  &&
52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) )
52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* fake this out - porshe carkit issue - */
52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//            btm_cb.pairing_state = BTM_PAIR_STATE_IDLE;
52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             if(! btm_cb.pin_code_len_saved)
52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_neg_reply (p_bda);
52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 return;
52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             else
52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             {
52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
5215818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                 return;
52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             }
52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ)
52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s",
52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                btm_pair_state_descr(btm_cb.pairing_state));
52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reply pin code again due to counter in_rand when local initiates pairing */
52265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(! btm_cb.pin_code_len_saved)
52285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
522957bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
523057bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath                btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code);
52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
52335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code);
52365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (p_bda);
52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (p_bda);
52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* received PIN code request. must be non-sm4 */
52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 = BTM_SM4_KNOWN;
52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN);
52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD;
52535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED))
52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying");
52605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code);
52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use the connecting device's CoD for the connection */
52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN))
52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) )
52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN);
52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We could have started connection after asking user for the PIN code */
52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len != 0)
52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply");
52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code);
52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT
52775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = btm_cb.pin_code_len;
52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
52795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark that we forwarded received from the user PIN code */
52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = 0;
52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can change mode back right away, that other connection being established */
52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* is not forced to be secure - found a FW issue, so we can not do this
52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode(); */
52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If pairing disabled OR (no PIN callback and not bonding) */
52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* OR we could not allocate entry in the database reject pairing request */
52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_cb->pairing_disabled
52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (p_cb->api.p_pin_callback == NULL)
52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* OR Microsoft keyboard can for some reason try to establish connection */
52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  the only thing we can do here is to shut it up.  Normally we will be originator */
52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  for keyboard bonding */
52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (!p_dev_rec->is_originator
52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
53005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) )
53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_neg_reply (p_bda);
53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify upper layer of PIN request and start expiration timer */
53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
53095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len_saved = 0;
53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Pin code request can not come at the same time as connection request */
53135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN);
53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if the name is known */
53175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Even if name is not known we might not be able to get one */
53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is the case when we are already getting something from the */
53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* device, so HCI level is flow controlled */
53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Also cannot send remote name request while paging, i.e. connection is not completed */
53215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback");
53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
5326818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            if (p_cb->api.p_pin_callback) {
5327818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
5328818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        (p_dev_rec->p_cur_service == NULL) ? FALSE
5329818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                : (p_dev_rec->p_cur_service->security_flags
5330818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                   & BTM_SEC_IN_MIN_16_DIGIT_PIN));
5331818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            }
53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name");
53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We received PIN code request for the device with unknown name */
53385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* it is not user friendly just to ask for the PIN without name */
53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* try to get name at first */
53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr,
53415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_PAGE_SCAN_REP_MODE_R1,
53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_MANDATARY_PAGE_SCAN_MODE, 0))
53435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[0] = 'f';
53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[1] = '0';
53475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback");
53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_cb->api.p_pin_callback)
5351818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class,
5352818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                            p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE
5353818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                    : (p_dev_rec->p_cur_service->security_flags
5354818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                       & BTM_SEC_IN_MIN_16_DIGIT_PIN));
53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
53565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
53615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
53635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_update_clock_offset
53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to update clock offset
53675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
53715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset)
53725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
53735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
53745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO     *p_inq_info;
53755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL)
53775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
53785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
53805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL)
53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
53855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
53865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************
53895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C     F U N C T I O N S
53905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/
53915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
53935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_execute_procedure
53955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start required security
53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.  There is a case when multiplexing protocol
53985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  calls this function on the originating side, connection to
53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer will not be established.  This function in this
54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  case performs only authorization.
54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS     - permission is granted
54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED - in process
54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES  - permission declined
54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec)
54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is a chance that we are getting name.  Wait until done. */
54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != 0)
54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If any security is required, get the name first */
54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start get name");
54215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_get_name (p_dev_rec))
54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authenticated and authentication is required */
54295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authentication and return PENDING to the caller */
5430818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
54315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
5432818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE))))
5433818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        || (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
5434818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            && (!p_dev_rec->is_originator
5435818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    && (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN))))
54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
54375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5438818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        /*
5439818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use,
5440818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the
5441818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * BTM_SEC_AUTHENTICATED is used for both MITM and non-MITM
5442818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * authenticated connections, hence we cannot distinguish here.
5443818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         */
5444818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
54455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
54465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
54475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
54485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
54495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
54505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start authentication");
54525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5453818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        /*
5454818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * If we do have a link-key, but we end up here because we need an
5455818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * upgrade, then clear the link-key known and authenticated flag before
5456818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * restarting authentication.
5457818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * WARNING: If the controller has link-key, it is optional and
5458818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * recommended for the controller to send a Link_Key_Request.
5459818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * In case we need an upgrade, the only alternative would be to delete
5460818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * the existing link-key. That could lead to very bad user experience
5461818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * or even IOP issues, if a reconnect causes a new connection that
5462818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * requires an upgrade.
5463818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         */
5464818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
5465818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                && (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
5466818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    && (!p_dev_rec->is_originator && (p_dev_rec->security_required
5467818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                            & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) {
5468818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED
5469818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    | BTM_SEC_AUTHENTICATED);
5470818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
5471818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not encrypted and encryption is required */
54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start encryption and return PENDING to the caller */
54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT))
54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT)))
54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
54875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
54905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
54915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start encryption");
54935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_encryption (p_dev_rec))
54955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5501899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
5502899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
5503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
5504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -",
5505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        "security failure", __FUNCTION__, p_dev_rec->link_key_type);
5506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return (BTM_FAILED_ON_SECURITY);
5507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
5508899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authorized and authorization is required */
55105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authorization and return PENDING to the caller */
55115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
55125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE))
55135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE))))
55145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("service id:%d, is trusted:%d",
55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->p_cur_service->service_id,
55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                      p_dev_rec->p_cur_service->service_id)));
55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) &&
55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) &&
55215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
55225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_dev_rec->p_cur_service->service_id) == FALSE))
55235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
55245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: Start authorization");
55255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(btm_sec_start_authorization (p_dev_rec));
55265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All required  security procedures already established */
55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE |
55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE |
55325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT |
55335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER |
55345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
55375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: access granted");
55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_SUCCESS);
55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_get_name
55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start get name procedure
55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec)
55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 tempstate = p_dev_rec->sec_state;
55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME;
55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Device should be connected, no need to provide correct page params */
55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* 0 and NULL are as timeout and callback params because they are not used in security get name case */
55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC,
55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                0, NULL)) != BTM_CMD_STARTED)
55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_state = tempstate;
55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authentication
55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authentication
55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec)
55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btsnd_hcic_auth_request (p_dev_rec->hci_handle));
55845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_encryption
55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start encryption
55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec)
55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE))
55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authorization
56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authorization
56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec)
56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    result;
56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_service_name = NULL;
56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    service_id;
56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE))
56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_cb.api.p_authorize_callback)
56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_MODE_UNSUPPORTED);
56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->p_cur_service)
56275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
56295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->is_originator)
56305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->orig_service_name;
56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->term_service_name;
56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = p_dev_rec->p_cur_service->service_id;
56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
56375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = 0;
56385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5639ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Send authorization request if not already sent during this service connection */
5640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
5641ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            || p_dev_rec->last_author_service_id != service_id)
5642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
5643ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING;
5644ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr,
56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->dev_class,
56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->sec_bd_name,
56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_service_name,
56485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     service_id,
56495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->is_originator);
5650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5652ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else    /* Already authorized once for this L2CAP bringup */
5653ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
56545344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
5655ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            return (BTM_SUCCESS);
5656ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5657ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (result == BTM_SUCCESS)
56595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED;
5661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Save the currently authorized service in case we are asked again by another multiplexer layer */
5663ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!p_dev_rec->is_originator)
5664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_dev_rec->last_author_service_id = service_id;
5665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(result);
56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_start_get_name (p_dev_rec);
56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_are_all_trusted
56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called check if all services are trusted
56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if all are trusted, otherwise FALSE
56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[])
56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT32 trusted_inx;
56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++)
56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL)
56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(FALSE);
56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_first_serv
56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the first record in the service database
57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm)
57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_ORIG_MASK )
57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm)
57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the PSM matches p_out_serv,
57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, just find the first record with the specified PSM */
57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) )
57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_next_serv
57415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the next record in the service database
57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur)
57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec   = &btm_cb.sec_serv_rec[0];
57515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               i;
57525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == p_cur->psm) )
57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cur != p_serv_rec)
57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(p_serv_rec);
57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_mx_serv
57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the service database with specified
57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PSM and multiplexor channel information
57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id, UINT32 mx_chan_id)
57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv;
57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5785444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
57865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && p_out_serv && p_out_serv->psm == psm
57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->mx_proto_id == mx_proto_id
57885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->orig_mx_chan_id == mx_chan_id)
57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the parameters match p_out_serv,
57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, the old way */
57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == psm)
58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->mx_proto_id == mx_proto_id)
58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (( is_originator && (p_serv_rec->orig_mx_chan_id  == mx_chan_id))
58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                || (!is_originator && (p_serv_rec->term_mx_chan_id  == mx_chan_id))))
58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
58085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_collision_timeout
58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Encryption could not start because of the collision
58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  try to do it again
58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle)
58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58235cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_tle);
58245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()", __func__);
58265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.sec_collision_tle.param = 0;
58275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec);
58295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no next procedure or start of procedure failed, notify the waiting layer */
58347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE);
58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec)
58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_link_key_callback)
58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
58515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->sec_bd_name, p_dev_rec->link_key,
58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->link_key_type);
58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadTrustedMask
58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get trusted mask for the peer device
58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr   - Address of the device
58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          NULL, if the device record is not found.
58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  otherwise, the trusted mask
58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr)
58685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5869444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
5870444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec != NULL)
58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(p_dev_rec->trusted_mask);
5872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return NULL;
58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_restore_mode
58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the security mode to previous setting
58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if it was changed during bonding.
58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
58845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void)
58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode_changed)
58895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = FALSE;
5891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK));
58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
58935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_type_changed)
58965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_type_changed = FALSE;
58985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type);
58995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_dev_by_sec_state
59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the device database for the device
59085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  which is being authenticated or encrypted
59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state)
59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0];
59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->sec_state == state))
59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_dev_rec);
59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_change_pairing_state
59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to change pairing state
59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state)
59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state = btm_cb.pairing_state;
59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
5938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  New: %s pairing_flags:0x%x", __func__,
5939444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            btm_pair_state_descr(new_state), btm_cb.pairing_flags);
59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_state = new_state;
59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_state == BTM_PAIR_STATE_IDLE)
59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer (&btm_cb.pairing_tle);
59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = 0;
59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len  = 0;
59495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the the lcb shows we are not bonding */
59515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE);
59525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode();
59545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_check_pending_reqs();
59555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_clear_ssp();
59565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN);
59585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If transitionng out of idle, mark the lcb as bonding */
59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state == BTM_PAIR_STATE_IDLE)
59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE);
59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_tle.param = (TIMER_PARAM_TYPE)btm_sec_pairing_timeout;
59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BTM_SEC_TIMEOUT_VALUE);
59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_pair_state_descr
59755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
59775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
59805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state)
59815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
59835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (state)
59845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_IDLE:                   return("IDLE");
59865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_GET_REM_NAME:           return("GET_REM_NAME");
59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:           return("WAIT_PIN_REQ");
59885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:         return("WAIT_LOCAL_PIN");
59895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:   return("WAIT_NUM_CONFIRM");
59905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:              return("KEY_ENTRY");
59915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:     return("WAIT_LOCAL_OOB_RSP");
59925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:      return("WAIT_LOCAL_IOCAPS");
59935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_INCOMING_SSP:           return("INCOMING_SSP");
59945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:     return("WAIT_AUTH_COMPLETE");
59955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:        return("WAIT_DISCONNECT");
59965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return("???");
59995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
6000104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer    sprintf(btm_cb.state_temp_buffer,"%hhu",state);
60015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_cb.state_temp_buffer);
60035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
60045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
60055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
60065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
60085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_rec_cback_event
60105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calls the callback function with the given
60125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result and clear the callback function.
60135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
60155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
601732429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport)
60185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
60195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_CALLBACK   *p_callback = p_dev_rec->p_callback;
60205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->p_callback)
60225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
60235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
6024e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
60251287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
6026e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (is_le_transport)
6027e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res);
6028e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        else
60291287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
6030e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res);
60315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
60335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_check_pending_reqs();
60345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
60355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
60375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_queue_mx_request
60395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
60415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
60425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
60435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
60445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         UINT32 mx_proto_id, UINT32 mx_chan_id,
60455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
60465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf (sizeof(tBTM_SEC_QUEUE_ENTRY));
60485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_e)
60505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
60515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->psm            = psm;
60525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->is_orig        = is_orig;
60535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->p_callback     = p_callback;
60545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->p_ref_data     = p_ref_data;
60555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->mx_proto_id    = mx_proto_id;
60565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_e->mx_chan_id     = mx_chan_id;
6057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->transport      = BT_TRANSPORT_BR_EDR;
60585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN);
60605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
6062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, psm, is_orig, mx_proto_id, mx_chan_id);
60635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_enqueue (&btm_cb.sec_pending_q, p_e);
60655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
60675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
60685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
60705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
60715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec)
60735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
60745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK);
60755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK);
60765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN rv = FALSE;
60775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((major == BTM_COD_MAJOR_AUDIO)
60795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&  ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) )
60805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6081444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x",
6082444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            __func__, major, minor);
60835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.security_mode_changed == FALSE)
60855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
60865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.security_mode_changed = TRUE;
60875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
60885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
60895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
60905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_write_auth_enable (TRUE);
60915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
60925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
60935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
60945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
60955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
60965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we got a PIN, use that, else try to get one */
60985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pin_code_len)
60995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
61005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_PINCodeReply (p_dev_rec->bd_addr, BTM_SUCCESS, btm_cb.pin_code_len, btm_cb.pin_code, p_dev_rec->trusted_mask);
61015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
61025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
61035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
61045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pin was not supplied - pre-fetch pin code now */
61055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0))
61065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("%s() PIN code callback called", __func__);
61087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
61095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
6110818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
6111818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE
6112818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                : (p_dev_rec->p_cur_service->security_flags
6113818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                   & BTM_SEC_IN_MIN_16_DIGIT_PIN));
61145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
61155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
61165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
61175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rv = TRUE;
61185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
61195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
61205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rv;
61215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
61225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_auth_payload_tout
6126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      Processes the HCI Autheniticated Payload Timeout Event
6128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  indicating that a packet containing a valid MIC on the
6129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  connection handle was not received within the programmed
6130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  timeout value. (Spec Default is 30 secs, but can be
6131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  changed via the BTM_SecSetAuthPayloadTimeout() function.
6132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len)
6135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT16 handle;
6137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    STREAM_TO_UINT16 (handle, p);
6139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    handle = HCID_GET_HANDLE (handle);
6140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Will be exposed to upper layers in the future if/when determined necessary */
6142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle);
6143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_queue_encrypt_request
6148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      encqueue encryption request when device has active security
6150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  process pending.
6151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport,
6154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
6155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY  *p_e;
6157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1);
6158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_e)
6160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->psm  = 0;  /* if PSM 0, encryption request */
6162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->p_callback  = p_callback;
6163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->p_ref_data = (void *)(p_e + 1);
6164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        *(UINT8 *)p_e->p_ref_data = *(UINT8 *)(p_ref_data);
6165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e->transport  = transport;
6166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN);
6167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        GKI_enqueue(&btm_cb.sec_pending_q, p_e);
6168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return TRUE;
6169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return FALSE;
6172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6174444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6176899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_peer_sec_caps
6177899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6178899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set sm4 and rmt_sec_caps fields
6179899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  based on the available peer device features.
6180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
6182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec)
6185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BD_ADDR     rem_bd_addr;
6187899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT8       *p_rem_bd_addr;
6188899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6189899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
6190899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
6191899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
6192899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
6193899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6194899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_TRUE;
6195899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections =
6196899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]));
6197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
6199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_KNOWN;
6201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections = FALSE;
6202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__,
6205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                  p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections);
6206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->remote_features_needed)
6209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!",
6211899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        __FUNCTION__);
6212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr);
6214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_io_capabilities_req(p_rem_bd_addr);
6216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = FALSE;
6217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6220899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_clean_pending_req_queue
6223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function cleans up the pending security request when the
6225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  link to the target device dropped.
6226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport)
6231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY    *p_e;
6233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BUFFER_Q                *bq = &btm_cb.sec_pending_q;
6234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq);
6236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_e != NULL)
6238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6239444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, remote_bda, BD_ADDR_LEN) == 0
6240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6243444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
6245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (*p_e->p_callback) (remote_bda, transport, p_e->p_ref_data, BTM_ERR_PROCESSING);
6246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            GKI_remove_from_queue(bq, (void *)p_e);
6247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e);
6249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6250899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6251899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6252899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6253899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_is_serv_level0
6255899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6256899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the service corresponding
6257899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  to PSM is security mode 4 level 0 service.
6258899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6259899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if the service is security mode 4 level 0 service
6260899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6261899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6262899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm)
6263899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6264899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (psm == BT_PSM_SDP)
6265899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6266899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm);
6267899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return TRUE;
6268899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6269899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return FALSE;
6270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_check_pending_enc_req
6275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to send pending encryption callback if
6277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  waiting
6278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
6283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable)
6284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_QUEUE_ENTRY    *p_e;
6286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BUFFER_Q                *bq = &btm_cb.sec_pending_q;
6287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8                   res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
6288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq);
6290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    while (p_e != NULL)
6292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
6293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0
6294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
62991287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
63001287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach            UINT8 sec_act = *(UINT8 *)(p_e->p_ref_data);
63011287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
6302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR
6304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                || (sec_act == BTM_BLE_SEC_ENCRYPT || sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM)
6306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                || (sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags
6307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    & BTM_SEC_LE_AUTHENTICATED)
6308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji               )
6310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
6311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res);
6312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                GKI_remove_from_queue(bq, (void *)p_e);
6313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
6314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e);
6316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6317899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6318899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6319899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6320899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6321899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_serv_level4_flags
6322899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6323899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set security mode 4 level 4 flags.
6324899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6325899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          service security requirements updated to include secure
6326899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  connections only mode.
6327899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6328899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6329899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator)
6330899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6331899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT16  sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS;
6332899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6333899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return cur_security | sec_level4_flags;
6334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
63365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
63375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clear_ble_keys
63395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear out the BLE keys.
63415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically when devices are removed in BTM_SecDeleteDevice,
63425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or when a new BT Link key is generated.
63435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
63455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
63475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC  *p_dev_rec)
63485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
63495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__);
63515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
6352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
63535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
6354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6355444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE)
6356444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_ble_resolving_list_remove_dev(p_dev_rec);
6357444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
63585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
63595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
63605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
63625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_is_a_bonded_dev
63645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description       Is the specified device is a bonded device
63665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - dev is bonded
63685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
63695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
63705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda)
63715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
63725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
63745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_bonded= FALSE;
63755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_dev_rec &&
63771287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if (SMP_INCLUDED == TRUE)
63787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))||
63791287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#else
63801287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach        (
63817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
63827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
63835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
63845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_bonded = TRUE;
63855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded);
63875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(is_bonded);
63885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
63895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
63905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
63915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6392ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_le_capable_dev
6393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6394ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description       Is the specified device is dual mode or LE only device
6395ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE - dev is a dual mode
6397ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
6399ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda)
6400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
6401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
6402ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN le_capable = FALSE;
6403ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6404ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE)
6405e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE)
6406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        le_capable  = TRUE;
6407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
6408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return le_capable;
6409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
6410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
6412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
64135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_bonded_dev
64145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
64155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Find a bonded device starting from the specified index
64165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
64175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - found a bonded device
64185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
64195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6420e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. ChenBOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_DEV_REC **p_rec)
64215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
64225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN found= FALSE;
64235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
64245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
64255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
64265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
64275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS)
64285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
64295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("LE bonded device not found");
64305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return found;
64315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
64325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
64335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = &btm_cb.sec_dev_rec[start_idx];
64345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
64355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
64365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
64375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
64385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_found_idx = i;
6439e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. Chen            *p_rec = p_dev_rec;
64405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
64415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
64425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() found=%d", __func__, found);
64445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
64455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(found);
64465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_use_smp_br_chnl
6451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6452444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if SMP BR connection can be used with
6453444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the peer.
6454444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  Is called when authentication for dedicated bonding is
6455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  successfully completed.
6456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if SMP BR connection can be used (the link key is
6458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         generated from P-256 and the peer supports Security
6459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         Manager over BR).
6460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec)
6463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT32  ext_feat;
6465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8   chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE];
6466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__,
6468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->link_key_type);
6469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) &&
6471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
6472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         return FALSE;
6473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask))
6475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT))
6478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return TRUE;
6481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_is_master
6486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if the device is BR/EDR master after
6488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  pairing is completed.
6489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if the device is master.
6491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec)
6494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
6496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return (p && (p->link_role == BTM_ROLE_MASTER));
6497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6499