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