15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2008-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the implementation of the SMP interface used by 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * applications that can run over an SMP. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 2578b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski#include <base/logging.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 295cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 300bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora#include "stack_config.h" 310bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora 322e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson#include "btm_int.h" 332e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson#include "hcimsgs.h" 34911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "l2c_int.h" 35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "l2cdefs.h" 36911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "smp_api.h" 37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "smp_int.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 392e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson#include "btu.h" 402e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson#include "p_256_ecc_pp.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 44ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_Init 45ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 46ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initializes the SMP unit. 47ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 48ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 49ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 50ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid SMP_Init(void) { 52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&smp_cb, 0, sizeof(tSMP_CB)); 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.smp_rsp_timer_ent = alarm_new("smp.smp_rsp_timer_ent"); 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.delayed_auth_timer_ent = alarm_new("smp.delayed_auth_timer_ent"); 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(SMP_INITIAL_TRACE_LEVEL) 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.trace_level = SMP_INITIAL_TRACE_LEVEL; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s", __func__); 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_l2cap_if_init(); 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* initialization of P-256 parameters */ 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_256_init_curve(KEY_LENGTH_DWORDS_P256); 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initialize failure case for certification */ 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.cert_failure = 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson stack_config_get_interface()->get_pts_smp_failure_case(); 70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_cb.cert_failure) 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s PTS FAILURE MODE IN EFFECT (CASE %d)", __func__, 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.cert_failure); 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_SetTraceLevel 78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function sets the trace level for SMP. If called with 80ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a value of 0xFF, it simply returns the current trace level. 81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 82ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Input Parameters: 83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * level: The level to set the GATT tracing to: 84ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 0xff-returns the current setting. 85ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 0-turns off tracing. 86ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 1-Errors. 87ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 2-Warnings. 88ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 3-APIs. 89ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 4-Events. 90ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 5-Debug. 91ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 92ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns The new or current trace level 93ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 94ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern uint8_t SMP_SetTraceLevel(uint8_t new_level) { 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (new_level != 0xFF) smp_cb.trace_level = new_level; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (smp_cb.trace_level); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_Register 104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function register for the SMP services callback. 106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SMP_Register(tSMP_CALLBACK* p_cback) { 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("SMP_Register state=%d", smp_cb.state); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_cb.p_callback != NULL) { 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("SMP_Register: duplicate registration, overwrite it"); 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.p_callback = p_cback; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_Pair 124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1259ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function call to perform a SMP pairing with peer 1269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * device. Device support one SMP pairing at one time. 127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters bd_addr - peer device bd address. 129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1339e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitSMP_STATUS SMP_Pair(const RawAddress& bd_addr) { 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t status = SMP_PAIR_INTERNAL_ERR; 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s state=%d br_state=%d flag=0x%x ", __func__, p_cb->state, 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->br_state, p_cb->flags); 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->state != SMP_STATE_IDLE || 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD || p_cb->smp_over_br) { 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pending security on going, reject this one */ 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return SMP_BUSY; 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD; 145c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_cb->pairing_bda = bd_addr; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!L2CA_ConnectFixedChnl(L2CAP_SMP_CID, bd_addr)) { 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s: L2C connect fixed channel failed.", __func__); 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return SMP_STARTED; 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_BR_PairWith 160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start a SMP pairing over BR/EDR. 162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Device support one SMP pairing at one time. 163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters bd_addr - peer device bd address. 165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns SMP_STARTED if pairing started, otherwise the reason for 1679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * failure. 168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1709e030fde05352ec4385d7baf6cc2af89e95e039cJakub PawlowskitSMP_STATUS SMP_BR_PairWith(const RawAddress& bd_addr) { 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t status = SMP_PAIR_INTERNAL_ERR; 173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s state=%d br_state=%d flag=0x%x ", __func__, p_cb->state, 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->br_state, p_cb->flags); 176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->state != SMP_STATE_IDLE || p_cb->smp_over_br || 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) { 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pending security on going, reject this one */ 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return SMP_BUSY; 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->role = HCI_ROLE_MASTER; 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD; 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->smp_over_br = true; 186c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_cb->pairing_bda = bd_addr; 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!L2CA_ConnectFixedChnl(L2CAP_SMP_BR_CID, bd_addr)) { 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s: L2C connect fixed channel failed.", __func__); 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status); 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return SMP_STARTED; 195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_PairCancel 200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function call to cancel a SMP pairing with peer device. 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters bd_addr - peer device bd address. 204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true - Pairining is cancelled 206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2089e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool SMP_PairCancel(const RawAddress& bd_addr) { 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = SMP_PAIR_FAIL_UNKNOWN; 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool status = false; 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // PTS SMP failure test cases 214fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa if (p_cb->cert_failure == SMP_PASSKEY_ENTRY_FAIL || 215fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa p_cb->cert_failure == SMP_NUMERIC_COMPAR_FAIL) 216fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa err_code = p_cb->cert_failure; 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->flags); 220c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (p_cb->state != SMP_STATE_IDLE && p_cb->pairing_bda == bd_addr) { 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->is_pair_cancel = true; 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_DEBUG("Cancel Pairing: set fail reason Unknown"); 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code); 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = true; 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_SecurityGrant 232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to grant security process. 234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters bd_addr - peer device bd address. 236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - result of the operation SMP_SUCCESS if success. 2379ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Otherwise, SMP_REPEATED_ATTEMPTS if too many 2389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * attempts. 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2439e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid SMP_SecurityGrant(const RawAddress& bd_addr, uint8_t res) { 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("SMP_SecurityGrant "); 245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_cb.smp_over_br) { 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_cb.br_state != SMP_BR_STATE_WAIT_APP_RSP || 248c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || smp_cb.pairing_bda != bd_addr) { 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 252503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu /* clear the SMP_SEC_REQUEST_EVT event after get grant */ 253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* avoid generating duplicate pair request */ 254503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu smp_cb.cb_evt = 0; 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_br_state_machine_event(&smp_cb, SMP_BR_API_SEC_GRANT_EVT, &res); 256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (smp_cb.state != SMP_STATE_WAIT_APP_RSP || 260c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || smp_cb.pairing_bda != bd_addr) 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear the SMP_SEC_REQUEST_EVT event after get grant */ 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* avoid generate duplicate pair request */ 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_cb.cb_evt = 0; 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &res); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_PasskeyReply 271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called after Security Manager submitted 273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * passkey request to the application. 274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2759ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: bd_addr - Address of the device for which passkey was 2769ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * requested 2779ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * res - result of the operation SMP_SUCCESS if success 278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * passkey - numeric value in the range of 2799ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_MIN_PASSKEY_VAL(0) - 2809ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2839e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid SMP_PasskeyReply(const RawAddress& bd_addr, uint8_t res, 284c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint32_t passkey) { 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t failure = SMP_PASSKEY_ENTRY_FAIL; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("SMP_PasskeyReply: Key: %d Result:%d", passkey, res); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If timeout already expired or has been canceled, ignore the reply */ 291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT) { 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("SMP_PasskeyReply() - Wrong State: %d", p_cb->state); 293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 296c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (bd_addr != p_cb->pairing_bda) { 297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("SMP_PasskeyReply() - Wrong BD Addr"); 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_find_dev(bd_addr) == NULL) { 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("SMP_PasskeyReply() - no dev CB"); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS) { 307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING( 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson passkey); 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send pairing failure */ 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_cb->selected_association_model == 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_MODEL_SEC_CONN_PASSKEY_ENT) { 315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(&smp_cb, SMP_SC_KEY_READY_EVT, &passkey); 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_convert_string_to_tk(p_cb->tk, passkey); 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_ConfirmReply 326ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 327ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called after Security Manager submitted 328ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * numeric comparison request to the application. 329ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 330ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device with which numeric 331ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * comparison was requested 332ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - comparison result SMP_SUCCESS if success 333ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 334ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3359e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid SMP_ConfirmReply(const RawAddress& bd_addr, uint8_t res) { 336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t failure = SMP_NUMERIC_COMPAR_FAIL; 338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s: Result:%d", __func__, res); 340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If timeout already expired or has been canceled, ignore the reply */ 342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->cb_evt != SMP_NC_REQ_EVT) { 343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("%s() - Wrong State: %d", __func__, p_cb->state); 344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 347c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (bd_addr != p_cb->pairing_bda) { 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s() - Wrong BD Addr", __func__); 349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_find_dev(bd_addr) == NULL) { 353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s() - no dev CB", __func__); 354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != SMP_SUCCESS) { 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING("%s() - Numeric Comparison fails", __func__); 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send pairing failure */ 360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_SC_NC_OK_EVT, NULL); 363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 367ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_OobDataReply 369ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the OOB data for 371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SMP in response to SMP_OOB_REQ_EVT 372ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - result of the operation SMP_SUCCESS if success 375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_data - simple pairing Randomizer C. 376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3789e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid SMP_OobDataReply(const RawAddress& bd_addr, tSMP_STATUS res, uint8_t len, 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_data) { 380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t failure = SMP_OOB_FAIL; 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_KEY key; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s State: %d res:%d", __func__, smp_cb.state, res); 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If timeout already expired or has been canceled, ignore the reply */ 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->state != SMP_STATE_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT) 388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != SMP_SUCCESS || len == 0 || !p_data) { 391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len > BT_OCTET16_LEN) len = BT_OCTET16_LEN; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->tk, p_data, len); 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key.key_type = SMP_KEY_TYPE_TK; 398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key.p_data = p_cb->tk; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key); 401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_SecureConnectionOobDataReply 407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the SC OOB data for 409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SMP in response to SMP_SC_OOB_REQ_EVT 410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: p_data - pointer to the data 412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid SMP_SecureConnectionOobDataReply(uint8_t* p_data) { 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t failure = SMP_OOB_FAIL; 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_SC_OOB_DATA* p_oob = (tSMP_SC_OOB_DATA*)p_data; 419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_oob) { 420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s received no data", __func__); 421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT( 426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s req_oob_type: %d, loc_oob_data.present: %d, " 427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "peer_oob_data.present: %d", 428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p_cb->req_oob_type, p_oob->loc_oob_data.present, 429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_oob->peer_oob_data.present); 430444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->state != SMP_STATE_WAIT_APP_RSP || 432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->cb_evt != SMP_SC_OOB_REQ_EVT) 433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool data_missing = false; 436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_cb->req_oob_type) { 437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_OOB_PEER: 438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_oob->peer_oob_data.present) data_missing = true; 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_OOB_LOCAL: 441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_oob->loc_oob_data.present) data_missing = true; 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_OOB_BOTH: 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_oob->loc_oob_data.present || !p_oob->peer_oob_data.present) 445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data_missing = true; 446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("Unexpected OOB data type requested. Fail OOB"); 449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data_missing = true; 450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (data_missing) { 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sc_oob_data = *p_oob; 459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(&smp_cb, SMP_SC_OOB_DATA_EVT, p_data); 461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 464ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_Encrypt 466ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to encrypt the data with the 4689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * specified key 469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: key - Pointer to key key[0] conatins the MSB 471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * key_len - key length 472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * plain_text - Pointer to data to be encrypted 473ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * plain_text[0] conatins the MSB 474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pt_len - plain text length 475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_out - output of the encrypted texts 476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Boolean - request is successful 478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SMP_Encrypt(uint8_t* key, uint8_t key_len, uint8_t* plain_text, 480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t pt_len, tSMP_ENC* p_out) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool status = false; 484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = smp_encrypt_data(key, key_len, plain_text, pt_len, p_out); 485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_KeypressNotification 491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to notify Security Manager about 4939ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Keypress Notification. 494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: bd_addr Address of the device to send keypress 4969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * notification to 497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * value Keypress notification parameter value 498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5009e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid SMP_KeypressNotification(const RawAddress& bd_addr, uint8_t value) { 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_EVENT("%s: Value: %d", __func__, value); 504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 505c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (bd_addr != p_cb->pairing_bda) { 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s() - Wrong BD Addr", __func__); 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_find_dev(bd_addr) == NULL) { 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s() - no dev CB", __func__); 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Keypress Notification is used by a device with KeyboardOnly IO capabilities 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * during the passkey entry protocol */ 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->local_io_capability != SMP_IO_CAP_IN) { 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s() - wrong local IO capabilities %d", __func__, 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->local_io_capability); 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 522444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb->selected_association_model != SMP_MODEL_SEC_CONN_PASSKEY_ENT) { 524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s() - wrong protocol %d", __func__, 525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->selected_association_model); 526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 528444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_KEYPRESS_NOTIFICATION_EVENT, &value); 530444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 531444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 532444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SMP_CreateLocalSecureConnectionsOobData 535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start creation of local SC OOB 537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * data set (tSMP_LOC_OOB_DATA). 538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: bd_addr - Address of the device to send OOB data block to 540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Boolean - true: creation of local SC OOB data set started. 542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool SMP_CreateLocalSecureConnectionsOobData(tBLE_BD_ADDR* addr_to_send_to) { 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_CB* p_cb = &smp_cb; 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (addr_to_send_to == NULL) { 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_ERROR("%s addr_to_send_to is not provided", __func__); 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 55178b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski VLOG(2) << __func__ << " addr type:" << +addr_to_send_to->type 55278b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski << ", BDA:" << addr_to_send_to->bda << ", state:" << p_cb->state 55378b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski << ", br_state: " << p_cb->br_state; 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_cb->state != SMP_STATE_IDLE) || (p_cb->smp_over_br)) { 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_TRACE_WARNING( 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s creation of local OOB data set " 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "starts only in IDLE state", 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->sc_oob_data.loc_oob_data.addr_sent_to = *addr_to_send_to; 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_sm_event(p_cb, SMP_CR_LOC_SC_OOB_DATA_EVT, NULL); 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 567444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 568