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 address management. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 31ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "gap_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) 34bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#include "btm_ble_int.h" 35ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "smp_api.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 370943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji#include "vendor_ble.h" 380943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_gen_resolve_paddr_cmpl 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is callback functioin when resolvable private address 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generation is complete. 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_gen_resolve_paddr_cmpl(tSMP_ENC *p) 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 5283c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_gen_resolve_paddr_cmpl"); 53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p) 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* set hash to be LSB of rpAddress */ 57ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->private_addr[5] = p->param_buf[0]; 58ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->private_addr[4] = p->param_buf[1]; 59ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->private_addr[3] = p->param_buf[2]; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set it to controller */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_ble_set_random_addr(p_cb->private_addr); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 63ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->own_addr_type = BLE_ADDR_RANDOM; 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start a periodical timer to refresh random addr */ 660aee331900424ed23857ee2390fbb03338a60d91Chris Manton btu_stop_timer_oneshot(&p_cb->raddr_timer_ent); 67ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#if (BTM_BLE_CONFORMANCE_TESTING == TRUE) 680aee331900424ed23857ee2390fbb03338a60d91Chris Manton btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR, 69ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji btm_cb.ble_ctr_cb.rpa_tout); 70ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#else 710aee331900424ed23857ee2390fbb03338a60d91Chris Manton btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR, 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_BLE_PRIVATE_ADDR_INT); 73ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#endif 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* random address set failure */ 7883c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("set random address failed"); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_gen_resolve_paddr_low 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when random address has generate the 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** random number base for low 3 byte bd address. 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 91ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p) 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9783c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_gen_resolve_paddr_low"); 98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p) 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 100ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p->param_buf[2] &= (~BLE_RESOLVE_ADDR_MASK); 101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p->param_buf[2] |= BLE_RESOLVE_ADDR_MSB; 102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->private_addr[2] = p->param_buf[0]; 104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->private_addr[1] = p->param_buf[1]; 105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->private_addr[0] = p->param_buf[2]; 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* encrypt with ur IRK */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output)) 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_gen_resolve_paddr_cmpl(NULL); 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_gen_resolve_paddr_cmpl(&output); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_gen_resolvable_private_addr 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function generate a resolvable private address. 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 128ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback) 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13083c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_gen_resolvable_private_addr"); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate 3B rand as BD LSB, SRK with it, get BD MSB */ 132ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji if (!btsnd_hcic_ble_rand((void *)p_cmd_cplt_cback)) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_gen_resolve_paddr_cmpl(NULL); 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_gen_non_resolve_paddr_cmpl 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the callback function when non-resolvable private 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function is generated and write to controller. 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_gen_non_resolve_paddr_cmpl(tBTM_RAND_ENC *p) 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 148ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_BLE_ADDR_CBACK *p_cback = p_cb->p_generate_cback; 149ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta void *p_data = p_cb->p; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp; 151ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BD_ADDR static_random; 152ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 15383c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_gen_non_resolve_paddr_cmpl"); 154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cb->p_generate_cback = NULL; 156ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p) 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 158ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pp = p->param_buf; 160ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta STREAM_TO_BDADDR(static_random, pp); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask off the 2 MSB */ 162ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta static_random[0] &= BLE_STATIC_PRIVATE_MSB_MASK; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 164ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* report complete */ 165ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_cback) 166ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (* p_cback)(static_random, p_data); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17083c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("btm_gen_non_resolvable_private_addr failed"); 171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_cback) 172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (* p_cback)(NULL, p_data); 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_gen_non_resolvable_private_addr 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function generate a non-resolvable private address. 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_gen_non_resolvable_private_addr (tBTM_BLE_ADDR_CBACK *p_cback, void *p) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 188ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 18983c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_gen_non_resolvable_private_addr"); 190ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 191ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_mgnt_cb->p_generate_cback != NULL) 192ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 194ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_mgnt_cb->p_generate_cback = p_cback; 195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_mgnt_cb->p = p; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)btm_gen_non_resolve_paddr_cmpl)) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_gen_non_resolve_paddr_cmpl(NULL); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 200ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #if SMP_INCLUDED == TRUE 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Utility functions for Random address resolving 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_resolve_address_cmpl 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends the random address resolving complete 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** callback. 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_resolve_address_cmpl(void) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = NULL; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22183c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_ble_resolve_address_cmpl p_mgnt_cb->index = %d", p_mgnt_cb->index); 222ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mgnt_cb->index < BTM_SEC_MAX_DEVICE_RECORDS) 224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[p_mgnt_cb->index]; 226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mgnt_cb->busy = FALSE; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (* p_mgnt_cb->p_resolve_cback)(p_dev_rec, p_mgnt_cb->p); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_proc_resolve_x 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function compares the X with random address 3 MSO bytes 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to find a match, if not match, continue for next record. 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_ble_proc_resolve_x(tSMP_ENC *p) 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 comp[3]; 24683c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_ble_proc_resolve_x"); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* compare the hash with 3 LSB of bd address */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project comp[0] = p_mgnt_cb->random_bda[5]; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project comp[1] = p_mgnt_cb->random_bda[4]; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project comp[2] = p_mgnt_cb->random_bda[3]; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p) 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp(p->param_buf, &comp[0], 3)) 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match is found */ 25783c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("match is found"); 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_resolve_address_cmpl(); 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_match_random_bda 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function match the random address to the appointed device 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** record, starting from calculating IRK. If record index exceed 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the maximum record number, matching failed and send callback. 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_ble_match_random_bda(UINT16 rec_index) 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 rand[3]; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use the 3 MSB of bd address as prand */ 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rand[0] = p_mgnt_cb->random_bda[2]; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rand[1] = p_mgnt_cb->random_bda[1]; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rand[2] = p_mgnt_cb->random_bda[0]; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28883c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT("btm_ble_match_random_bda rec_index = %d", rec_index); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rec_index < BTM_SEC_MAX_DEVICE_RECORDS) 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[rec_index]; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29483c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("sec_flags = %02x device_type = %d", p_dev_rec->sec_flags, p_dev_rec->device_type); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 296083c41bef2f5dfc19c2fd11177a8d6257c5851bfMudumba Ananth if ((p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) && 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->ble.key_type & BTM_LE_KEY_PID)) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate X = E irk(R0, R1, R2) and R is random address 3 LSO */ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_Encrypt(p_dev_rec->ble.keys.irk, BT_OCTET16_LEN, 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &rand[0], 3, &output); 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_ble_proc_resolve_x(&output); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // not completed 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* no match found */ 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_ble_resolve_address_cmpl(); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_resolve_random_addr 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to resolve a random address. 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the security record of the device whom a random 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** address is matched to. 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_cback, void *p) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33283c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_ble_resolve_random_addr"); 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_mgnt_cb->busy) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mgnt_cb->p = p; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mgnt_cb->busy = TRUE; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mgnt_cb->index = 0; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mgnt_cb->p_resolve_cback = p_cback; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_mgnt_cb->random_bda, random_bda, BD_ADDR_LEN); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start to resolve random address */ 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check for next security record */ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (TRUE) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 344ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_ble_match_random_bda(p_mgnt_cb->index)) 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* atch found or went through the list */ 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham p_mgnt_cb->index ++; 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cback)(NULL, p); 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #endif 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** address mapping between pseudo address and real connection address 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_ble_map_bda_to_conn_bda 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function map a BD address to the real connection address 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and return the connection address type. 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBLE_ADDR_TYPE btm_ble_map_bda_to_conn_bda(BD_ADDR bd_addr) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = NULL; 36983c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_ble_map_bda_to_conn_bda"); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL && 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->device_type == BT_DEVICE_TYPE_BLE) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->ble.ble_addr_type != BLE_ADDR_PUBLIC) 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(bd_addr, p_dev_rec->ble.static_addr, BD_ADDR_LEN); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_dev_rec->ble.ble_addr_type; 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BLE_ADDR_PUBLIC; 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 382ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3830943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji/******************************************************************************* 3840943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 3850943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Function btm_find_dev_by_public_static_addr 3860943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 3870943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Description find the security record whose LE static address is matching 3880943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 3890943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji*******************************************************************************/ 3900943c10ed5713a08659f08e39e13de4894aaba61Satya CallojitBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr) 3910943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji{ 3920943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji UINT8 i; 3930943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 39416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 3950943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++) 3960943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 3970943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && 3980943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji BTM_BLE_IS_RESOLVE_BDA(p_dev_rec->bd_addr)) 3990943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 4000943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if ( memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) == 0) 4010943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 4020943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA; 4030943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* found the match */ 4040943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji return p_dev_rec; 4050943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 4060943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 4070943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 40816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 4090943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji return NULL; 4100943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji} 4110943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4120943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji/******************************************************************************* 4130943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4140943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Function btm_public_addr_to_random_pseudo 4150943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4160943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Description This function map a static BD address to a pseudo random address 4170943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** in security database. 4180943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4190943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji*******************************************************************************/ 4200943c10ed5713a08659f08e39e13de4894aaba61Satya CallojiBOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type) 4210943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji{ 42216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 4230943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_public_static_addr(bd_addr); 4240943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 42583c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_public_addr_to_random_pseudo"); 4260943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4270943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* evt reported on static address, map static address to random pseudo */ 4280943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (p_dev_rec != NULL && 4290943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* static address is not static address */ 4300943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji memcmp(p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN) != 0) 4310943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* update current random */ 4320943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji btm_ble_read_irk_entry(p_dev_rec->ble.static_addr); 4330943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (p_dev_rec != NULL) 4340943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 4350943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* assign the orginal random to be the current report address */ 4360943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji memcpy(bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 4370943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* always be a resolvable random if a match is found */ 4380943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji *p_addr_type = BLE_ADDR_RANDOM; 4390943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 44083c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_ERROR("matched a public/reconnect address and map to random pseudo"); 4410943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4420943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji return TRUE; 4430943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 44416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 4450943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji return FALSE; 4460943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji} 4470943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4480943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji/******************************************************************************* 4490943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4500943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Function btm_random_pseudo_to_public 4510943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4520943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Description This function map a random pseudo address to a public address 4530943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** random_pseudo is input and output parameter 4540943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4550943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji*******************************************************************************/ 4560943c10ed5713a08659f08e39e13de4894aaba61Satya CallojiBOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type) 4570943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji{ 45816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 4590943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (random_pseudo); 4600943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4610943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (p_dev_rec != NULL) 4620943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 4630943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && 4640943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji BTM_BLE_IS_RESOLVE_BDA(p_dev_rec->bd_addr) && 4650943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji (p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0) 4660943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 46783c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_random_pseudo_to_public found the puclic static address!"); 4680943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji * p_static_addr_type = p_dev_rec->ble.static_addr_type; 4690943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji memcpy(random_pseudo, p_dev_rec->ble.static_addr, BD_ADDR_LEN); 4700943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji return TRUE; 4710943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 4720943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 47316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 4740943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji return FALSE; 4750943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji} 4760943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4770943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji/******************************************************************************* 4780943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4790943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Function btm_ble_refresh_rra 4800943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4810943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** Description This function refresh the currently used RRA into security 4820943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** database and set active connection address. 4830943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji** 4840943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji*******************************************************************************/ 4850943c10ed5713a08659f08e39e13de4894aaba61Satya Callojivoid btm_ble_refresh_rra(BD_ADDR static_bda, BD_ADDR rra) 4860943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji{ 48716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 4880943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji tBTM_SEC_DEV_REC *p_sec_rec = btm_find_dev_by_public_static_addr(static_bda); 4890943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji tACL_CONN *p_acl = btm_bda_to_acl (p_sec_rec->bd_addr, BT_TRANSPORT_LE); 4900943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji UINT8 rra_dummy = FALSE; 4910943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji BD_ADDR dummy_bda = {0}; 4920943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 49383c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_ERROR("btm_ble_refresh_rra"); 4940943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4950943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (memcmp(dummy_bda, rra, BD_ADDR_LEN) == 0) 4960943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji rra_dummy = TRUE; 4970943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji 4980943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* connection refresh RRA */ 4990943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (p_acl != NULL /* && memcmp(p_acl->active_remote_addr, dummy_bda, BD_ADDR_LEN) == 0 */) 5000943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 5010943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* use static address, rra is empty */ 5020943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (rra_dummy) 5030943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 5040943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji p_acl->active_remote_addr_type = p_sec_rec->ble.static_addr_type; 5050943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji memcpy(p_acl->active_remote_addr, p_sec_rec->ble.static_addr, BD_ADDR_LEN); 5060943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 5070943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji else 5080943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 5090943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji p_acl->active_remote_addr_type = BLE_ADDR_RANDOM; 5100943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji memcpy(p_acl->active_remote_addr, rra, BD_ADDR_LEN); 5110943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 5120943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 5130943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji /* update security record here, in adv event or connection complete process */ 5140943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji if (p_sec_rec != NULL) 5150943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 5160943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji memcpy(p_sec_rec->ble.cur_rand_addr, rra, BD_ADDR_LEN); 5170943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji p_sec_rec->ble.active_addr_type = rra_dummy ? BTM_BLE_ADDR_STATIC: BTM_BLE_ADDR_RRA; 5180943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 5190943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji else 5200943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji { 52183c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_ERROR("No matching known device in record"); 5220943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji } 52316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 5240943c10ed5713a08659f08e39e13de4894aaba61Satya Calloji} 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 528