smp_act.cc revision e7f14a682d57811d9df0d64372f222bcc143ec86
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 19444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include <string.h> 205a6b32562ab6a1bbca945e478d01e371bb49c40fPulkit Bhuwalka#include "btif_common.h" 217927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "device/include/interop.h" 227927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "include/bt_target.h" 237927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "stack/btm/btm_int.h" 247927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "stack/include/l2c_api.h" 257927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "stack/smp/smp_int.h" 267927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "utils/include/bt_utils.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern fixed_queue_t* btu_general_alarm_queue; 290bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 30911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SMP_KEY_DIST_TYPE_MAX 4 31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonconst tSMP_ACT smp_distribute_act[] = {smp_generate_ltk, smp_send_id_info, 32911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_generate_csrk, 33911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_derive_link_key}; 340bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool lmp_version_below(BD_ADDR bda, uint8_t version) { 36911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE); 37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (acl == NULL || acl->lmp_version == 0) { 38911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("%s cannot retrieve LMP version...", __func__); 39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("%s LMP version %d < %d", __func__, acl->lmp_version, 42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson version); 43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return acl->lmp_version < version; 44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool pts_test_send_authentication_complete_failure(tSMP_CB* p_cb) { 47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = 0; 48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->cert_failure < 2 || p_cb->cert_failure > 6) return false; 50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure); 52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->cert_failure) { 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 2: 55911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_PAIR_AUTH_FAIL; 56911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 58911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 3: 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_PAIR_FAIL_UNKNOWN; 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 4: 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_PAIR_NOT_SUPPORT; 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 5: 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_PASSKEY_ENTRY_FAIL; 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case 6: 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_REPEATED_ATTEMPTS; 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ; 780bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora} 790bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_update_key_mask 82ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function updates the key mask for sending or receiving. 83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void smp_update_key_mask(tSMP_CB* p_cb, uint8_t key_type, bool recv) { 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG( 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s before update role=%d recv=%d local_i_key = %02x, local_r_key = %02x", 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key); 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_cb->le_secure_connections_mode_is_used) || (p_cb->smp_over_br)) && 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((key_type == SMP_SEC_KEY_TYPE_ENC) || 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (key_type == SMP_SEC_KEY_TYPE_LK))) { 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* in LE SC mode LTK, CSRK and BR/EDR LK are derived locally instead of 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** being exchanged with the peer */ 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~key_type; 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~key_type; 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_cb->role == HCI_ROLE_SLAVE) { 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (recv) 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~key_type; 99444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~key_type; 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (recv) 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~key_type; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~key_type; 106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x", 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key, p_cb->local_r_key); 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_app_cback 1149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description notifies application about the events the application is 1159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * interested in 116ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_app_cback(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_EVT_DATA cb_data; 119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS callback_rc; 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d", __func__, p_cb->cb_evt); 121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->p_callback && p_cb->cb_evt != 0) { 122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->cb_evt) { 123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_IO_CAP_REQ_EVT: 124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.auth_req = p_cb->peer_auth_req; 125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.oob_data = SMP_OOB_NONE; 126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS; 127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE; 128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.init_keys = p_cb->local_i_key; 129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.resp_keys = p_cb->local_r_key; 130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("io_cap = %d", cb_data.io_req.io_cap); 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_NC_REQ_EVT: 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.passkey = p_data->passkey; 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_SC_OOB_REQ_EVT: 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.req_oob_type = p_data->req_oob_type; 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_SC_LOC_OOB_DATA_UP_EVT: 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data; 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_BR_KEYS_REQ_EVT: 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.auth_req = 0; 145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.oob_data = SMP_OOB_NONE; 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.io_cap = 0; 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE; 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY; 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY; 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data); 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s: callback_rc=%d p_cb->cb_evt=%d", __func__, 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc, p_cb->cb_evt); 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (callback_rc == SMP_SUCCESS) { 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->cb_evt) { 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_IO_CAP_REQ_EVT: 165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_auth_req = cb_data.io_req.auth_req; 166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_io_capability = cb_data.io_req.io_cap; 167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_oob_flag = cb_data.io_req.oob_data; 168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_enc_size = cb_data.io_req.max_key_size; 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key = cb_data.io_req.init_keys; 170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = cb_data.io_req.resp_keys; 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) { 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("Non bonding: No keys will be exchanged"); 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key = 0; 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = 0; 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING( 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "rcvd auth_req: 0x%02x, io_cap: %d \ 180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji loc_oob_flag: %d loc_enc_size: %d," 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "local_i_key: 0x%02x, local_r_key: 0x%02x", 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag, 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key); 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->secure_connections_only_mode_required = 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false; 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->secure_connections_only_mode_required) { 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT; 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) || 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2) || 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (const bt_bdaddr_t*)&p_cb->pairing_bda)) { 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT; 197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; 198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; 199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING( 202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x", 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key); 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL); 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_BR_KEYS_REQ_EVT: 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_enc_size = cb_data.io_req.max_key_size; 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key = cb_data.io_req.init_keys; 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = cb_data.io_req.resp_keys; 212e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski p_cb->loc_auth_req |= SMP_H7_SUPPORT_BIT; 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; 215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; 216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING( 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "for SMP over BR max_key_size: 0x%02x,\ 219e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski local_i_key: 0x%02x, local_r_key: 0x%02x, p_cb->loc_auth_req: 0x%02x", 220e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key, 221e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski p_cb->loc_auth_req); 222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL); 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_cb->cb_evt && p_cb->discard_sec_req) { 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->discard_sec_req = false; 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL); 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s return", __func__); 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_pair_fail 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description pairing failure to peer device if needed. 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->status = *(uint8_t*)p_data; 243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->failure = *(uint8_t*)p_data; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s status=%d failure=%d ", __func__, p_cb->status, 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->failure); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC && 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->status != SMP_SUCCESS) { 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb); 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->wait_for_authorization_complete = true; 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_pair_req 257ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description actions related to sending pairing request 258ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda); 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 2622d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* erase all keys when master sends pairing req*/ 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) btm_sec_clear_ble_keys(p_dev_rec); 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do not manipulate the key, let app decide, 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson leave out to BTM to mandate key distribution for bonding case */ 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_pair_rsp 272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description actions related to sending pairing response 273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_rsp(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 2765cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= p_cb->peer_i_key; 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= p_cb->peer_r_key; 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb)) { 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_use_oob_private_key(p_cb, NULL); 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_decide_association_model(p_cb, NULL); 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_confirm 290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send confirmation to the peer 291ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_init 299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing initializer to slave device 300ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_INIT, p_cb); 304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_rand 308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send pairing random to the peer 309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_RAND, p_cb); 313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 3145cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_pair_public_key 317ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send pairing public key command to the peer 318ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_PAIR_PUBLIC_KEY, p_cb); 322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_SEND_COMMITMENT 326ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send commitment command to the peer 327ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_PAIR_COMMITM, p_cb); 331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 334ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_dhkey_check 335ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send DHKey Check command to the peer 336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_PAIR_DHKEY_CHECK, p_cb); 340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_keypress_notification 344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send Keypress Notification command to the peer 345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_keypress_notification = *(uint8_t*)p_data; 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb); 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_enc_info 353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send encryption information command. 354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_LENC_KEYS le_key; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size); 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false); 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb); 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb); 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save the DIV and key size information when acting as slave device */ 365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN); 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_key.div = p_cb->div; 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_key.key_size = p_cb->loc_enc_size; 368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_key.sec_level = p_cb->sec_level; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->loc_auth_req & SMP_AUTH_BOND)) 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_KEY_VALUE*)&le_key, true); 374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("%s", __func__); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution(p_cb, NULL); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_id_info 382ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send ID information command. 383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_KEY_VALUE le_key; 386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb); 390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb); 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && 393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->loc_auth_req & SMP_AUTH_BOND)) 394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LID, &le_key, true); 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("%s", __func__); 397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution_by_transport(p_cb, NULL); 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_csrk_info 402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send CSRK command. 403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_LCSRK_KEYS key; 406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) { 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key.div = p_cb->div; 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key.sec_level = p_cb->sec_level; 412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key.counter = 0; /* initialize the local counter */ 413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(key.csrk, p_cb->csrk, BT_OCTET16_LEN); 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK, 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_KEY_VALUE*)&key, true); 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution_by_transport(p_cb, NULL); 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_send_ltk_reply 423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send LTK reply 424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_ltk_reply(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send stk as LTK response */ 428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_ltk_request_reply(p_cb->pairing_bda, true, p_data->key.p_data); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 430444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_sec_req 433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process security request. 434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_AUTH_REQ auth_req = *(tBTM_LE_AUTH_REQ*)p_data; 437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_REQ_ACT sec_req_act; 438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason; 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s auth_req=0x%x", __func__, auth_req); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = 0; 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act); 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s sec_req_act=0x%x", __func__, sec_req_act); 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (sec_req_act) { 449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_REQ_ACT_ENCRYPT: 450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__); 451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL); 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_REQ_ACT_PAIR: 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->secure_connections_only_mode_required = 456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false; 457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* respond to non SC pairing request as failure in SC only mode */ 459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->secure_connections_only_mode_required && 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (auth_req & SMP_SC_SUPPORT_BIT) == 0) { 461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_PAIR_AUTH_FAIL; 462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* initialize local i/r key to be default keys */ 465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->peer_auth_req = auth_req; 466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY; 467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_SEC_REQUEST_EVT; 468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_REQ_ACT_DISCARD: 472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->discard_sec_req = true; 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do nothing */ 477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 482ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_sec_grant 483ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process security grant. 484ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t res = *(uint8_t*)p_data; 487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != SMP_SUCCESS) { 489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data); 490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /*otherwise, start pairing */ 491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send IO request callback */ 493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_IO_CAP_REQ_EVT; 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_pair_fail 499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing failure from peer device 500ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->status = *(uint8_t*)p_data; 504373d928dbadbf0bbaa2e9b1128fedd48b4da41e8Jacky Cheung 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Cancel pending auth complete timer if set */ 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_cb->delayed_auth_timer_ent); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_pair_cmd 511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Process the SMP pairing request/response from peer device 512ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_cmd(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_ENC_KEY_SIZE; 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda); 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* erase all keys if it is slave proc pairing req*/ 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE)) 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_clear_ble_keys(p_dev_rec); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_io_caps, p); 526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_oob_flag, p); 527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_auth_req, p); 528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_enc_size, p); 529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_i_key, p); 530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_r_key, p); 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_INVALID_PARAMETERS; 534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // PTS Testing failure modes 539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pts_test_send_authentication_complete_failure(p_cb)) return; 540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) { 542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) { 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* peer (master) started pairing sending Pairing Request */ 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key = p_cb->peer_i_key; 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = p_cb->peer_r_key; 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_SEC_REQUEST_EVT; 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* update local i/r key according to pairing request */ 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pairing started with this side (slave) sending Security Request */ 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= p_cb->peer_i_key; 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= p_cb->peer_r_key; 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model = smp_select_association_model(p_cb); 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->secure_connections_only_mode_required && 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_cb->le_secure_connections_mode_is_used) || 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->selected_association_model == 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_MODEL_SEC_CONN_JUSTWORKS))) { 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR( 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s pairing failed - slave requires secure connection only mode", 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_PAIR_AUTH_FAIL; 563444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5660bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) { 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_request_oob_data(p_cb)) return; 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_pair_rsp(p_cb, NULL); 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 572444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Master receives pairing response */ 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model = smp_select_association_model(p_cb); 576444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->secure_connections_only_mode_required && 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_cb->le_secure_connections_mode_is_used) || 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) { 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR( 581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Master requires secure connection only mode \ 582444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji but it can't be provided -> Master fails pairing"); 583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_PAIR_AUTH_FAIL; 584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) { 589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_request_oob_data(p_cb)) return; 590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_decide_association_model(p_cb, NULL); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 595444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_confirm 598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing confirm from peer device 599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_INVALID_PARAMETERS; 603444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 605444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != NULL) { 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save the SConfirm for comparison later */ 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN); 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_init 621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing initializer from peer device 622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_INVALID_PARAMETERS; 626444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 628444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 633444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save the SRand for comparison */ 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 637444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 639ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_rand 640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing random (nonce) from peer device 641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_INVALID_PARAMETERS; 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 652444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save the SRand for comparison */ 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 656444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_pairing_public_key 659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing public key command from the peer device 660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - saves the peer public key; 661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - sets the flag indicating that the peer public key is received; 662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - calls smp_wait_for_both_public_keys(...). 663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_INVALID_PARAMETERS; 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->peer_publ_key.x, p, BT_OCTET32_LEN); 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->peer_publ_key.y, p, BT_OCTET32_LEN); 678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY; 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_wait_for_both_public_keys(p_cb, NULL); 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 684ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_pairing_commitment 685ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing commitment from peer device 686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_INVALID_PARAMETERS; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != NULL) { 701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->remote_commitment, p, BT_OCTET16_LEN); 702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 704444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_dhkey_check 707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process DHKey Check from peer device 708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_INVALID_PARAMETERS; 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != NULL) { 721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->remote_dhkey_check, p, BT_OCTET16_LEN); 722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 723444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK; 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_keypress_notification 729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process pairing keypress notification from peer device 730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_INVALID_PARAMETERS; 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->status = *(uint8_t*)p_data; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != NULL) { 744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_keypress_notification, p); 745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE; 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT; 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 750444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_process_pairing_command 753ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Process the SMP pairing request/response from peer device via 754ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BR/EDR transport. 755ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_pairing_command(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_ENC_KEY_SIZE; 759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda); 760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* rejecting BR pairing request over non-SC BR link */ 763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) { 764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_XTRANS_DERIVE_NOT_ALLOW; 765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); 766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* erase all keys if it is slave proc pairing req*/ 770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE)) 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_clear_ble_keys(p_dev_rec); 772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR; 774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_io_caps, p); 776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_oob_flag, p); 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_auth_req, p); 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_enc_size, p); 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_i_key, p); 780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(p_cb->peer_r_key, p); 781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_command_has_invalid_parameters(p_cb)) { 783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = SMP_INVALID_PARAMETERS; 784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); 785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* peer (master) started pairing sending Pairing Request */ 789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* or being master device always use received i/r key as keys to distribute */ 790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key = p_cb->peer_i_key; 791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = p_cb->peer_r_key; 792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) { 794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->new_encryption_key_is_p256 = false; 795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* shortcut to skip Security Grant step */ 796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT; 797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Master receives pairing response */ 798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG( 800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s master rcvs valid PAIRING RESPONSE." 801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " Supposed to move to key distribution phase. ", 802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* auth_req received via BR/EDR SM channel is set to 0, 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson but everything derived/exchanged has to be saved */ 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->peer_auth_req |= SMP_AUTH_BOND; 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_auth_req |= SMP_AUTH_BOND; 809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 812ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_process_security_grant 813ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process security grant in case of pairing over BR/EDR transport. 814ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_security_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t res = *(uint8_t*)p_data; 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != SMP_SUCCESS) { 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data); 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /*otherwise, start pairing */ 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send IO request callback */ 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT; 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 827444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 828ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_check_authorization_request 829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description sets the SMP kes to be derived/distribute over BR/EDR transport 830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * before starting the distribution/derivation 831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_SUCCESS; 834444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG( 836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s rcvs i_keys=0x%x r_keys=0x%x " 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "(i-initiator r-responder)", 838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_cb->local_i_key, p_cb->local_r_key); 839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* In LE SC mode LK field is ignored when BR/EDR transport is used */ 841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; 842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; 843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer. 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** Set local_r_key on master to expect only these keys. */ 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_MASTER) { 847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK); 848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 850e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski /* Check if H7 function needs to be used for key derivation*/ 851e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski if ((p_cb->loc_auth_req & SMP_H7_SUPPORT_BIT) && 852e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski (p_cb->peer_auth_req & SMP_H7_SUPPORT_BIT)) { 853e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski p_cb->key_derivation_h7_used = TRUE; 854e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski } 855e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski SMP_TRACE_DEBUG("%s: use h7 = %d", __func__, p_cb->key_derivation_h7_used); 856e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG( 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x " 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "(i-initiator r-responder)", 860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_cb->local_i_key, p_cb->local_r_key); 861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) || 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/ 864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->local_i_key || p_cb->local_r_key)) { 865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL); 866444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if no peer key is expected, start master key distribution */ 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0) 869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution_by_transport(p_cb, NULL); 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 873444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 876ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_select_next_key 877ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description selects the next key to derive/send when BR/EDR transport is 878ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * used. 879ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_SUCCESS; 882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__, 883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->role, p_cb->local_r_key, p_cb->local_i_key); 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE || 886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) { 887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_pick_key(p_cb, p_data); 888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_cb->local_i_key && !p_cb->local_r_key) { 891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* state check to prevent re-entrance */ 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) { 893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->total_tx_unacked == 0) 894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); 895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->wait_for_authorization_complete = true; 897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 902ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_enc_info 903ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process encryption information from peer device 904ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 9075cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN); 910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution(p_cb, NULL); 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_master_id 915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process master ID from slave device 916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_master_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_PENC_KEYS le_key; 920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true); 923444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(le_key.ediv, p); 925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(le_key.rand, p, BT_OCTET8_LEN); 926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* store the encryption keys from peer device */ 928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN); 929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_key.sec_level = p_cb->sec_level; 930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_key.key_size = p_cb->loc_enc_size; 9315cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && 933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->loc_auth_req & SMP_AUTH_BOND)) 934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC, 935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_KEY_VALUE*)&le_key, true); 936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution(p_cb, NULL); 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_enc_info 942ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process identity information from peer device 943ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 9465cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY(p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */ 949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution_by_transport(p_cb, NULL); 950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 953ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_id_addr 954ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process identity address from peer device 955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)p_data; 958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_PID_KEYS pid_key; 959444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true); 962444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(pid_key.addr_type, p); 964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_BDADDR(pid_key.static_addr, p); 965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN); 966444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* to use as BD_ADDR for lk derived from ltk */ 968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->id_addr_rcvd = true; 969911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->id_addr_type = pid_key.addr_type; 970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->id_addr, pid_key.static_addr, BD_ADDR_LEN); 971e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* store the ID key from peer device */ 973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && 974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->loc_auth_req & SMP_AUTH_BOND)) 975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID, 976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_KEY_VALUE*)&pid_key, true); 977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution_by_transport(p_cb, NULL); 978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_srk_info 982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process security information from peer device 983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_PCSRK_KEYS le_key; 986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true); 989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save CSRK to security record */ 991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_key.sec_level = p_cb->sec_level; 9925a6b32562ab6a1bbca945e478d01e371bb49c40fPulkit Bhuwalka maybe_non_aligned_memcpy(le_key.csrk, p_data, 9935a6b32562ab6a1bbca945e478d01e371bb49c40fPulkit Bhuwalka BT_OCTET16_LEN); /* get peer CSRK */ 994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson le_key.counter = 0; /* initialize the peer counter */ 995444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->peer_auth_req & SMP_AUTH_BOND) && 997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->loc_auth_req & SMP_AUTH_BOND)) 998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PCSRK, 999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_KEY_VALUE*)&le_key, true); 1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution_by_transport(p_cb, NULL); 1001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1004ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_compare 1005ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process compare value 1006ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_compare(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason; 1009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) { 1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* compare the max encryption key size, and save the smaller one for the 1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * link */ 1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->peer_enc_size < p_cb->loc_enc_size) 1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_enc_size = p_cb->peer_enc_size; 1016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) 1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_RAND_EVT, NULL); 1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* master device always use received i/r key as keys to distribute */ 1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key = p_cb->peer_i_key; 1022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = p_cb->peer_r_key; 1023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL); 1025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; 1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1034ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_sl_key 1035ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process key ready events. 1036ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sl_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t key_type = p_data->key.key_type; 1039444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (key_type == SMP_KEY_TYPE_TK) { 1042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_generate_srand_mrand_confirm(p_cb, NULL); 1043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (key_type == SMP_KEY_TYPE_CFM) { 1044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_WAIT_CONFIRM); 1045444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM) 1047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL); 1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1052ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_start_enc 1053ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description start encryption 1054ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_enc(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS cmd; 1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_ENC_FAIL; 1058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data != NULL) 1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = btm_ble_start_encrypt(p_cb->pairing_bda, true, p_data->key.p_data); 1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = btm_ble_start_encrypt(p_cb->pairing_bda, false, NULL); 1064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) 1066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1070ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_discard 1071ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description processing for discard security request 1072ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_discard(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) 1076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_reset_control_value(p_cb); 1077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1080ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_enc_cmpl 1081ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description encryption success 1082ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_enc_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t enc_enable = *(uint8_t*)p_data; 1085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL; 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1092ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_check_auth_req 1093ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description check authentication request 1094ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_check_auth_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t enc_enable = *(uint8_t*)p_data; 1097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL; 1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG( 1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x " 1101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "(i-initiator r-responder)", 1102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key); 1103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (enc_enable == 1) { 1104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->le_secure_connections_mode_is_used) { 1105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* In LE SC mode LTK is used instead of STK and has to be always saved */ 1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC; 1107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC; 1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* In LE SC mode LK is derived from LTK only if both sides request it */ 1110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) || 1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) { 1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; 1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; 1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer. 1117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** Set local_r_key on master to expect only these keys. 1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_MASTER) { 1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK); 1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* in legacy mode derivation of BR/EDR LK is not supported */ 1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; 1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; 1126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG( 1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x " 1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "(i-initiator r-responder)", 1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_cb->local_i_key, p_cb->local_r_key); 1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) || 1133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/ 1134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->local_i_key || p_cb->local_r_key)) { 1135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL); 1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (enc_enable == 0) { 1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if failed for encryption after pairing, send callback */ 1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR) 1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if enc failed for old security information */ 1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if master device, clean up and abck to idle; slave device do nothing */ 1144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (p_cb->role == HCI_ROLE_MASTER) { 1145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_key_pick_key 1152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Pick a key distribution function based on the key mask. 1153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_pick_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t key_to_dist = 1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->local_r_key : p_cb->local_i_key; 1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t i = 0; 1158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s key_to_dist=0x%x", __func__, key_to_dist); 1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while (i < SMP_KEY_DIST_TYPE_MAX) { 1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("key to send = %02x, i = %d", key_to_dist, i); 1162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (key_to_dist & (1 << i)) { 1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("smp_distribute_act[%d]", i); 1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*smp_distribute_act[i])(p_cb, p_data); 1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson i++; 1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_key_distribution 1173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description start key distribution if required. 1174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__, 1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->role, p_cb->local_r_key, p_cb->local_i_key); 1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE || 1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) { 1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_pick_key(p_cb, p_data); 1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_cb->local_i_key && !p_cb->local_r_key) { 1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* state check to prevent re-entrant */ 1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_get_state() == SMP_STATE_BOND_PENDING) { 1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->derive_lk) { 1188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_derive_link_key_from_long_term_key(p_cb, NULL); 1189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->derive_lk = false; 1190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->total_tx_unacked == 0) { 1193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Instead of declaring authorization complete immediately, 1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * delay the event from being sent by SMP_DELAYED_AUTH_TIMEOUT_MS. 1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * This allows the slave to send over Pairing Failed if the 1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * last key is rejected. During this waiting window, the 1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * state should remain in SMP_STATE_BOND_PENDING. 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!alarm_is_scheduled(p_cb->delayed_auth_timer_ent)) { 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s delaying auth complete.", __func__); 1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_set_on_queue( 1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->delayed_auth_timer_ent, SMP_DELAYED_AUTH_TIMEOUT_MS, 1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_delayed_auth_complete_timeout, NULL, btu_general_alarm_queue); 1205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->wait_for_authorization_complete = true; 1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1209444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_decide_association_model 1215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to select assoc model to be used for 1216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * STK generation and to start STK generation process. 1217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t failure = SMP_UNKNOWN_IO_CAP; 1221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t int_evt = 0; 1222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_KEY key; 1223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_INT_DATA* p = NULL; 1224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s Association Model = %d", __func__, 1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model); 1227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->selected_association_model) { 1229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */ 1230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_MASTER && 1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) && 1232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) { 1233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR( 1234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "IO capability does not meet authentication requirement"); 1235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson failure = SMP_PAIR_AUTH_FAIL; 1236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (tSMP_INT_DATA*)&failure; 1237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int_evt = SMP_AUTH_CMPL_EVT; 1238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level = SMP_SEC_UNAUTHENTICATE; 1240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", 1241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level); 1242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key.key_type = SMP_KEY_TYPE_TK; 1244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key.p_data = p_cb->tk; 1245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (tSMP_INT_DATA*)&key; 1246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_cb->tk, 0, BT_OCTET16_LEN); 1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* TK, ready */ 1249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int_evt = SMP_KEY_READY_EVT; 1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_PASSKEY: 1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level = SMP_SEC_AUTHENTICATED; 1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", 1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level); 1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_PASSKEY_REQ_EVT; 1259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int_evt = SMP_TK_REQ_EVT; 1260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_OOB: 1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB"); 1264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level = SMP_SEC_AUTHENTICATED; 1265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", 1266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level); 1267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_OOB_REQ_EVT; 1269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int_evt = SMP_TK_REQ_EVT; 1270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_KEY_NOTIF: 1273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level = SMP_SEC_AUTHENTICATED; 1274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("Need to generate Passkey"); 1275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* generate passkey and notify application */ 1277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_generate_passkey(p_cb, NULL); 1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_JUSTWORKS: 1281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_NUM_COMP: 1282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_OOB: 1285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT; 1286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_OUT_OF_RANGE: 1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)"); 1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (tSMP_INT_DATA*)&failure; 1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int_evt = SMP_AUTH_CMPL_EVT; 1292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR( 1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Association Model = %d (SOMETHING IS WRONG WITH THE CODE)", 1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model); 1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (tSMP_INT_DATA*)&failure; 1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int_evt = SMP_AUTH_CMPL_EVT; 1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("sec_level=%d ", p_cb->sec_level); 1303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (int_evt) smp_sm_event(p_cb, int_evt, p); 1304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_io_response 1308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process IO response for a slave device. 1309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_io_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_PAIR_AUTH_FAIL; 1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) { 1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pairing started by local (slave) Security Request */ 1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_SEC_REQ_PENDING); 1317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb); 1318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* plan to send pairing respond */ 1319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pairing started by peer (master) Pairing Request */ 1321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model = smp_select_association_model(p_cb); 1322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->secure_connections_only_mode_required && 1324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_cb->le_secure_connections_mode_is_used) || 1325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) { 1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR( 1327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Slave requires secure connection only mode \ 1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji but it can't be provided -> Slave fails pairing"); 1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) { 1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_request_oob_data(p_cb)) return; 1335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13360bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // PTS Testing failure modes 1338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pts_test_send_authentication_complete_failure(p_cb)) return; 13390bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 1340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_pair_rsp(p_cb, NULL); 1341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_process_slave_keys_response 1346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description process application keys response for a slave device 1347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (BR/EDR transport). 1348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_slave_keys_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_send_pair_response(p_cb, NULL); 1351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1353444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_send_pair_response 13559ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description actions related to sending pairing response over BR/EDR 13569ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * transport. 1357ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_send_pair_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key &= p_cb->peer_i_key; 1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key &= p_cb->peer_r_key; 1363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb); 1365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_pairing_cmpl 13699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to send the pairing complete 13709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * callback and remove the connection if needed. 1371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pairing_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->total_tx_unacked == 0) { 1374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* process the pairing complete */ 1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_proc_pairing_cmpl(p_cb); 1376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_pair_terminate 13819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to send the pairing complete 13829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * callback and remove the connection if needed. 1383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pair_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->status = SMP_CONN_TOUT; 1387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_proc_pairing_cmpl(p_cb); 1388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_idle_terminate 13929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function calledin idle state to determine to send 13939ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * authentication complete or not. 1394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_idle_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) { 1397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("Pairing terminated at IDLE state."); 1398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->status = SMP_FAIL; 1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_proc_pairing_cmpl(p_cb); 1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1403444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_fast_conn_param 1405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description apply default connection parameter for pairing process 1406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_fast_conn_param(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Disable L2CAP connection parameter updates while bonding since 1409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson some peripherals are not able to revert to fast connection parameters 1410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson during the start of service discovery. Connection paramter updates 1411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson get enabled again once service discovery completes. */ 1412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, false); 1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_both_have_public_keys 1417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description The function is called when both local and peer public keys are 1418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * saved. 1419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Actions: 1420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - invokes DHKey computation; 1421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - on slave side invokes sending local public key to the peer. 1422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - invokes SC phase 1 process. 1423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_both_have_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1426444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* invokes DHKey computation */ 1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_compute_dhkey(p_cb); 1429444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* on slave side invokes sending local public key to the peer */ 1431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) smp_send_pair_public_key(p_cb, NULL); 1432444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL); 1434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_start_secure_connection_phase1 14389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Start Secure Connection phase1 i.e. invokes initialization of 14399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Secure Connection phase 1 parameters and starts building/sending 14409ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * to the peer messages appropriate for the role and association 14419ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * model. 1442ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_secure_connection_phase1(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) { 1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level = SMP_SEC_UNAUTHENTICATE; 1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", 1449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level); 1450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level = SMP_SEC_AUTHENTICATED; 1452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", 1453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sec_level); 1454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->selected_association_model) { 1457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_JUSTWORKS: 1458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_NUM_COMP: 1459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_cb->local_random, 0, BT_OCTET16_LEN); 1460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_start_nonce_generation(p_cb); 1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* user has to provide passkey */ 1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_PASSKEY_REQ_EVT; 1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL); 1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* passkey has to be provided to user */ 1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("Need to generate SC Passkey"); 1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_generate_passkey(p_cb, NULL); 1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_OOB: 1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* use the available OOB information */ 1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_process_secure_connection_oob_data(p_cb, NULL); 1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("Association Model = %d is not used in LE SC", 1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model); 1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1484ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_local_nonce 1485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description The function processes new local nonce. 1486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note It is supposed to be called in SC phase1. 1488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_local_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->selected_association_model) { 1493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_JUSTWORKS: 1494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_NUM_COMP: 1495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) { 1496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* slave calculates and sends local commitment */ 1497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_calculate_local_commitment(p_cb); 1498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_commitment(p_cb, NULL); 1499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* slave has to wait for peer nonce */ 1500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_WAIT_NONCE); 1501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* i.e. master */ 1502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) { 1504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* slave commitment is already received, send local nonce, wait for 1505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * remote nonce*/ 1506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG( 1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "master in assoc mode = %d \ 1508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji already rcvd slave commitment - race condition", 1509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model); 1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM; 1511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_rand(p_cb, NULL); 1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_WAIT_NONCE); 1513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_calculate_local_commitment(p_cb); 1519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_MASTER) { 1521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_commitment(p_cb, NULL); 1522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* slave */ 1523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) { 1525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* master commitment is already received */ 1526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_commitment(p_cb, NULL); 1527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_WAIT_NONCE); 1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_OOB: 1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_MASTER) { 1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_rand(p_cb, NULL); 1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_WAIT_NONCE); 1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("Association Model = %d is not used in LE SC", 1540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model); 1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1544444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1546ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_peer_nonce 15479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description The function processes newly received and saved in CB peer 15489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * nonce. The actions depend on the selected association model and 15499ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the role. 1550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note It is supposed to be called in SC phase1. 1552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason; 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s start ", __func__); 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // PTS Testing failure modes 1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->cert_failure == 1) { 1560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure); 1561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; 1562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->selected_association_model) { 1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_JUSTWORKS: 1568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_NUM_COMP: 1569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* in these models only master receives commitment */ 1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_MASTER) { 1571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!smp_check_commitment(p_cb)) { 1572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; 1573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* slave sends local nonce */ 1578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_rand(p_cb, NULL); 1579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) { 1582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* go directly to phase 2 */ 1583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); 1584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* numeric comparison */ 1585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_WAIT_NONCE); 1587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL); 1588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!smp_check_commitment(p_cb) && p_cb->cert_failure != 9) { 15930bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; 15940bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15970bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) { 1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_rand(p_cb, NULL); 1600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (++p_cb->round < 20) { 1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_SEC_CONN_PHS1_START); 1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM; 1605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_start_nonce_generation(p_cb); 1606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); 1610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_MODEL_SEC_CONN_OOB: 1612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) { 1613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_rand(p_cb, NULL); 1614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); 1617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("Association Model = %d is not used in LE SC", 1620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model); 1621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s end ", __func__); 1625444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1627444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_match_dhkey_checks 1629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description checks if the calculated peer DHKey Check value is the same as 1630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * received from the peer DHKey check value. 1631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_match_dhkey_checks(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_DHKEY_CHK_FAIL; 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) { 1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("dhkey chcks do no match"); 1639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->failure = reason; 1640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("dhkey chcks match"); 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* compare the max encryption key size, and save the smaller one for the link 1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->peer_enc_size < p_cb->loc_enc_size) 1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->loc_enc_size = p_cb->peer_enc_size; 1650444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->role == HCI_ROLE_SLAVE) { 1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL); 1653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* master device always use received i/r key as keys to distribute */ 1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_i_key = p_cb->peer_i_key; 1656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_r_key = p_cb->peer_r_key; 1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL); 1658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1659444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1661444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_move_to_secure_connections_phase2 1663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Signal State Machine to start SC phase 2 initialization (to 1664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * compute local DHKey Check value). 1665ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note SM is supposed to be in the state SMP_STATE_SEC_CONN_PHS2_START. 1667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_move_to_secure_connections_phase2(tSMP_CB* p_cb, 1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_INT_DATA* p_data) { 1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1675ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_phase_2_dhkey_checks_are_present 16769ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description generates event if dhkey check from the peer is already 16779ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * received. 1678ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1679ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note It is supposed to be used on slave to prevent race condition. 16809ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * It is supposed to be called after slave dhkey check is 16819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * calculated. 1682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_phase_2_dhkey_checks_are_present(tSMP_CB* p_cb, 1684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_INT_DATA* p_data) { 1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 16865cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK) 1688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL); 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1690444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_wait_for_both_public_keys 16939ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description generates SMP_BOTH_PUBL_KEYS_RCVD_EVT event when both local and 16949ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * master public keys are available. 1695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1696ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note on the slave it is used to prevent race condition. 1697ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_wait_for_both_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) && 1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) { 1704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->role == HCI_ROLE_SLAVE) && 1705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_cb->req_oob_type == SMP_OOB_LOCAL) || 1706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cb->req_oob_type == SMP_OOB_BOTH))) { 1707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_set_state(SMP_STATE_PUBLIC_KEY_EXCH); 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL); 1710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1712444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_start_passkey_verification 1715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Starts SC passkey entry verification. 1716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_passkey_verification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = NULL; 17195cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_cb->local_random; 1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_STREAM(p, p_data->passkey); 1723ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = p_cb->peer_random; 1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_STREAM(p, p_data->passkey); 17266975b4d711142b885af479721cada448952c6b41Andre Eisenbach 1727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->round = 0; 1728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_start_nonce_generation(p_cb); 17296975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 17306975b4d711142b885af479721cada448952c6b41Andre Eisenbach 17316975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************* 1732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_secure_connection_oob_data 1733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Processes local/peer SC OOB data received from somewhere. 1734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_oob_data(tSMP_CB* p_cb, 1736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_INT_DATA* p_data) { 1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 17386975b4d711142b885af479721cada448952c6b41Andre Eisenbach 1739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_SC_OOB_DATA* p_sc_oob_data = &p_cb->sc_oob_data; 1740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_sc_oob_data->loc_oob_data.present) { 1741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->local_random, p_sc_oob_data->loc_oob_data.randomizer, 1742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(p_cb->local_random)); 1743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s: local OOB randomizer is absent", __func__); 1745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_cb->local_random, 0, sizeof(p_cb->local_random)); 1746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1747444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_sc_oob_data->peer_oob_data.present) { 1749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s: peer OOB data is absent", __func__); 1750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_cb->peer_random, 0, sizeof(p_cb->peer_random)); 1751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->peer_random, p_sc_oob_data->peer_oob_data.randomizer, 1753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(p_cb->peer_random)); 1754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment, 1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(p_cb->remote_commitment)); 1756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t reason = SMP_CONFIRM_VALUE_ERR; 1758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* check commitment */ 1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!smp_check_commitment(p_cb)) { 1760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->failure = reason; 1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1763444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 17646975b4d711142b885af479721cada448952c6b41Andre Eisenbach 1765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) { 1766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the peer doesn't have local randomiser */ 1767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT( 1768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: peer didn't receive local OOB data, set local randomizer to 0", 1769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_cb->local_random, 0, sizeof(p_cb->local_random)); 1771444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson print128(p_cb->local_random, (const uint8_t*)"local OOB randomizer"); 1775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson print128(p_cb->peer_random, (const uint8_t*)"peer OOB randomizer"); 1776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_start_nonce_generation(p_cb); 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1778444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1780ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_set_local_oob_keys 17819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Saves calculated private/public keys in 17829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sc_oob_data.loc_oob_data, starts nonce generation 1783ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (to be saved in sc_oob_data.loc_oob_data.randomizer). 1784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1787444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->sc_oob_data.loc_oob_data.private_key_used, p_cb->private_key, 1789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET32_LEN); 1790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sc_oob_data.loc_oob_data.publ_key_used = p_cb->loc_publ_key; 1791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_start_nonce_generation(p_cb); 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 17948fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/******************************************************************************* 1795ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_set_local_oob_random_commitment 17969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Saves calculated randomizer and commitment in 17979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sc_oob_data.loc_oob_data, passes sc_oob_data.loc_oob_data up 17989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * for safekeeping. 1799ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_random_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->sc_oob_data.loc_oob_data.randomizer, p_cb->rand, BT_OCTET16_LEN); 1803444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_calculate_f4(p_cb->sc_oob_data.loc_oob_data.publ_key_used.x, 1805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sc_oob_data.loc_oob_data.publ_key_used.x, 1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sc_oob_data.loc_oob_data.randomizer, 0, 1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sc_oob_data.loc_oob_data.commitment); 1808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1809d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SMP_DEBUG == TRUE) 1810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_print = NULL; 1811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("local SC OOB data set:"); 1812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.addr_sent_to; 1813648d513fd66d28a10dab4def62ca2d27187ccc34Jack He smp_debug_print_nbyte_little_endian(p_print, "addr_sent_to", 1814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(tBLE_BD_ADDR)); 1815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.private_key_used; 1816648d513fd66d28a10dab4def62ca2d27187ccc34Jack He smp_debug_print_nbyte_little_endian(p_print, "private_key_used", 1817648d513fd66d28a10dab4def62ca2d27187ccc34Jack He BT_OCTET32_LEN); 1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.x; 1819648d513fd66d28a10dab4def62ca2d27187ccc34Jack He smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.x", 1820648d513fd66d28a10dab4def62ca2d27187ccc34Jack He BT_OCTET32_LEN); 1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.y; 1822648d513fd66d28a10dab4def62ca2d27187ccc34Jack He smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.y", 1823648d513fd66d28a10dab4def62ca2d27187ccc34Jack He BT_OCTET32_LEN); 1824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.randomizer; 1825648d513fd66d28a10dab4def62ca2d27187ccc34Jack He smp_debug_print_nbyte_little_endian(p_print, "randomizer", BT_OCTET16_LEN); 1826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.commitment; 1827648d513fd66d28a10dab4def62ca2d27187ccc34Jack He smp_debug_print_nbyte_little_endian(p_print, "commitment", BT_OCTET16_LEN); 1828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG(""); 1829444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 18308fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 1831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pass created OOB data up */ 1832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt = SMP_SC_LOC_OOB_DATA_UP_EVT; 1833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_send_app_cback(p_cb, NULL); 1834444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb_cleanup(p_cb); 1836444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 18378fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1839ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1840ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_link_encrypted 1841ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 18429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called when link is encrypted and notified 18439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * to the slave device. Proceed to to send LTK, DIV and ER to 18449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * master if bonding the devices. 1845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_link_encrypted(BD_ADDR bda, uint8_t encr_enable) { 1851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s encr_enable=%d", __func__, encr_enable); 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (memcmp(&smp_cb.pairing_bda[0], bda, BD_ADDR_LEN) == 0) { 1856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* encryption completed with STK, remmeber the key size now, could be 1857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * overwite 1858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * when key exchange happens */ 1859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->loc_enc_size != 0 && encr_enable) { 1860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update the link encryption key size if a SMP pairing just performed */ 1861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size); 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &encr_enable); 1865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1869ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1870ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_proc_ltk_request 1871ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1872ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when LTK request is received from 1873ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * controller. 1874ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1875ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1876ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1877ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool smp_proc_ltk_request(BD_ADDR bda) { 1879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s state = %d", __func__, smp_cb.state); 1880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool match = false; 18811da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora 1882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!memcmp(bda, smp_cb.pairing_bda, BD_ADDR_LEN)) { 1883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson match = true; 1884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BD_ADDR dummy_bda = {0}; 1886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda); 1887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL && 1888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0 == memcmp(p_dev_rec->ble.pseudo_addr, smp_cb.pairing_bda, 1889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BD_ADDR_LEN) && 1890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0 != memcmp(p_dev_rec->ble.pseudo_addr, dummy_bda, BD_ADDR_LEN)) { 1891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson match = true; 18921da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora } 1893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) { 1896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL); 1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 1898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1904ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1905ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_process_secure_connection_long_term_key 1906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to process SC LTK. 1908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SC LTK is calculated and used instead of STK. 1909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Here SC LTK is saved in BLE DB. 1910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_long_term_key(void) { 1915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 1916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_save_secure_connections_long_term_key(p_cb); 1919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false); 1921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution(p_cb, NULL); 1922444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1923444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1924444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1925ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1926ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_set_derive_link_key 1927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set flag that indicates that 1929ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BR/EDR LK has to be derived from LTK after all keys are 1930ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * distributed. 1931ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1932ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1933ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1934ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_derive_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->derive_lk = true; 1938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_LK, false); 1939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution(p_cb, NULL); 1940e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun} 1941e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 1942e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun/******************************************************************************* 1943ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1944ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_derive_link_key_from_long_term_key 1945ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to derive BR/EDR LK from LTK. 1947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1950ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_derive_link_key_from_long_term_key(tSMP_CB* p_cb, 1952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_INT_DATA* p_data) { 1953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 1954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!smp_calculate_link_key_from_long_term_key(p_cb)) { 1957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s failed", __func__); 1958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 1959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1961444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1962444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1963444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1964ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_process_link_key 1966ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to process BR/EDR LK: 1968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - to derive SMP LTK from BR/EDR LK; 1969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*8 - to save SMP LTK. 1970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 1976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!smp_calculate_long_term_key_from_link_key(p_cb)) { 1979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s failed", __func__); 1980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status); 1981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s: LTK derivation from LK successfully completed", 1985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_save_secure_connections_long_term_key(p_cb); 1987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false); 1988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_select_next_key(p_cb, NULL); 1989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_key_distribution_by_transport 1993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description depending on the transport used at the moment calls either 1994ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * smp_key_distribution(...) or smp_br_key_distribution(...). 1995ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 1997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 1998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->smp_over_br) { 1999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_select_next_key(p_cb, NULL); 2000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_key_distribution(p_cb, NULL); 2002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2006ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function smp_br_pairing_complete 20079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to send the pairing complete 20089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * callback and remove the connection if needed. 2009ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { 2011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("%s", __func__); 2012d0aa8e53aa7ac1137a47570e08c2b963aaa49141Satya Calloji 2013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->total_tx_unacked == 0) { 2014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* process the pairing complete */ 2015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_proc_pairing_cmpl(p_cb); 2016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2018