smp_act.cc revision ecace46f9c04c941039356cce22af56c562381f3
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2003-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include <string.h>
205a6b32562ab6a1bbca945e478d01e371bb49c40fPulkit Bhuwalka#include "btif_common.h"
217927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "device/include/interop.h"
22ecace46f9c04c941039356cce22af56c562381f3Jakub Pawlowski#include "internal_include/bt_target.h"
237927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "stack/btm/btm_int.h"
247927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "stack/include/l2c_api.h"
257927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "stack/smp/smp_int.h"
267927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "utils/include/bt_utils.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SMP_KEY_DIST_TYPE_MAX 4
29fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa
305af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tngconst tSMP_ACT smp_distribute_act[] = {
315af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_generate_ltk,       /* SMP_SEC_KEY_TYPE_ENC - '1' bit index */
325af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_send_id_info,       /* SMP_SEC_KEY_TYPE_ID - '1' bit index */
335af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_generate_csrk,      /* SMP_SEC_KEY_TYPE_CSRK - '1' bit index */
345af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_set_derive_link_key /* SMP_SEC_KEY_TYPE_LK - '1' bit index */
355af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng};
360bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
37a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskistatic bool lmp_version_below(const RawAddress& bda, uint8_t version) {
38911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE);
39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (acl == NULL || acl->lmp_version == 0) {
40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_WARNING("%s cannot retrieve LMP version...", __func__);
41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s LMP version %d < %d", __func__, acl->lmp_version,
44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    version);
45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return acl->lmp_version < version;
46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson}
47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool pts_test_send_authentication_complete_failure(tSMP_CB* p_cb) {
49fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  uint8_t reason = p_cb->cert_failure;
50fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if (reason == SMP_PAIR_AUTH_FAIL || reason == SMP_PAIR_FAIL_UNKNOWN ||
51fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      reason == SMP_PAIR_NOT_SUPPORT || reason == SMP_PASSKEY_ENTRY_FAIL ||
52fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      reason == SMP_REPEATED_ATTEMPTS) {
535ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
545ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = reason;
555ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
56fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    return true;
57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
58fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  return false;
590bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora}
600bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_update_key_mask
63ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function updates the key mask for sending or receiving.
64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void smp_update_key_mask(tSMP_CB* p_cb, uint8_t key_type, bool recv) {
66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      "%s before update role=%d recv=%d local_i_key = %02x, local_r_key = %02x",
68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key);
69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (((p_cb->le_secure_connections_mode_is_used) || (p_cb->smp_over_br)) &&
71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ((key_type == SMP_SEC_KEY_TYPE_ENC) ||
72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       (key_type == SMP_SEC_KEY_TYPE_LK))) {
73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* in LE SC mode LTK, CSRK and BR/EDR LK are derived locally instead of
74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ** being exchanged with the peer */
75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_i_key &= ~key_type;
76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key &= ~key_type;
77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (p_cb->role == HCI_ROLE_SLAVE) {
78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (recv)
79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~key_type;
80444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~key_type;
82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (recv)
84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~key_type;
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~key_type;
87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x",
90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->local_i_key, p_cb->local_r_key);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
92444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
94ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_app_cback
959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  notifies application about the events the application is
969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              interested in
97ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_app_cback(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_EVT_DATA cb_data;
100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS callback_rc;
101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d", __func__, p_cb->cb_evt);
102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->p_callback && p_cb->cb_evt != 0) {
103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    switch (p_cb->cb_evt) {
104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_IO_CAP_REQ_EVT:
105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.auth_req = p_cb->peer_auth_req;
106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.oob_data = SMP_OOB_NONE;
107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS;
108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.init_keys = p_cb->local_i_key;
110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.resp_keys = p_cb->local_r_key;
111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_WARNING("io_cap = %d", cb_data.io_req.io_cap);
112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_NC_REQ_EVT:
115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.passkey = p_data->passkey;
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SC_OOB_REQ_EVT:
118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.req_oob_type = p_data->req_oob_type;
119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SC_LOC_OOB_DATA_UP_EVT:
121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data;
122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_BR_KEYS_REQ_EVT:
125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.auth_req = 0;
126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.oob_data = SMP_OOB_NONE;
127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.io_cap = 0;
128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY;
130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY;
131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      default:
134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    callback_rc =
138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("%s: callback_rc=%d  p_cb->cb_evt=%d", __func__,
141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    callback_rc, p_cb->cb_evt);
142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (callback_rc == SMP_SUCCESS) {
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      switch (p_cb->cb_evt) {
145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case SMP_IO_CAP_REQ_EVT:
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_auth_req = cb_data.io_req.auth_req;
147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_io_capability = cb_data.io_req.io_cap;
148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_oob_flag = cb_data.io_req.oob_data;
149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_enc_size = cb_data.io_req.max_key_size;
150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key = cb_data.io_req.init_keys;
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key = cb_data.io_req.resp_keys;
152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) {
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            SMP_TRACE_WARNING("Non bonding: No keys will be exchanged");
155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_i_key = 0;
156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_r_key = 0;
157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
160b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "rcvd auth_req: 0x%02x, io_cap: %d "
161b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "loc_oob_flag: %d loc_enc_size: %d, "
162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "local_i_key: 0x%02x, local_r_key: 0x%02x",
163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag,
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key);
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->secure_connections_only_mode_required =
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (p_cb->secure_connections_only_mode_required) {
170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT;
171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) ||
174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2) ||
175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS,
176a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                 (const RawAddress*)&p_cb->pairing_bda)) {
177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT;
178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1827a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski          if (lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_5_0)) {
1837a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski            p_cb->loc_auth_req &= ~SMP_H7_SUPPORT_BIT;
1847a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski          }
1857a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski
186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x",
188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key);
189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case SMP_BR_KEYS_REQ_EVT:
194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_enc_size = cb_data.io_req.max_key_size;
195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key = cb_data.io_req.init_keys;
196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key = cb_data.io_req.resp_keys;
197e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski          p_cb->loc_auth_req |= SMP_H7_SUPPORT_BIT;
198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
203b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "for SMP over BR max_key_size: 0x%02x, local_i_key: 0x%02x, "
204b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "local_r_key: 0x%02x, p_cb->loc_auth_req: 0x%02x",
205e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski              p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key,
206e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski              p_cb->loc_auth_req);
207444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL);
209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->cb_evt && p_cb->discard_sec_req) {
215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->discard_sec_req = false;
216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
219b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: return", __func__);
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_fail
224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  pairing failure to peer device if needed.
225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2275ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->status = p_data->status;
2285ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->failure = p_data->status;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
230b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: status=%d failure=%d ", __func__, p_cb->status,
231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->failure);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC &&
234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->status != SMP_SUCCESS) {
235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->wait_for_authorization_complete = true;
237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_req
242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  actions related to sending pairing request
243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2472d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach
248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* erase all keys when master sends pairing req*/
249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec) btm_sec_clear_ble_keys(p_dev_rec);
250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* do not manipulate the key, let app decide,
251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     leave out to BTM to mandate key distribution for bonding case */
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_rsp
257ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  actions related to sending pairing response
258ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_rsp(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2615cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= p_cb->peer_i_key;
263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= p_cb->peer_r_key;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb)) {
266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_use_oob_private_key(p_cb, NULL);
268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else
269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_decide_association_model(p_cb, NULL);
270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_confirm
275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send confirmation to the peer
276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_init
284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing initializer to slave device
285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_INIT, p_cb);
289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
292ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_rand
293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send pairing random to the peer
294ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_RAND, p_cb);
298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2995cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_public_key
302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send pairing public key command to the peer
303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_PUBLIC_KEY, p_cb);
307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
310ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     SMP_SEND_COMMITMENT
311ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send commitment command to the peer
312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_COMMITM, p_cb);
316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
319ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_dhkey_check
320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send DHKey Check command to the peer
321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_DHKEY_CHECK, p_cb);
325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
328ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_keypress_notification
329ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send Keypress Notification command to the peer
330ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
3325ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->local_keypress_notification = p_data->status;
333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_enc_info
338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send encryption information command.
339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_LENC_KEYS le_key;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
343b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the DIV and key size information when acting as slave device */
350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.div = p_cb->div;
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.key_size = p_cb->loc_enc_size;
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC,
358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s", __func__);
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
366ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_id_info
367ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send ID information command.
368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_KEY_VALUE le_key;
371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LID, &le_key, true);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s", __func__);
382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
386ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_csrk_info
387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send CSRK command.
388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_LCSRK_KEYS key;
391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) {
395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.div = p_cb->div;
396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.sec_level = p_cb->sec_level;
397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.counter = 0; /* initialize the local counter */
398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(key.csrk, p_cb->csrk, BT_OCTET16_LEN);
399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK,
400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&key, true);
401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_ltk_reply
408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send LTK reply
409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_ltk_reply(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send stk as LTK response */
413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_ltk_request_reply(p_cb->pairing_bda, true, p_data->key.p_data);
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sec_req
418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security request.
419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_AUTH_REQ auth_req = *(tBTM_LE_AUTH_REQ*)p_data;
422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_SEC_REQ_ACT sec_req_act;
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
424b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: auth_req=0x%x", __func__, auth_req);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = 0;
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
430b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: sec_req_act=0x%x", __func__, sec_req_act);
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (sec_req_act) {
433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_ENCRYPT:
434b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      SMP_TRACE_DEBUG("%s: BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__);
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_PAIR:
439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->secure_connections_only_mode_required =
440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* respond to non SC pairing request as failure in SC only mode */
443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->secure_connections_only_mode_required &&
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (auth_req & SMP_SC_SUPPORT_BIT) == 0) {
4455ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
4465ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_PAIR_AUTH_FAIL;
4475ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* initialize local i/r key to be default keys */
450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->peer_auth_req = auth_req;
451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY;
452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_DISCARD:
457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->discard_sec_req = true;
458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* do nothing */
462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sec_grant
468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security grant.
469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
4715ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t res = p_data->status;
472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (res != SMP_SUCCESS) {
474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /*otherwise, start pairing */
476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* send IO request callback */
478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
483ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_pair_fail
484ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing failure from peer device
485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
4885ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->status = p_data->status;
489373d928dbadbf0bbaa2e9b1128fedd48b4da41e8Jacky Cheung
490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Cancel pending auth complete timer if set */
491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  alarm_cancel(p_cb->delayed_auth_timer_ent);
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_pair_cmd
496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Process the SMP pairing request/response from peer device
497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_cmd(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
4995ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
503b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* erase all keys if it is slave proc pairing req */
504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_clear_ble_keys(p_dev_rec);
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_io_caps, p);
510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_auth_req, p);
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_enc_size, p);
513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_i_key, p);
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_r_key, p);
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
5175ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
5185ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
5195ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // PTS Testing failure modes
524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (pts_test_send_authentication_complete_failure(p_cb)) return;
525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) {
528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* peer (master) started pairing sending Pairing Request */
529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key = p_cb->peer_i_key;
530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key = p_cb->peer_r_key;
531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else /* update local i/r key according to pairing request */
534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    {
535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* pairing started with this side (slave) sending Security Request */
536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= p_cb->peer_i_key;
537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= p_cb->peer_r_key;
538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->selected_association_model = smp_select_association_model(p_cb);
539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->secure_connections_only_mode_required &&
541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (!(p_cb->le_secure_connections_mode_is_used) ||
542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           (p_cb->selected_association_model ==
543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            SMP_MODEL_SEC_CONN_JUSTWORKS))) {
544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_ERROR(
545b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon            "%s: pairing failed - slave requires secure connection only mode",
546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            __func__);
5475ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
5485ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_PAIR_AUTH_FAIL;
5495ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
5520bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (smp_request_oob_data(p_cb)) return;
555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_pair_rsp(p_cb, NULL);
557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
558444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* Master receives pairing response */
560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->selected_association_model = smp_select_association_model(p_cb);
562444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->secure_connections_only_mode_required &&
564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (!(p_cb->le_secure_connections_mode_is_used) ||
565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
567b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "Master requires secure connection only mode "
568b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "but it can't be provided -> Master fails pairing");
5695ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
5705ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_PAIR_AUTH_FAIL;
5715ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (smp_request_oob_data(p_cb)) return;
577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_decide_association_model(p_cb, NULL);
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
582444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_confirm
585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing confirm from peer device
586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
5885ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
589444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
591444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
5935ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
5945ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
5955ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* save the SConfirm for comparison later */
601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN);
602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_init
609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing initializer from peer device
610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6125ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
613444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
615444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
6175ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
6185ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6195ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
622444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the SRand for comparison */
624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
626444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_rand
629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing random (nonce) from peer device
630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6325ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
6375ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
6385ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6395ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
642444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the SRand for comparison */
644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
646444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
648ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_pairing_public_key
649ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing public key command from the peer device
650ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - saves the peer public key;
651ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - sets the flag indicating that the peer public key is received;
652ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - calls smp_wait_for_both_public_keys(...).
653ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
654ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6565ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
6615ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
6625ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6635ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->peer_publ_key.x, p, BT_OCTET32_LEN);
668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->peer_publ_key.y, p, BT_OCTET32_LEN);
669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY;
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_wait_for_both_public_keys(p_cb, NULL);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
675ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_pairing_commitment
676ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing commitment from peer device
677ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6795ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
6845ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
6855ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6865ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->remote_commitment, p, BT_OCTET16_LEN);
694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
696444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_dhkey_check
699ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process DHKey Check from peer device
700ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
7025ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
7075ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7085ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
7095ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->remote_dhkey_check, p, BT_OCTET16_LEN);
715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
716444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK;
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
721ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_keypress_notification
722ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing keypress notification from peer device
723ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
7255ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
7285ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->status = p_data->status;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
7315ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7325ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
7335ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_UINT8(p_cb->peer_keypress_notification, p);
739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE;
741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT;
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
744444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_pairing_command
747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Process the SMP pairing request/response from peer device via
748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              BR/EDR transport.
749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_pairing_command(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
7515ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* rejecting BR pairing request over non-SC BR link */
756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) {
7575ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7585ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_XTRANS_DERIVE_NOT_ALLOW;
7595ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* erase all keys if it is slave proc pairing req*/
764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_clear_ble_keys(p_dev_rec);
766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_io_caps, p);
770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_auth_req, p);
772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_enc_size, p);
773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_i_key, p);
774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_r_key, p);
775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
7775ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7785ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
7795ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* peer (master) started pairing sending Pairing Request */
784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* or being master device always use received i/r key as keys to distribute */
785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key = p_cb->peer_i_key;
786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key = p_cb->peer_r_key;
787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->new_encryption_key_is_p256 = false;
790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* shortcut to skip Security Grant step */
791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
792b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  } else {
793b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* Master receives pairing response */
794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG(
795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "%s master rcvs valid PAIRING RESPONSE."
796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        " Supposed to move to key distribution phase. ",
797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        __func__);
798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* auth_req received via BR/EDR SM channel is set to 0,
801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     but everything derived/exchanged has to be saved */
802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->peer_auth_req |= SMP_AUTH_BOND;
803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->loc_auth_req |= SMP_AUTH_BOND;
804444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
805444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
806444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
807ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_security_grant
808ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security grant in case of pairing over BR/EDR transport.
809ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_security_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
8125ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  if (p_data->status != SMP_SUCCESS) {
813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data);
814b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  } else {
815b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* otherwise, start pairing; send IO request callback */
816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
821ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_check_authorization_request
822ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  sets the SMP kes to be derived/distribute over BR/EDR transport
823ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              before starting the distribution/derivation
824ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
826b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s rcvs i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
827b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon                  __func__, p_cb->local_i_key, p_cb->local_r_key);
828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* In LE SC mode LK field is ignored when BR/EDR transport is used */
830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
832444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ** Set local_r_key on master to expect only these keys. */
835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_MASTER) {
836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
839e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  /* Check if H7 function needs to be used for key derivation*/
840e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  if ((p_cb->loc_auth_req & SMP_H7_SUPPORT_BIT) &&
841e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski      (p_cb->peer_auth_req & SMP_H7_SUPPORT_BIT)) {
842e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski    p_cb->key_derivation_h7_used = TRUE;
843e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  }
844e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  SMP_TRACE_DEBUG("%s: use h7 = %d", __func__, p_cb->key_derivation_h7_used);
845e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski
846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
847b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, p_cb->local_i_key, p_cb->local_r_key);
849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->local_i_key || p_cb->local_r_key)) {
853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL);
854444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if no peer key is expected, start master key distribution */
856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0)
857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_key_distribution_by_transport(p_cb, NULL);
858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
8595ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
8605ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_SUCCESS;
8615ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
866ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_select_next_key
867ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  selects the next key to derive/send when BR/EDR transport is
868ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              used.
869ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE ||
875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_pick_key(p_cb, p_data);
877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->local_i_key && !p_cb->local_r_key) {
880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* state check to prevent re-entrance */
881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) {
8825ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      if (p_cb->total_tx_unacked == 0) {
8835ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
8845ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_SUCCESS;
8855ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
8865ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      } else {
887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->wait_for_authorization_complete = true;
8885ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      }
889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
894ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_enc_info
895ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process encryption information from peer device
896ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
8985ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
8995cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_master_id
907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process master ID from slave device
908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_master_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
9105ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PENC_KEYS le_key;
912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true);
915444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(le_key.ediv, p);
917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(le_key.rand, p, BT_OCTET8_LEN);
918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store the encryption keys from peer device */
920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.key_size = p_cb->loc_enc_size;
9235cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC,
927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
928444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
933ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_enc_info
934ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process identity information from peer device
935ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
9375ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
9385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
943444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
945ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_id_addr
946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process identity address from peer device
947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
9495ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PID_KEYS pid_key;
951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true);
954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(pid_key.addr_type, p);
956b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(pid_key.static_addr, p);
957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN);
958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* to use as BD_ADDR for lk derived from ltk */
960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->id_addr_rcvd = true;
961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->id_addr_type = pid_key.addr_type;
962c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_cb->id_addr = pid_key.static_addr;
963e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store the ID key from peer device */
965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID,
968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&pid_key, true);
969911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
970444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
971444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_srk_info
974ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security information from peer device
975ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PCSRK_KEYS le_key;
978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true);
981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save CSRK to security record */
983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
984b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon
985b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* get peer CSRK */
9865ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  maybe_non_aligned_memcpy(le_key.csrk, p_data->p_data, BT_OCTET16_LEN);
987b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon
988b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* initialize the peer counter */
989b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  le_key.counter = 0;
990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PCSRK,
994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
999ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_compare
1000ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process compare value
1001ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_compare(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) {
1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* compare the max encryption key size, and save the smaller one for the
1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     * link */
1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->loc_enc_size = p_cb->peer_enc_size;
1009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->role == HCI_ROLE_SLAVE)
1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else {
1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* master device always use received i/r key as keys to distribute */
1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key = p_cb->peer_i_key;
1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key = p_cb->peer_r_key;
1016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
10215ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
10225ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
10235ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_CONFIRM_VALUE_ERR;
10245ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1029ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sl_key
1030ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process key ready events.
1031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sl_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t key_type = p_data->key.key_type;
1034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (key_type == SMP_KEY_TYPE_TK) {
1037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_generate_srand_mrand_confirm(p_cb, NULL);
1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (key_type == SMP_KEY_TYPE_CFM) {
1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_set_state(SMP_STATE_WAIT_CONFIRM);
1040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
1042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
1043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1044444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1045444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1047ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_enc
1048ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  start encryption
1049ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_enc(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_STATUS cmd;
1052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_data != NULL)
1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    cmd = btm_ble_start_encrypt(p_cb->pairing_bda, true, p_data->key.p_data);
1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else
1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    cmd = btm_ble_start_encrypt(p_cb->pairing_bda, false, NULL);
1058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
10595ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) {
10605ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
10615ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_ENC_FAIL;
10625ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
10635ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  }
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1067ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_discard
1068ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description   processing for discard security request
1069ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_discard(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
1073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_reset_control_value(p_cb);
1074444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1077ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_enc_cmpl
1078ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description   encryption success
1079ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_enc_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
10815ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t enc_enable = p_data->status;
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
10845ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  tSMP_INT_DATA smp_int_data;
10855ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
10865ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1090ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_check_auth_req
1091ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  check authentication request
1092ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_check_auth_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
10945ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t enc_enable = p_data->status;
1095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
1097b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      "%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key);
1099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (enc_enable == 1) {
1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->le_secure_connections_mode_is_used) {
1101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode LTK is used instead of STK and has to be always saved */
1102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC;
1103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC;
1104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode LK is derived from LTK only if both sides request it */
1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) ||
1107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) {
1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ** Set local_r_key on master to expect only these keys.
1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      */
1115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
1117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* in legacy mode derivation of BR/EDR LK is not supported */
1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG(
1124b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon        "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        __func__, p_cb->local_i_key, p_cb->local_r_key);
1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (p_cb->local_i_key || p_cb->local_r_key)) {
1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
11315ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    } else {
11325ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
11335ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
11345ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
11355ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    }
1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (enc_enable == 0) {
11375ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
11385ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if failed for encryption after pairing, send callback */
1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
11415ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if enc failed for old security information */
1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if master device, clean up and abck to idle; slave device do nothing */
1144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else if (p_cb->role == HCI_ROLE_MASTER) {
11455ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_pick_key
1152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Pick a key distribution function based on the key mask.
1153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_pick_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t key_to_dist =
1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->local_r_key : p_cb->local_i_key;
1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t i = 0;
1158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s key_to_dist=0x%x", __func__, key_to_dist);
1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while (i < SMP_KEY_DIST_TYPE_MAX) {
1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("key to send = %02x, i = %d", key_to_dist, i);
1162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (key_to_dist & (1 << i)) {
1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("smp_distribute_act[%d]", i);
1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (*smp_distribute_act[i])(p_cb, p_data);
1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    i++;
1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_distribution
1173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  start key distribution if required.
1174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE ||
1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_pick_key(p_cb, p_data);
1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->local_i_key && !p_cb->local_r_key) {
1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* state check to prevent re-entrant */
1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (smp_get_state() == SMP_STATE_BOND_PENDING) {
1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->derive_lk) {
1188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_derive_link_key_from_long_term_key(p_cb, NULL);
1189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->derive_lk = false;
1190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->total_tx_unacked == 0) {
1193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /*
1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * Instead of declaring authorization complete immediately,
1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * delay the event from being sent by SMP_DELAYED_AUTH_TIMEOUT_MS.
1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * This allows the slave to send over Pairing Failed if the
1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * last key is rejected.  During this waiting window, the
1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * state should remain in SMP_STATE_BOND_PENDING.
1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         */
1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (!alarm_is_scheduled(p_cb->delayed_auth_timer_ent)) {
1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_DEBUG("%s delaying auth complete.", __func__);
1202be8bbd7a83ec8bc900fac58a03010fbcb74956c9Jakub Pawlowski          alarm_set_on_mloop(p_cb->delayed_auth_timer_ent,
1203be8bbd7a83ec8bc900fac58a03010fbcb74956c9Jakub Pawlowski                             SMP_DELAYED_AUTH_TIMEOUT_MS,
1204be8bbd7a83ec8bc900fac58a03010fbcb74956c9Jakub Pawlowski                             smp_delayed_auth_complete_timeout, NULL);
1205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->wait_for_authorization_complete = true;
1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1209444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_decide_association_model
1215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to select assoc model to be used for
1216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  STK generation and to start STK generation process.
1217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t int_evt = 0;
12215ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  tSMP_INT_DATA smp_int_data;
1222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s Association Model = %d", __func__,
1224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->selected_association_model);
1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */
1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER &&
1229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
1230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) {
1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_ERROR(
1232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "IO capability does not meet authentication requirement");
12335ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_PAIR_AUTH_FAIL;
1234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        int_evt = SMP_AUTH_CMPL_EVT;
1235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        p_cb->sec_level);
1239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
12405ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_KEY key;
1241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        key.key_type = SMP_KEY_TYPE_TK;
1242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        key.p_data = p_cb->tk;
12435ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.key = key;
1244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memset(p_cb->tk, 0, BT_OCTET16_LEN);
1246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* TK, ready  */
1247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        int_evt = SMP_KEY_READY_EVT;
1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_PASSKEY:
1252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->sec_level);
1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_TK_REQ_EVT;
1258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_OOB:
1261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
1262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->sec_level);
1265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_OOB_REQ_EVT;
1267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_TK_REQ_EVT;
1268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_KEY_NOTIF:
1271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("Need to generate Passkey");
1273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* generate passkey and notify application */
1275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_generate_passkey(p_cb, NULL);
1276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT;
1284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_OUT_OF_RANGE:
1287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)");
12885ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_UNKNOWN_IO_CAP;
1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_AUTH_CMPL_EVT;
1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
1294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          "Association Model = %d (SOMETHING IS WRONG WITH THE CODE)",
1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->selected_association_model);
12965ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_UNKNOWN_IO_CAP;
1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_AUTH_CMPL_EVT;
1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_EVENT("sec_level=%d ", p_cb->sec_level);
13015ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  if (int_evt) smp_sm_event(p_cb, int_evt, &smp_int_data);
1302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_io_response
1306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process IO response for a slave device.
1307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_io_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* pairing started by local (slave) Security Request */
1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_set_state(SMP_STATE_SEC_REQ_PENDING);
1314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* plan to send pairing respond */
1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
1317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* pairing started by peer (master) Pairing Request */
1318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->selected_association_model = smp_select_association_model(p_cb);
1319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->secure_connections_only_mode_required &&
1321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (!(p_cb->le_secure_connections_mode_is_used) ||
1322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
1323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
1324b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "Slave requires secure connection only mode "
1325b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "but it can't be provided -> Slave fails pairing");
13265ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
13275ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_PAIR_AUTH_FAIL;
13285ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (smp_request_oob_data(p_cb)) return;
1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
13350bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    // PTS Testing failure modes
1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (pts_test_send_authentication_complete_failure(p_cb)) return;
13380bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_pair_rsp(p_cb, NULL);
1340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_slave_keys_response
1345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process application keys response for a slave device
1346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              (BR/EDR transport).
1347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_slave_keys_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_br_send_pair_response(p_cb, NULL);
1350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_send_pair_response
13549ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  actions related to sending pairing response over BR/EDR
13559ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              transport.
1356ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_send_pair_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= p_cb->peer_i_key;
1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= p_cb->peer_r_key;
1362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb);
1364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1367ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_pairing_cmpl
13689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
13699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
1370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pairing_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->total_tx_unacked == 0) {
1373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* process the pairing complete */
1374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1376444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_pair_terminate
13809ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
13819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
1382ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pair_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->status = SMP_CONN_TOUT;
1386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_proc_pairing_cmpl(p_cb);
1387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_idle_terminate
13919ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function calledin idle state to determine to send
13929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  authentication complete or not.
1393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_idle_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
1397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->status = SMP_FAIL;
1398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_fast_conn_param
1404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  apply default connection parameter for pairing process
1405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_fast_conn_param(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Disable L2CAP connection parameter updates while bonding since
1408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     some peripherals are not able to revert to fast connection parameters
1409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     during the start of service discovery. Connection paramter updates
1410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     get enabled again once service discovery completes. */
1411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, false);
1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_both_have_public_keys
1416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  The function is called when both local and peer public keys are
1417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              saved.
1418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              Actions:
1419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - invokes DHKey computation;
1420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - on slave side invokes sending local public key to the peer.
1421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - invokes SC phase 1 process.
1422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_both_have_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1425444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* invokes DHKey computation */
1427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_compute_dhkey(p_cb);
1428444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* on slave side invokes sending local public key to the peer */
1430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) smp_send_pair_public_key(p_cb, NULL);
1431444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL);
1433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_secure_connection_phase1
14379ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Start Secure Connection phase1 i.e. invokes initialization of
14389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              Secure Connection phase 1 parameters and starts building/sending
14399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              to the peer messages appropriate for the role and association
14409ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              model.
1441ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_secure_connection_phase1(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_cb->sec_level);
1449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_cb->sec_level);
1453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(p_cb->local_random, 0, BT_OCTET16_LEN);
1459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_start_nonce_generation(p_cb);
1460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* user has to provide passkey */
1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL);
1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* passkey has to be provided to user */
1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("Need to generate SC Passkey");
1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_generate_passkey(p_cb, NULL);
1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* use the available OOB information */
1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_process_secure_connection_oob_data(p_cb, NULL);
1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1483ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_local_nonce
1484ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  The function processes new local nonce.
1485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be called in SC phase1.
1487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_local_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave calculates and sends local commitment */
1496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_calculate_local_commitment(p_cb);
1497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_commitment(p_cb, NULL);
1498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave has to wait for peer nonce */
1499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_WAIT_NONCE);
1500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* i.e. master */
1501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* slave commitment is already received, send local nonce, wait for
1504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           * remote nonce*/
1505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_DEBUG(
1506b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "master in assoc mode = %d "
1507b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "already rcvd slave commitment - race condition",
1508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->selected_association_model);
1509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_send_rand(p_cb, NULL);
1511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_set_state(SMP_STATE_WAIT_NONCE);
1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_calculate_local_commitment(p_cb);
1518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_commitment(p_cb, NULL);
1521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* slave */
1522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* master commitment is already received */
1525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_send_commitment(p_cb, NULL);
1526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_set_state(SMP_STATE_WAIT_NONCE);
1527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_set_state(SMP_STATE_WAIT_NONCE);
1536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1543444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1545ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_peer_nonce
15469ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  The function processes newly received and saved in CB peer
15479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              nonce. The actions depend on the selected association model and
15489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              the role.
1549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be called in SC phase1.
1551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s start ", __func__);
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // PTS Testing failure modes
1556fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if (p_cb->cert_failure == SMP_CONFIRM_VALUE_ERR) {
1557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
15585ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
15595ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
15605ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_CONFIRM_VALUE_ERR;
15615ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1564fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  // PTS Testing failure modes (for LT)
1565fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if ((p_cb->cert_failure == SMP_NUMERIC_COMPAR_FAIL) &&
1566fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) &&
1567fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      (p_cb->role == HCI_ROLE_SLAVE)) {
1568fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
15695ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
15705ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL;
15715ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_NUMERIC_COMPAR_FAIL;
15725ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1573fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    return;
1574fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  }
1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* in these models only master receives commitment */
1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (!smp_check_commitment(p_cb)) {
15825ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          tSMP_INT_DATA smp_int_data;
15835ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
15845ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          p_cb->failure = SMP_CONFIRM_VALUE_ERR;
15855ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
1587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave sends local nonce */
1590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* go directly to phase 2 */
1595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* numeric comparison */
1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_WAIT_NONCE);
1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL);
1600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1604fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      if (!smp_check_commitment(p_cb) &&
1605fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa          p_cb->cert_failure != SMP_NUMERIC_COMPAR_FAIL) {
16065ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
16075ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
16085ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        p_cb->failure = SMP_CONFIRM_VALUE_ERR;
16095ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
16120bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (++p_cb->round < 20) {
1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_SEC_CONN_PHS1_START);
1619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_start_nonce_generation(p_cb);
1621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s end ", __func__);
1640444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1642444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1643ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_match_dhkey_checks
1644ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  checks if the calculated peer DHKey Check value is the same as
1645ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              received from the peer DHKey check value.
1646ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_match_dhkey_checks(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) {
1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_WARNING("dhkey chcks do no match");
16535ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
16545ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_DHKEY_CHK_FAIL;
16555ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_DHKEY_CHK_FAIL;
16565ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_EVENT("dhkey chcks match");
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* compare the max encryption key size, and save the smaller one for the link
1663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   */
1664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->loc_enc_size = p_cb->peer_enc_size;
1666444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
1668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL);
1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* master device always use received i/r key as keys to distribute */
1671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_i_key = p_cb->peer_i_key;
1672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key = p_cb->peer_r_key;
1673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1675444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1677444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1678ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_move_to_secure_connections_phase2
1679ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Signal State Machine to start SC phase 2 initialization (to
1680ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              compute local DHKey Check value).
1681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         SM is supposed to be in the state SMP_STATE_SEC_CONN_PHS2_START.
1683ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_move_to_secure_connections_phase2(tSMP_CB* p_cb,
1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                           tSMP_INT_DATA* p_data) {
1686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_phase_2_dhkey_checks_are_present
16929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  generates event if dhkey check from the peer is already
16939ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              received.
1694ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be used on slave to prevent race condition.
16969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              It is supposed to be called after slave dhkey check is
16979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              calculated.
1698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_phase_2_dhkey_checks_are_present(tSMP_CB* p_cb,
1700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                          tSMP_INT_DATA* p_data) {
1701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
17025cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK)
1704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL);
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1706444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_wait_for_both_public_keys
17099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  generates SMP_BOTH_PUBL_KEYS_RCVD_EVT event when both local and
17109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              master public keys are available.
1711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         on the slave it is used to prevent race condition.
1713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_wait_for_both_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) &&
1719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) {
1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((p_cb->role == HCI_ROLE_SLAVE) &&
1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        ((p_cb->req_oob_type == SMP_OOB_LOCAL) ||
1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->req_oob_type == SMP_OOB_BOTH))) {
1723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_set_state(SMP_STATE_PUBLIC_KEY_EXCH);
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL);
1726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1728444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_passkey_verification
1731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Starts SC passkey entry verification.
1732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_passkey_verification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = NULL;
17355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
1736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = p_cb->local_random;
1738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT32_TO_STREAM(p, p_data->passkey);
1739ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = p_cb->peer_random;
1741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT32_TO_STREAM(p, p_data->passkey);
17426975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->round = 0;
1744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
17456975b4d711142b885af479721cada448952c6b41Andre Eisenbach}
17466975b4d711142b885af479721cada448952c6b41Andre Eisenbach
17476975b4d711142b885af479721cada448952c6b41Andre Eisenbach/*******************************************************************************
1748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_secure_connection_oob_data
1749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Processes local/peer SC OOB data received from somewhere.
1750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_oob_data(tSMP_CB* p_cb,
1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            tSMP_INT_DATA* p_data) {
1753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
17546975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_SC_OOB_DATA* p_sc_oob_data = &p_cb->sc_oob_data;
1756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_sc_oob_data->loc_oob_data.present) {
1757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->local_random, p_sc_oob_data->loc_oob_data.randomizer,
1758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->local_random));
1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("%s: local OOB randomizer is absent", __func__);
1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
1762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1763444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_sc_oob_data->peer_oob_data.present) {
1765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("%s: peer OOB data is absent", __func__);
1766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(p_cb->peer_random, 0, sizeof(p_cb->peer_random));
1767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->peer_random, p_sc_oob_data->peer_oob_data.randomizer,
1769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->peer_random));
1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment,
1771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->remote_commitment));
1772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* check commitment */
1774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!smp_check_commitment(p_cb)) {
17755ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
17765ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
17775ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      p_cb->failure = SMP_CONFIRM_VALUE_ERR;
17785ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
1780444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
17816975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) {
1783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* the peer doesn't have local randomiser */
1784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT(
1785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          "%s: peer didn't receive local OOB data, set local randomizer to 0",
1786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          __func__);
1787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
1788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1790ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  print128(p_cb->local_random, (const uint8_t*)"local OOB randomizer");
1792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  print128(p_cb->peer_random, (const uint8_t*)"peer OOB randomizer");
1793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1795444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1797ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_set_local_oob_keys
17989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Saves calculated private/public keys in
17999ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              sc_oob_data.loc_oob_data, starts nonce generation
1800ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              (to be saved in sc_oob_data.loc_oob_data.randomizer).
1801ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1804444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(p_cb->sc_oob_data.loc_oob_data.private_key_used, p_cb->private_key,
1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         BT_OCTET32_LEN);
1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->sc_oob_data.loc_oob_data.publ_key_used = p_cb->loc_publ_key;
1808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18108fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
18118fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/*******************************************************************************
1812ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_set_local_oob_random_commitment
18139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Saves calculated randomizer and commitment in
18149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              sc_oob_data.loc_oob_data, passes sc_oob_data.loc_oob_data up
18159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              for safekeeping.
1816ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_random_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(p_cb->sc_oob_data.loc_oob_data.randomizer, p_cb->rand, BT_OCTET16_LEN);
1820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_calculate_f4(p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.randomizer, 0,
1824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.commitment);
1825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1826d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SMP_DEBUG == TRUE)
1827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p_print = NULL;
1828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("local SC OOB data set:");
1829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.addr_sent_to;
1830648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "addr_sent_to",
1831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                      sizeof(tBLE_BD_ADDR));
1832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.private_key_used;
1833648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "private_key_used",
1834648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.x;
1836648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.x",
1837648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.y;
1839648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.y",
1840648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.randomizer;
1842648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "randomizer", BT_OCTET16_LEN);
1843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.commitment;
1844648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "commitment", BT_OCTET16_LEN);
1845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("");
1846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
18478fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
1848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* pass created OOB data up */
1849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = SMP_SC_LOC_OOB_DATA_UP_EVT;
1850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_app_cback(p_cb, NULL);
1851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_cb_cleanup(p_cb);
1853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
18548fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_link_encrypted
1858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
18599ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called when link is encrypted and notified
18609ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  to the slave device. Proceed to to send LTK, DIV and ER to
18619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  master if bonding the devices.
1862ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1863ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1864ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1865ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1866ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1867a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid smp_link_encrypted(const RawAddress& bda, uint8_t encr_enable) {
1868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_CB* p_cb = &smp_cb;
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1870b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: encr_enable=%d", __func__, encr_enable);
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1872c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  if (smp_cb.pairing_bda == bda) {
1873b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* encryption completed with STK, remember the key size now, could be
1874b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon     * overwritten when key exchange happens                                 */
1875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->loc_enc_size != 0 && encr_enable) {
1876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* update the link encryption key size if a SMP pairing just performed */
1877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
18805ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
18815ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = encr_enable;
18825ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &smp_int_data);
1883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_proc_ltk_request
1889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when LTK request is received from
1891ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  controller.
1892ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1893ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1894ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1895ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1896a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool smp_proc_ltk_request(const RawAddress& bda) {
1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s state = %d", __func__, smp_cb.state);
1898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool match = false;
18991da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora
1900c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  if (bda == smp_cb.pairing_bda) {
1901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    match = true;
1902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
1904c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    if (p_dev_rec != NULL && p_dev_rec->ble.pseudo_addr == smp_cb.pairing_bda &&
1905b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski        p_dev_rec->ble.pseudo_addr != RawAddress::kEmpty) {
1906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      match = true;
19071da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora    }
1908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) {
1911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL);
1912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return true;
1913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1919ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1920ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_process_secure_connection_long_term_key
1921ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1922ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to process SC LTK.
1923ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  SC LTK is calculated and used instead of STK.
1924ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  Here SC LTK is saved in BLE DB.
1925ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1926ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_long_term_key(void) {
1930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_CB* p_cb = &smp_cb;
1931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_save_secure_connections_long_term_key(p_cb);
1934444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
1936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
1937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1939444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_set_derive_link_key
1942ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1943ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to set flag that indicates that
1944ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  BR/EDR LK has to be derived from LTK after all keys are
1945ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  distributed.
1946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_derive_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->derive_lk = true;
1953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_LK, false);
1954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
1955e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun}
1956e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
1957e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun/*******************************************************************************
1958ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1959ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_derive_link_key_from_long_term_key
1960ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1961ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to derive BR/EDR LK from LTK.
1962ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1963ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1964ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_derive_link_key_from_long_term_key(tSMP_CB* p_cb,
1967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            tSMP_INT_DATA* p_data) {
1968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
1969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!smp_calculate_link_key_from_long_term_key(p_cb)) {
1972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_ERROR("%s failed", __func__);
19735ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
19745ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = status;
19755ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_br_process_link_key
1983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1984ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to process BR/EDR LK:
1985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  - to derive SMP LTK from BR/EDR LK;
1986b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon *                  - to save SMP LTK.
1987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
1993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!smp_calculate_long_term_key_from_link_key(p_cb)) {
1996b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    SMP_TRACE_ERROR("%s: failed", __func__);
19975ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
19985ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = status;
19995ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
2000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
2001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s: LTK derivation from LK successfully completed",
2004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  __func__);
2005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_save_secure_connections_long_term_key(p_cb);
2006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
2007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_br_select_next_key(p_cb, NULL);
2008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
2011ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_distribution_by_transport
2012ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  depending on the transport used at the moment calls either
2013ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              smp_key_distribution(...) or smp_br_key_distribution(...).
2014ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->smp_over_br) {
2018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_select_next_key(p_cb, NULL);
2019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
2020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_distribution(p_cb, NULL);
2021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2023444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
2025ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_br_pairing_complete
20269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
20279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
2028ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2031d0aa8e53aa7ac1137a47570e08c2b963aaa49141Satya Calloji
2032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->total_tx_unacked == 0) {
2033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* process the pairing complete */
2034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
2035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2037