15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 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"
259181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach#include "stack/smp/p_256_ecc_pp.h"
267927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "stack/smp/smp_int.h"
277927f68bb2d9b963288261e1e858463b43c52a2dAndre Eisenbach#include "utils/include/bt_utils.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SMP_KEY_DIST_TYPE_MAX 4
30fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa
315af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tngconst tSMP_ACT smp_distribute_act[] = {
325af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_generate_ltk,       /* SMP_SEC_KEY_TYPE_ENC - '1' bit index */
335af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_send_id_info,       /* SMP_SEC_KEY_TYPE_ID - '1' bit index */
345af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_generate_csrk,      /* SMP_SEC_KEY_TYPE_CSRK - '1' bit index */
355af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng    smp_set_derive_link_key /* SMP_SEC_KEY_TYPE_LK - '1' bit index */
365af6abaf2e973072747c3c6588ae61183cb000a8Stanley Tng};
370bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
38a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskistatic bool lmp_version_below(const RawAddress& bda, uint8_t version) {
39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE);
40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (acl == NULL || acl->lmp_version == 0) {
41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_WARNING("%s cannot retrieve LMP version...", __func__);
42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s LMP version %d < %d", __func__, acl->lmp_version,
45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    version);
46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return acl->lmp_version < version;
47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson}
48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool pts_test_send_authentication_complete_failure(tSMP_CB* p_cb) {
50fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  uint8_t reason = p_cb->cert_failure;
51fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if (reason == SMP_PAIR_AUTH_FAIL || reason == SMP_PAIR_FAIL_UNKNOWN ||
52fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      reason == SMP_PAIR_NOT_SUPPORT || reason == SMP_PASSKEY_ENTRY_FAIL ||
53fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      reason == SMP_REPEATED_ATTEMPTS) {
545ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
555ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = reason;
565ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
57fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    return true;
58911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
59fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  return false;
600bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora}
610bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
63ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_update_key_mask
64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function updates the key mask for sending or receiving.
65ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void smp_update_key_mask(tSMP_CB* p_cb, uint8_t key_type, bool recv) {
67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      "%s before update role=%d recv=%d local_i_key = %02x, local_r_key = %02x",
69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key);
70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (((p_cb->le_secure_connections_mode_is_used) || (p_cb->smp_over_br)) &&
72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ((key_type == SMP_SEC_KEY_TYPE_ENC) ||
73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       (key_type == SMP_SEC_KEY_TYPE_LK))) {
74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* in LE SC mode LTK, CSRK and BR/EDR LK are derived locally instead of
75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ** being exchanged with the peer */
76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_i_key &= ~key_type;
77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key &= ~key_type;
78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (p_cb->role == HCI_ROLE_SLAVE) {
79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (recv)
80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~key_type;
81444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~key_type;
83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (recv)
85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~key_type;
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~key_type;
88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x",
91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->local_i_key, p_cb->local_r_key);
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
93444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
95ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_app_cback
969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  notifies application about the events the application is
979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              interested in
98ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_app_cback(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_EVT_DATA cb_data;
101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS callback_rc;
102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d", __func__, p_cb->cb_evt);
103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->p_callback && p_cb->cb_evt != 0) {
104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    switch (p_cb->cb_evt) {
105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_IO_CAP_REQ_EVT:
106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.auth_req = p_cb->peer_auth_req;
107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.oob_data = SMP_OOB_NONE;
108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS;
109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.init_keys = p_cb->local_i_key;
111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.resp_keys = p_cb->local_r_key;
112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_WARNING("io_cap = %d", cb_data.io_req.io_cap);
113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_NC_REQ_EVT:
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.passkey = p_data->passkey;
117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SC_OOB_REQ_EVT:
119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.req_oob_type = p_data->req_oob_type;
120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SC_LOC_OOB_DATA_UP_EVT:
122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data;
123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_BR_KEYS_REQ_EVT:
126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.auth_req = 0;
127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.oob_data = SMP_OOB_NONE;
128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.io_cap = 0;
129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY;
131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY;
132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      default:
135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    callback_rc =
139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("%s: callback_rc=%d  p_cb->cb_evt=%d", __func__,
142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    callback_rc, p_cb->cb_evt);
143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (callback_rc == SMP_SUCCESS) {
145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      switch (p_cb->cb_evt) {
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case SMP_IO_CAP_REQ_EVT:
147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_auth_req = cb_data.io_req.auth_req;
148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_io_capability = cb_data.io_req.io_cap;
149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_oob_flag = cb_data.io_req.oob_data;
150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_enc_size = cb_data.io_req.max_key_size;
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key = cb_data.io_req.init_keys;
152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key = cb_data.io_req.resp_keys;
153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) {
155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            SMP_TRACE_WARNING("Non bonding: No keys will be exchanged");
156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_i_key = 0;
157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_r_key = 0;
158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
161b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "rcvd auth_req: 0x%02x, io_cap: %d "
162b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "loc_oob_flag: %d loc_enc_size: %d, "
163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "local_i_key: 0x%02x, local_r_key: 0x%02x",
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag,
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key);
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->secure_connections_only_mode_required =
168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
169f37452a88679a008445998d8ced7b141a84fc373Hemant Gupta          /* just for PTS, force SC bit */
170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (p_cb->secure_connections_only_mode_required) {
171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT;
172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
174f37452a88679a008445998d8ced7b141a84fc373Hemant Gupta          if (!p_cb->secure_connections_only_mode_required &&
175f37452a88679a008445998d8ced7b141a84fc373Hemant Gupta              (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) ||
176f37452a88679a008445998d8ced7b141a84fc373Hemant Gupta               lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2) ||
177f37452a88679a008445998d8ced7b141a84fc373Hemant Gupta               interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS,
178f37452a88679a008445998d8ced7b141a84fc373Hemant Gupta                                  (const RawAddress*)&p_cb->pairing_bda))) {
179f37452a88679a008445998d8ced7b141a84fc373Hemant Gupta            p_cb->loc_auth_req &= ~SMP_SC_SUPPORT_BIT;
180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT;
181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1857a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski          if (lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_5_0)) {
1867a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski            p_cb->loc_auth_req &= ~SMP_H7_SUPPORT_BIT;
1877a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski          }
1887a7f69b2bbe74b1367ab41d7e4d08450a1624069Jakub Pawlowski
189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x",
191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key);
192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case SMP_BR_KEYS_REQ_EVT:
197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_enc_size = cb_data.io_req.max_key_size;
198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key = cb_data.io_req.init_keys;
199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key = cb_data.io_req.resp_keys;
200e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski          p_cb->loc_auth_req |= SMP_H7_SUPPORT_BIT;
201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
206b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "for SMP over BR max_key_size: 0x%02x, local_i_key: 0x%02x, "
207b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "local_r_key: 0x%02x, p_cb->loc_auth_req: 0x%02x",
208e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski              p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key,
209e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski              p_cb->loc_auth_req);
210444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL);
212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->cb_evt && p_cb->discard_sec_req) {
218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->discard_sec_req = false;
219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
222b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: return", __func__);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_fail
227ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  pairing failure to peer device if needed.
228ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2305ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->status = p_data->status;
2315ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->failure = p_data->status;
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
233b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: status=%d failure=%d ", __func__, p_cb->status,
234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->failure);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC &&
237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->status != SMP_SUCCESS) {
238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->wait_for_authorization_complete = true;
240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_req
245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  actions related to sending pairing request
246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2502d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach
251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* erase all keys when master sends pairing req*/
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec) btm_sec_clear_ble_keys(p_dev_rec);
253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* do not manipulate the key, let app decide,
254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     leave out to BTM to mandate key distribution for bonding case */
255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_rsp
260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  actions related to sending pairing response
261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_rsp(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2645cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= p_cb->peer_i_key;
266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= p_cb->peer_r_key;
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb)) {
269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_use_oob_private_key(p_cb, NULL);
271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else
272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_decide_association_model(p_cb, NULL);
273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_confirm
278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send confirmation to the peer
279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_init
287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing initializer to slave device
288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_INIT, p_cb);
292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_rand
296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send pairing random to the peer
297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_RAND, p_cb);
301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
3025cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_public_key
305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send pairing public key command to the peer
306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_PUBLIC_KEY, p_cb);
310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     SMP_SEND_COMMITMENT
314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send commitment command to the peer
315ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_COMMITM, p_cb);
319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_dhkey_check
323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send DHKey Check command to the peer
324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_DHKEY_CHECK, p_cb);
328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
331ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_keypress_notification
332ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send Keypress Notification command to the peer
333ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
3355ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->local_keypress_notification = p_data->status;
336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb);
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_enc_info
341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send encryption information command.
342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_LENC_KEYS le_key;
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
346b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the DIV and key size information when acting as slave device */
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.div = p_cb->div;
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.key_size = p_cb->loc_enc_size;
356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC,
361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s", __func__);
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
369ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_id_info
370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send ID information command.
371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_KEY_VALUE le_key;
374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LID, &le_key, true);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s", __func__);
385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_csrk_info
390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send CSRK command.
391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_LCSRK_KEYS key;
394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false);
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) {
398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.div = p_cb->div;
399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.sec_level = p_cb->sec_level;
400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.counter = 0; /* initialize the local counter */
401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(key.csrk, p_cb->csrk, BT_OCTET16_LEN);
402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK,
403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&key, true);
404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_ltk_reply
411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send LTK reply
412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_ltk_reply(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send stk as LTK response */
416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_ltk_request_reply(p_cb->pairing_bda, true, p_data->key.p_data);
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sec_req
421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security request.
422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_AUTH_REQ auth_req = *(tBTM_LE_AUTH_REQ*)p_data;
425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_SEC_REQ_ACT sec_req_act;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
427b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: auth_req=0x%x", __func__, auth_req);
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = 0;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
433b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: sec_req_act=0x%x", __func__, sec_req_act);
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (sec_req_act) {
436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_ENCRYPT:
437b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      SMP_TRACE_DEBUG("%s: BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__);
438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_PAIR:
442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->secure_connections_only_mode_required =
443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* respond to non SC pairing request as failure in SC only mode */
446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->secure_connections_only_mode_required &&
447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (auth_req & SMP_SC_SUPPORT_BIT) == 0) {
4485ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
4495ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_PAIR_AUTH_FAIL;
4505ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* initialize local i/r key to be default keys */
453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->peer_auth_req = auth_req;
454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY;
455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_DISCARD:
460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->discard_sec_req = true;
461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* do nothing */
465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sec_grant
471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security grant.
472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
4745ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t res = p_data->status;
475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (res != SMP_SUCCESS) {
477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /*otherwise, start pairing */
479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* send IO request callback */
481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_pair_fail
487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing failure from peer device
488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
4915ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->status = p_data->status;
492373d928dbadbf0bbaa2e9b1128fedd48b4da41e8Jacky Cheung
493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Cancel pending auth complete timer if set */
494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  alarm_cancel(p_cb->delayed_auth_timer_ent);
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_pair_cmd
499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Process the SMP pairing request/response from peer device
500ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_cmd(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
5025ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng  SMP_TRACE_DEBUG("%s: pairing_bda=%s", __func__,
506273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng                  p_cb->pairing_bda.ToString().c_str());
507273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng
508b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* erase all keys if it is slave proc pairing req */
509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_clear_ble_keys(p_dev_rec);
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_io_caps, p);
515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_auth_req, p);
517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_enc_size, p);
518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_i_key, p);
519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_r_key, p);
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
5225ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
5235ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
5245ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // PTS Testing failure modes
529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (pts_test_send_authentication_complete_failure(p_cb)) return;
530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) {
533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* peer (master) started pairing sending Pairing Request */
534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key = p_cb->peer_i_key;
535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key = p_cb->peer_r_key;
536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else /* update local i/r key according to pairing request */
539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    {
540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* pairing started with this side (slave) sending Security Request */
541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= p_cb->peer_i_key;
542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= p_cb->peer_r_key;
543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->selected_association_model = smp_select_association_model(p_cb);
544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->secure_connections_only_mode_required &&
546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (!(p_cb->le_secure_connections_mode_is_used) ||
547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           (p_cb->selected_association_model ==
548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            SMP_MODEL_SEC_CONN_JUSTWORKS))) {
549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_ERROR(
550b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon            "%s: pairing failed - slave requires secure connection only mode",
551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            __func__);
5525ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
5535ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_PAIR_AUTH_FAIL;
5545ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
5570bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (smp_request_oob_data(p_cb)) return;
560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_pair_rsp(p_cb, NULL);
562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
563444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* Master receives pairing response */
565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->selected_association_model = smp_select_association_model(p_cb);
567444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->secure_connections_only_mode_required &&
569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (!(p_cb->le_secure_connections_mode_is_used) ||
570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
572b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "Master requires secure connection only mode "
573b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "but it can't be provided -> Master fails pairing");
5745ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
5755ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_PAIR_AUTH_FAIL;
5765ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (smp_request_oob_data(p_cb)) return;
582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_decide_association_model(p_cb, NULL);
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
587444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_confirm
590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing confirm from peer device
591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
5935ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
594444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
596444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
5985ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
5995ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6005ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* save the SConfirm for comparison later */
606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN);
607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_init
614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing initializer from peer device
615ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6175ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
618444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
620444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
6225ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
6235ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6245ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
627444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the SRand for comparison */
629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
631444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
633ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_rand
634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing random (nonce) from peer device
635ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6375ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
6425ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
6435ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6445ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
647444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the SRand for comparison */
649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
651444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
653ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_pairing_public_key
654ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing public key command from the peer device
655ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - saves the peer public key;
656ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - sets the flag indicating that the peer public key is received;
657ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - calls smp_wait_for_both_public_keys(...).
658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6615ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
6665ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
6675ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
6685ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->peer_publ_key.x, p, BT_OCTET32_LEN);
673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->peer_publ_key.y, p, BT_OCTET32_LEN);
6749181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach
6759181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach  Point pt;
6769181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach  memcpy(pt.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN);
6779181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach  memcpy(pt.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN);
6789181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach
6799181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach  if (!ECC_ValidatePoint(pt)) {
6809181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach    android_errorWriteLog(0x534e4554, "72377774");
6819181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach    tSMP_INT_DATA smp;
6829181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach    smp.status = SMP_PAIR_AUTH_FAIL;
6839181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp);
6849181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach    return;
6859181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach  }
6869181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach
687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY;
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_wait_for_both_public_keys(p_cb, NULL);
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_pairing_commitment
694ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing commitment from peer device
695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
6975ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
7025ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7035ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
7045ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM;
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->remote_commitment, p, BT_OCTET16_LEN);
712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
714444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_dhkey_check
717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process DHKey Check from peer device
718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
7205ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
7255ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7265ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
7275ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->remote_dhkey_check, p, BT_OCTET16_LEN);
733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
734444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
739ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_keypress_notification
740ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing keypress notification from peer device
741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
7435ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
7465ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  p_cb->status = p_data->status;
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
7495ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7505ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
7515ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_UINT8(p_cb->peer_keypress_notification, p);
757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE;
759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT;
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
762444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
764ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_pairing_command
765ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Process the SMP pairing request/response from peer device via
766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              BR/EDR transport.
767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_pairing_command(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
7695ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* rejecting BR pairing request over non-SC BR link */
774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) {
7755ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7765ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_XTRANS_DERIVE_NOT_ALLOW;
7775ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* erase all keys if it is slave proc pairing req*/
782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_clear_ble_keys(p_dev_rec);
784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_io_caps, p);
788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_auth_req, p);
790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_enc_size, p);
791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_i_key, p);
792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_r_key, p);
793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
7955ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
7965ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_INVALID_PARAMETERS;
7975ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* peer (master) started pairing sending Pairing Request */
802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* or being master device always use received i/r key as keys to distribute */
803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key = p_cb->peer_i_key;
804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key = p_cb->peer_r_key;
805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->new_encryption_key_is_p256 = false;
808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* shortcut to skip Security Grant step */
809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
810b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  } else {
811b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* Master receives pairing response */
812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG(
813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "%s master rcvs valid PAIRING RESPONSE."
814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        " Supposed to move to key distribution phase. ",
815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        __func__);
816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* auth_req received via BR/EDR SM channel is set to 0,
819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     but everything derived/exchanged has to be saved */
820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->peer_auth_req |= SMP_AUTH_BOND;
821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->loc_auth_req |= SMP_AUTH_BOND;
822444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
823444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
824444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
825ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_security_grant
826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security grant in case of pairing over BR/EDR transport.
827ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_security_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
8305ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  if (p_data->status != SMP_SUCCESS) {
831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data);
832b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  } else {
833b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* otherwise, start pairing; send IO request callback */
834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
836444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
837444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
839ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_check_authorization_request
840ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  sets the SMP kes to be derived/distribute over BR/EDR transport
841ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              before starting the distribution/derivation
842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
844b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s rcvs i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
845b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon                  __func__, p_cb->local_i_key, p_cb->local_r_key);
846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* In LE SC mode LK field is ignored when BR/EDR transport is used */
848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ** Set local_r_key on master to expect only these keys. */
853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_MASTER) {
854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
857e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  /* Check if H7 function needs to be used for key derivation*/
858e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  if ((p_cb->loc_auth_req & SMP_H7_SUPPORT_BIT) &&
859e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski      (p_cb->peer_auth_req & SMP_H7_SUPPORT_BIT)) {
860e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski    p_cb->key_derivation_h7_used = TRUE;
861e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  }
862e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  SMP_TRACE_DEBUG("%s: use h7 = %d", __func__, p_cb->key_derivation_h7_used);
863e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski
864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
865b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, p_cb->local_i_key, p_cb->local_r_key);
867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->local_i_key || p_cb->local_r_key)) {
871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL);
872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if no peer key is expected, start master key distribution */
874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0)
875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_key_distribution_by_transport(p_cb, NULL);
876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
8775ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
8785ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_SUCCESS;
8795ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
881444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_select_next_key
885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  selects the next key to derive/send when BR/EDR transport is
886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              used.
887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE ||
893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_pick_key(p_cb, p_data);
895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->local_i_key && !p_cb->local_r_key) {
898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* state check to prevent re-entrance */
899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) {
9005ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      if (p_cb->total_tx_unacked == 0) {
9015ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
9025ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_SUCCESS;
9035ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
9045ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      } else {
905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->wait_for_authorization_complete = true;
9065ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      }
907444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_enc_info
913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process encryption information from peer device
914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
9165ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
9175cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
924ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_master_id
925ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process master ID from slave device
926ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_master_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
9285ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PENC_KEYS le_key;
930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true);
933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(le_key.ediv, p);
935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(le_key.rand, p, BT_OCTET8_LEN);
936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store the encryption keys from peer device */
938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.key_size = p_cb->loc_enc_size;
9415cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC,
945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
951ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_enc_info
952ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process identity information from peer device
953ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
9555ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
9565cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
961444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
962444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
963ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_id_addr
964ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process identity address from peer device
965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
9675ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t* p = p_data->p_data;
968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PID_KEYS pid_key;
969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true);
972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(pid_key.addr_type, p);
974b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(pid_key.static_addr, p);
975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN);
976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* to use as BD_ADDR for lk derived from ltk */
978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->id_addr_rcvd = true;
979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->id_addr_type = pid_key.addr_type;
980c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_cb->id_addr = pid_key.static_addr;
981e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store the ID key from peer device */
983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID,
986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&pid_key, true);
987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
988444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_srk_info
992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security information from peer device
993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PCSRK_KEYS le_key;
996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true);
999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save CSRK to security record */
1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
1002b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon
1003b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* get peer CSRK */
10045ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  maybe_non_aligned_memcpy(le_key.csrk, p_data->p_data, BT_OCTET16_LEN);
1005b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon
1006b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* initialize the peer counter */
1007b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  le_key.counter = 0;
1008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PCSRK,
1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
1014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1017ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_compare
1018ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process compare value
1019ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_compare(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) {
1023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* compare the max encryption key size, and save the smaller one for the
1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     * link */
1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->loc_enc_size = p_cb->peer_enc_size;
1027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->role == HCI_ROLE_SLAVE)
1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
1030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else {
1031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* master device always use received i/r key as keys to distribute */
1032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key = p_cb->peer_i_key;
1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key = p_cb->peer_r_key;
1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
10395ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
10405ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
10415ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_CONFIRM_VALUE_ERR;
10425ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1044444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1045444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1047ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sl_key
1048ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process key ready events.
1049ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sl_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t key_type = p_data->key.key_type;
1052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (key_type == SMP_KEY_TYPE_TK) {
1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_generate_srand_mrand_confirm(p_cb, NULL);
1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (key_type == SMP_KEY_TYPE_CFM) {
1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_set_state(SMP_STATE_WAIT_CONFIRM);
1058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1065ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_enc
1066ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  start encryption
1067ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_enc(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_STATUS cmd;
1070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_data != NULL)
1073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    cmd = btm_ble_start_encrypt(p_cb->pairing_bda, true, p_data->key.p_data);
1074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else
1075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    cmd = btm_ble_start_encrypt(p_cb->pairing_bda, false, NULL);
1076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
10775ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) {
10785ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
10795ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_ENC_FAIL;
10805ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
10815ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  }
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1084444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1085ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_discard
1086ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description   processing for discard security request
1087ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_discard(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
1091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_reset_control_value(p_cb);
1092444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1095ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_enc_cmpl
1096ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description   encryption success
1097ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_enc_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
10995ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t enc_enable = p_data->status;
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
11025ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  tSMP_INT_DATA smp_int_data;
11035ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
11045ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_check_auth_req
1109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  check authentication request
1110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_check_auth_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
11125ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  uint8_t enc_enable = p_data->status;
1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
1115b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      "%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key);
1117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (enc_enable == 1) {
1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->le_secure_connections_mode_is_used) {
1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode LTK is used instead of STK and has to be always saved */
1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC;
1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC;
1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode LK is derived from LTK only if both sides request it */
1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) ||
1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) {
1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ** Set local_r_key on master to expect only these keys.
1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      */
1133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
1135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
1137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* in legacy mode derivation of BR/EDR LK is not supported */
1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG(
1142b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon        "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        __func__, p_cb->local_i_key, p_cb->local_r_key);
1144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
1146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
1147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (p_cb->local_i_key || p_cb->local_r_key)) {
1148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
11495ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    } else {
11505ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
11515ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
11525ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
11535ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    }
1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (enc_enable == 0) {
11555ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
11565ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if failed for encryption after pairing, send callback */
1158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
11595ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if enc failed for old security information */
1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if master device, clean up and abck to idle; slave device do nothing */
1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else if (p_cb->role == HCI_ROLE_MASTER) {
11635ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_pick_key
1170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Pick a key distribution function based on the key mask.
1171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_pick_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t key_to_dist =
1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->local_r_key : p_cb->local_i_key;
1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t i = 0;
1176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s key_to_dist=0x%x", __func__, key_to_dist);
1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while (i < SMP_KEY_DIST_TYPE_MAX) {
1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("key to send = %02x, i = %d", key_to_dist, i);
1180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (key_to_dist & (1 << i)) {
1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("smp_distribute_act[%d]", i);
1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (*smp_distribute_act[i])(p_cb, p_data);
1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    i++;
1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1190ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_distribution
1191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  start key distribution if required.
1192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE ||
1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_pick_key(p_cb, p_data);
1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->local_i_key && !p_cb->local_r_key) {
1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* state check to prevent re-entrant */
1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (smp_get_state() == SMP_STATE_BOND_PENDING) {
1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->derive_lk) {
1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_derive_link_key_from_long_term_key(p_cb, NULL);
1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->derive_lk = false;
1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->total_tx_unacked == 0) {
1211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /*
1212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * Instead of declaring authorization complete immediately,
1213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * delay the event from being sent by SMP_DELAYED_AUTH_TIMEOUT_MS.
1214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * This allows the slave to send over Pairing Failed if the
1215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * last key is rejected.  During this waiting window, the
1216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * state should remain in SMP_STATE_BOND_PENDING.
1217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         */
1218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (!alarm_is_scheduled(p_cb->delayed_auth_timer_ent)) {
1219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_DEBUG("%s delaying auth complete.", __func__);
1220be8bbd7a83ec8bc900fac58a03010fbcb74956c9Jakub Pawlowski          alarm_set_on_mloop(p_cb->delayed_auth_timer_ent,
1221be8bbd7a83ec8bc900fac58a03010fbcb74956c9Jakub Pawlowski                             SMP_DELAYED_AUTH_TIMEOUT_MS,
1222be8bbd7a83ec8bc900fac58a03010fbcb74956c9Jakub Pawlowski                             smp_delayed_auth_complete_timeout, NULL);
1223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->wait_for_authorization_complete = true;
1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_decide_association_model
1233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to select assoc model to be used for
1234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  STK generation and to start STK generation process.
1235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t int_evt = 0;
12395ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  tSMP_INT_DATA smp_int_data;
1240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s Association Model = %d", __func__,
1242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->selected_association_model);
1243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */
1246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER &&
1247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) {
1249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_ERROR(
1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "IO capability does not meet authentication requirement");
12515ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_PAIR_AUTH_FAIL;
1252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        int_evt = SMP_AUTH_CMPL_EVT;
1253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        p_cb->sec_level);
1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
12585ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_KEY key;
1259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        key.key_type = SMP_KEY_TYPE_TK;
1260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        key.p_data = p_cb->tk;
12615ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.key = key;
1262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memset(p_cb->tk, 0, BT_OCTET16_LEN);
1264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* TK, ready  */
1265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        int_evt = SMP_KEY_READY_EVT;
1266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_PASSKEY:
1270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->sec_level);
1273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_TK_REQ_EVT;
1276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_OOB:
1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
1280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->sec_level);
1283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_OOB_REQ_EVT;
1285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_TK_REQ_EVT;
1286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_KEY_NOTIF:
1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("Need to generate Passkey");
1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* generate passkey and notify application */
1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_generate_passkey(p_cb, NULL);
1294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT;
1302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_OUT_OF_RANGE:
1305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)");
13065ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_UNKNOWN_IO_CAP;
1307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_AUTH_CMPL_EVT;
1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          "Association Model = %d (SOMETHING IS WRONG WITH THE CODE)",
1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->selected_association_model);
13145ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_UNKNOWN_IO_CAP;
1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_AUTH_CMPL_EVT;
1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_EVENT("sec_level=%d ", p_cb->sec_level);
13195ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson  if (int_evt) smp_sm_event(p_cb, int_evt, &smp_int_data);
1320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_io_response
1324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process IO response for a slave device.
1325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_io_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* pairing started by local (slave) Security Request */
1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_set_state(SMP_STATE_SEC_REQ_PENDING);
1332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* plan to send pairing respond */
1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
1335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* pairing started by peer (master) Pairing Request */
1336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->selected_association_model = smp_select_association_model(p_cb);
1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->secure_connections_only_mode_required &&
1339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (!(p_cb->le_secure_connections_mode_is_used) ||
1340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
1341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
1342b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "Slave requires secure connection only mode "
1343b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "but it can't be provided -> Slave fails pairing");
13445ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
13455ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_PAIR_AUTH_FAIL;
13465ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
1348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
1351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (smp_request_oob_data(p_cb)) return;
1352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
13530bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    // PTS Testing failure modes
1355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (pts_test_send_authentication_complete_failure(p_cb)) return;
13560bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_pair_rsp(p_cb, NULL);
1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1361444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1362ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_slave_keys_response
1363ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process application keys response for a slave device
1364ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              (BR/EDR transport).
1365ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_slave_keys_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_br_send_pair_response(p_cb, NULL);
1368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1370444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_send_pair_response
13729ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  actions related to sending pairing response over BR/EDR
13739ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              transport.
1374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_send_pair_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= p_cb->peer_i_key;
1379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= p_cb->peer_r_key;
1380444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb);
1382444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1383444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1385ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_pairing_cmpl
13869ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
13879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
1388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pairing_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->total_tx_unacked == 0) {
1391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* process the pairing complete */
1392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1394444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1396444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_pair_terminate
13989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
13999ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
1400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pair_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->status = SMP_CONN_TOUT;
1404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_proc_pairing_cmpl(p_cb);
1405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_idle_terminate
14099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function calledin idle state to determine to send
14109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  authentication complete or not.
1411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_idle_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
1415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->status = SMP_FAIL;
1416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
1417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_fast_conn_param
1422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  apply default connection parameter for pairing process
1423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_fast_conn_param(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Disable L2CAP connection parameter updates while bonding since
1426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     some peripherals are not able to revert to fast connection parameters
1427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     during the start of service discovery. Connection paramter updates
1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     get enabled again once service discovery completes. */
1429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, false);
1430444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1431444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1432444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_both_have_public_keys
1434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  The function is called when both local and peer public keys are
1435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              saved.
1436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              Actions:
1437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - invokes DHKey computation;
1438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - on slave side invokes sending local public key to the peer.
1439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - invokes SC phase 1 process.
1440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_both_have_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* invokes DHKey computation */
1445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_compute_dhkey(p_cb);
1446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* on slave side invokes sending local public key to the peer */
1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) smp_send_pair_public_key(p_cb, NULL);
1449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL);
1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_secure_connection_phase1
14559ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Start Secure Connection phase1 i.e. invokes initialization of
14569ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              Secure Connection phase 1 parameters and starts building/sending
14579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              to the peer messages appropriate for the role and association
14589ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              model.
1459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_secure_connection_phase1(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_cb->sec_level);
1467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_cb->sec_level);
1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(p_cb->local_random, 0, BT_OCTET16_LEN);
1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_start_nonce_generation(p_cb);
1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* user has to provide passkey */
1481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL);
1483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* passkey has to be provided to user */
1486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("Need to generate SC Passkey");
1487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_generate_passkey(p_cb, NULL);
1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* use the available OOB information */
1491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_process_secure_connection_oob_data(p_cb, NULL);
1492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1501ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_local_nonce
1502ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  The function processes new local nonce.
1503ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1504ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be called in SC phase1.
1505ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_local_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave calculates and sends local commitment */
1514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_calculate_local_commitment(p_cb);
1515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_commitment(p_cb, NULL);
1516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave has to wait for peer nonce */
1517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_WAIT_NONCE);
1518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* i.e. master */
1519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* slave commitment is already received, send local nonce, wait for
1522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           * remote nonce*/
1523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_DEBUG(
1524b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "master in assoc mode = %d "
1525b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "already rcvd slave commitment - race condition",
1526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->selected_association_model);
1527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_send_rand(p_cb, NULL);
1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_set_state(SMP_STATE_WAIT_NONCE);
1530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_calculate_local_commitment(p_cb);
1536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_commitment(p_cb, NULL);
1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* slave */
1540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* master commitment is already received */
1543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_send_commitment(p_cb, NULL);
1544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_set_state(SMP_STATE_WAIT_NONCE);
1545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_set_state(SMP_STATE_WAIT_NONCE);
1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1561444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1563ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_peer_nonce
15649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  The function processes newly received and saved in CB peer
15659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              nonce. The actions depend on the selected association model and
15669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              the role.
1567ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1568ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be called in SC phase1.
1569ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s start ", __func__);
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // PTS Testing failure modes
1574fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if (p_cb->cert_failure == SMP_CONFIRM_VALUE_ERR) {
1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
15765ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
15775ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
15785ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_CONFIRM_VALUE_ERR;
15795ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1582fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  // PTS Testing failure modes (for LT)
1583fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if ((p_cb->cert_failure == SMP_NUMERIC_COMPAR_FAIL) &&
1584fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) &&
1585fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      (p_cb->role == HCI_ROLE_SLAVE)) {
1586fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
15875ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
15885ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL;
15895ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_NUMERIC_COMPAR_FAIL;
15905ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1591fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    return;
1592fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  }
1593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* in these models only master receives commitment */
1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (!smp_check_commitment(p_cb)) {
16005ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          tSMP_INT_DATA smp_int_data;
16015ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
16025ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          p_cb->failure = SMP_CONFIRM_VALUE_ERR;
16035ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson          smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
1605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave sends local nonce */
1608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* go directly to phase 2 */
1613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* numeric comparison */
1615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_WAIT_NONCE);
1617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL);
1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1622fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      if (!smp_check_commitment(p_cb) &&
1623fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa          p_cb->cert_failure != SMP_NUMERIC_COMPAR_FAIL) {
16245ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        tSMP_INT_DATA smp_int_data;
16255ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
16265ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        p_cb->failure = SMP_CONFIRM_VALUE_ERR;
16275ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
16300bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (++p_cb->round < 20) {
1636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_SEC_CONN_PHS1_START);
1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_start_nonce_generation(p_cb);
1639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s end ", __func__);
1658444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1660444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_match_dhkey_checks
1662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  checks if the calculated peer DHKey Check value is the same as
1663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              received from the peer DHKey check value.
1664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_match_dhkey_checks(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) {
1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_WARNING("dhkey chcks do no match");
16715ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
16725ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = SMP_DHKEY_CHK_FAIL;
16735ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    p_cb->failure = SMP_DHKEY_CHK_FAIL;
16745ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_EVENT("dhkey chcks match");
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* compare the max encryption key size, and save the smaller one for the link
1681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   */
1682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->loc_enc_size = p_cb->peer_enc_size;
1684444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
1686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL);
1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* master device always use received i/r key as keys to distribute */
1689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_i_key = p_cb->peer_i_key;
1690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key = p_cb->peer_r_key;
1691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1693444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1695444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1696ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_move_to_secure_connections_phase2
1697ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Signal State Machine to start SC phase 2 initialization (to
1698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              compute local DHKey Check value).
1699ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1700ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         SM is supposed to be in the state SMP_STATE_SEC_CONN_PHS2_START.
1701ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_move_to_secure_connections_phase2(tSMP_CB* p_cb,
1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                           tSMP_INT_DATA* p_data) {
1704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_phase_2_dhkey_checks_are_present
17109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  generates event if dhkey check from the peer is already
17119ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              received.
1712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be used on slave to prevent race condition.
17149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              It is supposed to be called after slave dhkey check is
17159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              calculated.
1716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_phase_2_dhkey_checks_are_present(tSMP_CB* p_cb,
1718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                          tSMP_INT_DATA* p_data) {
1719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
17205cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK)
1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL);
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1724444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1726ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_wait_for_both_public_keys
17279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  generates SMP_BOTH_PUBL_KEYS_RCVD_EVT event when both local and
17289ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              master public keys are available.
1729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         on the slave it is used to prevent race condition.
1731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_wait_for_both_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) &&
1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) {
1738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((p_cb->role == HCI_ROLE_SLAVE) &&
1739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        ((p_cb->req_oob_type == SMP_OOB_LOCAL) ||
1740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->req_oob_type == SMP_OOB_BOTH))) {
1741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_set_state(SMP_STATE_PUBLIC_KEY_EXCH);
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL);
1744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1746444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_passkey_verification
1749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Starts SC passkey entry verification.
1750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_passkey_verification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = NULL;
17535cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
1754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = p_cb->local_random;
1756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT32_TO_STREAM(p, p_data->passkey);
1757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = p_cb->peer_random;
1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT32_TO_STREAM(p, p_data->passkey);
17606975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->round = 0;
1762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
17636975b4d711142b885af479721cada448952c6b41Andre Eisenbach}
17646975b4d711142b885af479721cada448952c6b41Andre Eisenbach
17656975b4d711142b885af479721cada448952c6b41Andre Eisenbach/*******************************************************************************
1766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_secure_connection_oob_data
1767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Processes local/peer SC OOB data received from somewhere.
1768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_oob_data(tSMP_CB* p_cb,
1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            tSMP_INT_DATA* p_data) {
1771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
17726975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_SC_OOB_DATA* p_sc_oob_data = &p_cb->sc_oob_data;
1774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_sc_oob_data->loc_oob_data.present) {
1775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->local_random, p_sc_oob_data->loc_oob_data.randomizer,
1776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->local_random));
1777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("%s: local OOB randomizer is absent", __func__);
1779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
1780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1781444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_sc_oob_data->peer_oob_data.present) {
1783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("%s: peer OOB data is absent", __func__);
1784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(p_cb->peer_random, 0, sizeof(p_cb->peer_random));
1785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->peer_random, p_sc_oob_data->peer_oob_data.randomizer,
1787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->peer_random));
1788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment,
1789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->remote_commitment));
1790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* check commitment */
1792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!smp_check_commitment(p_cb)) {
17935ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      tSMP_INT_DATA smp_int_data;
17945ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
17955ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      p_cb->failure = SMP_CONFIRM_VALUE_ERR;
17965ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
1798444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
17996975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) {
1801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* the peer doesn't have local randomiser */
1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT(
1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          "%s: peer didn't receive local OOB data, set local randomizer to 0",
1804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          __func__);
1805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
1806444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  print128(p_cb->local_random, (const uint8_t*)"local OOB randomizer");
1810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  print128(p_cb->peer_random, (const uint8_t*)"peer OOB randomizer");
1811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1813444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1815ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_set_local_oob_keys
18169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Saves calculated private/public keys in
18179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              sc_oob_data.loc_oob_data, starts nonce generation
1818ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              (to be saved in sc_oob_data.loc_oob_data.randomizer).
1819ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1822444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(p_cb->sc_oob_data.loc_oob_data.private_key_used, p_cb->private_key,
1824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         BT_OCTET32_LEN);
1825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->sc_oob_data.loc_oob_data.publ_key_used = p_cb->loc_publ_key;
1826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18288fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
18298fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/*******************************************************************************
1830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_set_local_oob_random_commitment
18319ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Saves calculated randomizer and commitment in
18329ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              sc_oob_data.loc_oob_data, passes sc_oob_data.loc_oob_data up
18339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              for safekeeping.
1834ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_random_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(p_cb->sc_oob_data.loc_oob_data.randomizer, p_cb->rand, BT_OCTET16_LEN);
1838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_calculate_f4(p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.randomizer, 0,
1842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.commitment);
1843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1844d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SMP_DEBUG == TRUE)
1845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p_print = NULL;
1846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("local SC OOB data set:");
1847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.addr_sent_to;
1848648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "addr_sent_to",
1849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                      sizeof(tBLE_BD_ADDR));
1850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.private_key_used;
1851648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "private_key_used",
1852648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.x;
1854648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.x",
1855648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.y;
1857648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.y",
1858648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.randomizer;
1860648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "randomizer", BT_OCTET16_LEN);
1861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.commitment;
1862648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "commitment", BT_OCTET16_LEN);
1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("");
1864444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
18658fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
1866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* pass created OOB data up */
1867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = SMP_SC_LOC_OOB_DATA_UP_EVT;
1868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_app_cback(p_cb, NULL);
1869444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_cb_cleanup(p_cb);
1871444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
18728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1874ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1875ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_link_encrypted
1876ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
18779ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called when link is encrypted and notified
18789ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  to the slave device. Proceed to to send LTK, DIV and ER to
18799ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  master if bonding the devices.
1880ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1885a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid smp_link_encrypted(const RawAddress& bda, uint8_t encr_enable) {
1886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_CB* p_cb = &smp_cb;
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1888b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: encr_enable=%d", __func__, encr_enable);
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1890c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  if (smp_cb.pairing_bda == bda) {
1891b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* encryption completed with STK, remember the key size now, could be
1892b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon     * overwritten when key exchange happens                                 */
1893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->loc_enc_size != 0 && encr_enable) {
1894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* update the link encryption key size if a SMP pairing just performed */
1895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
18985ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
18995ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = encr_enable;
19005ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &smp_int_data);
1901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1905ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_proc_ltk_request
1907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when LTK request is received from
1909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  controller.
1910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1914a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool smp_proc_ltk_request(const RawAddress& bda) {
1915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s state = %d", __func__, smp_cb.state);
1916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool match = false;
19171da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora
1918c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  if (bda == smp_cb.pairing_bda) {
1919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    match = true;
1920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
1922c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    if (p_dev_rec != NULL && p_dev_rec->ble.pseudo_addr == smp_cb.pairing_bda &&
1923b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski        p_dev_rec->ble.pseudo_addr != RawAddress::kEmpty) {
1924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      match = true;
19251da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora    }
1926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) {
1929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL);
1930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return true;
1931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1935444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1937ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1938ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_process_secure_connection_long_term_key
1939ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to process SC LTK.
1941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  SC LTK is calculated and used instead of STK.
1942ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  Here SC LTK is saved in BLE DB.
1943ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1944ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1945ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_long_term_key(void) {
1948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_CB* p_cb = &smp_cb;
1949444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_save_secure_connections_long_term_key(p_cb);
1952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
1954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
1955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1956444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1957444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1958ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1959ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_set_derive_link_key
1960ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1961ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to set flag that indicates that
1962ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  BR/EDR LK has to be derived from LTK after all keys are
1963ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  distributed.
1964ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1966ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_derive_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1969911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->derive_lk = true;
1971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_LK, false);
1972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
1973e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun}
1974e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
1975e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun/*******************************************************************************
1976ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1977ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_derive_link_key_from_long_term_key
1978ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1979ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to derive BR/EDR LK from LTK.
1980ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_derive_link_key_from_long_term_key(tSMP_CB* p_cb,
1985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            tSMP_INT_DATA* p_data) {
1986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
1987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!smp_calculate_link_key_from_long_term_key(p_cb)) {
1990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_ERROR("%s failed", __func__);
19915ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
19925ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = status;
19935ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1999ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2000ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_br_process_link_key
2001ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2002ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to process BR/EDR LK:
2003ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  - to derive SMP LTK from BR/EDR LK;
2004b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon *                  - to save SMP LTK.
2005ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2006ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2007ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2008ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
2011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!smp_calculate_long_term_key_from_link_key(p_cb)) {
2014b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    SMP_TRACE_ERROR("%s: failed", __func__);
20155ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    tSMP_INT_DATA smp_int_data;
20165ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_int_data.status = status;
20175ce55bd2e01e738e7558038c403bc87e035ba583Myles Watson    smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
2018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
2019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
202172072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
202272072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure  if (p_dev_rec) {
202372072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure    SMP_TRACE_DEBUG("%s: dev_type = %d ", __func__, p_dev_rec->device_type);
202472072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure    p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE;
202572072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure  } else {
202672072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure    SMP_TRACE_ERROR("%s failed to find Security Record", __func__);
202772072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure  }
202872072a06c3305867c597cb41024a4b90812b01f7Nitin Shivpure
2029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s: LTK derivation from LK successfully completed",
2030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  __func__);
2031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_save_secure_connections_long_term_key(p_cb);
2032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
2033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_br_select_next_key(p_cb, NULL);
2034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
2037ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_distribution_by_transport
2038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  depending on the transport used at the moment calls either
2039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              smp_key_distribution(...) or smp_br_key_distribution(...).
2040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->smp_over_br) {
2044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_select_next_key(p_cb, NULL);
2045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
2046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_distribution(p_cb, NULL);
2047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
2051ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_br_pairing_complete
20529ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
20539ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
2054ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2057d0aa8e53aa7ac1137a47570e08c2b963aaa49141Satya Calloji
2058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->total_tx_unacked == 0) {
2059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* process the pairing complete */
2060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
2061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2063