15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2003-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#include "bt_target.h"
205cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include <string.h>
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "btm_int.h"
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "l2c_api.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "smp_int.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
298fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta#define MAX_KEY_DISTRIBUTION_TYPES   3
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] =
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initiator */
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {{SMP_MODEL_ENC_ONLY, SMP_MODEL_ENC_ONLY,   SMP_MODEL_PASSKEY,   SMP_MODEL_ENC_ONLY,    SMP_MODEL_PASSKEY}, /* Display Only */
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {SMP_MODEL_ENC_ONLY,  SMP_MODEL_ENC_ONLY,   SMP_MODEL_PASSKEY,   SMP_MODEL_ENC_ONLY,    SMP_MODEL_PASSKEY}, /* SMP_CAP_IO = 1 */
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF,  SMP_MODEL_PASSKEY,   SMP_MODEL_ENC_ONLY,    SMP_MODEL_KEY_NOTIF}, /* keyboard only */
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {SMP_MODEL_ENC_ONLY,  SMP_MODEL_ENC_ONLY,   SMP_MODEL_ENC_ONLY,  SMP_MODEL_ENC_ONLY,    SMP_MODEL_ENC_ONLY},/* No Input No Output */
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF,  SMP_MODEL_PASSKEY,   SMP_MODEL_ENC_ONLY,    SMP_MODEL_KEY_NOTIF}}, /* keyboard display */
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* responder */
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {{SMP_MODEL_ENC_ONLY, SMP_MODEL_ENC_ONLY,   SMP_MODEL_KEY_NOTIF, SMP_MODEL_ENC_ONLY,    SMP_MODEL_KEY_NOTIF}, /* Display Only */
41ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {SMP_MODEL_ENC_ONLY,  SMP_MODEL_ENC_ONLY,   SMP_MODEL_KEY_NOTIF,   SMP_MODEL_ENC_ONLY,    SMP_MODEL_KEY_NOTIF}, /* SMP_CAP_IO = 1 */
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {SMP_MODEL_PASSKEY,   SMP_MODEL_PASSKEY,    SMP_MODEL_PASSKEY,   SMP_MODEL_ENC_ONLY,    SMP_MODEL_PASSKEY}, /* keyboard only */
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {SMP_MODEL_ENC_ONLY,  SMP_MODEL_ENC_ONLY,   SMP_MODEL_ENC_ONLY,  SMP_MODEL_ENC_ONLY,    SMP_MODEL_ENC_ONLY},/* No Input No Output */
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {SMP_MODEL_PASSKEY,   SMP_MODEL_PASSKEY,    SMP_MODEL_KEY_NOTIF, SMP_MODEL_ENC_ONLY,    SMP_MODEL_PASSKEY}} /* keyboard display */
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* display only */    /*SMP_CAP_IO = 1 */  /* keyboard only */   /* No InputOutput */  /* keyboard display */
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tSMP_ACT smp_distribute_act [] =
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_generate_ltk,
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_id_info,
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_generate_csrk
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_update_key_mask
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function updates the key mask for sending or receiving.
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_update_key_mask (tSMP_CB *p_cb, UINT8 key_type, BOOLEAN recv)
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
61b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_update_key_mask ");
62b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("before update role=%d recv=%d loc_i_key = %02x, loc_r_key = %02x", p_cb->role, recv, p_cb->loc_i_key, p_cb->loc_r_key);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->role == HCI_ROLE_SLAVE)
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (recv)
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_i_key &= ~key_type;
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_r_key &= ~key_type;
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (recv)
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_r_key &= ~key_type;
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_i_key &= ~key_type;
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
78b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("updated loc_i_key = %02x, loc_r_key = %02x", p_cb->loc_i_key, p_cb->loc_r_key);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_io_cap_req
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  send SMP IO request
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_app_cback(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_EVT_DATA   cb_data;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_STATUS callback_rc;
885cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
895cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
90b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_app_cback p_cb->cb_evt=%d", p_cb->cb_evt );
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->p_callback && p_cb->cb_evt != 0)
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.io_req.auth_req = p_cb->peer_auth_req;
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.io_req.oob_data = SMP_OOB_NONE;
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.io_req.init_keys = p_cb->loc_i_key ;
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.io_req.resp_keys = p_cb->loc_r_key ;
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
102b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_WARNING( "io_cap = %d",cb_data.io_req.io_cap);
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        callback_rc = (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
106b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_DEBUG ("callback_rc=%d  p_cb->cb_evt=%d",callback_rc, p_cb->cb_evt );
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (callback_rc == SMP_SUCCESS && p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_auth_req   = cb_data.io_req.auth_req;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_io_caps    = cb_data.io_req.io_cap;
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_oob_flag   = cb_data.io_req.oob_data;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_enc_size   = cb_data.io_req.max_key_size;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_i_key      = cb_data.io_req.init_keys;
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_r_key      = cb_data.io_req.resp_keys;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
117b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_WARNING( "new io_cap = %d p_cb->loc_enc_size = %d",p_cb->loc_io_caps, p_cb->loc_enc_size);
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->cb_evt && p_cb->discard_sec_req)
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->discard_sec_req = FALSE;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
128b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_app_cback return");
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_pair_fail
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  pairing failure to peer device if needed.
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->status = *(UINT8 *)p_data;
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->failure = *(UINT8 *)p_data;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
139b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_pair_fail status=%d failure=%d ",p_cb->status, p_cb->failure);
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS)
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_pair_req
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process pairing request to slave device
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_pair_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
1545cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
1555cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
156b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_pair_req  ");
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1582d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach#if BLE_INCLUDED == TRUE
1592d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach    /* Disable L2CAP connection parameter updates while bonding since
1602d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach       some peripherals are not able to revert to fast connection parameters
1612d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach       during the start of service discovery. Connection paramter updates
1622d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach       get enabled again once service discovery completes. */
1638fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE) == FALSE)
1648fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
165b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_ERROR ("smp pair failed...!");
1668fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        return;
1678fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
1682d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach#endif
1692d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* erase all keys when master sends pairing req*/
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_clear_ble_keys(p_dev_rec);
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* do not manipulate the key, let app decide,
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       leave out to BTM to mandate key distribution for bonding case */
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_pair_rsp
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process pairing response to slave device
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_pair_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1835cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
1845cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
185b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_pair_rsp  ");
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->loc_i_key &= p_cb->peer_i_key;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->loc_r_key &= p_cb->peer_r_key;
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (smp_send_cmd (SMP_OPCODE_PAIRING_RSP, p_cb))
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_decide_asso_model(p_cb, NULL);
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_pair_request
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process pairing request to slave device
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2025cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
2035cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
204b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_confirm  ");
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_init
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process pairing initializer to slave device
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2135cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
2145cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
215b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_init  ");
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_CONFORMANCE_TESTING == TRUE
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->enable_test_rand_val)
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
220b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_DEBUG ("Use rand value from script");
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_cb->rand, p_cb->test_rand, BT_OCTET16_LEN);
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_cmd(SMP_OPCODE_INIT, p_cb);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_enc_info
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  send security information command.
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_LENC_KEYS   le_key;
2345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
236b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_enc_info  p_cb->loc_enc_size = %d", p_cb->loc_enc_size);
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, FALSE);
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the DIV and key size information when acting as slave device */
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    le_key.div =  p_cb->div;
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    le_key.key_size = p_cb->loc_enc_size;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    le_key.sec_level = p_cb->sec_level;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
248b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_WARNING( "smp_send_enc_info");
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_id_info
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  send ID information command.
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2585cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
2595cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
260b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_id_info  ");
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, FALSE);
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
266b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_WARNING( "smp_send_id_info");
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_csrk_info
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  send CSRK command.
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_csrk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_KEY_VALUE   key;
2775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
2785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
279b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_csrk_info ");
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, FALSE);
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb))
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        key.lcsrk_key.div = p_cb->div;
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        key.lcsrk_key.sec_level = p_cb->sec_level;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        key.lcsrk_key.counter = 0; /* initialize the local counter */
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK, &key, TRUE);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_send_ltk_reply
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  send LTK reply
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_send_ltk_reply(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
299b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_send_ltk_reply ");
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send stk as LTK response */
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_ble_ltk_request_reply(p_cb->pairing_bda, TRUE, p_data->key.p_data);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_sec_req
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process security request.
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_sec_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_AUTH_REQ        auth_req = *(tBTM_LE_AUTH_REQ *)p_data;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_SEC_REQ_ACT    sec_req_act;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
313b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_sec_req  auth_req=0x%x",auth_req);
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->cb_evt = 0;
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_ble_link_sec_check(p_cb->pairing_bda, auth_req,  &sec_req_act);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
319b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_sec_req  sec_req_act=0x%x",sec_req_act);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (sec_req_act)
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case  BTM_BLE_SEC_REQ_ACT_ENCRYPT:
324b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_DEBUG ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_ENCRYPT");
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BLE_SEC_REQ_ACT_PAIR:
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* initialize local i/r key to be default keys */
330b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_DEBUG ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_PAIR");
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->peer_auth_req = auth_req;
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_r_key = p_cb->loc_i_key = SMP_SEC_DEFAULT_KEY ;
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
3347475a5098339d763aa6e3a0374ee2f1c16e002c4Nitin Arora            btu_stop_timer (&p_cb->rsp_timer_ent);
3357475a5098339d763aa6e3a0374ee2f1c16e002c4Nitin Arora            btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
3367475a5098339d763aa6e3a0374ee2f1c16e002c4Nitin Arora                   SMP_WAIT_FOR_RSP_TOUT);
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BLE_SEC_REQ_ACT_DISCARD:
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->discard_sec_req = TRUE;
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* do nothing */
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_sec_grant
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process security grant.
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 res= *(UINT8 *)p_data;
355b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_sec_grant ");
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != SMP_SUCCESS)
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /*otherwise, start pairing */
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send IO request callback */
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_pair_fail
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process pairing failure from peer device
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
372b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_pair_fail   ");
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->status = *(UINT8 *)p_data;
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_pair_cmd
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Process the SMP pairing request/response from peer device
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = (UINT8 *)p_data;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   reason = SMP_ENC_KEY_SIZE;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_pair_cmd  ");
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* erase all keys if it is slave proc pairing req*/
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_clear_ble_keys(p_dev_rec);
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(p_cb->peer_io_caps, p);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(p_cb->peer_auth_req, p);
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(p_cb->peer_enc_size, p);
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(p_cb->peer_i_key, p);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(p_cb->peer_r_key, p);
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_CONFORMANCE_TESTING == TRUE
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->enable_test_pair_fail)
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
402b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_DEBUG ("Forced pair fair");
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->peer_enc_size < SMP_MIN_ENC_KEY_SIZE)
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &(p_cb->pair_fail_status));
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->peer_enc_size < SMP_MIN_ENC_KEY_SIZE)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_cb->role == HCI_ROLE_SLAVE)
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_i_key = p_cb->peer_i_key;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_r_key = p_cb->peer_r_key;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* update local i/r key according to pairing request */
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_i_key &= p_cb->peer_i_key;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_r_key &= p_cb->peer_r_key;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_confirm
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process pairing confirm from peer device
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p = (UINT8 *)p_data;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
444b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_confirm  ");
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p != NULL)
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* save the SConfirm for comparison later */
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN);
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_init
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process pairing initializer from peer device
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p = (UINT8 *)p_data;
461b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_init ");
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the SRand for comparison */
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_enc_info
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process encryption information from peer device
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_enc_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = (UINT8 *)p_data;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
474b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_enc_info  ");
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_master_id
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process master ID from slave device
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_master_id(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = (UINT8 *)p_data;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_PENC_KEYS   le_key;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
488b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG (" smp_proc_master_id");
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, TRUE);
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16(le_key.ediv, p);
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_ARRAY(le_key.rand, p, BT_OCTET8_LEN );
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* store the encryption keys from peer device */
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    le_key.sec_level = p_cb->sec_level;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    le_key.key_size  = p_cb->loc_enc_size;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_enc_info
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process identity information from peer device
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_id_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = (UINT8 *)p_data;
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
510b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_id_info ");
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_ARRAY (p_cb->tk, p, BT_OCTET16_LEN);   /* reuse TK for IRK */
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_id_addr
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process identity address from peer device
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_id_addr(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = (UINT8 *)p_data;
522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_PID_KEYS    pid_key;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
524b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_id_addr  ");
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, TRUE);
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
527ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    STREAM_TO_UINT8(pid_key.addr_type, p);
528ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    STREAM_TO_BDADDR(pid_key.static_addr, p);
529ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN);
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
531ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* store the ID key from peer device */
532ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID, (tBTM_LE_KEY_VALUE *)&pid_key, TRUE);
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_srk_info
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process security information from peer device
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_srk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_PCSRK_KEYS   le_key;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
544b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_srk_info ");
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, TRUE);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save CSRK to security record */
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    le_key.sec_level = p_cb->sec_level;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (le_key.csrk, p_data, BT_OCTET16_LEN);   /* get peer CSRK */
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    le_key.counter = 0; /* initialize the peer counter */
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PCSRK, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_key_distribution(p_cb, NULL);
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_compare
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process compare value
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_compare(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   reason;
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
564b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_compare  ");
565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (
566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if SMP_CONFORMANCE_TESTING == TRUE
567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_cb->skip_test_compare_check ||
568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        !memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN))
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* compare the max encryption key size, and save the smaller one for the link */
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( p_cb->peer_enc_size < p_cb->loc_enc_size)
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_enc_size = p_cb->peer_enc_size;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->role == HCI_ROLE_SLAVE)
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* master device always use received i/r key as keys to distribute */
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_i_key = p_cb->peer_i_key;
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->loc_r_key = p_cb->peer_r_key;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_sl_key
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process key ready events.
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_sl_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 key_type = p_data->key.key_type;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
601b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_sl_keysmp_proc_sl_key  ");
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type == SMP_KEY_TYPE_TK)
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_generate_confirm(p_cb, NULL);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (key_type == SMP_KEY_TYPE_CFM)
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_set_state(SMP_ST_WAIT_CONFIRM);
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_start_enc
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  start encryption
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    tBTM_STATUS cmd;
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 reason = SMP_ENC_FAIL;
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
624b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_start_enc ");
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data != NULL)
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cmd = btm_ble_start_encrypt(p_cb->pairing_bda, TRUE, p_data->key.p_data);
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cmd = btm_ble_start_encrypt(p_cb->pairing_bda, FALSE, NULL);
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6308fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY)
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_discard
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description   processing for discard security request
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_discard(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6415cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
6425cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
643b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_discard ");
64498283bb879d26d0c29a76988e1bffebd6f730fc5Priti Aghera    if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
64598283bb879d26d0c29a76988e1bffebd6f730fc5Priti Aghera        smp_reset_control_value(p_cb);
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_release_delay
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process the release delay request
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_release_delay(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6535cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
6545cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
655b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_release_delay ");
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer (&p_cb->rsp_timer_ent);
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     SMP_WAIT_FOR_REL_DELAY_TOUT);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function      smp_proc_release_delay_tout
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description   processing the release delay timeout
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_release_delay_tout(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6675cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
6685cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
669b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_release_delay_tout ");
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer (&p_cb->rsp_timer_ent);
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_proc_pairing_cmpl(p_cb);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_enc_cmpl
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description   encryption success
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_enc_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 enc_enable = *(UINT8 *)p_data;
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
684b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_enc_cmpl ");
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_check_auth_req
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  check authentication request
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_check_auth_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 enc_enable = *(UINT8 *)p_data;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
698b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_check_auth_req enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      enc_enable, p_cb->loc_i_key, p_cb->loc_r_key);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enc_enable == 1)
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_cb->loc_i_key || p_cb->loc_r_key))
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (enc_enable == 0)
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if failed for encryption after pairing, send callback */
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if enc failed for old security information */
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if master device, clean up and abck to idle; slave device do nothing */
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_cb->role == HCI_ROLE_MASTER)
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_key_pick_key
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Pick a key distribution function based on the key mask.
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_key_pick_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   key_to_dist = (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->loc_r_key : p_cb->loc_i_key;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i = 0;
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
734b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_key_pick_key key_to_dist=0x%x", key_to_dist);
7358fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    while (i < MAX_KEY_DISTRIBUTION_TYPES)
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
737b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_DEBUG("key to send = %02x, i = %d",  key_to_dist, i);
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (key_to_dist & (1 << i))
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
741b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_DEBUG ("smp_distribute_act[%d]", i);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* smp_distribute_act[i])(p_cb, p_data);
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i ++;
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_key_distribution
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  start key distribution if required.
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   reason = SMP_SUCCESS;
755b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_key_distribution role=%d (0-master) r_keys=0x%x i_keys=0x%x",
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_cb->role, p_cb->loc_r_key, p_cb->loc_i_key);
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->role == HCI_ROLE_SLAVE||
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (!p_cb->loc_r_key && p_cb->role == HCI_ROLE_MASTER))
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_key_pick_key(p_cb, p_data);
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->loc_i_key && !p_cb->loc_r_key)
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* state check to prevent re-entrant */
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (smp_get_state() == SMP_ST_BOND_PENDING)
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_decide_asso_model
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to compare both sides' io capability
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  oob data flag and authentication request, and decide the
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  association model to use for the authentication.
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_decide_asso_model(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   failure = SMP_UNKNOWN_IO_CAP;
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ASSO_MODEL model = SMP_MODEL_MAX;
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 int_evt = 0;
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_KEY key;
783ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tSMP_INT_DATA   *p = NULL;
7845cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
786b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_decide_asso_model p_cb->peer_io_caps = %d p_cb->loc_io_caps = %d \
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_cb->peer_auth_req = %02x",
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_cb->peer_io_caps, p_cb->loc_io_caps, p_cb->peer_auth_req);
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* OOB data present on both devices, use OOB association model */
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT)
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        model = SMP_MODEL_OOB;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* no MITM required, ignore IO cap, use encryption only */
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) &&
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req))
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        model = SMP_MODEL_ENC_ONLY;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else/* use IO capability to decide assiciation model */
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->loc_io_caps < SMP_IO_CAP_MAX)
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->role == HCI_ROLE_MASTER)
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                model = smp_association_table[p_cb->role][p_cb->peer_io_caps][p_cb->loc_io_caps];
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                model = smp_association_table[p_cb->role][p_cb->loc_io_caps][p_cb->peer_io_caps];
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
812b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG("Association Model = %d", model);
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (model == SMP_MODEL_OOB)
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
816b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->sec_level = SMP_SEC_AUTHENTICATED;
818b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->cb_evt = SMP_OOB_REQ_EVT;
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int_evt = SMP_TK_REQ_EVT;
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (model == SMP_MODEL_PASSKEY)
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->sec_level = SMP_SEC_AUTHENTICATED;
826b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int_evt = SMP_TK_REQ_EVT;
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (model == SMP_MODEL_KEY_NOTIF)
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->sec_level = SMP_SEC_AUTHENTICATED;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
835b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_DEBUG("Need to generate Passkey");
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* generate passkey and notify application */
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_generate_passkey(p_cb, NULL);
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (model == SMP_MODEL_ENC_ONLY) /* TK = 0, go calculate Confirm */
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->role == HCI_ROLE_MASTER &&
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0))
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
845b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_ERROR("IO capability does not meet authentication requirement");
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            failure = SMP_PAIR_AUTH_FAIL;
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = (tSMP_INT_DATA *)&failure;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            int_evt = SMP_AUTH_CMPL_EVT;
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
853b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            key.key_type = SMP_KEY_TYPE_TK;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            key.p_data = p_cb->tk;
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = (tSMP_INT_DATA *)&key;
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(p_cb->tk, 0, BT_OCTET16_LEN);
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* TK, ready  */
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            int_evt = SMP_KEY_READY_EVT;
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (model == SMP_MODEL_MAX)
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
866b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_ERROR("Association Model = SMP_MODEL_MAX (failed)");
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (tSMP_INT_DATA *)&failure;
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int_evt = SMP_AUTH_CMPL_EVT;
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
871b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_EVENT ("sec_level=%d ", p_cb->sec_level );
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (int_evt)
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, int_evt, p);
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     smp_proc_io_rsp
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  process IO response for a slave device.
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_io_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
8835cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
884b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_io_rsp ");
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_set_state(SMP_ST_SEC_REQ_PENDING);
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* respond to pairing request */
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_send_pair_rsp(p_cb, NULL);
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_pairing_cmpl
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send the pairing complete callback
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and remove the connection if needed.
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
903b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_pairing_cmpl ");
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_cb->status == SMP_SUCCESS) ||
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS))
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_RELEASE_DELAY_EVT, p_data);
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this will transition to idle state right away */
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(p_cb, SMP_RELEASE_DELAY_TOUT_EVT, p_data);
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_pair_terminate
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send the pairing complete callback
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and remove the connection if needed.
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_pair_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9245cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
9255cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
926b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_pair_terminate ");
927ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
9285cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    p_cb->status = SMP_CONN_TOUT;
9296975b4d711142b885af479721cada448952c6b41Andre Eisenbach
9306975b4d711142b885af479721cada448952c6b41Andre Eisenbach    smp_proc_pairing_cmpl(p_cb);
9316975b4d711142b885af479721cada448952c6b41Andre Eisenbach}
9326975b4d711142b885af479721cada448952c6b41Andre Eisenbach
9336975b4d711142b885af479721cada448952c6b41Andre Eisenbach/*******************************************************************************
9346975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Function         smp_delay_terminate
9356975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description      This function is called when connection dropped when smp delay
9366975b4d711142b885af479721cada448952c6b41Andre Eisenbach**                  timer is still active.
9376975b4d711142b885af479721cada448952c6b41Andre Eisenbach*******************************************************************************/
9386975b4d711142b885af479721cada448952c6b41Andre Eisenbachvoid smp_delay_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
9396975b4d711142b885af479721cada448952c6b41Andre Eisenbach{
940b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_delay_terminate ");
9416975b4d711142b885af479721cada448952c6b41Andre Eisenbach
9426975b4d711142b885af479721cada448952c6b41Andre Eisenbach    btu_stop_timer (&p_cb->rsp_timer_ent);
9436975b4d711142b885af479721cada448952c6b41Andre Eisenbach
94458440603564a1f43ef27b3bf738d9d6177b7b9eeZhihai Xu    /* if remote user terminate connection, keep the previous status */
94558440603564a1f43ef27b3bf738d9d6177b7b9eeZhihai Xu    /* this is to avoid reporting reverse status to uplayer */
94658440603564a1f43ef27b3bf738d9d6177b7b9eeZhihai Xu    if (p_data->reason != HCI_ERR_PEER_USER)
9476975b4d711142b885af479721cada448952c6b41Andre Eisenbach        p_cb->status = SMP_CONN_TOUT;
948ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_proc_pairing_cmpl(p_cb);
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_idle_terminate
9535cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen** Description      This function called in idle state to determine to send authentication
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete or not.
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_idle_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9585cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
961b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->status = SMP_FAIL;
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_proc_pairing_cmpl(p_cb);
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9668fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
9678fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/*******************************************************************************
9688fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Function     smp_fast_conn_param
9698fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Description  apply default connection parameter for pairing process
9708fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta*******************************************************************************/
9718fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
9728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta{
9738fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    /* disable connection parameter update */
9748fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    (void)L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE);
9758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta}
9768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
9778fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_link_encrypted
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when link is encrypted and notified to
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  slave device. Proceed to to send LTK, DIV and ER to master if
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bonding the devices.
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable)
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_CB *p_cb = &smp_cb;
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
994b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_link_encrypted encr_enable=%d",encr_enable);
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp(&smp_cb.pairing_bda[0], bda, BD_ADDR_LEN) == 0)
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* encryption completed with STK, remmeber the key size now, could be overwite
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *  when key exchange happens                                        */
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->loc_enc_size != 0 && encr_enable)
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* update the link encryption key size if a SMP pairing just performed */
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &encr_enable);
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         smp_proc_ltk_request
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when LTK request is received from
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  controller.
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN smp_proc_ltk_request(BD_ADDR bda)
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1021b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    SMP_TRACE_DEBUG ("smp_proc_ltk_request state = %d", smp_cb.state);
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( smp_cb.state == SMP_ST_ENC_PENDING &&
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         !memcmp(bda, smp_cb.pairing_bda, BD_ADDR_LEN))
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL);
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1034