btm_ble.c revision 5738f83aeb59361a0a2eda2460113f6dc919427
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 BLE device control utilities, and LE 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * security functions. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_ble_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "smp_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN AES_CMAC ( BT_OCTET16 key, UINT8 *input, UINT16 length, UINT16 tlen, UINT8 *p_signature); 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable); 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN smp_proc_ltk_request(BD_ADDR bda); 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_active_bgconn_scan_params(void); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* External Function to be called by other modules */ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************** 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddBleDevice 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add/modify device. This function will be normally called 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** during host startup to restore all required information 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for a LE device stored in the NVRAM. 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peer 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_name - Name of the peer device. NULL if unknown. 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dev_type - Remote device's device type. 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** addr_type - LE device address type. 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if added OK, else FALSE 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddBleDevice (BD_ADDR bd_addr, BD_NAME bd_name, tBT_DEVICE_TYPE dev_type, 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBLE_ADDR_TYPE addr_type) 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_info=NULL; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("BTM_SecAddBleDevice dev_type=0x%x", dev_type); 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("Add a new device"); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no device record, allocate one. 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If we can not find an empty spot for this one, let it fail. */ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("allocate a new dev rec idx=0x%x ", i ); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[i]; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark this record as in use and initialize */ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = BTM_SEC_IN_USE; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update conn params, use default value for background connection params */ 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.min_conn_int = 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.max_conn_int = 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.supervision_tout = 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("hci_handl=0x%x ", p_dev_rec->hci_handle ); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("Device already exist"); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_name && bd_name[0]) 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->device_type = dev_type; 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.ble_addr_type = addr_type; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3 ("p_dev_rec->device_type =0x%x addr_type=0x%x sec_flags=0x%x", 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_type, addr_type, p_dev_rec->sec_flags); 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sync up with the Inq Data base*/ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info = BTM_InqDbRead(bd_addr); 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_info) 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type ; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->results.device_type = p_dev_rec->device_type; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("InqDb device_type =0x%x addr_type=0x%x", 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->results.device_type, p_info->results.ble_addr_type); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddBleKey 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add/modify LE device information. This function will be 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** normally called during host startup to restore all required 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** information stored in the NVRAM. 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peer 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_le_key - LE key values. 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** key_type - LE SMP key type. 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if added OK, else FALSE 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddBleKey (BD_ADDR bd_addr, tBTM_LE_KEY_VALUE *p_le_key, tBTM_LE_KEY_TYPE key_type) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_SecAddBleKey"); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec || !p_le_key || 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID && 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC)) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING3 ("BTM_SecAddLeKey() No BT Link Key, Wrong Type, or No Device record \ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for bdaddr: %08x%04x, Type: %d", 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[4]<<8)+bd_addr[5], key_type); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3 ("BTM_SecAddLeKey() BDA: %08x%04x, Type: 0x%02x", 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[4]<<8)+bd_addr[5], key_type); 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (key_type == BTM_LE_KEY_PENC || key_type == BTM_LE_KEY_PID || 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_type == BTM_LE_KEY_PCSRK || key_type == BTM_LE_KEY_LENC || 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_type == BTM_LE_KEY_LCSRK) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_save_le_key (bd_addr, key_type, p_le_key, FALSE); 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BleLoadLocalKeys 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Local local identity key, encryption root or sign counter. 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: key_type: type of key, can be BTM_BLE_KEY_TYPE_ID, BTM_BLE_KEY_TYPE_ER 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or BTM_BLE_KEY_TYPE_COUNTER. 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_key: pointer to the key. 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns non2. 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleLoadLocalKeys(UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_DEVCB *p_devcb = &btm_cb.devcb; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_BleLoadLocalKeys"); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_key != NULL) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (key_type) 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_BLE_KEY_TYPE_ID: 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_devcb->id_keys, &p_key->id_keys, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_BLE_KEY_TYPE_ER: 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_devcb->er, p_key->er, sizeof(BT_OCTET16)); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR1("unknow local key type: %d", key_type); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetDeviceEncRoot 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local device encryption 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** root. 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the local device ER is copied into er 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_GetDeviceEncRoot (BT_OCTET16 er) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_GetDeviceEncRoot"); 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (er, btm_cb.devcb.er, BT_OCTET16_LEN); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetDeviceIDRoot 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local device identity 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** root. 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the local device IR is copied into irk 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_GetDeviceIDRoot (BT_OCTET16 irk) 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_GetDeviceIDRoot "); 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetDeviceDHK 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local device DHK. 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the local device DHK is copied into dhk 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_GetDeviceDHK (BT_OCTET16 dhk) 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_GetDeviceDHK"); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadConnectionAddr 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the local device random address 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** . 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ReadConnectionAddr (BD_ADDR conn_addr) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_ReadConnectionAddr"); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.ble_ctr_cb.inq_var.own_addr_type == BLE_ADDR_PUBLIC) 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetLocalDeviceAddr(conn_addr); 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (conn_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecurityGrant 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to grant security process. 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters bd_addr - peer device bd address. 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation BTM_SUCCESS if success. 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Otherwise, BTM_REPEATED_ATTEMPTS is too many attempts. 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SecurityGrant(BD_ADDR bd_addr, UINT8 res) 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_SecurityGrant"); 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_SecurityGrant(bd_addr, res_smp); 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BlePasskeyReply 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey request to the application. 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which passkey was requested 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation BTM_SUCCESS if success 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** key_len - length in bytes of the Passkey 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_passkey - pointer to array with the passkey 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BlePasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_BlePasskeyReply"); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_PasskeyReply(bd_addr, res_smp, passkey); 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BleOobDataReply 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the OOB data for 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SMP in response to BTM_LE_OOB_REQ_EVT 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation SMP_SUCCESS if success 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_data - simple pairing Randomizer C. 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleOobDataReply(BD_ADDR bd_addr, UINT8 res, UINT8 len, UINT8 *p_data) 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL; 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_BleOobDataReply"); 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_OobDataReply(bd_addr, res_smp, len, p_data); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BleSetConnScanParams 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set scan parameter used in BLE connection request 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: scan_interval: scan interval 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** scan_window: scan window 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleSetConnScanParams (UINT16 scan_interval, UINT16 scan_window) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN new_param = FALSE; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) && 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX)) 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer(&p_ble_cb->scan_param_idle_timer); 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ble_cb->scan_int != scan_interval) 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ble_cb->scan_int = scan_interval; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_param = TRUE; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ble_cb->scan_win != scan_window) 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ble_cb->scan_win = scan_window; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_param = TRUE; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_param) 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_update_active_bgconn_scan_params(); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Illegal Connection Scan Parameters"); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************** 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BleSetPrefConnParams 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set a peripheral's preferred connection parameters 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peripheral 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** scan_interval: scan interval 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** scan_window: scan window 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** min_conn_int - minimum preferred connection interval 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** max_conn_int - maximum preferred connection interval 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** slave_latency - preferred slave latency 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** supervision_tout - preferred supervision timeout 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleSetPrefConnParams (BD_ADDR bd_addr, 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 min_conn_int, UINT16 max_conn_int, 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 slave_latency, UINT16 supervision_tout) 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API4 ("BTM_BleSetPrefConnParams min: %u max: %u latency: %u \ 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tout: %u", 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project min_conn_int, max_conn_int, slave_latency, supervision_tout); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_BLE_VALID_PRAM(min_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) && 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_BLE_VALID_PRAM(max_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) && 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_BLE_VALID_PRAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, BTM_BLE_CONN_SUP_TOUT_MAX) && 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project slave_latency <= BTM_BLE_CONN_LATENCY_MAX) 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* expect conn int and stout and slave latency to be updated all together */ 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF || max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.min_conn_int = min_conn_int; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.min_conn_int = max_conn_int; 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.max_conn_int = max_conn_int; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.max_conn_int = min_conn_int; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.slave_latency = slave_latency; 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF; 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.supervision_tout = supervision_tout; 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_TIMEOUT_DEF; 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Unknown Device, setting rejected"); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Illegal Connection Parameters"); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 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_ReadDevInfo 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the device/address type 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of BD address. 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter remote_bda: remote device address 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_dev_type: output parameter to read the device type. 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_addr_type: output parameter to read the address type. 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ReadDevInfo (BD_ADDR remote_bda, tBT_DEVICE_TYPE *p_dev_type, tBLE_ADDR_TYPE *p_addr_type) 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (remote_bda); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info = BTM_InqDbRead(remote_bda); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_dev_type = BT_DEVICE_TYPE_BREDR; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_addr_type = BLE_ADDR_PUBLIC; 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check with the BT manager if details about remote device are known */ 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_inq_info != NULL) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_dev_type = p_inq_info->results.device_type ; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_addr_type = p_inq_info->results.ble_addr_type; 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* unknown device, assume BR/EDR */ 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* there is a security device record exisitng */ 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* new inquiry result, overwrite device type in security device record */ 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_inq_info) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->device_type = p_inq_info->results.device_type; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_dev_type = p_dev_rec->device_type; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_addr_type = p_dev_rec->ble.ble_addr_type; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_find_dev_type - device_type = %d addr_type = %d", *p_dev_type , *p_addr_type); 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Internal Functions 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_update_active_bgconn_scan_params 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to update the scan parameter if background 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection has been active. 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_active_bgconn_scan_params(void) 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_BLE_SEL_CBACK *p_select_cback; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if active , cancel and restart and apply the params */ 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->bg_conn_state == BLE_BG_CONN_ACTIVE) 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_ble_start_auto_conn(FALSE)) 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_start_auto_conn(TRUE); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE) 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_select_cback = p_cb->p_select_cback; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_ble_start_select_conn(FALSE, NULL)) 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_start_select_conn(TRUE, p_select_cback); 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_check_link_type 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to check the link type is BLE or BR/EDR. 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if BLE link; FALSE if BR/EDR. 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_check_link_type (BD_ADDR bd_addr) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tACL_CONN *p; 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_check_link_type"); 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p = btm_bda_to_acl(bd_addr)) != NULL) 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p->is_le_link; 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_rand_enc_complete 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is the callback functions for HCI_Rand command 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and HCI_Encrypt command is completed. 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This message is received from the HCI. 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_rand_enc_complete (UINT8 *p, UINT16 op_code, tBTM_RAND_ENC_CB *p_enc_cplt_cback) 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_RAND_ENC params; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_dest = params.param_buf; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_rand_enc_complete"); 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(¶ms, 0, sizeof(tBTM_RAND_ENC)); 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was a callback address for vcs complete, call it */ 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_enc_cplt_cback && p) 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pass paramters to the callback function */ 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8(params.status, p); /* command status */ 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (params.status == HCI_SUCCESS) 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params.opcode = op_code; 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == HCI_BLE_RAND) 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params.param_len = BT_OCTET8_LEN; 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params.param_len = BT_OCTET16_LEN; 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_dest, p, params.param_len); /* Fetch return info from HCI event message */ 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_enc_cplt_cback) 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_enc_cplt_cback)(¶ms); /* Call the Encryption complete callback function */ 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED == TRUE) 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_get_enc_key_type 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to increment local sign counter 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_increment_sign_ctr(BD_ADDR bd_addr, BOOLEAN is_local ) 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_ble_increment_sign_ctr is_local=%d", is_local); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_local) 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.keys.local_counter++; 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.keys.counter++; 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3 ("is_local=%d local sign counter=%d peer sign counter=%d", 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_local, 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.keys.local_counter, 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.keys.counter); 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_get_enc_key_type 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to get the BLE key type that has been exchanged 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in betweem local device and peer device. 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns p_key_type: output parameter to carry the key type value. 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_get_enc_key_type(BD_ADDR bd_addr, UINT8 *p_key_types) 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_get_enc_key_type"); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_key_types = p_dev_rec->ble.key_type; 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_get_local_div 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local DIV 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TURE - if a valid DIV is availavle 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_get_local_div (BD_ADDR bd_addr, UINT16 *p_div) 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = FALSE; 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_get_local_div"); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0],bd_addr[1], 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[2],bd_addr[3], 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[4],bd_addr[5]); 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec && p_dev_rec->ble.keys.div) 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = TRUE; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_div = p_dev_rec->ble.keys.div; 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, *p_div); 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_save_le_key 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the SMP to update 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** an BLE key. SMP is internal, whereas all the keys shall 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be sent to the application. The function is also called 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** when application passes ble key stored in NVRAM to the btm_sec. 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pass_to_application parameter is false in this case. 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY_VALUE *p_keys, 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN pass_to_application) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec; 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_EVT_DATA cb_data; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",key_type, pass_to_application); 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Store the updated key in the device database */ 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0],bd_addr[1], 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[2],bd_addr[3], 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[4],bd_addr[5]); 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = btm_find_dev (bd_addr)) != NULL && p_keys) 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (key_type) 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_LE_KEY_PENC: 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_rec->ble.keys.ltk, p_keys->penc_key.ltk, BT_OCTET16_LEN); 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level; 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.ediv = p_keys->penc_key.ediv; 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.key_size = p_keys->penc_key.key_size; 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type |= BTM_LE_KEY_PENC; 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED) 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x", 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type, 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags, 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.sec_level); 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_LE_KEY_PID: 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN); 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type |= BTM_LE_KEY_PID; 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1("BTM_LE_KEY_PID key_type=0x%x save peer IRK", p_rec->ble.key_type); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_LE_KEY_PCSRK: 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_rec->ble.keys.csrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN); 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.counter = p_keys->pcsrk_key.counter; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type |= BTM_LE_KEY_PCSRK; 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_keys->pcsrk_key.sec_level== SMP_SEC_AUTHENTICATED) 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG4("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d", 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type, 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_flags, 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.srk_sec_level, 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.counter ); 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_LE_KEY_LENC: 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */ 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.key_size = p_keys->lenc_key.key_size; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type |= BTM_LE_KEY_LENC; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG4("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x", 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type, 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.div, 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.key_size, 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.sec_level ); 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_LE_KEY_LCSRK:/* local CSRK has been delivered */ 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */ 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level; 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter; 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type |= BTM_LE_KEY_LCSRK; 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG4("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d", 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.key_type, 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.div, 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.local_csrk_sec_level, 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.local_counter ); 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING1("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type); 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3 ("BLE key type 0x%02x updated for BDA: %08x%04x (btm_sec_save_le_key)", key_type, 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[4]<<8)+bd_addr[5]); 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify the application that one of the BLE keys has been updated 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project If link key is in progress, it will get sent later.*/ 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pass_to_application && btm_cb.api.p_le_callback) 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.key.p_key_value = p_keys; 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.key.key_type = key_type; 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_le_callback) (BTM_LE_KEY_EVT, bd_addr, &cb_data); 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING3 ("BLE key type 0x%02x called for Unknown BDA or type: %08x%04x !! (btm_sec_save_le_key)", key_type, 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[4]<<8)+bd_addr[5]); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rec) 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("sec_flags=0x%x", p_rec->sec_flags); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_update_sec_key_size 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description update the current lin kencryption key size 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size) 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec; 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1("btm_ble_update_sec_key_size enc_key_size = %d", enc_key_size); 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = btm_find_dev (bd_addr)) != NULL ) 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->enc_key_size = enc_key_size; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_read_sec_key_size 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description update the current lin kencryption key size 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr) 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec; 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = btm_find_dev (bd_addr)) != NULL ) 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_rec->enc_key_size; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_link_sec_check 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check BLE link security level match. 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE: check is OK and the *p_sec_req_act contain the action 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_link_sec_check(BD_ADDR bd_addr, tBTM_LE_AUTH_REQ auth_req, tBTM_BLE_SEC_REQ_ACT *p_sec_req_act) 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 req_sec_level, cur_sec_level; 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_ble_link_sec_check auth_req =0x%x", auth_req); 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0 ("btm_ble_link_sec_check received for unknown device"); 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* race condition: discard the security request while master is encrypting the link */ 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project req_sec_level = BTM_LE_SEC_UNAUTHENTICATE; 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((auth_req == (BTM_LE_AUTH_REQ_BOND|BTM_LE_AUTH_REQ_MITM)) || 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (auth_req == (BTM_LE_AUTH_REQ_MITM)) ) 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project req_sec_level = BTM_LE_SEC_AUTHENTICATED; 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags); 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* currently encrpted */ 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED) 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_sec_level = BTM_LE_SEC_AUTHENTICATED; 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE; 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* unencrypted link */ 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if bonded, get the key security level */ 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_sec_level = p_dev_rec->ble.keys.sec_level; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_sec_level = BTM_LE_SEC_NONE; 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cur_sec_level >= req_sec_level) 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cur_sec_level == BTM_LE_SEC_NONE) 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_NONE; 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* To avoid re-encryption on an encrypted link for an equal condition encryption 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD; 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_ENCRYPT; 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_PAIR; /* start the pariring process to upgrade the keys*/ 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3("cur_sec_level=%d req_sec_level=%d sec_req_act=%d", 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_sec_level, 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project req_sec_level, 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sec_req_act); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_set_encryption 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to ensure that LE connection is 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** encrypted. Should be called only on an open connection. 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically only needed for connections that first want to 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bring up unencrypted links, then later encrypt them. 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the local device ER is copied into er 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_set_encryption (BD_ADDR bd_addr, void *p_ref_data, UINT8 link_role) 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS cmd = BTM_NO_RESOURCES; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_BLE_SEC_ACT sec_act = *(tBTM_BLE_SEC_ACT *)p_ref_data ; 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec = btm_find_dev (bd_addr); 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, p_rec->role_master); 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rec == NULL) 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM) 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->security_required |= BTM_SEC_IN_MITM; 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (sec_act) 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_BLE_SEC_ENCRYPT: 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (link_role == BTM_ROLE_MASTER) 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start link layer encryption using the security info stored */ 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_start_encrypt(bd_addr, FALSE, NULL); 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmd = BTM_CMD_STARTED; 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if salve role then fall through to call SMP_Pair below which will send a 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_request to request the master to encrypt the link */ 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_BLE_SEC_ENCRYPT_NO_MITM: 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_BLE_SEC_ENCRYPT_MITM: 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SMP_Pair(bd_addr) == SMP_STARTED) 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmd = BTM_CMD_STARTED; 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmd = BTM_SUCCESS; 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return cmd; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_ltk_request 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when encryption request is received 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on a slave device. 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_ltk_request(UINT16 handle, UINT8 rand[8], UINT16 ediv) 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET8 dummy_stk = {0}; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_ltk_request"); 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->ediv = ediv; 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN); 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!smp_proc_ltk_request(p_dev_rec->bd_addr)) 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_ltk_request_reply(p_dev_rec->bd_addr, FALSE, dummy_stk); 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_start_encrypt 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start LE encryption. 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk) 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec = btm_find_dev (bda); 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET8 dummy_rand = {0}; 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_start_encrypt"); 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_rec || 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_rec && p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)) 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rec->sec_state == BTM_SEC_STATE_IDLE) 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->enc_handle = p_rec->hci_handle; 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (use_stk) 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_start_enc(p_rec->hci_handle, dummy_rand, 0, stk)) 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_start_enc(p_rec->hci_handle, p_rec->ble.keys.rand, 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rec->ble.keys.ediv, p_rec->ble.keys.ltk)) 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_link_encrypted 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LE link encrption status is changed. 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_link_encrypted(BD_ADDR bd_addr, UINT8 encr_enable) 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_ble_link_encrypted encr_enable=%d", encr_enable); 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_link_encrypted(bd_addr, encr_enable); 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags); 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (encr_enable && p_dev_rec->enc_key_size == 0) 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size; 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_callback) 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (encr_enable) 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS); 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_dev_rec->role_master) 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING); 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_enc_proc_ltk 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description send LTK reply when it's ready. 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_enc_proc_ltk(tSMP_ENC *p) 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_enc_proc_ltk"); 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p && p->param_len == BT_OCTET16_LEN) 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < (BT_OCTET16_LEN - btm_cb.key_size); i ++) 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->param_buf[BT_OCTET16_LEN - i - 1] = 0; 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p->param_buf); 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_enc_proc_slave_y 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description calculate LTK when Y is ready 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_enc_proc_slave_y(tSMP_ENC *p) 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 div, y; 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp = p->param_buf; 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_enc_proc_slave_y"); 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p != NULL) 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(y, pp); 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project div = p_cb->ediv ^ y; 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev_by_handle (p_cb->enc_handle); 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_dev_rec && 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.keys.div == div ) 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("LTK request OK"); 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculating LTK , LTK = E er(div) */ 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_Encrypt(p_cb->devcb.er, BT_OCTET16_LEN, (UINT8 *)&div, 2, &output); 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_enc_proc_ltk(&output); 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("LTK request failed - send negative reply"); 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_ble_ltk_req_neg_reply(p_cb->enc_handle); 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_link_encrypted(p_dev_rec->bd_addr, 0); 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_ltk_request_reply 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to send a LTK request reply on a slave 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device. 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_ltk_request_reply(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk) 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec = btm_find_dev (bda); 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rec == NULL) 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("btm_ble_ltk_request_reply received for unknown device"); 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_ltk_request_reply"); 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->enc_handle = p_rec->hci_handle; 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->key_size = p_rec->ble.keys.key_size; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR1("key size = %d", p_rec->ble.keys.key_size); 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (use_stk) 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk); 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* calculate LTK using peer device */ 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate Y= Encrypt(DHK, Rand) received from encrypt request */ 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_Encrypt(p_cb->devcb.id_keys.dhk, BT_OCTET16_LEN, p_cb->enc_rand, 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET8_LEN, &output); 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_enc_proc_slave_y(&output); 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_io_capabilities_req 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to handle SMP get IO capability request. 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p_data) 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 callback_rc = BTM_SUCCESS; 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_io_capabilities_req"); 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_le_callback) 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the callback function implementation may change the IO capability... */ 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = (*btm_cb.api.p_le_callback) (BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA *)p_data); 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != p_data->oob_data)) 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (callback_rc == BTM_SUCCESS) 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->auth_req &= BTM_LE_AUTH_REQ_MASK; 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d auth_req:%d", 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required, p_data->auth_req); 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK 1-IRK 2-CSRK)", 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->init_keys, 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->resp_keys); 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if authentication requires MITM protection, put on the mask */ 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->security_required & BTM_SEC_IN_MITM) 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->auth_req |= BTM_LE_AUTH_REQ_MITM; 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_data->auth_req & SMP_AUTH_BOND)) 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("Non bonding: No keys should be exchanged"); 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->init_keys = 0; 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->resp_keys = 0; 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_ble_io_capabilities_req 3: auth_req:%d", p_data->auth_req); 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x", 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->init_keys, 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->resp_keys); 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d", 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->io_cap, p_data->auth_req); 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove MITM protection requirement if IO cap does not allow it */ 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE) 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM; 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3 ("btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:%d", 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->io_cap, p_data->oob_data, p_data->auth_req); 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return callback_rc; 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_proc_smp_cback 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is the SMP callback handler. 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_proc_smp_cback(tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data) 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 res; 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_proc_smp_cback event = %d", event); 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec != NULL) 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_IO_CAP_REQ_EVT: 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_io_capabilities_req(p_dev_rec, (tBTM_LE_IO_REQ *)&p_data->io_req); 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_PASSKEY_REQ_EVT: 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_PASSKEY_NOTIF_EVT: 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_OOB_REQ_EVT: 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_SEC_REQUEST_EVT: 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_COMPLT_EVT: 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_le_callback) 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the callback function implementation may change the IO capability... */ 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback ); 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_le_callback) (event, bd_addr, (tBTM_LE_EVT_DATA *)p_data); 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0 ("btm_proc_smp_cback: btm_cb.api.p_le_callback ==NULL"); 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == SMP_COMPLT_EVT) 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags ); 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING; 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3 ("after update result=%d sec_level=0x%x sec_flags=0x%x", 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res, p_data->cmplt.sec_level , p_dev_rec->sec_flags ); 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_dev_rec_cback_event(p_dev_rec, res); 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->cmplt.is_pair_cancel && btm_cb.api.p_bond_cancel_cmpl_callback ) 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("Pairing Cancel completed"); 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS); 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.devcb.no_disc_if_pair_fail) 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("Pairing failed - Remove ACL"); 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_remove_acl(bd_addr); 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("Pairing failed - Not Removing ACL"); 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_remove_acl(bd_addr); 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG3 ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x", 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_state, 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags, 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len ); 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG6 ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x", 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_bda[0], btm_cb.pairing_bda[1], btm_cb.pairing_bda[2], 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_bda[3], btm_cb.pairing_bda[4], btm_cb.pairing_bda[5]); 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN); 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = 0; 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("unknown event = %d", event); 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("btm_proc_smp_cback received for unknown device"); 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* SMP_INCLUDED */ 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BleDataSignature 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to sign the data using AES128 CMAC 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** algorith. 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter bd_addr: target device the data to be signed for. 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_text: singing data 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** len: length of the data to be signed. 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** signature: output parameter where data signature is going to 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be stored. 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if signing sucessul, otherwise FALSE. 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleDataSignature (BD_ADDR bd_addr, UINT8 *p_text, UINT16 len, 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BLE_SIGNATURE signature) 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ret = FALSE; 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec = btm_find_dev (bd_addr); 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_buf, *pp; 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 er; 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 div; 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 temp[4]; /* for (r || DIV) r=1*/ 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 r=1; 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p=temp, *p_mac = (UINT8 *)signature; 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 local_csrk; 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_BleDataSignature"); 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rec == NULL) 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("data signing can not be done from unknow device"); 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(len + 4))) != NULL) 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("Start to generate Local CSRK"); 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* prepare plain text */ 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_text) 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_text, len); 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pp = (p_buf + len); 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_cb.devcb.enable_test_local_sign_cntr) 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("Use Test local counter value from script counter_val=%d", btm_cb.devcb.test_local_sign_cntr); 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(pp, btm_cb.devcb.test_local_sign_cntr); 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter); 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter); 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* compute local csrk */ 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_get_local_div(bd_addr, &div)) 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("compute_csrk div=%x", div); 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceEncRoot(er); 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CSRK = d1(ER, DIV, 1) */ 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, div); 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, r); 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(er, BT_OCTET16_LEN, temp, 4, &output)) 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Local CSRK generation failed "); 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("local CSRK generation success"); 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)local_csrk, output.param_buf, BT_OCTET16_LEN); 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.enable_test_local_sign_cntr) 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(p_mac, btm_cb.devcb.test_local_sign_cntr); 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter); 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter); 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((ret = AES_CMAC(local_csrk, p_buf, (UINT16)(len + 4), BTM_CMAC_TLEN_SIZE, p_mac)) == TRUE) 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_increment_sign_ctr(bd_addr, TRUE); 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_cb.devcb.enable_test_mac_val) 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("Use MAC value from script"); 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_mac, btm_cb.devcb.test_mac, BTM_CMAC_TLEN_SIZE); 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1("BTM_BleDataSignature p_mac = %d", p_mac); 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG4("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x", 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3)); 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG4("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x", 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7)); 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BleVerifySignature 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to verify the data signature 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter bd_addr: target device the data to be signed for. 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_orig: original data before signature. 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** len: length of the signing data 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** counter: counter used when doing data signing 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_comp: signature to be compared against. 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if signature verified correctly; otherwise FALSE. 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleVerifySignature (BD_ADDR bd_addr, UINT8 *p_orig, UINT16 len, UINT32 counter, 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_comp) 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN verified = FALSE; 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_rec = btm_find_dev (bd_addr); 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 p_mac[BTM_CMAC_TLEN_SIZE]; 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK))) 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("can not verify signature for unknown device"); 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (counter < p_rec->ble.keys.counter) 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("signature received with out dated sign counter"); 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_orig == NULL) 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("No signature to verify"); 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("BTM_BleVerifySignature rcv_cnt=%d >= expected_cnt=%d", counter, p_rec->ble.keys.counter); 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (AES_CMAC(p_rec->ble.keys.csrk, p_orig, len, BTM_CMAC_TLEN_SIZE, p_mac)) 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0) 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_increment_sign_ctr(bd_addr, FALSE); 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project verified = TRUE; 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return verified; 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Utility functions for LE device IR/ER generation 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_notify_new_key 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to notify application new keys have been 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generated. 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_notify_new_key(UINT8 key_type) 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_BLE_LOCAL_KEYS *p_locak_keys = NULL; 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_notify_new_key key_type=%d", key_type); 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_le_key_callback) 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (key_type) 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_BLE_KEY_TYPE_ID: 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ID"); 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.id_keys; 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_BLE_KEY_TYPE_ER: 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ER"); 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.er; 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR1("unknown key type: %d", key_type); 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_locak_keys != NULL) 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_le_key_callback) (key_type, p_locak_keys); 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_process_er2 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when ER is generated, store it in 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** local control block. 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_er2(tBTM_RAND_ENC *p) 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_process_er2"); 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p &&p->opcode == HCI_BLE_RAND) 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&btm_cb.devcb.er[8], p->param_buf, BT_OCTET8_LEN); 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_notify_new_key(BTM_BLE_KEY_TYPE_ER); 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Generating ER2 exception."); 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16)); 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_process_er 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when ER is generated, store it in 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** local control block. 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_er(tBTM_RAND_ENC *p) 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_process_er"); 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p &&p->opcode == HCI_BLE_RAND) 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&btm_cb.devcb.er[0], p->param_buf, BT_OCTET8_LEN); 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er2)) 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16)); 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Generating ER2 failed."); 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Generating ER1 exception."); 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_process_irk 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when IRK is generated, store it in 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** local control block. 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_irk(tSMP_ENC *p) 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_process_irk"); 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p &&p->opcode == HCI_BLE_ENCRYPT) 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN); 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_notify_new_key(BTM_BLE_KEY_TYPE_ID); 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Generating IRK exception."); 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* proceed generate ER */ 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er)) 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Generating ER failed."); 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** 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_process_dhk 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when DHK is calculated, store it in 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** local control block, and proceed to generate ER, a 128-bits 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** random number. 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_dhk(tSMP_ENC *p) 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 btm_ble_irk_pt = 0x01; 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_process_dhk"); 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p && p->opcode == HCI_BLE_ENCRYPT) 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN); 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("BLE DHK generated."); 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* IRK = D1(IR, 1) */ 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt, 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1, &output)) 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reset all identity root related key */ 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_process_irk(&output); 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reset all identity root related key */ 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_process_ir2 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when IR is generated, proceed to calculate 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** DHK = Eir({0x03, 0, 0 ...}) 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_ir2(tBTM_RAND_ENC *p) 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 btm_ble_dhk_pt = 0x03; 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_process_ir2"); 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p && p->opcode == HCI_BLE_RAND) 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remembering in control block */ 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&btm_cb.devcb.id_keys.ir[8], p->param_buf, BT_OCTET8_LEN); 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate DHK= Eir({0x03, 0x00, 0x00 ...}) */ 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_dhk_pt, 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1, &output); 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_process_dhk(&output); 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("BLE IR generated."); 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_process_ir 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when IR is generated, proceed to calculate 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** DHK = Eir({0x02, 0, 0 ...}) 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_ir(tBTM_RAND_ENC *p) 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_process_ir"); 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p && p->opcode == HCI_BLE_RAND) 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remembering in control block */ 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(btm_cb.devcb.id_keys.ir, p->param_buf, BT_OCTET8_LEN); 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir2)) 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Generating IR2 failed."); 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_reset_id 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to reset LE device identity. 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_reset_id( void ) 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("btm_ble_reset_id"); 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* regenrate Identity Root*/ 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir)) 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("Generating IR failed."); 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_set_no_disc_if_pair_fail 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function indicates that whether no disconnect of the ACL 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** should be used if pairing failed 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_set_no_disc_if_pair_fail(BOOLEAN disable_disc ) 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", disable_disc); 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.no_disc_if_pair_fail = disable_disc; 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_set_test_mac_value 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function set test MAC value 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_set_test_mac_value(BOOLEAN enable, UINT8 *p_test_mac_val ) 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm_ble_set_test_mac_value enable=%d", enable); 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.enable_test_mac_val = enable; 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN); 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_set_test_local_sign_cntr_value 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function set test local sign counter value 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_set_test_local_sign_cntr_value(BOOLEAN enable, UINT32 test_local_sign_cntr ) 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG2 ("btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d", 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project enable, test_local_sign_cntr); 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.enable_test_local_sign_cntr = enable; 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.test_local_sign_cntr = test_local_sign_cntr; 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_BLE_CONFORMANCE_TESTING */ 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 1901