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