blob: 1239542225cc9abf4ebbd02676916ac064368225 [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
Jakub Pawlowski5b790fe2017-09-18 09:00:20 -07003 * Copyright 2003-2012 Broadcom Corporation
The Android Open Source Project5738f832012-12-12 16:00:35 -08004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
Chienyuan7f436b92018-11-29 23:19:27 +080019#include <cutils/log.h>
Jakub Pawlowskie4f13782018-10-23 14:46:24 +020020#include <log/log.h>
Satya Calloji444a8da2015-03-06 10:38:22 -080021#include <string.h>
Pulkit Bhuwalka5a6b3252017-02-17 16:25:22 -080022#include "btif_common.h"
Pulkit Bhuwalka2bc59e52018-03-22 14:34:33 -070023#include "btif_storage.h"
Andre Eisenbach7927f682015-07-02 16:14:28 -070024#include "device/include/interop.h"
Jakub Pawlowskiecace462017-10-17 16:40:41 -070025#include "internal_include/bt_target.h"
Andre Eisenbach7927f682015-07-02 16:14:28 -070026#include "stack/btm/btm_int.h"
27#include "stack/include/l2c_api.h"
Andre Eisenbach9181ec22018-03-01 13:27:01 -080028#include "stack/smp/p_256_ecc_pp.h"
Andre Eisenbach7927f682015-07-02 16:14:28 -070029#include "stack/smp/smp_int.h"
30#include "utils/include/bt_utils.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080031
Myles Watson911d1ae2016-11-28 16:44:40 -080032#define SMP_KEY_DIST_TYPE_MAX 4
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053033
Stanley Tng5af6aba2017-09-29 09:01:25 -070034const tSMP_ACT smp_distribute_act[] = {
35 smp_generate_ltk, /* SMP_SEC_KEY_TYPE_ENC - '1' bit index */
36 smp_send_id_info, /* SMP_SEC_KEY_TYPE_ID - '1' bit index */
37 smp_generate_csrk, /* SMP_SEC_KEY_TYPE_CSRK - '1' bit index */
38 smp_set_derive_link_key /* SMP_SEC_KEY_TYPE_LK - '1' bit index */
39};
The Android Open Source Project5738f832012-12-12 16:00:35 -080040
Jakub Pawlowskia484a882017-06-24 17:30:18 -070041static bool lmp_version_below(const RawAddress& bda, uint8_t version) {
Myles Watson911d1ae2016-11-28 16:44:40 -080042 tACL_CONN* acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE);
43 if (acl == NULL || acl->lmp_version == 0) {
44 SMP_TRACE_WARNING("%s cannot retrieve LMP version...", __func__);
45 return false;
46 }
47 SMP_TRACE_WARNING("%s LMP version %d < %d", __func__, acl->lmp_version,
48 version);
49 return acl->lmp_version < version;
Andre Eisenbach27e239d2015-10-26 13:49:17 -070050}
51
Myles Watson911d1ae2016-11-28 16:44:40 -080052static bool pts_test_send_authentication_complete_failure(tSMP_CB* p_cb) {
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053053 uint8_t reason = p_cb->cert_failure;
54 if (reason == SMP_PAIR_AUTH_FAIL || reason == SMP_PAIR_FAIL_UNKNOWN ||
55 reason == SMP_PAIR_NOT_SUPPORT || reason == SMP_PASSKEY_ENTRY_FAIL ||
56 reason == SMP_REPEATED_ATTEMPTS) {
Myles Watson5ce55bd2017-09-20 16:41:19 -070057 tSMP_INT_DATA smp_int_data;
58 smp_int_data.status = reason;
59 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053060 return true;
Myles Watson911d1ae2016-11-28 16:44:40 -080061 }
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053062 return false;
Nitin Arora0bd0c8f2016-03-15 15:00:36 -070063}
64
The Android Open Source Project5738f832012-12-12 16:00:35 -080065/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -080066 * Function smp_update_key_mask
67 * Description This function updates the key mask for sending or receiving.
68 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -080069static void smp_update_key_mask(tSMP_CB* p_cb, uint8_t key_type, bool recv) {
70 SMP_TRACE_DEBUG(
71 "%s before update role=%d recv=%d local_i_key = %02x, local_r_key = %02x",
72 __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -080073
Myles Watson911d1ae2016-11-28 16:44:40 -080074 if (((p_cb->le_secure_connections_mode_is_used) || (p_cb->smp_over_br)) &&
75 ((key_type == SMP_SEC_KEY_TYPE_ENC) ||
76 (key_type == SMP_SEC_KEY_TYPE_LK))) {
77 /* in LE SC mode LTK, CSRK and BR/EDR LK are derived locally instead of
78 ** being exchanged with the peer */
79 p_cb->local_i_key &= ~key_type;
80 p_cb->local_r_key &= ~key_type;
81 } else if (p_cb->role == HCI_ROLE_SLAVE) {
82 if (recv)
83 p_cb->local_i_key &= ~key_type;
Satya Calloji444a8da2015-03-06 10:38:22 -080084 else
Myles Watson911d1ae2016-11-28 16:44:40 -080085 p_cb->local_r_key &= ~key_type;
86 } else {
87 if (recv)
88 p_cb->local_r_key &= ~key_type;
The Android Open Source Project5738f832012-12-12 16:00:35 -080089 else
Myles Watson911d1ae2016-11-28 16:44:40 -080090 p_cb->local_i_key &= ~key_type;
91 }
The Android Open Source Project5738f832012-12-12 16:00:35 -080092
Myles Watson911d1ae2016-11-28 16:44:40 -080093 SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x",
94 p_cb->local_i_key, p_cb->local_r_key);
The Android Open Source Project5738f832012-12-12 16:00:35 -080095}
Satya Calloji444a8da2015-03-06 10:38:22 -080096
The Android Open Source Project5738f832012-12-12 16:00:35 -080097/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -080098 * Function smp_send_app_cback
Myles Watson9ca07092016-11-28 16:41:53 -080099 * Description notifies application about the events the application is
100 * interested in
Myles Watsonee96a3c2016-11-23 14:49:54 -0800101 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800102void smp_send_app_cback(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
103 tSMP_EVT_DATA cb_data;
104 tSMP_STATUS callback_rc;
105 SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d", __func__, p_cb->cb_evt);
106 if (p_cb->p_callback && p_cb->cb_evt != 0) {
107 switch (p_cb->cb_evt) {
108 case SMP_IO_CAP_REQ_EVT:
109 cb_data.io_req.auth_req = p_cb->peer_auth_req;
110 cb_data.io_req.oob_data = SMP_OOB_NONE;
Pulkit Bhuwalka2bc59e52018-03-22 14:34:33 -0700111 cb_data.io_req.io_cap = btif_storage_get_local_io_caps_ble();
Myles Watson911d1ae2016-11-28 16:44:40 -0800112 cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
113 cb_data.io_req.init_keys = p_cb->local_i_key;
114 cb_data.io_req.resp_keys = p_cb->local_r_key;
115 SMP_TRACE_WARNING("io_cap = %d", cb_data.io_req.io_cap);
116 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800117
Myles Watson911d1ae2016-11-28 16:44:40 -0800118 case SMP_NC_REQ_EVT:
119 cb_data.passkey = p_data->passkey;
120 break;
121 case SMP_SC_OOB_REQ_EVT:
122 cb_data.req_oob_type = p_data->req_oob_type;
123 break;
124 case SMP_SC_LOC_OOB_DATA_UP_EVT:
125 cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data;
126 break;
Satya Calloji444a8da2015-03-06 10:38:22 -0800127
Myles Watson911d1ae2016-11-28 16:44:40 -0800128 case SMP_BR_KEYS_REQ_EVT:
129 cb_data.io_req.auth_req = 0;
130 cb_data.io_req.oob_data = SMP_OOB_NONE;
131 cb_data.io_req.io_cap = 0;
132 cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
133 cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY;
134 cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY;
135 break;
Satya Calloji444a8da2015-03-06 10:38:22 -0800136
Myles Watson911d1ae2016-11-28 16:44:40 -0800137 default:
138 break;
139 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800140
Myles Watson911d1ae2016-11-28 16:44:40 -0800141 callback_rc =
142 (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800143
Myles Watson911d1ae2016-11-28 16:44:40 -0800144 SMP_TRACE_DEBUG("%s: callback_rc=%d p_cb->cb_evt=%d", __func__,
145 callback_rc, p_cb->cb_evt);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800146
Myles Watson911d1ae2016-11-28 16:44:40 -0800147 if (callback_rc == SMP_SUCCESS) {
148 switch (p_cb->cb_evt) {
149 case SMP_IO_CAP_REQ_EVT:
150 p_cb->loc_auth_req = cb_data.io_req.auth_req;
151 p_cb->local_io_capability = cb_data.io_req.io_cap;
152 p_cb->loc_oob_flag = cb_data.io_req.oob_data;
153 p_cb->loc_enc_size = cb_data.io_req.max_key_size;
154 p_cb->local_i_key = cb_data.io_req.init_keys;
155 p_cb->local_r_key = cb_data.io_req.resp_keys;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800156
Myles Watson911d1ae2016-11-28 16:44:40 -0800157 if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) {
158 SMP_TRACE_WARNING("Non bonding: No keys will be exchanged");
159 p_cb->local_i_key = 0;
160 p_cb->local_r_key = 0;
161 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800162
Myles Watson911d1ae2016-11-28 16:44:40 -0800163 SMP_TRACE_WARNING(
johnshamoonb2dadde2017-05-31 11:32:24 -0700164 "rcvd auth_req: 0x%02x, io_cap: %d "
165 "loc_oob_flag: %d loc_enc_size: %d, "
Myles Watson911d1ae2016-11-28 16:44:40 -0800166 "local_i_key: 0x%02x, local_r_key: 0x%02x",
167 p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag,
168 p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800169
Myles Watson911d1ae2016-11-28 16:44:40 -0800170 p_cb->secure_connections_only_mode_required =
171 (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
Hemant Guptaf37452a2017-12-06 15:35:20 +0530172 /* just for PTS, force SC bit */
Myles Watson911d1ae2016-11-28 16:44:40 -0800173 if (p_cb->secure_connections_only_mode_required) {
174 p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT;
175 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800176
Hemant Guptaf37452a2017-12-06 15:35:20 +0530177 if (!p_cb->secure_connections_only_mode_required &&
178 (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) ||
179 lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2) ||
180 interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS,
181 (const RawAddress*)&p_cb->pairing_bda))) {
182 p_cb->loc_auth_req &= ~SMP_SC_SUPPORT_BIT;
Myles Watson911d1ae2016-11-28 16:44:40 -0800183 p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT;
184 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
185 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
186 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800187
Jakub Pawlowski7a7f69b2017-09-27 15:41:13 -0700188 if (lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_5_0)) {
189 p_cb->loc_auth_req &= ~SMP_H7_SUPPORT_BIT;
190 }
191
Myles Watson911d1ae2016-11-28 16:44:40 -0800192 SMP_TRACE_WARNING(
193 "set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x",
194 p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800195
Myles Watson911d1ae2016-11-28 16:44:40 -0800196 smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
197 break;
Satya Calloji444a8da2015-03-06 10:38:22 -0800198
Myles Watson911d1ae2016-11-28 16:44:40 -0800199 case SMP_BR_KEYS_REQ_EVT:
200 p_cb->loc_enc_size = cb_data.io_req.max_key_size;
201 p_cb->local_i_key = cb_data.io_req.init_keys;
202 p_cb->local_r_key = cb_data.io_req.resp_keys;
Jakub Pawlowskie7f14a62017-03-20 15:38:56 -0700203 p_cb->loc_auth_req |= SMP_H7_SUPPORT_BIT;
Satya Calloji444a8da2015-03-06 10:38:22 -0800204
Myles Watson911d1ae2016-11-28 16:44:40 -0800205 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
206 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
Satya Calloji444a8da2015-03-06 10:38:22 -0800207
Myles Watson911d1ae2016-11-28 16:44:40 -0800208 SMP_TRACE_WARNING(
johnshamoonb2dadde2017-05-31 11:32:24 -0700209 "for SMP over BR max_key_size: 0x%02x, local_i_key: 0x%02x, "
210 "local_r_key: 0x%02x, p_cb->loc_auth_req: 0x%02x",
Jakub Pawlowskie7f14a62017-03-20 15:38:56 -0700211 p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key,
212 p_cb->loc_auth_req);
Satya Calloji444a8da2015-03-06 10:38:22 -0800213
Myles Watson911d1ae2016-11-28 16:44:40 -0800214 smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL);
215 break;
216 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800217 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800218 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800219
Myles Watson911d1ae2016-11-28 16:44:40 -0800220 if (!p_cb->cb_evt && p_cb->discard_sec_req) {
221 p_cb->discard_sec_req = false;
222 smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
223 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800224
johnshamoonb2dadde2017-05-31 11:32:24 -0700225 SMP_TRACE_DEBUG("%s: return", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800226}
Satya Calloji444a8da2015-03-06 10:38:22 -0800227
The Android Open Source Project5738f832012-12-12 16:00:35 -0800228/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800229 * Function smp_send_pair_fail
230 * Description pairing failure to peer device if needed.
231 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800232void smp_send_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700233 p_cb->status = p_data->status;
234 p_cb->failure = p_data->status;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800235
johnshamoonb2dadde2017-05-31 11:32:24 -0700236 SMP_TRACE_DEBUG("%s: status=%d failure=%d ", __func__, p_cb->status,
Myles Watson911d1ae2016-11-28 16:44:40 -0800237 p_cb->failure);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800238
Myles Watson911d1ae2016-11-28 16:44:40 -0800239 if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC &&
240 p_cb->status != SMP_SUCCESS) {
241 smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
242 p_cb->wait_for_authorization_complete = true;
243 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800244}
245
246/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800247 * Function smp_send_pair_req
248 * Description actions related to sending pairing request
249 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800250void smp_send_pair_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
251 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
252 SMP_TRACE_DEBUG("%s", __func__);
Andre Eisenbach2d41fe12013-04-17 11:22:58 +0800253
Myles Watson911d1ae2016-11-28 16:44:40 -0800254 /* erase all keys when master sends pairing req*/
255 if (p_dev_rec) btm_sec_clear_ble_keys(p_dev_rec);
256 /* do not manipulate the key, let app decide,
257 leave out to BTM to mandate key distribution for bonding case */
258 smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800259}
Satya Calloji444a8da2015-03-06 10:38:22 -0800260
The Android Open Source Project5738f832012-12-12 16:00:35 -0800261/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800262 * Function smp_send_pair_rsp
263 * Description actions related to sending pairing response
264 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800265void smp_send_pair_rsp(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
266 SMP_TRACE_DEBUG("%s", __func__);
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800267
Myles Watson911d1ae2016-11-28 16:44:40 -0800268 p_cb->local_i_key &= p_cb->peer_i_key;
269 p_cb->local_r_key &= p_cb->peer_r_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800270
Myles Watson911d1ae2016-11-28 16:44:40 -0800271 if (smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb)) {
272 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
273 smp_use_oob_private_key(p_cb, NULL);
274 else
275 smp_decide_association_model(p_cb, NULL);
276 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800277}
278
279/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800280 * Function smp_send_confirm
281 * Description send confirmation to the peer
282 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800283void smp_send_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
284 SMP_TRACE_DEBUG("%s", __func__);
285 smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800286}
Satya Calloji444a8da2015-03-06 10:38:22 -0800287
The Android Open Source Project5738f832012-12-12 16:00:35 -0800288/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800289 * Function smp_send_init
290 * Description process pairing initializer to slave device
291 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800292void smp_send_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
293 SMP_TRACE_DEBUG("%s", __func__);
294 smp_send_cmd(SMP_OPCODE_INIT, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800295}
Satya Calloji444a8da2015-03-06 10:38:22 -0800296
297/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800298 * Function smp_send_rand
299 * Description send pairing random to the peer
300 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800301void smp_send_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
302 SMP_TRACE_DEBUG("%s", __func__);
303 smp_send_cmd(SMP_OPCODE_RAND, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800304}
305
306/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800307 * Function smp_send_pair_public_key
308 * Description send pairing public key command to the peer
309 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800310void smp_send_pair_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
311 SMP_TRACE_DEBUG("%s", __func__);
312 smp_send_cmd(SMP_OPCODE_PAIR_PUBLIC_KEY, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800313}
314
315/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800316 * Function SMP_SEND_COMMITMENT
317 * Description send commitment command to the peer
318 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800319void smp_send_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
320 SMP_TRACE_DEBUG("%s", __func__);
321 smp_send_cmd(SMP_OPCODE_PAIR_COMMITM, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800322}
323
324/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800325 * Function smp_send_dhkey_check
326 * Description send DHKey Check command to the peer
327 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800328void smp_send_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
329 SMP_TRACE_DEBUG("%s", __func__);
330 smp_send_cmd(SMP_OPCODE_PAIR_DHKEY_CHECK, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800331}
332
333/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800334 * Function smp_send_keypress_notification
335 * Description send Keypress Notification command to the peer
336 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800337void smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700338 p_cb->local_keypress_notification = p_data->status;
Myles Watson911d1ae2016-11-28 16:44:40 -0800339 smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800340}
341
The Android Open Source Project5738f832012-12-12 16:00:35 -0800342/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800343 * Function smp_send_enc_info
344 * Description send encryption information command.
345 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800346void smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100347 tBTM_LE_KEY_VALUE le_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800348
johnshamoonb2dadde2017-05-31 11:32:24 -0700349 SMP_TRACE_DEBUG("%s: p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
Myles Watson911d1ae2016-11-28 16:44:40 -0800350 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800351
Myles Watson911d1ae2016-11-28 16:44:40 -0800352 smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
353 smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800354
Myles Watson911d1ae2016-11-28 16:44:40 -0800355 /* save the DIV and key size information when acting as slave device */
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100356 le_key.lenc_key.ltk = p_cb->ltk;
357 le_key.lenc_key.div = p_cb->div;
358 le_key.lenc_key.key_size = p_cb->loc_enc_size;
359 le_key.lenc_key.sec_level = p_cb->sec_level;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800360
Myles Watson911d1ae2016-11-28 16:44:40 -0800361 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
362 (p_cb->loc_auth_req & SMP_AUTH_BOND))
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100363 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, &le_key, true);
Satya Calloji444a8da2015-03-06 10:38:22 -0800364
Myles Watson911d1ae2016-11-28 16:44:40 -0800365 SMP_TRACE_WARNING("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800366
Myles Watson911d1ae2016-11-28 16:44:40 -0800367 smp_key_distribution(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800368}
Satya Calloji444a8da2015-03-06 10:38:22 -0800369
The Android Open Source Project5738f832012-12-12 16:00:35 -0800370/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800371 * Function smp_send_id_info
372 * Description send ID information command.
373 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800374void smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
375 tBTM_LE_KEY_VALUE le_key;
376 SMP_TRACE_DEBUG("%s", __func__);
377 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800378
Myles Watson911d1ae2016-11-28 16:44:40 -0800379 smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
380 smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800381
Myles Watson911d1ae2016-11-28 16:44:40 -0800382 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
383 (p_cb->loc_auth_req & SMP_AUTH_BOND))
384 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LID, &le_key, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800385
Myles Watson911d1ae2016-11-28 16:44:40 -0800386 SMP_TRACE_WARNING("%s", __func__);
387 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800388}
Satya Calloji444a8da2015-03-06 10:38:22 -0800389
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700390/** send CSRK command. */
Myles Watson911d1ae2016-11-28 16:44:40 -0800391void smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100392 tBTM_LE_KEY_VALUE key;
Myles Watson911d1ae2016-11-28 16:44:40 -0800393 SMP_TRACE_DEBUG("%s", __func__);
394 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800395
Myles Watson911d1ae2016-11-28 16:44:40 -0800396 if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) {
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100397 key.lcsrk_key.div = p_cb->div;
398 key.lcsrk_key.sec_level = p_cb->sec_level;
399 key.lcsrk_key.counter = 0; /* initialize the local counter */
400 key.lcsrk_key.csrk = p_cb->csrk;
401 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK, &key, true);
Myles Watson911d1ae2016-11-28 16:44:40 -0800402 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800403
Myles Watson911d1ae2016-11-28 16:44:40 -0800404 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800405}
406
407/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800408 * Function smp_send_ltk_reply
409 * Description send LTK reply
410 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800411void smp_send_ltk_reply(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
412 SMP_TRACE_DEBUG("%s", __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700413
414 Octet16 stk;
415 memcpy(stk.data(), p_data->key.p_data, stk.size());
Myles Watson911d1ae2016-11-28 16:44:40 -0800416 /* send stk as LTK response */
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700417 btm_ble_ltk_request_reply(p_cb->pairing_bda, true, stk);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800418}
Satya Calloji444a8da2015-03-06 10:38:22 -0800419
The Android Open Source Project5738f832012-12-12 16:00:35 -0800420/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800421 * Function smp_proc_sec_req
422 * Description process security request.
423 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800424void smp_proc_sec_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Manoj Babulal4b35abd2018-12-27 02:43:19 -0800425 tBTM_LE_AUTH_REQ auth_req = *(tBTM_LE_AUTH_REQ*)p_data->p_data;
Myles Watson911d1ae2016-11-28 16:44:40 -0800426 tBTM_BLE_SEC_REQ_ACT sec_req_act;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800427
johnshamoonb2dadde2017-05-31 11:32:24 -0700428 SMP_TRACE_DEBUG("%s: auth_req=0x%x", __func__, auth_req);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800429
Myles Watson911d1ae2016-11-28 16:44:40 -0800430 p_cb->cb_evt = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800431
Myles Watson911d1ae2016-11-28 16:44:40 -0800432 btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800433
johnshamoonb2dadde2017-05-31 11:32:24 -0700434 SMP_TRACE_DEBUG("%s: sec_req_act=0x%x", __func__, sec_req_act);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800435
Myles Watson911d1ae2016-11-28 16:44:40 -0800436 switch (sec_req_act) {
437 case BTM_BLE_SEC_REQ_ACT_ENCRYPT:
johnshamoonb2dadde2017-05-31 11:32:24 -0700438 SMP_TRACE_DEBUG("%s: BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__);
Myles Watson911d1ae2016-11-28 16:44:40 -0800439 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
440 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800441
Myles Watson911d1ae2016-11-28 16:44:40 -0800442 case BTM_BLE_SEC_REQ_ACT_PAIR:
443 p_cb->secure_connections_only_mode_required =
444 (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
Satya Calloji444a8da2015-03-06 10:38:22 -0800445
Myles Watson911d1ae2016-11-28 16:44:40 -0800446 /* respond to non SC pairing request as failure in SC only mode */
447 if (p_cb->secure_connections_only_mode_required &&
448 (auth_req & SMP_SC_SUPPORT_BIT) == 0) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700449 tSMP_INT_DATA smp_int_data;
450 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
451 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800452 } else {
453 /* initialize local i/r key to be default keys */
454 p_cb->peer_auth_req = auth_req;
455 p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY;
456 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
457 }
458 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800459
Myles Watson911d1ae2016-11-28 16:44:40 -0800460 case BTM_BLE_SEC_REQ_ACT_DISCARD:
461 p_cb->discard_sec_req = true;
462 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800463
Myles Watson911d1ae2016-11-28 16:44:40 -0800464 default:
465 /* do nothing */
466 break;
467 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800468}
Satya Calloji444a8da2015-03-06 10:38:22 -0800469
The Android Open Source Project5738f832012-12-12 16:00:35 -0800470/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800471 * Function smp_proc_sec_grant
472 * Description process security grant.
473 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800474void smp_proc_sec_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700475 uint8_t res = p_data->status;
Myles Watson911d1ae2016-11-28 16:44:40 -0800476 SMP_TRACE_DEBUG("%s", __func__);
477 if (res != SMP_SUCCESS) {
478 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
479 } else /*otherwise, start pairing */
480 {
481 /* send IO request callback */
482 p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
483 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800484}
Satya Calloji444a8da2015-03-06 10:38:22 -0800485
The Android Open Source Project5738f832012-12-12 16:00:35 -0800486/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800487 * Function smp_proc_pair_fail
488 * Description process pairing failure from peer device
489 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800490void smp_proc_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
491 SMP_TRACE_DEBUG("%s", __func__);
Chienyuan7f436b92018-11-29 23:19:27 +0800492
493 if (p_cb->rcvd_cmd_len < 2) {
494 android_errorWriteLog(0x534e4554, "111214739");
495 SMP_TRACE_WARNING("%s: rcvd_cmd_len %d too short: must be at least 2",
496 __func__, p_cb->rcvd_cmd_len);
497 p_cb->status = SMP_INVALID_PARAMETERS;
498 } else {
499 p_cb->status = p_data->status;
500 }
Jacky Cheung373d9282016-05-17 13:42:43 -0700501
Myles Watson911d1ae2016-11-28 16:44:40 -0800502 /* Cancel pending auth complete timer if set */
503 alarm_cancel(p_cb->delayed_auth_timer_ent);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800504}
Satya Calloji444a8da2015-03-06 10:38:22 -0800505
The Android Open Source Project5738f832012-12-12 16:00:35 -0800506/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800507 * Function smp_proc_pair_cmd
508 * Description Process the SMP pairing request/response from peer device
509 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800510void smp_proc_pair_cmd(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700511 uint8_t* p = p_data->p_data;
Myles Watson911d1ae2016-11-28 16:44:40 -0800512 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800513
Stanley Tng273ffd82018-02-08 12:26:51 -0800514 SMP_TRACE_DEBUG("%s: pairing_bda=%s", __func__,
515 p_cb->pairing_bda.ToString().c_str());
516
johnshamoonb2dadde2017-05-31 11:32:24 -0700517 /* erase all keys if it is slave proc pairing req */
Myles Watson911d1ae2016-11-28 16:44:40 -0800518 if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
519 btm_sec_clear_ble_keys(p_dev_rec);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800520
Myles Watson911d1ae2016-11-28 16:44:40 -0800521 p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800522
Ugo Yu73aa4fa2018-11-29 17:55:40 +0800523 if (smp_command_has_invalid_length(p_cb)) {
524 tSMP_INT_DATA smp_int_data;
525 smp_int_data.status = SMP_INVALID_PARAMETERS;
526 android_errorWriteLog(0x534e4554, "111850706");
527 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
528 return;
529 }
530
Myles Watson911d1ae2016-11-28 16:44:40 -0800531 STREAM_TO_UINT8(p_cb->peer_io_caps, p);
532 STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
533 STREAM_TO_UINT8(p_cb->peer_auth_req, p);
534 STREAM_TO_UINT8(p_cb->peer_enc_size, p);
535 STREAM_TO_UINT8(p_cb->peer_i_key, p);
536 STREAM_TO_UINT8(p_cb->peer_r_key, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800537
Myles Watson911d1ae2016-11-28 16:44:40 -0800538 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700539 tSMP_INT_DATA smp_int_data;
540 smp_int_data.status = SMP_INVALID_PARAMETERS;
541 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800542 return;
543 }
544
545 // PTS Testing failure modes
546 if (pts_test_send_authentication_complete_failure(p_cb)) return;
547
548 if (p_cb->role == HCI_ROLE_SLAVE) {
549 if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) {
550 /* peer (master) started pairing sending Pairing Request */
551 p_cb->local_i_key = p_cb->peer_i_key;
552 p_cb->local_r_key = p_cb->peer_r_key;
553
554 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
555 } else /* update local i/r key according to pairing request */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800556 {
Myles Watson911d1ae2016-11-28 16:44:40 -0800557 /* pairing started with this side (slave) sending Security Request */
558 p_cb->local_i_key &= p_cb->peer_i_key;
559 p_cb->local_r_key &= p_cb->peer_r_key;
560 p_cb->selected_association_model = smp_select_association_model(p_cb);
561
562 if (p_cb->secure_connections_only_mode_required &&
563 (!(p_cb->le_secure_connections_mode_is_used) ||
564 (p_cb->selected_association_model ==
565 SMP_MODEL_SEC_CONN_JUSTWORKS))) {
566 SMP_TRACE_ERROR(
johnshamoonb2dadde2017-05-31 11:32:24 -0700567 "%s: pairing failed - slave requires secure connection only mode",
Myles Watson911d1ae2016-11-28 16:44:40 -0800568 __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -0700569 tSMP_INT_DATA smp_int_data;
570 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
571 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800572 return;
Myles Watson911d1ae2016-11-28 16:44:40 -0800573 }
574
575 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
576 if (smp_request_oob_data(p_cb)) return;
577 } else {
578 smp_send_pair_rsp(p_cb, NULL);
579 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800580 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800581 } else /* Master receives pairing response */
582 {
583 p_cb->selected_association_model = smp_select_association_model(p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800584
Myles Watson911d1ae2016-11-28 16:44:40 -0800585 if (p_cb->secure_connections_only_mode_required &&
586 (!(p_cb->le_secure_connections_mode_is_used) ||
587 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
588 SMP_TRACE_ERROR(
johnshamoonb2dadde2017-05-31 11:32:24 -0700589 "Master requires secure connection only mode "
590 "but it can't be provided -> Master fails pairing");
Myles Watson5ce55bd2017-09-20 16:41:19 -0700591 tSMP_INT_DATA smp_int_data;
592 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
593 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800594 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800595 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800596
597 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
598 if (smp_request_oob_data(p_cb)) return;
599 } else {
600 smp_decide_association_model(p_cb, NULL);
601 }
602 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800603}
Satya Calloji444a8da2015-03-06 10:38:22 -0800604
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700605/** process pairing confirm from peer device */
Myles Watson911d1ae2016-11-28 16:44:40 -0800606void smp_proc_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800607 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800608
Myles Watson911d1ae2016-11-28 16:44:40 -0800609 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700610 tSMP_INT_DATA smp_int_data;
611 smp_int_data.status = SMP_INVALID_PARAMETERS;
612 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800613 return;
614 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800615
Jakub Pawlowski3c3fbd82019-01-11 13:43:33 +0100616 if (p_data) {
617 uint8_t* p = p_data->p_data;
618 if (p != NULL) {
619 /* save the SConfirm for comparison later */
620 STREAM_TO_ARRAY(p_cb->rconfirm.data(), p, OCTET16_LEN);
621 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800622 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800623
Myles Watson911d1ae2016-11-28 16:44:40 -0800624 p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800625}
626
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700627/** process pairing initializer from peer device */
Myles Watson911d1ae2016-11-28 16:44:40 -0800628void smp_proc_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700629 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800630
Myles Watson911d1ae2016-11-28 16:44:40 -0800631 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800632
Myles Watson911d1ae2016-11-28 16:44:40 -0800633 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700634 tSMP_INT_DATA smp_int_data;
635 smp_int_data.status = SMP_INVALID_PARAMETERS;
636 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800637 return;
638 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800639
Myles Watson911d1ae2016-11-28 16:44:40 -0800640 /* save the SRand for comparison */
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700641 STREAM_TO_ARRAY(p_cb->rrand.data(), p, OCTET16_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800642}
Satya Calloji444a8da2015-03-06 10:38:22 -0800643
644/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800645 * Function smp_proc_rand
646 * Description process pairing random (nonce) from peer device
647 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800648void smp_proc_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700649 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800650
Myles Watson911d1ae2016-11-28 16:44:40 -0800651 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800652
Myles Watson911d1ae2016-11-28 16:44:40 -0800653 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700654 tSMP_INT_DATA smp_int_data;
655 smp_int_data.status = SMP_INVALID_PARAMETERS;
656 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800657 return;
658 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800659
Myles Watson911d1ae2016-11-28 16:44:40 -0800660 /* save the SRand for comparison */
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700661 STREAM_TO_ARRAY(p_cb->rrand.data(), p, OCTET16_LEN);
Satya Calloji444a8da2015-03-06 10:38:22 -0800662}
663
664/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800665 * Function smp_process_pairing_public_key
666 * Description process pairing public key command from the peer device
667 * - saves the peer public key;
668 * - sets the flag indicating that the peer public key is received;
669 * - calls smp_wait_for_both_public_keys(...).
670 *
671 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800672void smp_process_pairing_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700673 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800674
Myles Watson911d1ae2016-11-28 16:44:40 -0800675 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800676
Myles Watson911d1ae2016-11-28 16:44:40 -0800677 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700678 tSMP_INT_DATA smp_int_data;
679 smp_int_data.status = SMP_INVALID_PARAMETERS;
680 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800681 return;
682 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800683
Myles Watson911d1ae2016-11-28 16:44:40 -0800684 STREAM_TO_ARRAY(p_cb->peer_publ_key.x, p, BT_OCTET32_LEN);
685 STREAM_TO_ARRAY(p_cb->peer_publ_key.y, p, BT_OCTET32_LEN);
Andre Eisenbach9181ec22018-03-01 13:27:01 -0800686
687 Point pt;
688 memcpy(pt.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN);
689 memcpy(pt.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN);
690
691 if (!ECC_ValidatePoint(pt)) {
692 android_errorWriteLog(0x534e4554, "72377774");
693 tSMP_INT_DATA smp;
694 smp.status = SMP_PAIR_AUTH_FAIL;
695 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp);
696 return;
697 }
698
Myles Watson911d1ae2016-11-28 16:44:40 -0800699 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY;
Satya Calloji444a8da2015-03-06 10:38:22 -0800700
Myles Watson911d1ae2016-11-28 16:44:40 -0800701 smp_wait_for_both_public_keys(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -0800702}
703
704/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800705 * Function smp_process_pairing_commitment
706 * Description process pairing commitment from peer device
707 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800708void smp_process_pairing_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700709 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800710
Myles Watson911d1ae2016-11-28 16:44:40 -0800711 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800712
Myles Watson911d1ae2016-11-28 16:44:40 -0800713 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700714 tSMP_INT_DATA smp_int_data;
715 smp_int_data.status = SMP_INVALID_PARAMETERS;
716 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800717 return;
718 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800719
Myles Watson911d1ae2016-11-28 16:44:40 -0800720 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM;
Satya Calloji444a8da2015-03-06 10:38:22 -0800721
Myles Watson911d1ae2016-11-28 16:44:40 -0800722 if (p != NULL) {
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700723 STREAM_TO_ARRAY(p_cb->remote_commitment.data(), p, OCTET16_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -0800724 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800725}
726
727/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800728 * Function smp_process_dhkey_check
729 * Description process DHKey Check from peer device
730 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800731void smp_process_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700732 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800733
Myles Watson911d1ae2016-11-28 16:44:40 -0800734 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800735
Myles Watson911d1ae2016-11-28 16:44:40 -0800736 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700737 tSMP_INT_DATA smp_int_data;
738 smp_int_data.status = SMP_INVALID_PARAMETERS;
739 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800740 return;
741 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800742
Myles Watson911d1ae2016-11-28 16:44:40 -0800743 if (p != NULL) {
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700744 STREAM_TO_ARRAY(p_cb->remote_dhkey_check.data(), p, OCTET16_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -0800745 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800746
Myles Watson911d1ae2016-11-28 16:44:40 -0800747 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK;
Satya Calloji444a8da2015-03-06 10:38:22 -0800748}
749
750/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800751 * Function smp_process_keypress_notification
752 * Description process pairing keypress notification from peer device
753 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800754void smp_process_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700755 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800756
Myles Watson911d1ae2016-11-28 16:44:40 -0800757 SMP_TRACE_DEBUG("%s", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -0700758 p_cb->status = p_data->status;
Satya Calloji444a8da2015-03-06 10:38:22 -0800759
Myles Watson911d1ae2016-11-28 16:44:40 -0800760 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700761 tSMP_INT_DATA smp_int_data;
762 smp_int_data.status = SMP_INVALID_PARAMETERS;
763 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800764 return;
765 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800766
Myles Watson911d1ae2016-11-28 16:44:40 -0800767 if (p != NULL) {
768 STREAM_TO_UINT8(p_cb->peer_keypress_notification, p);
769 } else {
770 p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE;
771 }
772 p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT;
Satya Calloji444a8da2015-03-06 10:38:22 -0800773}
774
775/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800776 * Function smp_br_process_pairing_command
777 * Description Process the SMP pairing request/response from peer device via
778 * BR/EDR transport.
779 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800780void smp_br_process_pairing_command(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700781 uint8_t* p = p_data->p_data;
Myles Watson911d1ae2016-11-28 16:44:40 -0800782 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
Satya Calloji444a8da2015-03-06 10:38:22 -0800783
Myles Watson911d1ae2016-11-28 16:44:40 -0800784 SMP_TRACE_DEBUG("%s", __func__);
785 /* rejecting BR pairing request over non-SC BR link */
786 if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700787 tSMP_INT_DATA smp_int_data;
788 smp_int_data.status = SMP_XTRANS_DERIVE_NOT_ALLOW;
789 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800790 return;
791 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800792
Myles Watson911d1ae2016-11-28 16:44:40 -0800793 /* erase all keys if it is slave proc pairing req*/
794 if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
795 btm_sec_clear_ble_keys(p_dev_rec);
Satya Calloji444a8da2015-03-06 10:38:22 -0800796
Myles Watson911d1ae2016-11-28 16:44:40 -0800797 p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
Satya Calloji444a8da2015-03-06 10:38:22 -0800798
Ugo Yu73aa4fa2018-11-29 17:55:40 +0800799 if (smp_command_has_invalid_length(p_cb)) {
800 tSMP_INT_DATA smp_int_data;
801 smp_int_data.status = SMP_INVALID_PARAMETERS;
802 android_errorWriteLog(0x534e4554, "111213909");
803 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
804 return;
805 }
806
Myles Watson911d1ae2016-11-28 16:44:40 -0800807 STREAM_TO_UINT8(p_cb->peer_io_caps, p);
808 STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
809 STREAM_TO_UINT8(p_cb->peer_auth_req, p);
810 STREAM_TO_UINT8(p_cb->peer_enc_size, p);
811 STREAM_TO_UINT8(p_cb->peer_i_key, p);
812 STREAM_TO_UINT8(p_cb->peer_r_key, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800813
Myles Watson911d1ae2016-11-28 16:44:40 -0800814 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700815 tSMP_INT_DATA smp_int_data;
816 smp_int_data.status = SMP_INVALID_PARAMETERS;
817 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800818 return;
819 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800820
Myles Watson911d1ae2016-11-28 16:44:40 -0800821 /* peer (master) started pairing sending Pairing Request */
822 /* or being master device always use received i/r key as keys to distribute */
823 p_cb->local_i_key = p_cb->peer_i_key;
824 p_cb->local_r_key = p_cb->peer_r_key;
Satya Calloji444a8da2015-03-06 10:38:22 -0800825
Myles Watson911d1ae2016-11-28 16:44:40 -0800826 if (p_cb->role == HCI_ROLE_SLAVE) {
827 p_dev_rec->new_encryption_key_is_p256 = false;
828 /* shortcut to skip Security Grant step */
829 p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
johnshamoonb2dadde2017-05-31 11:32:24 -0700830 } else {
831 /* Master receives pairing response */
Myles Watson911d1ae2016-11-28 16:44:40 -0800832 SMP_TRACE_DEBUG(
833 "%s master rcvs valid PAIRING RESPONSE."
834 " Supposed to move to key distribution phase. ",
835 __func__);
836 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800837
Myles Watson911d1ae2016-11-28 16:44:40 -0800838 /* auth_req received via BR/EDR SM channel is set to 0,
839 but everything derived/exchanged has to be saved */
840 p_cb->peer_auth_req |= SMP_AUTH_BOND;
841 p_cb->loc_auth_req |= SMP_AUTH_BOND;
Satya Calloji444a8da2015-03-06 10:38:22 -0800842}
843
844/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800845 * Function smp_br_process_security_grant
846 * Description process security grant in case of pairing over BR/EDR transport.
847 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800848void smp_br_process_security_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800849 SMP_TRACE_DEBUG("%s", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -0700850 if (p_data->status != SMP_SUCCESS) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800851 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data);
johnshamoonb2dadde2017-05-31 11:32:24 -0700852 } else {
853 /* otherwise, start pairing; send IO request callback */
Myles Watson911d1ae2016-11-28 16:44:40 -0800854 p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
855 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800856}
857
858/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800859 * Function smp_br_check_authorization_request
860 * Description sets the SMP kes to be derived/distribute over BR/EDR transport
861 * before starting the distribution/derivation
862 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800863void smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
johnshamoonb2dadde2017-05-31 11:32:24 -0700864 SMP_TRACE_DEBUG("%s rcvs i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
865 __func__, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800866
Myles Watson911d1ae2016-11-28 16:44:40 -0800867 /* In LE SC mode LK field is ignored when BR/EDR transport is used */
868 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
869 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
Satya Calloji444a8da2015-03-06 10:38:22 -0800870
Myles Watson911d1ae2016-11-28 16:44:40 -0800871 /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
872 ** Set local_r_key on master to expect only these keys. */
873 if (p_cb->role == HCI_ROLE_MASTER) {
874 p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
875 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800876
Jakub Pawlowskie7f14a62017-03-20 15:38:56 -0700877 /* Check if H7 function needs to be used for key derivation*/
878 if ((p_cb->loc_auth_req & SMP_H7_SUPPORT_BIT) &&
879 (p_cb->peer_auth_req & SMP_H7_SUPPORT_BIT)) {
880 p_cb->key_derivation_h7_used = TRUE;
881 }
882 SMP_TRACE_DEBUG("%s: use h7 = %d", __func__, p_cb->key_derivation_h7_used);
883
Myles Watson911d1ae2016-11-28 16:44:40 -0800884 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -0700885 "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
Myles Watson911d1ae2016-11-28 16:44:40 -0800886 __func__, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800887
Myles Watson911d1ae2016-11-28 16:44:40 -0800888 if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
889 (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
890 (p_cb->local_i_key || p_cb->local_r_key)) {
891 smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -0800892
Myles Watson911d1ae2016-11-28 16:44:40 -0800893 /* if no peer key is expected, start master key distribution */
894 if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0)
895 smp_key_distribution_by_transport(p_cb, NULL);
896 } else {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700897 tSMP_INT_DATA smp_int_data;
898 smp_int_data.status = SMP_SUCCESS;
899 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800900 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800901}
902
903/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800904 * Function smp_br_select_next_key
905 * Description selects the next key to derive/send when BR/EDR transport is
906 * used.
907 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800908void smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800909 SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
910 p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800911
Myles Watson911d1ae2016-11-28 16:44:40 -0800912 if (p_cb->role == HCI_ROLE_SLAVE ||
913 (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
914 smp_key_pick_key(p_cb, p_data);
915 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800916
Myles Watson911d1ae2016-11-28 16:44:40 -0800917 if (!p_cb->local_i_key && !p_cb->local_r_key) {
918 /* state check to prevent re-entrance */
919 if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700920 if (p_cb->total_tx_unacked == 0) {
921 tSMP_INT_DATA smp_int_data;
922 smp_int_data.status = SMP_SUCCESS;
923 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
924 } else {
Myles Watson911d1ae2016-11-28 16:44:40 -0800925 p_cb->wait_for_authorization_complete = true;
Myles Watson5ce55bd2017-09-20 16:41:19 -0700926 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800927 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800928 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800929}
930
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700931/** process encryption information from peer device */
Myles Watson911d1ae2016-11-28 16:44:40 -0800932void smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700933 uint8_t* p = p_data->p_data;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800934
Myles Watson911d1ae2016-11-28 16:44:40 -0800935 SMP_TRACE_DEBUG("%s", __func__);
Cheney Ni0e68a1c2018-08-08 22:20:08 +0800936
937 if (smp_command_has_invalid_parameters(p_cb)) {
938 tSMP_INT_DATA smp_int_data;
939 smp_int_data.status = SMP_INVALID_PARAMETERS;
940 android_errorWriteLog(0x534e4554, "111937065");
941 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
942 return;
943 }
944
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700945 STREAM_TO_ARRAY(p_cb->ltk.data(), p, OCTET16_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800946
Myles Watson911d1ae2016-11-28 16:44:40 -0800947 smp_key_distribution(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800948}
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700949
950/** process master ID from slave device */
Myles Watson911d1ae2016-11-28 16:44:40 -0800951void smp_proc_master_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700952 uint8_t* p = p_data->p_data;
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100953 tBTM_LE_KEY_VALUE le_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800954
Myles Watson911d1ae2016-11-28 16:44:40 -0800955 SMP_TRACE_DEBUG("%s", __func__);
Ugo Yuc8294662018-08-08 16:09:58 +0800956
957 if (p_cb->rcvd_cmd_len < 11) { // 1(Code) + 2(EDIV) + 8(Rand)
958 android_errorWriteLog(0x534e4554, "111937027");
959 SMP_TRACE_ERROR("%s: Invalid command length: %d, should be at least 11",
960 __func__, p_cb->rcvd_cmd_len);
961 return;
962 }
963
Myles Watson911d1ae2016-11-28 16:44:40 -0800964 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800965
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100966 STREAM_TO_UINT16(le_key.penc_key.ediv, p);
967 STREAM_TO_ARRAY(le_key.penc_key.rand, p, BT_OCTET8_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800968
Myles Watson911d1ae2016-11-28 16:44:40 -0800969 /* store the encryption keys from peer device */
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100970 le_key.penc_key.ltk = p_cb->ltk;
971 le_key.penc_key.sec_level = p_cb->sec_level;
972 le_key.penc_key.key_size = p_cb->loc_enc_size;
Satya Calloji444a8da2015-03-06 10:38:22 -0800973
Myles Watson911d1ae2016-11-28 16:44:40 -0800974 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
975 (p_cb->loc_auth_req & SMP_AUTH_BOND))
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +0100976 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC, &le_key, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800977
Myles Watson911d1ae2016-11-28 16:44:40 -0800978 smp_key_distribution(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800979}
Satya Calloji444a8da2015-03-06 10:38:22 -0800980
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700981/** process identity information from peer device */
Myles Watson911d1ae2016-11-28 16:44:40 -0800982void smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700983 uint8_t* p = p_data->p_data;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800984
Myles Watson911d1ae2016-11-28 16:44:40 -0800985 SMP_TRACE_DEBUG("%s", __func__);
Cheney Ni0e68a1c2018-08-08 22:20:08 +0800986
987 if (smp_command_has_invalid_parameters(p_cb)) {
988 tSMP_INT_DATA smp_int_data;
989 smp_int_data.status = SMP_INVALID_PARAMETERS;
990 android_errorWriteLog(0x534e4554, "111937065");
991 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
992 return;
993 }
994
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700995 STREAM_TO_ARRAY(p_cb->tk.data(), p, OCTET16_LEN); /* reuse TK for IRK */
Myles Watson911d1ae2016-11-28 16:44:40 -0800996 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800997}
Satya Calloji444a8da2015-03-06 10:38:22 -0800998
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700999/** process identity address from peer device */
Myles Watson911d1ae2016-11-28 16:44:40 -08001000void smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001001 uint8_t* p = p_data->p_data;
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001002 tBTM_LE_KEY_VALUE pid_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001003
Myles Watson911d1ae2016-11-28 16:44:40 -08001004 SMP_TRACE_DEBUG("%s", __func__);
Ugo Yu73aa4fa2018-11-29 17:55:40 +08001005
1006 if (smp_command_has_invalid_parameters(p_cb)) {
1007 tSMP_INT_DATA smp_int_data;
1008 smp_int_data.status = SMP_INVALID_PARAMETERS;
1009 android_errorWriteLog(0x534e4554, "111214770");
1010 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1011 return;
1012 }
1013
Myles Watson911d1ae2016-11-28 16:44:40 -08001014 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001015
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001016 STREAM_TO_UINT8(pid_key.pid_key.identity_addr_type, p);
1017 STREAM_TO_BDADDR(pid_key.pid_key.identity_addr, p);
1018 pid_key.pid_key.irk = p_cb->tk;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001019
Myles Watson911d1ae2016-11-28 16:44:40 -08001020 /* to use as BD_ADDR for lk derived from ltk */
1021 p_cb->id_addr_rcvd = true;
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001022 p_cb->id_addr_type = pid_key.pid_key.identity_addr_type;
1023 p_cb->id_addr = pid_key.pid_key.identity_addr;
Chaojing Sune2805532015-04-22 13:40:21 -07001024
Myles Watson911d1ae2016-11-28 16:44:40 -08001025 /* store the ID key from peer device */
1026 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
1027 (p_cb->loc_auth_req & SMP_AUTH_BOND))
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001028 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID, &pid_key, true);
Myles Watson911d1ae2016-11-28 16:44:40 -08001029 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001030}
Satya Calloji444a8da2015-03-06 10:38:22 -08001031
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001032/* process security information from peer device */
Myles Watson911d1ae2016-11-28 16:44:40 -08001033void smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001034 tBTM_LE_KEY_VALUE le_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001035
Myles Watson911d1ae2016-11-28 16:44:40 -08001036 SMP_TRACE_DEBUG("%s", __func__);
Ugo Yu73aa4fa2018-11-29 17:55:40 +08001037
1038 if (smp_command_has_invalid_parameters(p_cb)) {
1039 tSMP_INT_DATA smp_int_data;
1040 smp_int_data.status = SMP_INVALID_PARAMETERS;
1041 android_errorWriteLog(0x534e4554, "111214470");
1042 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1043 return;
1044 }
1045
Myles Watson911d1ae2016-11-28 16:44:40 -08001046 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001047
Myles Watson911d1ae2016-11-28 16:44:40 -08001048 /* save CSRK to security record */
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001049 le_key.pcsrk_key.sec_level = p_cb->sec_level;
johnshamoonb2dadde2017-05-31 11:32:24 -07001050
1051 /* get peer CSRK */
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001052 maybe_non_aligned_memcpy(le_key.pcsrk_key.csrk.data(), p_data->p_data,
1053 OCTET16_LEN);
johnshamoonb2dadde2017-05-31 11:32:24 -07001054
1055 /* initialize the peer counter */
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001056 le_key.pcsrk_key.counter = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001057
Myles Watson911d1ae2016-11-28 16:44:40 -08001058 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
1059 (p_cb->loc_auth_req & SMP_AUTH_BOND))
Jakub Pawlowskib6d3e5b2018-11-27 18:22:22 +01001060 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PCSRK, &le_key, true);
Myles Watson911d1ae2016-11-28 16:44:40 -08001061 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001062}
1063
1064/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001065 * Function smp_proc_compare
1066 * Description process compare value
1067 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001068void smp_proc_compare(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001069 SMP_TRACE_DEBUG("%s", __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001070 if (!memcmp(p_cb->rconfirm.data(), p_data->key.p_data, OCTET16_LEN)) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001071 /* compare the max encryption key size, and save the smaller one for the
1072 * link */
1073 if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1074 p_cb->loc_enc_size = p_cb->peer_enc_size;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001075
Myles Watson911d1ae2016-11-28 16:44:40 -08001076 if (p_cb->role == HCI_ROLE_SLAVE)
1077 smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
1078 else {
1079 /* master device always use received i/r key as keys to distribute */
1080 p_cb->local_i_key = p_cb->peer_i_key;
1081 p_cb->local_r_key = p_cb->peer_r_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001082
Myles Watson911d1ae2016-11-28 16:44:40 -08001083 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001084 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001085
1086 } else {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001087 tSMP_INT_DATA smp_int_data;
1088 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1089 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1090 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001091 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001092}
Satya Calloji444a8da2015-03-06 10:38:22 -08001093
The Android Open Source Project5738f832012-12-12 16:00:35 -08001094/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001095 * Function smp_proc_sl_key
1096 * Description process key ready events.
1097 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001098void smp_proc_sl_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1099 uint8_t key_type = p_data->key.key_type;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001100
Myles Watson911d1ae2016-11-28 16:44:40 -08001101 SMP_TRACE_DEBUG("%s", __func__);
1102 if (key_type == SMP_KEY_TYPE_TK) {
1103 smp_generate_srand_mrand_confirm(p_cb, NULL);
1104 } else if (key_type == SMP_KEY_TYPE_CFM) {
1105 smp_set_state(SMP_STATE_WAIT_CONFIRM);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001106
Myles Watson911d1ae2016-11-28 16:44:40 -08001107 if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
1108 smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
1109 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001110}
Satya Calloji444a8da2015-03-06 10:38:22 -08001111
The Android Open Source Project5738f832012-12-12 16:00:35 -08001112/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001113 * Function smp_start_enc
1114 * Description start encryption
1115 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001116void smp_start_enc(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1117 tBTM_STATUS cmd;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001118
Myles Watson911d1ae2016-11-28 16:44:40 -08001119 SMP_TRACE_DEBUG("%s", __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001120 if (p_data != NULL) {
1121 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, true,
1122 (Octet16*)p_data->key.p_data);
1123 } else {
Myles Watson911d1ae2016-11-28 16:44:40 -08001124 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, false, NULL);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001125 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001126
Myles Watson5ce55bd2017-09-20 16:41:19 -07001127 if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) {
1128 tSMP_INT_DATA smp_int_data;
1129 smp_int_data.status = SMP_ENC_FAIL;
1130 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1131 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001132}
1133
1134/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001135 * Function smp_proc_discard
1136 * Description processing for discard security request
1137 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001138void smp_proc_discard(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1139 SMP_TRACE_DEBUG("%s", __func__);
1140 if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
1141 smp_reset_control_value(p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001142}
The Android Open Source Project5738f832012-12-12 16:00:35 -08001143
1144/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001145 * Function smp_enc_cmpl
1146 * Description encryption success
1147 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001148void smp_enc_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001149 uint8_t enc_enable = p_data->status;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001150
Myles Watson911d1ae2016-11-28 16:44:40 -08001151 SMP_TRACE_DEBUG("%s", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001152 tSMP_INT_DATA smp_int_data;
1153 smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
1154 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001155}
1156
The Android Open Source Project5738f832012-12-12 16:00:35 -08001157/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001158 * Function smp_check_auth_req
1159 * Description check authentication request
1160 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001161void smp_check_auth_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001162 uint8_t enc_enable = p_data->status;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001163
Myles Watson911d1ae2016-11-28 16:44:40 -08001164 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -07001165 "%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
Myles Watson911d1ae2016-11-28 16:44:40 -08001166 __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key);
1167 if (enc_enable == 1) {
1168 if (p_cb->le_secure_connections_mode_is_used) {
1169 /* In LE SC mode LTK is used instead of STK and has to be always saved */
1170 p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC;
1171 p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC;
Satya Calloji444a8da2015-03-06 10:38:22 -08001172
Myles Watson911d1ae2016-11-28 16:44:40 -08001173 /* In LE SC mode LK is derived from LTK only if both sides request it */
1174 if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) ||
1175 !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) {
1176 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1177 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1178 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001179
Myles Watson911d1ae2016-11-28 16:44:40 -08001180 /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
1181 ** Set local_r_key on master to expect only these keys.
1182 */
1183 if (p_cb->role == HCI_ROLE_MASTER) {
1184 p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
1185 }
1186 } else {
1187 /* in legacy mode derivation of BR/EDR LK is not supported */
1188 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1189 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001190 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001191 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -07001192 "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
Myles Watson911d1ae2016-11-28 16:44:40 -08001193 __func__, p_cb->local_i_key, p_cb->local_r_key);
1194
1195 if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
1196 (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
1197 (p_cb->local_i_key || p_cb->local_r_key)) {
1198 smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001199 } else {
1200 tSMP_INT_DATA smp_int_data;
1201 smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
1202 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1203 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001204 } else if (enc_enable == 0) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001205 tSMP_INT_DATA smp_int_data;
1206 smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
Myles Watson911d1ae2016-11-28 16:44:40 -08001207 /* if failed for encryption after pairing, send callback */
1208 if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
Myles Watson5ce55bd2017-09-20 16:41:19 -07001209 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001210 /* if enc failed for old security information */
1211 /* if master device, clean up and abck to idle; slave device do nothing */
1212 else if (p_cb->role == HCI_ROLE_MASTER) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001213 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001214 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001215 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001216}
1217
1218/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001219 * Function smp_key_pick_key
1220 * Description Pick a key distribution function based on the key mask.
1221 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001222void smp_key_pick_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1223 uint8_t key_to_dist =
1224 (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->local_r_key : p_cb->local_i_key;
1225 uint8_t i = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001226
Myles Watson911d1ae2016-11-28 16:44:40 -08001227 SMP_TRACE_DEBUG("%s key_to_dist=0x%x", __func__, key_to_dist);
1228 while (i < SMP_KEY_DIST_TYPE_MAX) {
1229 SMP_TRACE_DEBUG("key to send = %02x, i = %d", key_to_dist, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001230
Myles Watson911d1ae2016-11-28 16:44:40 -08001231 if (key_to_dist & (1 << i)) {
1232 SMP_TRACE_DEBUG("smp_distribute_act[%d]", i);
1233 (*smp_distribute_act[i])(p_cb, p_data);
1234 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001235 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001236 i++;
1237 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001238}
1239/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001240 * Function smp_key_distribution
1241 * Description start key distribution if required.
1242 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001243void smp_key_distribution(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1244 SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
1245 p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001246
Myles Watson911d1ae2016-11-28 16:44:40 -08001247 if (p_cb->role == HCI_ROLE_SLAVE ||
1248 (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
1249 smp_key_pick_key(p_cb, p_data);
1250 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001251
Myles Watson911d1ae2016-11-28 16:44:40 -08001252 if (!p_cb->local_i_key && !p_cb->local_r_key) {
1253 /* state check to prevent re-entrant */
1254 if (smp_get_state() == SMP_STATE_BOND_PENDING) {
1255 if (p_cb->derive_lk) {
1256 smp_derive_link_key_from_long_term_key(p_cb, NULL);
1257 p_cb->derive_lk = false;
1258 }
Chaojing Sune2805532015-04-22 13:40:21 -07001259
Myles Watson911d1ae2016-11-28 16:44:40 -08001260 if (p_cb->total_tx_unacked == 0) {
1261 /*
1262 * Instead of declaring authorization complete immediately,
1263 * delay the event from being sent by SMP_DELAYED_AUTH_TIMEOUT_MS.
1264 * This allows the slave to send over Pairing Failed if the
1265 * last key is rejected. During this waiting window, the
1266 * state should remain in SMP_STATE_BOND_PENDING.
1267 */
1268 if (!alarm_is_scheduled(p_cb->delayed_auth_timer_ent)) {
1269 SMP_TRACE_DEBUG("%s delaying auth complete.", __func__);
Jakub Pawlowskibe8bbd72017-09-08 11:26:25 -07001270 alarm_set_on_mloop(p_cb->delayed_auth_timer_ent,
1271 SMP_DELAYED_AUTH_TIMEOUT_MS,
1272 smp_delayed_auth_complete_timeout, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001273 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001274 } else {
1275 p_cb->wait_for_authorization_complete = true;
1276 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001277 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001278 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001279}
Satya Calloji444a8da2015-03-06 10:38:22 -08001280
The Android Open Source Project5738f832012-12-12 16:00:35 -08001281/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001282 * Function smp_decide_association_model
1283 * Description This function is called to select assoc model to be used for
1284 * STK generation and to start STK generation process.
1285 *
1286 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001287void smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001288 uint8_t int_evt = 0;
Myles Watson5ce55bd2017-09-20 16:41:19 -07001289 tSMP_INT_DATA smp_int_data;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001290
Myles Watson911d1ae2016-11-28 16:44:40 -08001291 SMP_TRACE_DEBUG("%s Association Model = %d", __func__,
1292 p_cb->selected_association_model);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001293
Myles Watson911d1ae2016-11-28 16:44:40 -08001294 switch (p_cb->selected_association_model) {
1295 case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */
1296 if (p_cb->role == HCI_ROLE_MASTER &&
1297 ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
1298 ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) {
1299 SMP_TRACE_ERROR(
1300 "IO capability does not meet authentication requirement");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001301 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
Myles Watson911d1ae2016-11-28 16:44:40 -08001302 int_evt = SMP_AUTH_CMPL_EVT;
1303 } else {
Rahul Sabnis03580fc2020-06-26 10:27:07 -07001304 if (p_cb->local_io_capability != SMP_IO_CAP_NONE &&
1305 p_cb->local_io_capability != SMP_IO_CAP_IN) {
1306 /* display consent dialog if this device has a display */
1307 SMP_TRACE_DEBUG("ENCRYPTION_ONLY showing Consent Dialog");
1308 p_cb->cb_evt = SMP_CONSENT_REQ_EVT;
1309 smp_set_state(SMP_STATE_WAIT_NONCE);
1310 smp_sm_event(p_cb, SMP_SC_DSPL_NC_EVT, NULL);
1311 } else {
1312 p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1313 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1314 p_cb->sec_level);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001315
Rahul Sabnis03580fc2020-06-26 10:27:07 -07001316 tSMP_KEY key;
1317 key.key_type = SMP_KEY_TYPE_TK;
1318 key.p_data = p_cb->tk.data();
1319 smp_int_data.key = key;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001320
Rahul Sabnis03580fc2020-06-26 10:27:07 -07001321 p_cb->tk = {0};
1322 /* TK, ready */
1323 int_evt = SMP_KEY_READY_EVT;
1324 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001325 }
1326 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001327
Myles Watson911d1ae2016-11-28 16:44:40 -08001328 case SMP_MODEL_PASSKEY:
1329 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1330 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1331 p_cb->sec_level);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001332
Myles Watson911d1ae2016-11-28 16:44:40 -08001333 p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1334 int_evt = SMP_TK_REQ_EVT;
1335 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001336
Myles Watson911d1ae2016-11-28 16:44:40 -08001337 case SMP_MODEL_OOB:
1338 SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
1339 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1340 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1341 p_cb->sec_level);
Satya Calloji444a8da2015-03-06 10:38:22 -08001342
Myles Watson911d1ae2016-11-28 16:44:40 -08001343 p_cb->cb_evt = SMP_OOB_REQ_EVT;
1344 int_evt = SMP_TK_REQ_EVT;
1345 break;
Satya Calloji444a8da2015-03-06 10:38:22 -08001346
Myles Watson911d1ae2016-11-28 16:44:40 -08001347 case SMP_MODEL_KEY_NOTIF:
1348 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1349 SMP_TRACE_DEBUG("Need to generate Passkey");
Satya Calloji444a8da2015-03-06 10:38:22 -08001350
Myles Watson911d1ae2016-11-28 16:44:40 -08001351 /* generate passkey and notify application */
1352 smp_generate_passkey(p_cb, NULL);
1353 break;
Satya Calloji444a8da2015-03-06 10:38:22 -08001354
Myles Watson911d1ae2016-11-28 16:44:40 -08001355 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1356 case SMP_MODEL_SEC_CONN_NUM_COMP:
1357 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1358 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1359 case SMP_MODEL_SEC_CONN_OOB:
1360 int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT;
1361 break;
Satya Calloji444a8da2015-03-06 10:38:22 -08001362
Myles Watson911d1ae2016-11-28 16:44:40 -08001363 case SMP_MODEL_OUT_OF_RANGE:
1364 SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001365 smp_int_data.status = SMP_UNKNOWN_IO_CAP;
Myles Watson911d1ae2016-11-28 16:44:40 -08001366 int_evt = SMP_AUTH_CMPL_EVT;
1367 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001368
Myles Watson911d1ae2016-11-28 16:44:40 -08001369 default:
1370 SMP_TRACE_ERROR(
1371 "Association Model = %d (SOMETHING IS WRONG WITH THE CODE)",
1372 p_cb->selected_association_model);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001373 smp_int_data.status = SMP_UNKNOWN_IO_CAP;
Myles Watson911d1ae2016-11-28 16:44:40 -08001374 int_evt = SMP_AUTH_CMPL_EVT;
1375 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001376
Myles Watson911d1ae2016-11-28 16:44:40 -08001377 SMP_TRACE_EVENT("sec_level=%d ", p_cb->sec_level);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001378 if (int_evt) smp_sm_event(p_cb, int_evt, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001379}
1380
1381/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001382 * Function smp_process_io_response
1383 * Description process IO response for a slave device.
1384 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001385void smp_process_io_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001386
Myles Watson911d1ae2016-11-28 16:44:40 -08001387 SMP_TRACE_DEBUG("%s", __func__);
1388 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1389 /* pairing started by local (slave) Security Request */
1390 smp_set_state(SMP_STATE_SEC_REQ_PENDING);
1391 smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
1392 } else /* plan to send pairing respond */
1393 {
1394 /* pairing started by peer (master) Pairing Request */
1395 p_cb->selected_association_model = smp_select_association_model(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001396
Myles Watson911d1ae2016-11-28 16:44:40 -08001397 if (p_cb->secure_connections_only_mode_required &&
1398 (!(p_cb->le_secure_connections_mode_is_used) ||
1399 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
1400 SMP_TRACE_ERROR(
johnshamoonb2dadde2017-05-31 11:32:24 -07001401 "Slave requires secure connection only mode "
1402 "but it can't be provided -> Slave fails pairing");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001403 tSMP_INT_DATA smp_int_data;
1404 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
1405 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001406 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001407 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001408
1409 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
1410 if (smp_request_oob_data(p_cb)) return;
1411 }
1412
1413 // PTS Testing failure modes
1414 if (pts_test_send_authentication_complete_failure(p_cb)) return;
1415
1416 smp_send_pair_rsp(p_cb, NULL);
1417 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001418}
Satya Calloji444a8da2015-03-06 10:38:22 -08001419
1420/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001421 * Function smp_br_process_slave_keys_response
1422 * Description process application keys response for a slave device
1423 * (BR/EDR transport).
1424 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001425void smp_br_process_slave_keys_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1426 smp_br_send_pair_response(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001427}
1428
1429/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001430 * Function smp_br_send_pair_response
Myles Watson9ca07092016-11-28 16:41:53 -08001431 * Description actions related to sending pairing response over BR/EDR
1432 * transport.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001433 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001434void smp_br_send_pair_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1435 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001436
Myles Watson911d1ae2016-11-28 16:44:40 -08001437 p_cb->local_i_key &= p_cb->peer_i_key;
1438 p_cb->local_r_key &= p_cb->peer_r_key;
Satya Calloji444a8da2015-03-06 10:38:22 -08001439
Myles Watson911d1ae2016-11-28 16:44:40 -08001440 smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001441}
1442
The Android Open Source Project5738f832012-12-12 16:00:35 -08001443/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001444 * Function smp_pairing_cmpl
Myles Watson9ca07092016-11-28 16:41:53 -08001445 * Description This function is called to send the pairing complete
1446 * callback and remove the connection if needed.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001447 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001448void smp_pairing_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1449 if (p_cb->total_tx_unacked == 0) {
1450 /* process the pairing complete */
1451 smp_proc_pairing_cmpl(p_cb);
1452 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001453}
Satya Calloji444a8da2015-03-06 10:38:22 -08001454
The Android Open Source Project5738f832012-12-12 16:00:35 -08001455/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001456 * Function smp_pair_terminate
Myles Watson9ca07092016-11-28 16:41:53 -08001457 * Description This function is called to send the pairing complete
1458 * callback and remove the connection if needed.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001459 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001460void smp_pair_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1461 SMP_TRACE_DEBUG("%s", __func__);
1462 p_cb->status = SMP_CONN_TOUT;
1463 smp_proc_pairing_cmpl(p_cb);
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07001464}
1465
1466/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001467 * Function smp_idle_terminate
Myles Watson9ca07092016-11-28 16:41:53 -08001468 * Description This function calledin idle state to determine to send
1469 * authentication complete or not.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001470 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001471void smp_idle_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1472 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1473 SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
1474 p_cb->status = SMP_FAIL;
1475 smp_proc_pairing_cmpl(p_cb);
1476 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001477}
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001478
1479/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001480 * Function smp_both_have_public_keys
1481 * Description The function is called when both local and peer public keys are
1482 * saved.
1483 * Actions:
1484 * - invokes DHKey computation;
1485 * - on slave side invokes sending local public key to the peer.
1486 * - invokes SC phase 1 process.
1487 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001488void smp_both_have_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1489 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001490
Myles Watson911d1ae2016-11-28 16:44:40 -08001491 /* invokes DHKey computation */
1492 smp_compute_dhkey(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001493
Myles Watson911d1ae2016-11-28 16:44:40 -08001494 /* on slave side invokes sending local public key to the peer */
1495 if (p_cb->role == HCI_ROLE_SLAVE) smp_send_pair_public_key(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001496
Myles Watson911d1ae2016-11-28 16:44:40 -08001497 smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001498}
1499
1500/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001501 * Function smp_start_secure_connection_phase1
Myles Watson9ca07092016-11-28 16:41:53 -08001502 * Description Start Secure Connection phase1 i.e. invokes initialization of
1503 * Secure Connection phase 1 parameters and starts building/sending
1504 * to the peer messages appropriate for the role and association
1505 * model.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001506 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001507void smp_start_secure_connection_phase1(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1508 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001509
Myles Watson911d1ae2016-11-28 16:44:40 -08001510 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1511 p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1512 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1513 p_cb->sec_level);
1514 } else {
1515 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1516 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1517 p_cb->sec_level);
1518 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001519
Myles Watson911d1ae2016-11-28 16:44:40 -08001520 switch (p_cb->selected_association_model) {
1521 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1522 case SMP_MODEL_SEC_CONN_NUM_COMP:
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001523 p_cb->local_random = {0};
Myles Watson911d1ae2016-11-28 16:44:40 -08001524 smp_start_nonce_generation(p_cb);
1525 break;
1526 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1527 /* user has to provide passkey */
1528 p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1529 smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL);
1530 break;
1531 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1532 /* passkey has to be provided to user */
1533 SMP_TRACE_DEBUG("Need to generate SC Passkey");
1534 smp_generate_passkey(p_cb, NULL);
1535 break;
1536 case SMP_MODEL_SEC_CONN_OOB:
1537 /* use the available OOB information */
1538 smp_process_secure_connection_oob_data(p_cb, NULL);
1539 break;
1540 default:
1541 SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1542 p_cb->selected_association_model);
1543 break;
1544 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001545}
1546
1547/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001548 * Function smp_process_local_nonce
1549 * Description The function processes new local nonce.
1550 *
1551 * Note It is supposed to be called in SC phase1.
1552 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001553void smp_process_local_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1554 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001555
Myles Watson911d1ae2016-11-28 16:44:40 -08001556 switch (p_cb->selected_association_model) {
1557 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1558 case SMP_MODEL_SEC_CONN_NUM_COMP:
1559 if (p_cb->role == HCI_ROLE_SLAVE) {
1560 /* slave calculates and sends local commitment */
1561 smp_calculate_local_commitment(p_cb);
1562 smp_send_commitment(p_cb, NULL);
1563 /* slave has to wait for peer nonce */
1564 smp_set_state(SMP_STATE_WAIT_NONCE);
1565 } else /* i.e. master */
1566 {
1567 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1568 /* slave commitment is already received, send local nonce, wait for
1569 * remote nonce*/
1570 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -07001571 "master in assoc mode = %d "
1572 "already rcvd slave commitment - race condition",
Myles Watson911d1ae2016-11-28 16:44:40 -08001573 p_cb->selected_association_model);
1574 p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1575 smp_send_rand(p_cb, NULL);
1576 smp_set_state(SMP_STATE_WAIT_NONCE);
1577 }
1578 }
1579 break;
1580 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1581 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1582 smp_calculate_local_commitment(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001583
Myles Watson911d1ae2016-11-28 16:44:40 -08001584 if (p_cb->role == HCI_ROLE_MASTER) {
1585 smp_send_commitment(p_cb, NULL);
1586 } else /* slave */
1587 {
1588 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1589 /* master commitment is already received */
1590 smp_send_commitment(p_cb, NULL);
1591 smp_set_state(SMP_STATE_WAIT_NONCE);
1592 }
1593 }
1594 break;
1595 case SMP_MODEL_SEC_CONN_OOB:
1596 if (p_cb->role == HCI_ROLE_MASTER) {
1597 smp_send_rand(p_cb, NULL);
1598 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001599
Myles Watson911d1ae2016-11-28 16:44:40 -08001600 smp_set_state(SMP_STATE_WAIT_NONCE);
1601 break;
1602 default:
1603 SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1604 p_cb->selected_association_model);
1605 break;
1606 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001607}
1608
1609/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001610 * Function smp_process_peer_nonce
Myles Watson9ca07092016-11-28 16:41:53 -08001611 * Description The function processes newly received and saved in CB peer
1612 * nonce. The actions depend on the selected association model and
1613 * the role.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001614 *
1615 * Note It is supposed to be called in SC phase1.
1616 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001617void smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001618 SMP_TRACE_DEBUG("%s start ", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001619
Myles Watson911d1ae2016-11-28 16:44:40 -08001620 // PTS Testing failure modes
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301621 if (p_cb->cert_failure == SMP_CONFIRM_VALUE_ERR) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001622 SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001623 tSMP_INT_DATA smp_int_data;
1624 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1625 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1626 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001627 return;
1628 }
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301629 // PTS Testing failure modes (for LT)
1630 if ((p_cb->cert_failure == SMP_NUMERIC_COMPAR_FAIL) &&
1631 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) &&
1632 (p_cb->role == HCI_ROLE_SLAVE)) {
1633 SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001634 tSMP_INT_DATA smp_int_data;
1635 smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL;
1636 p_cb->failure = SMP_NUMERIC_COMPAR_FAIL;
1637 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301638 return;
1639 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001640
1641 switch (p_cb->selected_association_model) {
1642 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1643 case SMP_MODEL_SEC_CONN_NUM_COMP:
1644 /* in these models only master receives commitment */
1645 if (p_cb->role == HCI_ROLE_MASTER) {
1646 if (!smp_check_commitment(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001647 tSMP_INT_DATA smp_int_data;
1648 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1649 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1650 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001651 break;
1652 }
1653 } else {
1654 /* slave sends local nonce */
1655 smp_send_rand(p_cb, NULL);
1656 }
1657
1658 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
Rahul Sabnis03580fc2020-06-26 10:27:07 -07001659 if (p_cb->local_io_capability != SMP_IO_CAP_NONE &&
1660 p_cb->local_io_capability != SMP_IO_CAP_IN) {
1661 /* display consent dialog */
1662 SMP_TRACE_DEBUG("JUST WORKS showing Consent Dialog");
1663 p_cb->cb_evt = SMP_CONSENT_REQ_EVT;
1664 smp_set_state(SMP_STATE_WAIT_NONCE);
1665 smp_sm_event(p_cb, SMP_SC_DSPL_NC_EVT, NULL);
1666 } else {
1667 /* go directly to phase 2 */
1668 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1669 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001670 } else /* numeric comparison */
1671 {
1672 smp_set_state(SMP_STATE_WAIT_NONCE);
1673 smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL);
1674 }
1675 break;
1676 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1677 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301678 if (!smp_check_commitment(p_cb) &&
1679 p_cb->cert_failure != SMP_NUMERIC_COMPAR_FAIL) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001680 tSMP_INT_DATA smp_int_data;
1681 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1682 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1683 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001684 break;
1685 }
Nitin Arora0bd0c8f2016-03-15 15:00:36 -07001686
Myles Watson911d1ae2016-11-28 16:44:40 -08001687 if (p_cb->role == HCI_ROLE_SLAVE) {
1688 smp_send_rand(p_cb, NULL);
1689 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001690
Myles Watson911d1ae2016-11-28 16:44:40 -08001691 if (++p_cb->round < 20) {
1692 smp_set_state(SMP_STATE_SEC_CONN_PHS1_START);
1693 p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1694 smp_start_nonce_generation(p_cb);
1695 break;
1696 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001697
Myles Watson911d1ae2016-11-28 16:44:40 -08001698 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1699 break;
1700 case SMP_MODEL_SEC_CONN_OOB:
1701 if (p_cb->role == HCI_ROLE_SLAVE) {
1702 smp_send_rand(p_cb, NULL);
1703 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001704
Myles Watson911d1ae2016-11-28 16:44:40 -08001705 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1706 break;
1707 default:
1708 SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1709 p_cb->selected_association_model);
1710 break;
1711 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001712
Myles Watson911d1ae2016-11-28 16:44:40 -08001713 SMP_TRACE_DEBUG("%s end ", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001714}
1715
1716/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001717 * Function smp_match_dhkey_checks
1718 * Description checks if the calculated peer DHKey Check value is the same as
1719 * received from the peer DHKey check value.
1720 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001721void smp_match_dhkey_checks(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001722 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001723
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001724 if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check.data(),
1725 OCTET16_LEN)) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001726 SMP_TRACE_WARNING("dhkey chcks do no match");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001727 tSMP_INT_DATA smp_int_data;
1728 smp_int_data.status = SMP_DHKEY_CHK_FAIL;
1729 p_cb->failure = SMP_DHKEY_CHK_FAIL;
1730 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001731 return;
1732 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001733
Myles Watson911d1ae2016-11-28 16:44:40 -08001734 SMP_TRACE_EVENT("dhkey chcks match");
Satya Calloji444a8da2015-03-06 10:38:22 -08001735
Myles Watson911d1ae2016-11-28 16:44:40 -08001736 /* compare the max encryption key size, and save the smaller one for the link
1737 */
1738 if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1739 p_cb->loc_enc_size = p_cb->peer_enc_size;
Satya Calloji444a8da2015-03-06 10:38:22 -08001740
Myles Watson911d1ae2016-11-28 16:44:40 -08001741 if (p_cb->role == HCI_ROLE_SLAVE) {
1742 smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL);
1743 } else {
1744 /* master device always use received i/r key as keys to distribute */
1745 p_cb->local_i_key = p_cb->peer_i_key;
1746 p_cb->local_r_key = p_cb->peer_r_key;
1747 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1748 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001749}
1750
1751/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001752 * Function smp_move_to_secure_connections_phase2
1753 * Description Signal State Machine to start SC phase 2 initialization (to
1754 * compute local DHKey Check value).
1755 *
1756 * Note SM is supposed to be in the state SMP_STATE_SEC_CONN_PHS2_START.
1757 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001758void smp_move_to_secure_connections_phase2(tSMP_CB* p_cb,
1759 tSMP_INT_DATA* p_data) {
1760 SMP_TRACE_DEBUG("%s", __func__);
1761 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001762}
1763
1764/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001765 * Function smp_phase_2_dhkey_checks_are_present
Myles Watson9ca07092016-11-28 16:41:53 -08001766 * Description generates event if dhkey check from the peer is already
1767 * received.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001768 *
1769 * Note It is supposed to be used on slave to prevent race condition.
Myles Watson9ca07092016-11-28 16:41:53 -08001770 * It is supposed to be called after slave dhkey check is
1771 * calculated.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001772 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001773void smp_phase_2_dhkey_checks_are_present(tSMP_CB* p_cb,
1774 tSMP_INT_DATA* p_data) {
1775 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001776
Myles Watson911d1ae2016-11-28 16:44:40 -08001777 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK)
1778 smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001779}
1780
1781/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001782 * Function smp_wait_for_both_public_keys
Myles Watson9ca07092016-11-28 16:41:53 -08001783 * Description generates SMP_BOTH_PUBL_KEYS_RCVD_EVT event when both local and
1784 * master public keys are available.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001785 *
1786 * Note on the slave it is used to prevent race condition.
1787 *
1788 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001789void smp_wait_for_both_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1790 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001791
Myles Watson911d1ae2016-11-28 16:44:40 -08001792 if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) &&
1793 (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) {
1794 if ((p_cb->role == HCI_ROLE_SLAVE) &&
1795 ((p_cb->req_oob_type == SMP_OOB_LOCAL) ||
1796 (p_cb->req_oob_type == SMP_OOB_BOTH))) {
1797 smp_set_state(SMP_STATE_PUBLIC_KEY_EXCH);
Satya Calloji444a8da2015-03-06 10:38:22 -08001798 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001799 smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL);
1800 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001801}
1802
1803/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001804 * Function smp_start_passkey_verification
1805 * Description Starts SC passkey entry verification.
1806 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001807void smp_start_passkey_verification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1808 uint8_t* p = NULL;
Satya Calloji444a8da2015-03-06 10:38:22 -08001809
Myles Watson911d1ae2016-11-28 16:44:40 -08001810 SMP_TRACE_DEBUG("%s", __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001811 p = p_cb->local_random.data();
Myles Watson911d1ae2016-11-28 16:44:40 -08001812 UINT32_TO_STREAM(p, p_data->passkey);
Satya Calloji444a8da2015-03-06 10:38:22 -08001813
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001814 p = p_cb->peer_random.data();
Myles Watson911d1ae2016-11-28 16:44:40 -08001815 UINT32_TO_STREAM(p, p_data->passkey);
Satya Calloji444a8da2015-03-06 10:38:22 -08001816
Myles Watson911d1ae2016-11-28 16:44:40 -08001817 p_cb->round = 0;
1818 smp_start_nonce_generation(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001819}
1820
1821/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001822 * Function smp_process_secure_connection_oob_data
1823 * Description Processes local/peer SC OOB data received from somewhere.
1824 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001825void smp_process_secure_connection_oob_data(tSMP_CB* p_cb,
1826 tSMP_INT_DATA* p_data) {
1827 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001828
Myles Watson911d1ae2016-11-28 16:44:40 -08001829 tSMP_SC_OOB_DATA* p_sc_oob_data = &p_cb->sc_oob_data;
1830 if (p_sc_oob_data->loc_oob_data.present) {
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001831 p_cb->local_random = p_sc_oob_data->loc_oob_data.randomizer;
Myles Watson911d1ae2016-11-28 16:44:40 -08001832 } else {
1833 SMP_TRACE_EVENT("%s: local OOB randomizer is absent", __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001834 p_cb->local_random = {0};
Myles Watson911d1ae2016-11-28 16:44:40 -08001835 }
1836
1837 if (!p_sc_oob_data->peer_oob_data.present) {
1838 SMP_TRACE_EVENT("%s: peer OOB data is absent", __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001839 p_cb->peer_random = {0};
Myles Watson911d1ae2016-11-28 16:44:40 -08001840 } else {
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001841 p_cb->peer_random = p_sc_oob_data->peer_oob_data.randomizer;
1842 p_cb->remote_commitment = p_sc_oob_data->peer_oob_data.commitment;
Myles Watson911d1ae2016-11-28 16:44:40 -08001843
Myles Watson911d1ae2016-11-28 16:44:40 -08001844 /* check commitment */
1845 if (!smp_check_commitment(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001846 tSMP_INT_DATA smp_int_data;
1847 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1848 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1849 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001850 return;
Satya Calloji444a8da2015-03-06 10:38:22 -08001851 }
1852
Myles Watson911d1ae2016-11-28 16:44:40 -08001853 if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) {
1854 /* the peer doesn't have local randomiser */
1855 SMP_TRACE_EVENT(
1856 "%s: peer didn't receive local OOB data, set local randomizer to 0",
1857 __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001858 p_cb->local_random = {0};
Satya Calloji444a8da2015-03-06 10:38:22 -08001859 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001860 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001861
Myles Watson911d1ae2016-11-28 16:44:40 -08001862 print128(p_cb->local_random, (const uint8_t*)"local OOB randomizer");
1863 print128(p_cb->peer_random, (const uint8_t*)"peer OOB randomizer");
1864 smp_start_nonce_generation(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001865}
1866
1867/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001868 * Function smp_set_local_oob_keys
Myles Watson9ca07092016-11-28 16:41:53 -08001869 * Description Saves calculated private/public keys in
1870 * sc_oob_data.loc_oob_data, starts nonce generation
Myles Watsonee96a3c2016-11-23 14:49:54 -08001871 * (to be saved in sc_oob_data.loc_oob_data.randomizer).
1872 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001873void smp_set_local_oob_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1874 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001875
Myles Watson911d1ae2016-11-28 16:44:40 -08001876 memcpy(p_cb->sc_oob_data.loc_oob_data.private_key_used, p_cb->private_key,
1877 BT_OCTET32_LEN);
1878 p_cb->sc_oob_data.loc_oob_data.publ_key_used = p_cb->loc_publ_key;
1879 smp_start_nonce_generation(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001880}
1881
1882/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001883 * Function smp_set_local_oob_random_commitment
Myles Watson9ca07092016-11-28 16:41:53 -08001884 * Description Saves calculated randomizer and commitment in
1885 * sc_oob_data.loc_oob_data, passes sc_oob_data.loc_oob_data up
1886 * for safekeeping.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001887 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001888void smp_set_local_oob_random_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1889 SMP_TRACE_DEBUG("%s", __func__);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001890 p_cb->sc_oob_data.loc_oob_data.randomizer = p_cb->rand;
Satya Calloji444a8da2015-03-06 10:38:22 -08001891
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001892 p_cb->sc_oob_data.loc_oob_data.commitment =
Jakub Pawlowski430e59d2018-06-21 14:23:47 +02001893 crypto_toolbox::f4(p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1894 p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1895 p_cb->sc_oob_data.loc_oob_data.randomizer, 0);
Satya Calloji444a8da2015-03-06 10:38:22 -08001896
Marie Janssend19e0782016-07-15 12:48:27 -07001897#if (SMP_DEBUG == TRUE)
Myles Watson911d1ae2016-11-28 16:44:40 -08001898 uint8_t* p_print = NULL;
1899 SMP_TRACE_DEBUG("local SC OOB data set:");
1900 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.addr_sent_to;
Jack He648d5132016-12-15 10:56:55 -08001901 smp_debug_print_nbyte_little_endian(p_print, "addr_sent_to",
Myles Watson911d1ae2016-11-28 16:44:40 -08001902 sizeof(tBLE_BD_ADDR));
1903 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.private_key_used;
Jack He648d5132016-12-15 10:56:55 -08001904 smp_debug_print_nbyte_little_endian(p_print, "private_key_used",
1905 BT_OCTET32_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001906 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.x;
Jack He648d5132016-12-15 10:56:55 -08001907 smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.x",
1908 BT_OCTET32_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001909 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.y;
Jack He648d5132016-12-15 10:56:55 -08001910 smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.y",
1911 BT_OCTET32_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001912 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.randomizer;
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001913 smp_debug_print_nbyte_little_endian(p_print, "randomizer", OCTET16_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001914 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.commitment;
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001915 smp_debug_print_nbyte_little_endian(p_print, "commitment", OCTET16_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001916 SMP_TRACE_DEBUG("");
Satya Calloji444a8da2015-03-06 10:38:22 -08001917#endif
1918
Myles Watson911d1ae2016-11-28 16:44:40 -08001919 /* pass created OOB data up */
1920 p_cb->cb_evt = SMP_SC_LOC_OOB_DATA_UP_EVT;
1921 smp_send_app_cback(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001922
Myles Watson911d1ae2016-11-28 16:44:40 -08001923 smp_cb_cleanup(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001924}
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001925
The Android Open Source Project5738f832012-12-12 16:00:35 -08001926/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001927 *
1928 * Function smp_link_encrypted
1929 *
Myles Watson9ca07092016-11-28 16:41:53 -08001930 * Description This function is called when link is encrypted and notified
1931 * to the slave device. Proceed to to send LTK, DIV and ER to
1932 * master if bonding the devices.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001933 *
1934 *
1935 * Returns void
1936 *
1937 ******************************************************************************/
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001938void smp_link_encrypted(const RawAddress& bda, uint8_t encr_enable) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001939 tSMP_CB* p_cb = &smp_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001940
johnshamoonb2dadde2017-05-31 11:32:24 -07001941 SMP_TRACE_DEBUG("%s: encr_enable=%d", __func__, encr_enable);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001942
Jakub Pawlowskic2276b02017-06-09 16:00:25 -07001943 if (smp_cb.pairing_bda == bda) {
johnshamoonb2dadde2017-05-31 11:32:24 -07001944 /* encryption completed with STK, remember the key size now, could be
1945 * overwritten when key exchange happens */
Myles Watson911d1ae2016-11-28 16:44:40 -08001946 if (p_cb->loc_enc_size != 0 && encr_enable) {
1947 /* update the link encryption key size if a SMP pairing just performed */
1948 btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001949 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001950
Myles Watson5ce55bd2017-09-20 16:41:19 -07001951 tSMP_INT_DATA smp_int_data;
1952 smp_int_data.status = encr_enable;
1953 smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001954 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001955}
Satya Calloji444a8da2015-03-06 10:38:22 -08001956
Jakub Pawlowskid78b1dd2018-10-01 13:25:11 +02001957void smp_cancel_start_encryption_attempt() {
1958 SMP_TRACE_ERROR("%s: Encryption request cancelled", __func__);
1959 smp_sm_event(&smp_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
1960}
1961
The Android Open Source Project5738f832012-12-12 16:00:35 -08001962/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001963 *
1964 * Function smp_proc_ltk_request
1965 *
1966 * Description This function is called when LTK request is received from
1967 * controller.
1968 *
1969 * Returns void
1970 *
1971 ******************************************************************************/
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001972bool smp_proc_ltk_request(const RawAddress& bda) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001973 SMP_TRACE_DEBUG("%s state = %d", __func__, smp_cb.state);
1974 bool match = false;
Nitin Arora1da48a32015-07-17 18:38:01 -07001975
Jakub Pawlowskic2276b02017-06-09 16:00:25 -07001976 if (bda == smp_cb.pairing_bda) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001977 match = true;
1978 } else {
Myles Watson911d1ae2016-11-28 16:44:40 -08001979 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
Jakub Pawlowskic2276b02017-06-09 16:00:25 -07001980 if (p_dev_rec != NULL && p_dev_rec->ble.pseudo_addr == smp_cb.pairing_bda &&
Jakub Pawlowskib707f442017-07-03 15:39:36 -07001981 p_dev_rec->ble.pseudo_addr != RawAddress::kEmpty) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001982 match = true;
Nitin Arora1da48a32015-07-17 18:38:01 -07001983 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001984 }
Nitin Arora1da48a32015-07-17 18:38:01 -07001985
Myles Watson911d1ae2016-11-28 16:44:40 -08001986 if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) {
1987 smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL);
1988 return true;
1989 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001990
Myles Watson911d1ae2016-11-28 16:44:40 -08001991 return false;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001992}
Satya Calloji444a8da2015-03-06 10:38:22 -08001993
1994/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001995 *
1996 * Function smp_process_secure_connection_long_term_key
1997 *
1998 * Description This function is called to process SC LTK.
1999 * SC LTK is calculated and used instead of STK.
2000 * Here SC LTK is saved in BLE DB.
2001 *
2002 * Returns void
2003 *
2004 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002005void smp_process_secure_connection_long_term_key(void) {
2006 tSMP_CB* p_cb = &smp_cb;
Satya Calloji444a8da2015-03-06 10:38:22 -08002007
Myles Watson911d1ae2016-11-28 16:44:40 -08002008 SMP_TRACE_DEBUG("%s", __func__);
2009 smp_save_secure_connections_long_term_key(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08002010
Myles Watson911d1ae2016-11-28 16:44:40 -08002011 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
2012 smp_key_distribution(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08002013}
2014
2015/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08002016 *
2017 * Function smp_set_derive_link_key
2018 *
2019 * Description This function is called to set flag that indicates that
2020 * BR/EDR LK has to be derived from LTK after all keys are
2021 * distributed.
2022 *
2023 * Returns void
2024 *
2025 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002026void smp_set_derive_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2027 SMP_TRACE_DEBUG("%s", __func__);
2028 p_cb->derive_lk = true;
2029 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_LK, false);
2030 smp_key_distribution(p_cb, NULL);
Chaojing Sune2805532015-04-22 13:40:21 -07002031}
2032
2033/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08002034 *
2035 * Function smp_derive_link_key_from_long_term_key
2036 *
2037 * Description This function is called to derive BR/EDR LK from LTK.
2038 *
2039 * Returns void
2040 *
2041 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002042void smp_derive_link_key_from_long_term_key(tSMP_CB* p_cb,
2043 tSMP_INT_DATA* p_data) {
2044 tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
Satya Calloji444a8da2015-03-06 10:38:22 -08002045
Myles Watson911d1ae2016-11-28 16:44:40 -08002046 SMP_TRACE_DEBUG("%s", __func__);
2047 if (!smp_calculate_link_key_from_long_term_key(p_cb)) {
2048 SMP_TRACE_ERROR("%s failed", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -07002049 tSMP_INT_DATA smp_int_data;
2050 smp_int_data.status = status;
2051 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08002052 return;
2053 }
Satya Calloji444a8da2015-03-06 10:38:22 -08002054}
2055
2056/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08002057 *
2058 * Function smp_br_process_link_key
2059 *
2060 * Description This function is called to process BR/EDR LK:
2061 * - to derive SMP LTK from BR/EDR LK;
johnshamoonb2dadde2017-05-31 11:32:24 -07002062 * - to save SMP LTK.
Myles Watsonee96a3c2016-11-23 14:49:54 -08002063 *
2064 * Returns void
2065 *
2066 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002067void smp_br_process_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2068 tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
Satya Calloji444a8da2015-03-06 10:38:22 -08002069
Myles Watson911d1ae2016-11-28 16:44:40 -08002070 SMP_TRACE_DEBUG("%s", __func__);
2071 if (!smp_calculate_long_term_key_from_link_key(p_cb)) {
johnshamoonb2dadde2017-05-31 11:32:24 -07002072 SMP_TRACE_ERROR("%s: failed", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -07002073 tSMP_INT_DATA smp_int_data;
2074 smp_int_data.status = status;
2075 smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08002076 return;
2077 }
Satya Calloji444a8da2015-03-06 10:38:22 -08002078
Nitin Shivpure96036cd2018-03-13 12:01:48 +05302079 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
2080 if (p_dev_rec) {
2081 SMP_TRACE_DEBUG("%s: dev_type = %d ", __func__, p_dev_rec->device_type);
2082 p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE;
2083 } else {
2084 SMP_TRACE_ERROR("%s failed to find Security Record", __func__);
2085 }
2086
Myles Watson911d1ae2016-11-28 16:44:40 -08002087 SMP_TRACE_DEBUG("%s: LTK derivation from LK successfully completed",
2088 __func__);
2089 smp_save_secure_connections_long_term_key(p_cb);
2090 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
2091 smp_br_select_next_key(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08002092}
2093
2094/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08002095 * Function smp_key_distribution_by_transport
2096 * Description depending on the transport used at the moment calls either
2097 * smp_key_distribution(...) or smp_br_key_distribution(...).
2098 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002099void smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2100 SMP_TRACE_DEBUG("%s", __func__);
2101 if (p_cb->smp_over_br) {
2102 smp_br_select_next_key(p_cb, NULL);
2103 } else {
2104 smp_key_distribution(p_cb, NULL);
2105 }
Satya Calloji444a8da2015-03-06 10:38:22 -08002106}
2107
2108/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08002109 * Function smp_br_pairing_complete
Myles Watson9ca07092016-11-28 16:41:53 -08002110 * Description This function is called to send the pairing complete
2111 * callback and remove the connection if needed.
Myles Watsonee96a3c2016-11-23 14:49:54 -08002112 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002113void smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2114 SMP_TRACE_DEBUG("%s", __func__);
Satya Callojid0aa8e52015-05-06 09:24:06 -07002115
Myles Watson911d1ae2016-11-28 16:44:40 -08002116 if (p_cb->total_tx_unacked == 0) {
2117 /* process the pairing complete */
2118 smp_proc_pairing_cmpl(p_cb);
2119 }
Satya Calloji444a8da2015-03-06 10:38:22 -08002120}