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