smp_act.cc revision c2276b06572ab6fc1f900fbb1f41087e77d47e2a
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
31fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa
32911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonconst tSMP_ACT smp_distribute_act[] = {smp_generate_ltk, smp_send_id_info,
33911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       smp_generate_csrk,
34911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       smp_set_derive_link_key};
350bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
36c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskistatic bool lmp_version_below(const bt_bdaddr_t& bda, uint8_t version) {
37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE);
38911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (acl == NULL || acl->lmp_version == 0) {
39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_WARNING("%s cannot retrieve LMP version...", __func__);
40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s LMP version %d < %d", __func__, acl->lmp_version,
43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    version);
44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return acl->lmp_version < version;
45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson}
46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bool pts_test_send_authentication_complete_failure(tSMP_CB* p_cb) {
48fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  uint8_t reason = p_cb->cert_failure;
49fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if (reason == SMP_PAIR_AUTH_FAIL || reason == SMP_PAIR_FAIL_UNKNOWN ||
50fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      reason == SMP_PAIR_NOT_SUPPORT || reason == SMP_PASSKEY_ENTRY_FAIL ||
51fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      reason == SMP_REPEATED_ATTEMPTS) {
52fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
53fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    return true;
54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
55fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  return false;
560bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora}
570bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_update_key_mask
60ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function updates the key mask for sending or receiving.
61ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void smp_update_key_mask(tSMP_CB* p_cb, uint8_t key_type, bool recv) {
63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      "%s before update role=%d recv=%d local_i_key = %02x, local_r_key = %02x",
65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key);
66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (((p_cb->le_secure_connections_mode_is_used) || (p_cb->smp_over_br)) &&
68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ((key_type == SMP_SEC_KEY_TYPE_ENC) ||
69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       (key_type == SMP_SEC_KEY_TYPE_LK))) {
70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* in LE SC mode LTK, CSRK and BR/EDR LK are derived locally instead of
71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ** being exchanged with the peer */
72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_i_key &= ~key_type;
73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key &= ~key_type;
74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (p_cb->role == HCI_ROLE_SLAVE) {
75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (recv)
76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~key_type;
77444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~key_type;
79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (recv)
81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~key_type;
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~key_type;
84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x",
87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->local_i_key, p_cb->local_r_key);
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
89444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
91ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_app_cback
929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  notifies application about the events the application is
939ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              interested in
94ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_app_cback(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_EVT_DATA cb_data;
97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS callback_rc;
98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d", __func__, p_cb->cb_evt);
99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->p_callback && p_cb->cb_evt != 0) {
100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    switch (p_cb->cb_evt) {
101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_IO_CAP_REQ_EVT:
102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.auth_req = p_cb->peer_auth_req;
103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.oob_data = SMP_OOB_NONE;
104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS;
105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.init_keys = p_cb->local_i_key;
107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.resp_keys = p_cb->local_r_key;
108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_WARNING("io_cap = %d", cb_data.io_req.io_cap);
109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_NC_REQ_EVT:
112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.passkey = p_data->passkey;
113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SC_OOB_REQ_EVT:
115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.req_oob_type = p_data->req_oob_type;
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SC_LOC_OOB_DATA_UP_EVT:
118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data;
119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_BR_KEYS_REQ_EVT:
122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.auth_req = 0;
123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.oob_data = SMP_OOB_NONE;
124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.io_cap = 0;
125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY;
127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY;
128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      default:
131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    callback_rc =
135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("%s: callback_rc=%d  p_cb->cb_evt=%d", __func__,
138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    callback_rc, p_cb->cb_evt);
139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (callback_rc == SMP_SUCCESS) {
141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      switch (p_cb->cb_evt) {
142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case SMP_IO_CAP_REQ_EVT:
143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_auth_req = cb_data.io_req.auth_req;
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_io_capability = cb_data.io_req.io_cap;
145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_oob_flag = cb_data.io_req.oob_data;
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_enc_size = cb_data.io_req.max_key_size;
147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key = cb_data.io_req.init_keys;
148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key = cb_data.io_req.resp_keys;
149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) {
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            SMP_TRACE_WARNING("Non bonding: No keys will be exchanged");
152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_i_key = 0;
153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_r_key = 0;
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
157b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "rcvd auth_req: 0x%02x, io_cap: %d "
158b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "loc_oob_flag: %d loc_enc_size: %d, "
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "local_i_key: 0x%02x, local_r_key: 0x%02x",
160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag,
161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key);
162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->secure_connections_only_mode_required =
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (p_cb->secure_connections_only_mode_required) {
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT;
168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) ||
171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2) ||
172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS,
173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                 (const bt_bdaddr_t*)&p_cb->pairing_bda)) {
174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT;
175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x",
181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key);
182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case SMP_BR_KEYS_REQ_EVT:
187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->loc_enc_size = cb_data.io_req.max_key_size;
188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key = cb_data.io_req.init_keys;
189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key = cb_data.io_req.resp_keys;
190e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski          p_cb->loc_auth_req |= SMP_H7_SUPPORT_BIT;
191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_WARNING(
196b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "for SMP over BR max_key_size: 0x%02x, local_i_key: 0x%02x, "
197b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "local_r_key: 0x%02x, p_cb->loc_auth_req: 0x%02x",
198e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski              p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key,
199e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski              p_cb->loc_auth_req);
200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL);
202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->cb_evt && p_cb->discard_sec_req) {
208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->discard_sec_req = false;
209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
212b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: return", __func__);
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_fail
217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  pairing failure to peer device if needed.
218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->status = *(uint8_t*)p_data;
221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->failure = *(uint8_t*)p_data;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
223b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: status=%d failure=%d ", __func__, p_cb->status,
224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->failure);
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC &&
227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->status != SMP_SUCCESS) {
228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->wait_for_authorization_complete = true;
230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_req
235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  actions related to sending pairing request
236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2402d41fe1c5dbac701a074eec272545439168930a7Andre Eisenbach
241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* erase all keys when master sends pairing req*/
242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec) btm_sec_clear_ble_keys(p_dev_rec);
243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* do not manipulate the key, let app decide,
244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     leave out to BTM to mandate key distribution for bonding case */
245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_rsp
250ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  actions related to sending pairing response
251ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_rsp(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
2545cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= p_cb->peer_i_key;
256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= p_cb->peer_r_key;
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb)) {
259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_use_oob_private_key(p_cb, NULL);
261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_decide_association_model(p_cb, NULL);
263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
267ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_confirm
268ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send confirmation to the peer
269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_init
277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing initializer to slave device
278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_INIT, p_cb);
282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_rand
286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send pairing random to the peer
287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_RAND, p_cb);
291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2925cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
294ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_pair_public_key
295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send pairing public key command to the peer
296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_pair_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_PUBLIC_KEY, p_cb);
300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     SMP_SEND_COMMITMENT
304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send commitment command to the peer
305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_COMMITM, p_cb);
309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_dhkey_check
313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send DHKey Check command to the peer
314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_DHKEY_CHECK, p_cb);
318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_keypress_notification
322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description send Keypress Notification command to the peer
323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_keypress_notification = *(uint8_t*)p_data;
326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb);
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
330ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_enc_info
331ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send encryption information command.
332ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_LENC_KEYS le_key;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
336b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the DIV and key size information when acting as slave device */
343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.div = p_cb->div;
345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.key_size = p_cb->loc_enc_size;
346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC,
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s", __func__);
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
357444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_id_info
360ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send ID information command.
361ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_KEY_VALUE le_key;
364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false);
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
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_LID, &le_key, true);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_WARNING("%s", __func__);
375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_csrk_info
380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send CSRK command.
381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_LCSRK_KEYS key;
384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) {
388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.div = p_cb->div;
389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.sec_level = p_cb->sec_level;
390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    key.counter = 0; /* initialize the local counter */
391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(key.csrk, p_cb->csrk, BT_OCTET16_LEN);
392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK,
393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&key, true);
394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_send_ltk_reply
401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  send LTK reply
402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_send_ltk_reply(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* send stk as LTK response */
406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_ltk_request_reply(p_cb->pairing_bda, true, p_data->key.p_data);
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
408444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sec_req
411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security request.
412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_AUTH_REQ auth_req = *(tBTM_LE_AUTH_REQ*)p_data;
415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_SEC_REQ_ACT sec_req_act;
416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
418b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: auth_req=0x%x", __func__, auth_req);
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = 0;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
424b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: sec_req_act=0x%x", __func__, sec_req_act);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (sec_req_act) {
427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_ENCRYPT:
428b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      SMP_TRACE_DEBUG("%s: BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__);
429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_PAIR:
433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->secure_connections_only_mode_required =
434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* respond to non SC pairing request as failure in SC only mode */
437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->secure_connections_only_mode_required &&
438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (auth_req & SMP_SC_SUPPORT_BIT) == 0) {
439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        reason = SMP_PAIR_AUTH_FAIL;
440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* initialize local i/r key to be default keys */
443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->peer_auth_req = auth_req;
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY;
445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_REQ_ACT_DISCARD:
450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->discard_sec_req = true;
451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* do nothing */
455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sec_grant
461ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security grant.
462ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sec_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t res = *(uint8_t*)p_data;
465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (res != SMP_SUCCESS) {
467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /*otherwise, start pairing */
469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* send IO request callback */
471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_pair_fail
477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing failure from peer device
478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->status = *(uint8_t*)p_data;
482373d928dbadbf0bbaa2e9b1128fedd48b4da41e8Jacky Cheung
483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Cancel pending auth complete timer if set */
484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  alarm_cancel(p_cb->delayed_auth_timer_ent);
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_pair_cmd
489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Process the SMP pairing request/response from peer device
490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_pair_cmd(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_ENC_KEY_SIZE;
494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
497b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* erase all keys if it is slave proc pairing req */
498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_clear_ble_keys(p_dev_rec);
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_io_caps, p);
504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_auth_req, p);
506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_enc_size, p);
507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_i_key, p);
508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_r_key, p);
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    reason = SMP_INVALID_PARAMETERS;
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // PTS Testing failure modes
517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (pts_test_send_authentication_complete_failure(p_cb)) return;
518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) {
521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* peer (master) started pairing sending Pairing Request */
522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key = p_cb->peer_i_key;
523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key = p_cb->peer_r_key;
524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else /* update local i/r key according to pairing request */
527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    {
528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* pairing started with this side (slave) sending Security Request */
529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= p_cb->peer_i_key;
530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= p_cb->peer_r_key;
531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->selected_association_model = smp_select_association_model(p_cb);
532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->secure_connections_only_mode_required &&
534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (!(p_cb->le_secure_connections_mode_is_used) ||
535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           (p_cb->selected_association_model ==
536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            SMP_MODEL_SEC_CONN_JUSTWORKS))) {
537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_ERROR(
538b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon            "%s: pairing failed - slave requires secure connection only mode",
539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            __func__);
540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        reason = SMP_PAIR_AUTH_FAIL;
541444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
5440bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (smp_request_oob_data(p_cb)) return;
547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_pair_rsp(p_cb, NULL);
549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
550444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* Master receives pairing response */
552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->selected_association_model = smp_select_association_model(p_cb);
554444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
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 == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
559b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "Master requires secure connection only mode "
560b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "but it can't be provided -> Master fails pairing");
561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      reason = SMP_PAIR_AUTH_FAIL;
562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (smp_request_oob_data(p_cb)) return;
568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_decide_association_model(p_cb, NULL);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
573444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_confirm
576ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing confirm from peer device
577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_INVALID_PARAMETERS;
581444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
583444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* save the SConfirm for comparison later */
591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN);
592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_init
599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing initializer from peer device
600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_INVALID_PARAMETERS;
604444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
606444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
611444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the SRand for comparison */
613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
615444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
617ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_rand
618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing random (nonce) from peer device
619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_INVALID_PARAMETERS;
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
630444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save the SRand for comparison */
632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
634444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
636ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_pairing_public_key
637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing public key command from the peer device
638ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - saves the peer public key;
639ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - sets the flag indicating that the peer public key is received;
640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - calls smp_wait_for_both_public_keys(...).
641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
642ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_INVALID_PARAMETERS;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->peer_publ_key.x, p, BT_OCTET32_LEN);
655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->peer_publ_key.y, p, BT_OCTET32_LEN);
656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY;
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_wait_for_both_public_keys(p_cb, NULL);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_pairing_commitment
663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing commitment from peer device
664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_pairing_commitment(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  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM;
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->remote_commitment, p, BT_OCTET16_LEN);
680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
682444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
684ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_dhkey_check
685ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process DHKey Check from peer device
686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_dhkey_check(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  if (p != NULL) {
699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_ARRAY(p_cb->remote_dhkey_check, p, BT_OCTET16_LEN);
700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
701444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_keypress_notification
707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process pairing keypress notification from peer device
708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_keypress_notification(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__);
714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->status = *(uint8_t*)p_data;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_UINT8(p_cb->peer_keypress_notification, p);
723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE;
725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT;
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
728444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_pairing_command
731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Process the SMP pairing request/response from peer device via
732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              BR/EDR transport.
733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_pairing_command(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_ENC_KEY_SIZE;
737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* rejecting BR pairing request over non-SC BR link */
741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) {
742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    reason = SMP_XTRANS_DERIVE_NOT_ALLOW;
743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* erase all keys if it is slave proc pairing req*/
748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_clear_ble_keys(p_dev_rec);
750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_io_caps, p);
754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_auth_req, p);
756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_enc_size, p);
757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_i_key, p);
758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(p_cb->peer_r_key, p);
759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (smp_command_has_invalid_parameters(p_cb)) {
761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    reason = SMP_INVALID_PARAMETERS;
762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* peer (master) started pairing sending Pairing Request */
767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* or being master device always use received i/r key as keys to distribute */
768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key = p_cb->peer_i_key;
769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key = p_cb->peer_r_key;
770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->new_encryption_key_is_p256 = false;
773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* shortcut to skip Security Grant step */
774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
775b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  } else {
776b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* Master receives pairing response */
777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG(
778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "%s master rcvs valid PAIRING RESPONSE."
779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        " Supposed to move to key distribution phase. ",
780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        __func__);
781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* auth_req received via BR/EDR SM channel is set to 0,
784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     but everything derived/exchanged has to be saved */
785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->peer_auth_req |= SMP_AUTH_BOND;
786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->loc_auth_req |= SMP_AUTH_BOND;
787444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
789444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_security_grant
791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security grant in case of pairing over BR/EDR transport.
792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_security_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t res = *(uint8_t*)p_data;
795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (res != SMP_SUCCESS) {
797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data);
798b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  } else {
799b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* otherwise, start pairing; send IO request callback */
800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
802444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
803444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
804444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
805ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_check_authorization_request
806ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  sets the SMP kes to be derived/distribute over BR/EDR transport
807ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              before starting the distribution/derivation
808ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_SUCCESS;
811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
812b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s rcvs i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
813b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon                  __func__, p_cb->local_i_key, p_cb->local_r_key);
814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* In LE SC mode LK field is ignored when BR/EDR transport is used */
816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ** Set local_r_key on master to expect only these keys. */
821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_MASTER) {
822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
824444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
825e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  /* Check if H7 function needs to be used for key derivation*/
826e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  if ((p_cb->loc_auth_req & SMP_H7_SUPPORT_BIT) &&
827e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski      (p_cb->peer_auth_req & SMP_H7_SUPPORT_BIT)) {
828e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski    p_cb->key_derivation_h7_used = TRUE;
829e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  }
830e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski  SMP_TRACE_DEBUG("%s: use h7 = %d", __func__, p_cb->key_derivation_h7_used);
831e7f14a682d57811d9df0d64372f222bcc143ec86Jakub Pawlowski
832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
833b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, p_cb->local_i_key, p_cb->local_r_key);
835444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->local_i_key || p_cb->local_r_key)) {
839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL);
840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if no peer key is expected, start master key distribution */
842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0)
843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_key_distribution_by_transport(p_cb, NULL);
844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_select_next_key
851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  selects the next key to derive/send when BR/EDR transport is
852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              used.
853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_SUCCESS;
856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE ||
860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_pick_key(p_cb, p_data);
862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->local_i_key && !p_cb->local_r_key) {
865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* state check to prevent re-entrance */
866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) {
867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->total_tx_unacked == 0)
868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason);
869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      else
870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->wait_for_authorization_complete = true;
871444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
876ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_enc_info
877ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process encryption information from peer device
878ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
8815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_master_id
889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process master ID from slave device
890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_master_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PENC_KEYS le_key;
894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true);
897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(le_key.ediv, p);
899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(le_key.rand, p, BT_OCTET8_LEN);
900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store the encryption keys from peer device */
902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.key_size = p_cb->loc_enc_size;
9055cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC,
909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_enc_info
916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process identity information from peer device
917ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
9205cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY(p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
924444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
925444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_id_addr
928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process identity address from peer device
929ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)p_data;
932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PID_KEYS pid_key;
933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true);
936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(pid_key.addr_type, p);
938c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  STREAM_TO_BDADDR(to_BD_ADDR(pid_key.static_addr), p);
939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN);
940444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* to use as BD_ADDR for lk derived from ltk */
942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->id_addr_rcvd = true;
943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->id_addr_type = pid_key.addr_type;
944c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_cb->id_addr = pid_key.static_addr;
945e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* store the ID key from peer device */
947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->loc_auth_req & SMP_AUTH_BOND))
949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID,
950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&pid_key, true);
951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_srk_info
956ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process security information from peer device
957ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_PCSRK_KEYS le_key;
960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true);
963444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* save CSRK to security record */
965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  le_key.sec_level = p_cb->sec_level;
966b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon
967b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* get peer CSRK */
968b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  maybe_non_aligned_memcpy(le_key.csrk, p_data, BT_OCTET16_LEN);
969b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon
970b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  /* initialize the peer counter */
971b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  le_key.counter = 0;
972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
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_PCSRK,
976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        (tBTM_LE_KEY_VALUE*)&le_key, true);
977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution_by_transport(p_cb, NULL);
978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_compare
982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process compare value
983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_compare(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason;
986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) {
989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* compare the max encryption key size, and save the smaller one for the
990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     * link */
991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->peer_enc_size < p_cb->loc_enc_size)
992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->loc_enc_size = p_cb->peer_enc_size;
993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->role == HCI_ROLE_SLAVE)
995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else {
997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* master device always use received i/r key as keys to distribute */
998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key = p_cb->peer_i_key;
999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key = p_cb->peer_r_key;
1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1011ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_sl_key
1012ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process key ready events.
1013ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_sl_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t key_type = p_data->key.key_type;
1016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (key_type == SMP_KEY_TYPE_TK) {
1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_generate_srand_mrand_confirm(p_cb, NULL);
1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (key_type == SMP_KEY_TYPE_CFM) {
1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_set_state(SMP_STATE_WAIT_CONFIRM);
1022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1029ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_enc
1030ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  start encryption
1031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_enc(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_STATUS cmd;
1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_ENC_FAIL;
1035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_data != NULL)
1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    cmd = btm_ble_start_encrypt(p_cb->pairing_bda, true, p_data->key.p_data);
1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else
1040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    cmd = btm_ble_start_encrypt(p_cb->pairing_bda, false, NULL);
1041444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY)
1043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1047ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_proc_discard
1048ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description   processing for discard security request
1049ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_proc_discard(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_reset_control_value(p_cb);
1054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1057ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_enc_cmpl
1058ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description   encryption success
1059ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_enc_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t enc_enable = *(uint8_t*)p_data;
1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1069ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_check_auth_req
1070ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  check authentication request
1071ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_check_auth_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t enc_enable = *(uint8_t*)p_data;
1074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
1075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG(
1077b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon      "%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
1078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key);
1079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (enc_enable == 1) {
1080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->le_secure_connections_mode_is_used) {
1081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode LTK is used instead of STK and has to be always saved */
1082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC;
1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC;
1084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode LK is derived from LTK only if both sides request it */
1086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) ||
1087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) {
1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
1093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ** Set local_r_key on master to expect only these keys.
1094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      */
1095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
1097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
1099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* in legacy mode derivation of BR/EDR LK is not supported */
1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG(
1104b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon        "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
1105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        __func__, p_cb->local_i_key, p_cb->local_r_key);
1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (p_cb->local_i_key || p_cb->local_r_key)) {
1110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else
1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (enc_enable == 0) {
1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if failed for encryption after pairing, send callback */
1115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if enc failed for old security information */
1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if master device, clean up and abck to idle; slave device do nothing */
1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else if (p_cb->role == HCI_ROLE_MASTER) {
1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_pick_key
1127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Pick a key distribution function based on the key mask.
1128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_pick_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t key_to_dist =
1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->local_r_key : p_cb->local_i_key;
1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t i = 0;
1133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s key_to_dist=0x%x", __func__, key_to_dist);
1135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while (i < SMP_KEY_DIST_TYPE_MAX) {
1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("key to send = %02x, i = %d", key_to_dist, i);
1137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (key_to_dist & (1 << i)) {
1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("smp_distribute_act[%d]", i);
1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (*smp_distribute_act[i])(p_cb, p_data);
1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    i++;
1144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1147ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_distribution
1148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  start key distribution if required.
1149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
1152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
1153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE ||
1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_pick_key(p_cb, p_data);
1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_cb->local_i_key && !p_cb->local_r_key) {
1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* state check to prevent re-entrant */
1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (smp_get_state() == SMP_STATE_BOND_PENDING) {
1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->derive_lk) {
1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_derive_link_key_from_long_term_key(p_cb, NULL);
1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->derive_lk = false;
1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->total_tx_unacked == 0) {
1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /*
1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * Instead of declaring authorization complete immediately,
1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * delay the event from being sent by SMP_DELAYED_AUTH_TIMEOUT_MS.
1171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * This allows the slave to send over Pairing Failed if the
1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * last key is rejected.  During this waiting window, the
1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         * state should remain in SMP_STATE_BOND_PENDING.
1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         */
1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (!alarm_is_scheduled(p_cb->delayed_auth_timer_ent)) {
1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_DEBUG("%s delaying auth complete.", __func__);
1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          alarm_set_on_queue(
1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->delayed_auth_timer_ent, SMP_DELAYED_AUTH_TIMEOUT_MS,
1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              smp_delayed_auth_complete_timeout, NULL, btu_general_alarm_queue);
1180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->wait_for_authorization_complete = true;
1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1187444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1189ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_decide_association_model
1190ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to select assoc model to be used for
1191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  STK generation and to start STK generation process.
1192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t failure = SMP_UNKNOWN_IO_CAP;
1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t int_evt = 0;
1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_KEY key;
1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_INT_DATA* p = NULL;
1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s Association Model = %d", __func__,
1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_cb->selected_association_model);
1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */
1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER &&
1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) {
1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_ERROR(
1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "IO capability does not meet authentication requirement");
1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        failure = SMP_PAIR_AUTH_FAIL;
1211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p = (tSMP_INT_DATA*)&failure;
1212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        int_evt = SMP_AUTH_CMPL_EVT;
1213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        p_cb->sec_level);
1217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        key.key_type = SMP_KEY_TYPE_TK;
1219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        key.p_data = p_cb->tk;
1220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p = (tSMP_INT_DATA*)&key;
1221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memset(p_cb->tk, 0, BT_OCTET16_LEN);
1223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* TK, ready  */
1224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        int_evt = SMP_KEY_READY_EVT;
1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_PASSKEY:
1229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->sec_level);
1232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_TK_REQ_EVT;
1235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_OOB:
1238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
1239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->sec_level);
1242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_OOB_REQ_EVT;
1244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_TK_REQ_EVT;
1245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_KEY_NOTIF:
1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("Need to generate Passkey");
1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* generate passkey and notify application */
1252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_generate_passkey(p_cb, NULL);
1253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT;
1261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_OUT_OF_RANGE:
1264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)");
1265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p = (tSMP_INT_DATA*)&failure;
1266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_AUTH_CMPL_EVT;
1267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
1271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          "Association Model = %d (SOMETHING IS WRONG WITH THE CODE)",
1272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->selected_association_model);
1273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p = (tSMP_INT_DATA*)&failure;
1274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      int_evt = SMP_AUTH_CMPL_EVT;
1275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_EVENT("sec_level=%d ", p_cb->sec_level);
1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (int_evt) smp_sm_event(p_cb, int_evt, p);
1279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_io_response
1283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process IO response for a slave device.
1284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_io_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_PAIR_AUTH_FAIL;
1287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* pairing started by local (slave) Security Request */
1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_set_state(SMP_STATE_SEC_REQ_PENDING);
1292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* plan to send pairing respond */
1294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* pairing started by peer (master) Pairing Request */
1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->selected_association_model = smp_select_association_model(p_cb);
1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->secure_connections_only_mode_required &&
1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (!(p_cb->le_secure_connections_mode_is_used) ||
1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR(
1302b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "Slave requires secure connection only mode "
1303b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon          "but it can't be provided -> Slave fails pairing");
1304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
1306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
1309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (smp_request_oob_data(p_cb)) return;
1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
13110bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    // PTS Testing failure modes
1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (pts_test_send_authentication_complete_failure(p_cb)) return;
13140bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_send_pair_rsp(p_cb, NULL);
1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_process_slave_keys_response
1321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  process application keys response for a slave device
1322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              (BR/EDR transport).
1323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_slave_keys_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_br_send_pair_response(p_cb, NULL);
1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1329ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_br_send_pair_response
13309ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  actions related to sending pairing response over BR/EDR
13319ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              transport.
1332ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_send_pair_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_i_key &= p_cb->peer_i_key;
1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->local_r_key &= p_cb->peer_r_key;
1338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb);
1340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_pairing_cmpl
13449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
13459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
1346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pairing_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->total_tx_unacked == 0) {
1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* process the pairing complete */
1350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
1351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1353444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_pair_terminate
13569ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
13579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
1358ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_pair_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->status = SMP_CONN_TOUT;
1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_proc_pairing_cmpl(p_cb);
1363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1366ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_idle_terminate
13679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function calledin idle state to determine to send
13689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  authentication complete or not.
1369ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_idle_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
1373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->status = SMP_FAIL;
1374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1376444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_fast_conn_param
1380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  apply default connection parameter for pairing process
1381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_fast_conn_param(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Disable L2CAP connection parameter updates while bonding since
1384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     some peripherals are not able to revert to fast connection parameters
1385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     during the start of service discovery. Connection paramter updates
1386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     get enabled again once service discovery completes. */
1387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, false);
1388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_both_have_public_keys
1392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  The function is called when both local and peer public keys are
1393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              saved.
1394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              Actions:
1395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - invokes DHKey computation;
1396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - on slave side invokes sending local public key to the peer.
1397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              - invokes SC phase 1 process.
1398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_both_have_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* invokes DHKey computation */
1403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_compute_dhkey(p_cb);
1404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* on slave side invokes sending local public key to the peer */
1406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) smp_send_pair_public_key(p_cb, NULL);
1407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL);
1409444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_secure_connection_phase1
14139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Start Secure Connection phase1 i.e. invokes initialization of
14149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              Secure Connection phase 1 parameters and starts building/sending
14159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              to the peer messages appropriate for the role and association
14169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              model.
1417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_secure_connection_phase1(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_cb->sec_level);
1425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_cb->sec_level);
1429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(p_cb->local_random, 0, BT_OCTET16_LEN);
1435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_start_nonce_generation(p_cb);
1436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* user has to provide passkey */
1439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL);
1441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* passkey has to be provided to user */
1444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_DEBUG("Need to generate SC Passkey");
1445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_generate_passkey(p_cb, NULL);
1446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* use the available OOB information */
1449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_process_secure_connection_oob_data(p_cb, NULL);
1450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_local_nonce
1460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  The function processes new local nonce.
1461ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1462ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be called in SC phase1.
1463ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_local_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave calculates and sends local commitment */
1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_calculate_local_commitment(p_cb);
1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_commitment(p_cb, NULL);
1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave has to wait for peer nonce */
1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_WAIT_NONCE);
1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* i.e. master */
1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* slave commitment is already received, send local nonce, wait for
1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           * remote nonce*/
1481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          SMP_TRACE_DEBUG(
1482b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "master in assoc mode = %d "
1483b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon              "already rcvd slave commitment - race condition",
1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cb->selected_association_model);
1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_send_rand(p_cb, NULL);
1487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_set_state(SMP_STATE_WAIT_NONCE);
1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_calculate_local_commitment(p_cb);
1494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_commitment(p_cb, NULL);
1497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* slave */
1498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* master commitment is already received */
1501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_send_commitment(p_cb, NULL);
1502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_set_state(SMP_STATE_WAIT_NONCE);
1503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_set_state(SMP_STATE_WAIT_NONCE);
1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1519444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_peer_nonce
15229ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  The function processes newly received and saved in CB peer
15239ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              nonce. The actions depend on the selected association model and
15249ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              the role.
1525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be called in SC phase1.
1527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason;
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s start ", __func__);
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // PTS Testing failure modes
1534fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if (p_cb->cert_failure == SMP_CONFIRM_VALUE_ERR) {
1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
1536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1540fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  // PTS Testing failure modes (for LT)
1541fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  if ((p_cb->cert_failure == SMP_NUMERIC_COMPAR_FAIL) &&
1542fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) &&
1543fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      (p_cb->role == HCI_ROLE_SLAVE)) {
1544fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
1545fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    reason = p_cb->failure = SMP_NUMERIC_COMPAR_FAIL;
1546fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1547fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa    return;
1548fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa  }
1549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (p_cb->selected_association_model) {
1551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_JUSTWORKS:
1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_NUM_COMP:
1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* in these models only master receives commitment */
1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_MASTER) {
1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (!smp_check_commitment(p_cb)) {
1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* slave sends local nonce */
1562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* go directly to phase 2 */
1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else /* numeric comparison */
1569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {
1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_WAIT_NONCE);
1571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL);
1572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1576fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa      if (!smp_check_commitment(p_cb) &&
1577fd102ca1610684631837278d74a2cfb6a50f7f69ravishankar srivatsa          p_cb->cert_failure != SMP_NUMERIC_COMPAR_FAIL) {
15780bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora        reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR;
15790bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora        smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
15820bd0c8fc88a7141691a7ca839b11cb711945ee33Nitin Arora
1583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (++p_cb->round < 20) {
1588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_set_state(SMP_STATE_SEC_CONN_PHS1_START);
1589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_start_nonce_generation(p_cb);
1591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SMP_MODEL_SEC_CONN_OOB:
1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_cb->role == HCI_ROLE_SLAVE) {
1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        smp_send_rand(p_cb, NULL);
1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      p_cb->selected_association_model);
1606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s end ", __func__);
1610444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1612444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_match_dhkey_checks
1614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  checks if the calculated peer DHKey Check value is the same as
1615ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              received from the peer DHKey check value.
1616ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_match_dhkey_checks(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason = SMP_DHKEY_CHK_FAIL;
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) {
1623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_WARNING("dhkey chcks do no match");
1624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->failure = reason;
1625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_EVENT("dhkey chcks match");
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* compare the max encryption key size, and save the smaller one for the link
1632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   */
1633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->loc_enc_size = p_cb->peer_enc_size;
1635444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->role == HCI_ROLE_SLAVE) {
1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL);
1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* master device always use received i/r key as keys to distribute */
1640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_i_key = p_cb->peer_i_key;
1641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_cb->local_r_key = p_cb->peer_r_key;
1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1644444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1646444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1647ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_move_to_secure_connections_phase2
1648ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Signal State Machine to start SC phase 2 initialization (to
1649ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              compute local DHKey Check value).
1650ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1651ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         SM is supposed to be in the state SMP_STATE_SEC_CONN_PHS2_START.
1652ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_move_to_secure_connections_phase2(tSMP_CB* p_cb,
1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                           tSMP_INT_DATA* p_data) {
1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_phase_2_dhkey_checks_are_present
16619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  generates event if dhkey check from the peer is already
16629ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              received.
1663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         It is supposed to be used on slave to prevent race condition.
16659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              It is supposed to be called after slave dhkey check is
16669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              calculated.
1667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_phase_2_dhkey_checks_are_present(tSMP_CB* p_cb,
1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                          tSMP_INT_DATA* p_data) {
1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
16715cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
1672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK)
1673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL);
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1675444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1677ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_wait_for_both_public_keys
16789ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  generates SMP_BOTH_PUBL_KEYS_RCVD_EVT event when both local and
16799ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              master public keys are available.
1680ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note         on the slave it is used to prevent race condition.
1682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1683ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_wait_for_both_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) &&
1688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) {
1689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((p_cb->role == HCI_ROLE_SLAVE) &&
1690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        ((p_cb->req_oob_type == SMP_OOB_LOCAL) ||
1691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         (p_cb->req_oob_type == SMP_OOB_BOTH))) {
1692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_set_state(SMP_STATE_PUBLIC_KEY_EXCH);
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL);
1695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1697444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1699ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_start_passkey_verification
1700ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Starts SC passkey entry verification.
1701ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_start_passkey_verification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = NULL;
17045cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
1705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = p_cb->local_random;
1707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT32_TO_STREAM(p, p_data->passkey);
1708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = p_cb->peer_random;
1710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT32_TO_STREAM(p, p_data->passkey);
17116975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->round = 0;
1713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
17146975b4d711142b885af479721cada448952c6b41Andre Eisenbach}
17156975b4d711142b885af479721cada448952c6b41Andre Eisenbach
17166975b4d711142b885af479721cada448952c6b41Andre Eisenbach/*******************************************************************************
1717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_process_secure_connection_oob_data
1718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  Processes local/peer SC OOB data received from somewhere.
1719ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_oob_data(tSMP_CB* p_cb,
1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            tSMP_INT_DATA* p_data) {
1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
17236975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_SC_OOB_DATA* p_sc_oob_data = &p_cb->sc_oob_data;
1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_sc_oob_data->loc_oob_data.present) {
1726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->local_random, p_sc_oob_data->loc_oob_data.randomizer,
1727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->local_random));
1728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("%s: local OOB randomizer is absent", __func__);
1730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
1731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1732444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_sc_oob_data->peer_oob_data.present) {
1734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_EVENT("%s: peer OOB data is absent", __func__);
1735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(p_cb->peer_random, 0, sizeof(p_cb->peer_random));
1736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->peer_random, p_sc_oob_data->peer_oob_data.randomizer,
1738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->peer_random));
1739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment,
1740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           sizeof(p_cb->remote_commitment));
1741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t reason = SMP_CONFIRM_VALUE_ERR;
1743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* check commitment */
1744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!smp_check_commitment(p_cb)) {
1745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cb->failure = reason;
1746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
1747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return;
1748444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
17496975b4d711142b885af479721cada448952c6b41Andre Eisenbach
1750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) {
1751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* the peer doesn't have local randomiser */
1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SMP_TRACE_EVENT(
1753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          "%s: peer didn't receive local OOB data, set local randomizer to 0",
1754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          __func__);
1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
1756444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1758ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  print128(p_cb->local_random, (const uint8_t*)"local OOB randomizer");
1760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  print128(p_cb->peer_random, (const uint8_t*)"peer OOB randomizer");
1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1763444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1765ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_set_local_oob_keys
17669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Saves calculated private/public keys in
17679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              sc_oob_data.loc_oob_data, starts nonce generation
1768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              (to be saved in sc_oob_data.loc_oob_data.randomizer).
1769ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1772444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(p_cb->sc_oob_data.loc_oob_data.private_key_used, p_cb->private_key,
1774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         BT_OCTET32_LEN);
1775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->sc_oob_data.loc_oob_data.publ_key_used = p_cb->loc_publ_key;
1776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_start_nonce_generation(p_cb);
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
17798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/*******************************************************************************
1780ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_set_local_oob_random_commitment
17819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description  Saves calculated randomizer and commitment in
17829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              sc_oob_data.loc_oob_data, passes sc_oob_data.loc_oob_data up
17839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *              for safekeeping.
1784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_local_oob_random_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(p_cb->sc_oob_data.loc_oob_data.randomizer, p_cb->rand, BT_OCTET16_LEN);
1788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_calculate_f4(p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.randomizer, 0,
1792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                   p_cb->sc_oob_data.loc_oob_data.commitment);
1793444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1794d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SMP_DEBUG == TRUE)
1795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p_print = NULL;
1796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("local SC OOB data set:");
1797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.addr_sent_to;
1798648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "addr_sent_to",
1799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                      sizeof(tBLE_BD_ADDR));
1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.private_key_used;
1801648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "private_key_used",
1802648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.x;
1804648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.x",
1805648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.y;
1807648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.y",
1808648d513fd66d28a10dab4def62ca2d27187ccc34Jack He                                      BT_OCTET32_LEN);
1809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.randomizer;
1810648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "randomizer", BT_OCTET16_LEN);
1811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.commitment;
1812648d513fd66d28a10dab4def62ca2d27187ccc34Jack He  smp_debug_print_nbyte_little_endian(p_print, "commitment", BT_OCTET16_LEN);
1813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("");
1814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
18158fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
1816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* pass created OOB data up */
1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->cb_evt = SMP_SC_LOC_OOB_DATA_UP_EVT;
1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_send_app_cback(p_cb, NULL);
1819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_cb_cleanup(p_cb);
1821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
18228fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1824ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1825ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_link_encrypted
1826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
18279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called when link is encrypted and notified
18289ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  to the slave device. Proceed to to send LTK, DIV and ER to
18299ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  master if bonding the devices.
1830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1833ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1834ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1835c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid smp_link_encrypted(const bt_bdaddr_t& bda, uint8_t encr_enable) {
1836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_CB* p_cb = &smp_cb;
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1838b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon  SMP_TRACE_DEBUG("%s: encr_enable=%d", __func__, encr_enable);
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1840c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  if (smp_cb.pairing_bda == bda) {
1841b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    /* encryption completed with STK, remember the key size now, could be
1842b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon     * overwritten when key exchange happens                                 */
1843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_cb->loc_enc_size != 0 && encr_enable) {
1844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* update the link encryption key size if a SMP pairing just performed */
1845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &encr_enable);
1849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1854ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_proc_ltk_request
1855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when LTK request is received from
1857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  controller.
1858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1861ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1862c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool smp_proc_ltk_request(const bt_bdaddr_t& bda) {
1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s state = %d", __func__, smp_cb.state);
1864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool match = false;
18651da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora
1866c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  if (bda == smp_cb.pairing_bda) {
1867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    match = true;
1868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1869c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    const bt_bdaddr_t& dummy_bda = {.address = {0}};
1870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
1871c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    if (p_dev_rec != NULL && p_dev_rec->ble.pseudo_addr == smp_cb.pairing_bda &&
1872c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        p_dev_rec->ble.pseudo_addr != dummy_bda) {
1873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      match = true;
18741da48a3600c980fe4ba825d287ff0ac5038be3ffNitin Arora    }
1875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) {
1878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL);
1879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return true;
1880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_process_secure_connection_long_term_key
1888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to process SC LTK.
1890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  SC LTK is calculated and used instead of STK.
1891ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  Here SC LTK is saved in BLE DB.
1892ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1893ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1894ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1895ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_process_secure_connection_long_term_key(void) {
1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_CB* p_cb = &smp_cb;
1898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_save_secure_connections_long_term_key(p_cb);
1901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
1903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
1904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_set_derive_link_key
1909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to set flag that indicates that
1911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  BR/EDR LK has to be derived from LTK after all keys are
1912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  distributed.
1913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_set_derive_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->derive_lk = true;
1920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_LK, false);
1921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_key_distribution(p_cb, NULL);
1922e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun}
1923e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
1924e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun/*******************************************************************************
1925ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1926ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_derive_link_key_from_long_term_key
1927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to derive BR/EDR LK from LTK.
1929ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1930ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1931ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1932ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_derive_link_key_from_long_term_key(tSMP_CB* p_cb,
1934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            tSMP_INT_DATA* p_data) {
1935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
1936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!smp_calculate_link_key_from_long_term_key(p_cb)) {
1939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    SMP_TRACE_ERROR("%s failed", __func__);
1940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
1941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1943444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_br_process_link_key
1948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to process BR/EDR LK:
1950ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  - to derive SMP LTK from BR/EDR LK;
1951b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon *                  - to save SMP LTK.
1952ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1953ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1954ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_process_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
1958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!smp_calculate_long_term_key_from_link_key(p_cb)) {
1961b2dadde6c163d59abe39ed9028efc8a986c268e4johnshamoon    SMP_TRACE_ERROR("%s: failed", __func__);
1962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status);
1963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1965444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s: LTK derivation from LK successfully completed",
1967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  __func__);
1968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_save_secure_connections_long_term_key(p_cb);
1969911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
1970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_br_select_next_key(p_cb, NULL);
1971444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1973444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1974ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function     smp_key_distribution_by_transport
1975ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description  depending on the transport used at the moment calls either
1976ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *              smp_key_distribution(...) or smp_br_key_distribution(...).
1977ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->smp_over_br) {
1981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_br_select_next_key(p_cb, NULL);
1982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_key_distribution(p_cb, NULL);
1984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         smp_br_pairing_complete
19899ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send the pairing complete
19909ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  callback and remove the connection if needed.
1991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_TRACE_DEBUG("%s", __func__);
1994d0aa8e53aa7ac1137a47570e08c2b963aaa49141Satya Calloji
1995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb->total_tx_unacked == 0) {
1996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* process the pairing complete */
1997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    smp_proc_pairing_cmpl(p_cb);
1998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2000