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