blob: d1efb2d80b43346f752ee5654837a59ccb235625 [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
Satya Calloji444a8da2015-03-06 10:38:22 -080019#include <string.h>
Pulkit Bhuwalka5a6b3252017-02-17 16:25:22 -080020#include "btif_common.h"
Andre Eisenbach7927f682015-07-02 16:14:28 -070021#include "device/include/interop.h"
Jakub Pawlowskiecace462017-10-17 16:40:41 -070022#include "internal_include/bt_target.h"
Andre Eisenbach7927f682015-07-02 16:14:28 -070023#include "stack/btm/btm_int.h"
24#include "stack/include/l2c_api.h"
Andre Eisenbach9181ec22018-03-01 13:27:01 -080025#include "stack/smp/p_256_ecc_pp.h"
Andre Eisenbach7927f682015-07-02 16:14:28 -070026#include "stack/smp/smp_int.h"
27#include "utils/include/bt_utils.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080028
Myles Watson911d1ae2016-11-28 16:44:40 -080029#define SMP_KEY_DIST_TYPE_MAX 4
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053030
Stanley Tng5af6aba2017-09-29 09:01:25 -070031const tSMP_ACT smp_distribute_act[] = {
32 smp_generate_ltk, /* SMP_SEC_KEY_TYPE_ENC - '1' bit index */
33 smp_send_id_info, /* SMP_SEC_KEY_TYPE_ID - '1' bit index */
34 smp_generate_csrk, /* SMP_SEC_KEY_TYPE_CSRK - '1' bit index */
35 smp_set_derive_link_key /* SMP_SEC_KEY_TYPE_LK - '1' bit index */
36};
The Android Open Source Project5738f832012-12-12 16:00:35 -080037
Jakub Pawlowskia484a882017-06-24 17:30:18 -070038static bool lmp_version_below(const RawAddress& bda, uint8_t version) {
Myles Watson911d1ae2016-11-28 16:44:40 -080039 tACL_CONN* acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE);
40 if (acl == NULL || acl->lmp_version == 0) {
41 SMP_TRACE_WARNING("%s cannot retrieve LMP version...", __func__);
42 return false;
43 }
44 SMP_TRACE_WARNING("%s LMP version %d < %d", __func__, acl->lmp_version,
45 version);
46 return acl->lmp_version < version;
Andre Eisenbach27e239d2015-10-26 13:49:17 -070047}
48
Myles Watson911d1ae2016-11-28 16:44:40 -080049static bool pts_test_send_authentication_complete_failure(tSMP_CB* p_cb) {
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053050 uint8_t reason = p_cb->cert_failure;
51 if (reason == SMP_PAIR_AUTH_FAIL || reason == SMP_PAIR_FAIL_UNKNOWN ||
52 reason == SMP_PAIR_NOT_SUPPORT || reason == SMP_PASSKEY_ENTRY_FAIL ||
53 reason == SMP_REPEATED_ATTEMPTS) {
Myles Watson5ce55bd2017-09-20 16:41:19 -070054 tSMP_INT_DATA smp_int_data;
55 smp_int_data.status = reason;
56 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053057 return true;
Myles Watson911d1ae2016-11-28 16:44:40 -080058 }
ravishankar srivatsafd102ca2017-05-04 10:13:58 +053059 return false;
Nitin Arora0bd0c8f2016-03-15 15:00:36 -070060}
61
The Android Open Source Project5738f832012-12-12 16:00:35 -080062/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -080063 * Function smp_update_key_mask
64 * Description This function updates the key mask for sending or receiving.
65 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -080066static void smp_update_key_mask(tSMP_CB* p_cb, uint8_t key_type, bool recv) {
67 SMP_TRACE_DEBUG(
68 "%s before update role=%d recv=%d local_i_key = %02x, local_r_key = %02x",
69 __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -080070
Myles Watson911d1ae2016-11-28 16:44:40 -080071 if (((p_cb->le_secure_connections_mode_is_used) || (p_cb->smp_over_br)) &&
72 ((key_type == SMP_SEC_KEY_TYPE_ENC) ||
73 (key_type == SMP_SEC_KEY_TYPE_LK))) {
74 /* in LE SC mode LTK, CSRK and BR/EDR LK are derived locally instead of
75 ** being exchanged with the peer */
76 p_cb->local_i_key &= ~key_type;
77 p_cb->local_r_key &= ~key_type;
78 } else if (p_cb->role == HCI_ROLE_SLAVE) {
79 if (recv)
80 p_cb->local_i_key &= ~key_type;
Satya Calloji444a8da2015-03-06 10:38:22 -080081 else
Myles Watson911d1ae2016-11-28 16:44:40 -080082 p_cb->local_r_key &= ~key_type;
83 } else {
84 if (recv)
85 p_cb->local_r_key &= ~key_type;
The Android Open Source Project5738f832012-12-12 16:00:35 -080086 else
Myles Watson911d1ae2016-11-28 16:44:40 -080087 p_cb->local_i_key &= ~key_type;
88 }
The Android Open Source Project5738f832012-12-12 16:00:35 -080089
Myles Watson911d1ae2016-11-28 16:44:40 -080090 SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x",
91 p_cb->local_i_key, p_cb->local_r_key);
The Android Open Source Project5738f832012-12-12 16:00:35 -080092}
Satya Calloji444a8da2015-03-06 10:38:22 -080093
The Android Open Source Project5738f832012-12-12 16:00:35 -080094/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -080095 * Function smp_send_app_cback
Myles Watson9ca07092016-11-28 16:41:53 -080096 * Description notifies application about the events the application is
97 * interested in
Myles Watsonee96a3c2016-11-23 14:49:54 -080098 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -080099void smp_send_app_cback(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
100 tSMP_EVT_DATA cb_data;
101 tSMP_STATUS callback_rc;
102 SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d", __func__, p_cb->cb_evt);
103 if (p_cb->p_callback && p_cb->cb_evt != 0) {
104 switch (p_cb->cb_evt) {
105 case SMP_IO_CAP_REQ_EVT:
106 cb_data.io_req.auth_req = p_cb->peer_auth_req;
107 cb_data.io_req.oob_data = SMP_OOB_NONE;
108 cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS;
109 cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
110 cb_data.io_req.init_keys = p_cb->local_i_key;
111 cb_data.io_req.resp_keys = p_cb->local_r_key;
112 SMP_TRACE_WARNING("io_cap = %d", cb_data.io_req.io_cap);
113 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800114
Myles Watson911d1ae2016-11-28 16:44:40 -0800115 case SMP_NC_REQ_EVT:
116 cb_data.passkey = p_data->passkey;
117 break;
118 case SMP_SC_OOB_REQ_EVT:
119 cb_data.req_oob_type = p_data->req_oob_type;
120 break;
121 case SMP_SC_LOC_OOB_DATA_UP_EVT:
122 cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data;
123 break;
Satya Calloji444a8da2015-03-06 10:38:22 -0800124
Myles Watson911d1ae2016-11-28 16:44:40 -0800125 case SMP_BR_KEYS_REQ_EVT:
126 cb_data.io_req.auth_req = 0;
127 cb_data.io_req.oob_data = SMP_OOB_NONE;
128 cb_data.io_req.io_cap = 0;
129 cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE;
130 cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY;
131 cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY;
132 break;
Satya Calloji444a8da2015-03-06 10:38:22 -0800133
Myles Watson911d1ae2016-11-28 16:44:40 -0800134 default:
135 break;
136 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800137
Myles Watson911d1ae2016-11-28 16:44:40 -0800138 callback_rc =
139 (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800140
Myles Watson911d1ae2016-11-28 16:44:40 -0800141 SMP_TRACE_DEBUG("%s: callback_rc=%d p_cb->cb_evt=%d", __func__,
142 callback_rc, p_cb->cb_evt);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800143
Myles Watson911d1ae2016-11-28 16:44:40 -0800144 if (callback_rc == SMP_SUCCESS) {
145 switch (p_cb->cb_evt) {
146 case SMP_IO_CAP_REQ_EVT:
147 p_cb->loc_auth_req = cb_data.io_req.auth_req;
148 p_cb->local_io_capability = cb_data.io_req.io_cap;
149 p_cb->loc_oob_flag = cb_data.io_req.oob_data;
150 p_cb->loc_enc_size = cb_data.io_req.max_key_size;
151 p_cb->local_i_key = cb_data.io_req.init_keys;
152 p_cb->local_r_key = cb_data.io_req.resp_keys;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800153
Myles Watson911d1ae2016-11-28 16:44:40 -0800154 if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) {
155 SMP_TRACE_WARNING("Non bonding: No keys will be exchanged");
156 p_cb->local_i_key = 0;
157 p_cb->local_r_key = 0;
158 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800159
Myles Watson911d1ae2016-11-28 16:44:40 -0800160 SMP_TRACE_WARNING(
johnshamoonb2dadde2017-05-31 11:32:24 -0700161 "rcvd auth_req: 0x%02x, io_cap: %d "
162 "loc_oob_flag: %d loc_enc_size: %d, "
Myles Watson911d1ae2016-11-28 16:44:40 -0800163 "local_i_key: 0x%02x, local_r_key: 0x%02x",
164 p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag,
165 p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800166
Myles Watson911d1ae2016-11-28 16:44:40 -0800167 p_cb->secure_connections_only_mode_required =
168 (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
Hemant Guptaf37452a2017-12-06 15:35:20 +0530169 /* just for PTS, force SC bit */
Myles Watson911d1ae2016-11-28 16:44:40 -0800170 if (p_cb->secure_connections_only_mode_required) {
171 p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT;
172 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800173
Hemant Guptaf37452a2017-12-06 15:35:20 +0530174 if (!p_cb->secure_connections_only_mode_required &&
175 (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) ||
176 lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2) ||
177 interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS,
178 (const RawAddress*)&p_cb->pairing_bda))) {
179 p_cb->loc_auth_req &= ~SMP_SC_SUPPORT_BIT;
Myles Watson911d1ae2016-11-28 16:44:40 -0800180 p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT;
181 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
182 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
183 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800184
Jakub Pawlowski7a7f69b2017-09-27 15:41:13 -0700185 if (lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_5_0)) {
186 p_cb->loc_auth_req &= ~SMP_H7_SUPPORT_BIT;
187 }
188
Myles Watson911d1ae2016-11-28 16:44:40 -0800189 SMP_TRACE_WARNING(
190 "set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x",
191 p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800192
Myles Watson911d1ae2016-11-28 16:44:40 -0800193 smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
194 break;
Satya Calloji444a8da2015-03-06 10:38:22 -0800195
Myles Watson911d1ae2016-11-28 16:44:40 -0800196 case SMP_BR_KEYS_REQ_EVT:
197 p_cb->loc_enc_size = cb_data.io_req.max_key_size;
198 p_cb->local_i_key = cb_data.io_req.init_keys;
199 p_cb->local_r_key = cb_data.io_req.resp_keys;
Jakub Pawlowskie7f14a62017-03-20 15:38:56 -0700200 p_cb->loc_auth_req |= SMP_H7_SUPPORT_BIT;
Satya Calloji444a8da2015-03-06 10:38:22 -0800201
Myles Watson911d1ae2016-11-28 16:44:40 -0800202 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
203 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
Satya Calloji444a8da2015-03-06 10:38:22 -0800204
Myles Watson911d1ae2016-11-28 16:44:40 -0800205 SMP_TRACE_WARNING(
johnshamoonb2dadde2017-05-31 11:32:24 -0700206 "for SMP over BR max_key_size: 0x%02x, local_i_key: 0x%02x, "
207 "local_r_key: 0x%02x, p_cb->loc_auth_req: 0x%02x",
Jakub Pawlowskie7f14a62017-03-20 15:38:56 -0700208 p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key,
209 p_cb->loc_auth_req);
Satya Calloji444a8da2015-03-06 10:38:22 -0800210
Myles Watson911d1ae2016-11-28 16:44:40 -0800211 smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL);
212 break;
213 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800214 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800215 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800216
Myles Watson911d1ae2016-11-28 16:44:40 -0800217 if (!p_cb->cb_evt && p_cb->discard_sec_req) {
218 p_cb->discard_sec_req = false;
219 smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
220 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800221
johnshamoonb2dadde2017-05-31 11:32:24 -0700222 SMP_TRACE_DEBUG("%s: return", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800223}
Satya Calloji444a8da2015-03-06 10:38:22 -0800224
The Android Open Source Project5738f832012-12-12 16:00:35 -0800225/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800226 * Function smp_send_pair_fail
227 * Description pairing failure to peer device if needed.
228 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800229void smp_send_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700230 p_cb->status = p_data->status;
231 p_cb->failure = p_data->status;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800232
johnshamoonb2dadde2017-05-31 11:32:24 -0700233 SMP_TRACE_DEBUG("%s: status=%d failure=%d ", __func__, p_cb->status,
Myles Watson911d1ae2016-11-28 16:44:40 -0800234 p_cb->failure);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800235
Myles Watson911d1ae2016-11-28 16:44:40 -0800236 if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC &&
237 p_cb->status != SMP_SUCCESS) {
238 smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
239 p_cb->wait_for_authorization_complete = true;
240 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800241}
242
243/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800244 * Function smp_send_pair_req
245 * Description actions related to sending pairing request
246 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800247void smp_send_pair_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
248 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
249 SMP_TRACE_DEBUG("%s", __func__);
Andre Eisenbach2d41fe12013-04-17 11:22:58 +0800250
Myles Watson911d1ae2016-11-28 16:44:40 -0800251 /* erase all keys when master sends pairing req*/
252 if (p_dev_rec) btm_sec_clear_ble_keys(p_dev_rec);
253 /* do not manipulate the key, let app decide,
254 leave out to BTM to mandate key distribution for bonding case */
255 smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800256}
Satya Calloji444a8da2015-03-06 10:38:22 -0800257
The Android Open Source Project5738f832012-12-12 16:00:35 -0800258/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800259 * Function smp_send_pair_rsp
260 * Description actions related to sending pairing response
261 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800262void smp_send_pair_rsp(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
263 SMP_TRACE_DEBUG("%s", __func__);
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800264
Myles Watson911d1ae2016-11-28 16:44:40 -0800265 p_cb->local_i_key &= p_cb->peer_i_key;
266 p_cb->local_r_key &= p_cb->peer_r_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800267
Myles Watson911d1ae2016-11-28 16:44:40 -0800268 if (smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb)) {
269 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB)
270 smp_use_oob_private_key(p_cb, NULL);
271 else
272 smp_decide_association_model(p_cb, NULL);
273 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800274}
275
276/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800277 * Function smp_send_confirm
278 * Description send confirmation to the peer
279 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800280void smp_send_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
281 SMP_TRACE_DEBUG("%s", __func__);
282 smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800283}
Satya Calloji444a8da2015-03-06 10:38:22 -0800284
The Android Open Source Project5738f832012-12-12 16:00:35 -0800285/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800286 * Function smp_send_init
287 * Description process pairing initializer to slave device
288 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800289void smp_send_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
290 SMP_TRACE_DEBUG("%s", __func__);
291 smp_send_cmd(SMP_OPCODE_INIT, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800292}
Satya Calloji444a8da2015-03-06 10:38:22 -0800293
294/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800295 * Function smp_send_rand
296 * Description send pairing random to the peer
297 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800298void smp_send_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
299 SMP_TRACE_DEBUG("%s", __func__);
300 smp_send_cmd(SMP_OPCODE_RAND, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800301}
302
303/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800304 * Function smp_send_pair_public_key
305 * Description send pairing public key command to the peer
306 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800307void smp_send_pair_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
308 SMP_TRACE_DEBUG("%s", __func__);
309 smp_send_cmd(SMP_OPCODE_PAIR_PUBLIC_KEY, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800310}
311
312/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800313 * Function SMP_SEND_COMMITMENT
314 * Description send commitment command to the peer
315 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800316void smp_send_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
317 SMP_TRACE_DEBUG("%s", __func__);
318 smp_send_cmd(SMP_OPCODE_PAIR_COMMITM, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800319}
320
321/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800322 * Function smp_send_dhkey_check
323 * Description send DHKey Check command to the peer
324 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800325void smp_send_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
326 SMP_TRACE_DEBUG("%s", __func__);
327 smp_send_cmd(SMP_OPCODE_PAIR_DHKEY_CHECK, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800328}
329
330/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800331 * Function smp_send_keypress_notification
332 * Description send Keypress Notification command to the peer
333 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800334void smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700335 p_cb->local_keypress_notification = p_data->status;
Myles Watson911d1ae2016-11-28 16:44:40 -0800336 smp_send_cmd(SMP_OPCODE_PAIR_KEYPR_NOTIF, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -0800337}
338
The Android Open Source Project5738f832012-12-12 16:00:35 -0800339/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800340 * Function smp_send_enc_info
341 * Description send encryption information command.
342 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800343void smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
344 tBTM_LE_LENC_KEYS le_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800345
johnshamoonb2dadde2017-05-31 11:32:24 -0700346 SMP_TRACE_DEBUG("%s: p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
Myles Watson911d1ae2016-11-28 16:44:40 -0800347 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800348
Myles Watson911d1ae2016-11-28 16:44:40 -0800349 smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
350 smp_send_cmd(SMP_OPCODE_MASTER_ID, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800351
Myles Watson911d1ae2016-11-28 16:44:40 -0800352 /* save the DIV and key size information when acting as slave device */
353 memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
354 le_key.div = p_cb->div;
355 le_key.key_size = p_cb->loc_enc_size;
356 le_key.sec_level = p_cb->sec_level;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800357
Myles Watson911d1ae2016-11-28 16:44:40 -0800358 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
359 (p_cb->loc_auth_req & SMP_AUTH_BOND))
360 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC,
361 (tBTM_LE_KEY_VALUE*)&le_key, true);
Satya Calloji444a8da2015-03-06 10:38:22 -0800362
Myles Watson911d1ae2016-11-28 16:44:40 -0800363 SMP_TRACE_WARNING("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800364
Myles Watson911d1ae2016-11-28 16:44:40 -0800365 smp_key_distribution(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800366}
Satya Calloji444a8da2015-03-06 10:38:22 -0800367
The Android Open Source Project5738f832012-12-12 16:00:35 -0800368/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800369 * Function smp_send_id_info
370 * Description send ID information command.
371 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800372void smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
373 tBTM_LE_KEY_VALUE le_key;
374 SMP_TRACE_DEBUG("%s", __func__);
375 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800376
Myles Watson911d1ae2016-11-28 16:44:40 -0800377 smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
378 smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800379
Myles Watson911d1ae2016-11-28 16:44:40 -0800380 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
381 (p_cb->loc_auth_req & SMP_AUTH_BOND))
382 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 -0800383
Myles Watson911d1ae2016-11-28 16:44:40 -0800384 SMP_TRACE_WARNING("%s", __func__);
385 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800386}
Satya Calloji444a8da2015-03-06 10:38:22 -0800387
The Android Open Source Project5738f832012-12-12 16:00:35 -0800388/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800389 * Function smp_send_csrk_info
390 * Description send CSRK command.
391 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800392void smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
393 tBTM_LE_LCSRK_KEYS key;
394 SMP_TRACE_DEBUG("%s", __func__);
395 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800396
Myles Watson911d1ae2016-11-28 16:44:40 -0800397 if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) {
398 key.div = p_cb->div;
399 key.sec_level = p_cb->sec_level;
400 key.counter = 0; /* initialize the local counter */
401 memcpy(key.csrk, p_cb->csrk, BT_OCTET16_LEN);
402 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK,
403 (tBTM_LE_KEY_VALUE*)&key, true);
404 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800405
Myles Watson911d1ae2016-11-28 16:44:40 -0800406 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800407}
408
409/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800410 * Function smp_send_ltk_reply
411 * Description send LTK reply
412 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800413void smp_send_ltk_reply(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
414 SMP_TRACE_DEBUG("%s", __func__);
415 /* send stk as LTK response */
416 btm_ble_ltk_request_reply(p_cb->pairing_bda, true, p_data->key.p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800417}
Satya Calloji444a8da2015-03-06 10:38:22 -0800418
The Android Open Source Project5738f832012-12-12 16:00:35 -0800419/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800420 * Function smp_proc_sec_req
421 * Description process security request.
422 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800423void smp_proc_sec_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
424 tBTM_LE_AUTH_REQ auth_req = *(tBTM_LE_AUTH_REQ*)p_data;
425 tBTM_BLE_SEC_REQ_ACT sec_req_act;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800426
johnshamoonb2dadde2017-05-31 11:32:24 -0700427 SMP_TRACE_DEBUG("%s: auth_req=0x%x", __func__, auth_req);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800428
Myles Watson911d1ae2016-11-28 16:44:40 -0800429 p_cb->cb_evt = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800430
Myles Watson911d1ae2016-11-28 16:44:40 -0800431 btm_ble_link_sec_check(p_cb->pairing_bda, auth_req, &sec_req_act);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800432
johnshamoonb2dadde2017-05-31 11:32:24 -0700433 SMP_TRACE_DEBUG("%s: sec_req_act=0x%x", __func__, sec_req_act);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800434
Myles Watson911d1ae2016-11-28 16:44:40 -0800435 switch (sec_req_act) {
436 case BTM_BLE_SEC_REQ_ACT_ENCRYPT:
johnshamoonb2dadde2017-05-31 11:32:24 -0700437 SMP_TRACE_DEBUG("%s: BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__);
Myles Watson911d1ae2016-11-28 16:44:40 -0800438 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
439 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800440
Myles Watson911d1ae2016-11-28 16:44:40 -0800441 case BTM_BLE_SEC_REQ_ACT_PAIR:
442 p_cb->secure_connections_only_mode_required =
443 (btm_cb.security_mode == BTM_SEC_MODE_SC) ? true : false;
Satya Calloji444a8da2015-03-06 10:38:22 -0800444
Myles Watson911d1ae2016-11-28 16:44:40 -0800445 /* respond to non SC pairing request as failure in SC only mode */
446 if (p_cb->secure_connections_only_mode_required &&
447 (auth_req & SMP_SC_SUPPORT_BIT) == 0) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700448 tSMP_INT_DATA smp_int_data;
449 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
450 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800451 } else {
452 /* initialize local i/r key to be default keys */
453 p_cb->peer_auth_req = auth_req;
454 p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY;
455 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
456 }
457 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800458
Myles Watson911d1ae2016-11-28 16:44:40 -0800459 case BTM_BLE_SEC_REQ_ACT_DISCARD:
460 p_cb->discard_sec_req = true;
461 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800462
Myles Watson911d1ae2016-11-28 16:44:40 -0800463 default:
464 /* do nothing */
465 break;
466 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800467}
Satya Calloji444a8da2015-03-06 10:38:22 -0800468
The Android Open Source Project5738f832012-12-12 16:00:35 -0800469/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800470 * Function smp_proc_sec_grant
471 * Description process security grant.
472 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800473void smp_proc_sec_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700474 uint8_t res = p_data->status;
Myles Watson911d1ae2016-11-28 16:44:40 -0800475 SMP_TRACE_DEBUG("%s", __func__);
476 if (res != SMP_SUCCESS) {
477 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
478 } else /*otherwise, start pairing */
479 {
480 /* send IO request callback */
481 p_cb->cb_evt = SMP_IO_CAP_REQ_EVT;
482 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800483}
Satya Calloji444a8da2015-03-06 10:38:22 -0800484
The Android Open Source Project5738f832012-12-12 16:00:35 -0800485/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800486 * Function smp_proc_pair_fail
487 * Description process pairing failure from peer device
488 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800489void smp_proc_pair_fail(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
490 SMP_TRACE_DEBUG("%s", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -0700491 p_cb->status = p_data->status;
Jacky Cheung373d9282016-05-17 13:42:43 -0700492
Myles Watson911d1ae2016-11-28 16:44:40 -0800493 /* Cancel pending auth complete timer if set */
494 alarm_cancel(p_cb->delayed_auth_timer_ent);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800495}
Satya Calloji444a8da2015-03-06 10:38:22 -0800496
The Android Open Source Project5738f832012-12-12 16:00:35 -0800497/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800498 * Function smp_proc_pair_cmd
499 * Description Process the SMP pairing request/response from peer device
500 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800501void smp_proc_pair_cmd(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700502 uint8_t* p = p_data->p_data;
Myles Watson911d1ae2016-11-28 16:44:40 -0800503 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800504
Stanley Tng273ffd82018-02-08 12:26:51 -0800505 SMP_TRACE_DEBUG("%s: pairing_bda=%s", __func__,
506 p_cb->pairing_bda.ToString().c_str());
507
johnshamoonb2dadde2017-05-31 11:32:24 -0700508 /* erase all keys if it is slave proc pairing req */
Myles Watson911d1ae2016-11-28 16:44:40 -0800509 if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
510 btm_sec_clear_ble_keys(p_dev_rec);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800511
Myles Watson911d1ae2016-11-28 16:44:40 -0800512 p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800513
Myles Watson911d1ae2016-11-28 16:44:40 -0800514 STREAM_TO_UINT8(p_cb->peer_io_caps, p);
515 STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
516 STREAM_TO_UINT8(p_cb->peer_auth_req, p);
517 STREAM_TO_UINT8(p_cb->peer_enc_size, p);
518 STREAM_TO_UINT8(p_cb->peer_i_key, p);
519 STREAM_TO_UINT8(p_cb->peer_r_key, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800520
Myles Watson911d1ae2016-11-28 16:44:40 -0800521 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700522 tSMP_INT_DATA smp_int_data;
523 smp_int_data.status = SMP_INVALID_PARAMETERS;
524 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800525 return;
526 }
527
528 // PTS Testing failure modes
529 if (pts_test_send_authentication_complete_failure(p_cb)) return;
530
531 if (p_cb->role == HCI_ROLE_SLAVE) {
532 if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) {
533 /* peer (master) started pairing sending Pairing Request */
534 p_cb->local_i_key = p_cb->peer_i_key;
535 p_cb->local_r_key = p_cb->peer_r_key;
536
537 p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
538 } else /* update local i/r key according to pairing request */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800539 {
Myles Watson911d1ae2016-11-28 16:44:40 -0800540 /* pairing started with this side (slave) sending Security Request */
541 p_cb->local_i_key &= p_cb->peer_i_key;
542 p_cb->local_r_key &= p_cb->peer_r_key;
543 p_cb->selected_association_model = smp_select_association_model(p_cb);
544
545 if (p_cb->secure_connections_only_mode_required &&
546 (!(p_cb->le_secure_connections_mode_is_used) ||
547 (p_cb->selected_association_model ==
548 SMP_MODEL_SEC_CONN_JUSTWORKS))) {
549 SMP_TRACE_ERROR(
johnshamoonb2dadde2017-05-31 11:32:24 -0700550 "%s: pairing failed - slave requires secure connection only mode",
Myles Watson911d1ae2016-11-28 16:44:40 -0800551 __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -0700552 tSMP_INT_DATA smp_int_data;
553 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
554 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800555 return;
Myles Watson911d1ae2016-11-28 16:44:40 -0800556 }
557
558 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
559 if (smp_request_oob_data(p_cb)) return;
560 } else {
561 smp_send_pair_rsp(p_cb, NULL);
562 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800563 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800564 } else /* Master receives pairing response */
565 {
566 p_cb->selected_association_model = smp_select_association_model(p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800567
Myles Watson911d1ae2016-11-28 16:44:40 -0800568 if (p_cb->secure_connections_only_mode_required &&
569 (!(p_cb->le_secure_connections_mode_is_used) ||
570 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
571 SMP_TRACE_ERROR(
johnshamoonb2dadde2017-05-31 11:32:24 -0700572 "Master requires secure connection only mode "
573 "but it can't be provided -> Master fails pairing");
Myles Watson5ce55bd2017-09-20 16:41:19 -0700574 tSMP_INT_DATA smp_int_data;
575 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
576 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800577 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800578 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800579
580 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
581 if (smp_request_oob_data(p_cb)) return;
582 } else {
583 smp_decide_association_model(p_cb, NULL);
584 }
585 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800586}
Satya Calloji444a8da2015-03-06 10:38:22 -0800587
The Android Open Source Project5738f832012-12-12 16:00:35 -0800588/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800589 * Function smp_proc_confirm
590 * Description process pairing confirm from peer device
591 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800592void smp_proc_confirm(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700593 uint8_t* p = p_data->p_data;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800594
Myles Watson911d1ae2016-11-28 16:44:40 -0800595 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800596
Myles Watson911d1ae2016-11-28 16:44:40 -0800597 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700598 tSMP_INT_DATA smp_int_data;
599 smp_int_data.status = SMP_INVALID_PARAMETERS;
600 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800601 return;
602 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800603
Myles Watson911d1ae2016-11-28 16:44:40 -0800604 if (p != NULL) {
605 /* save the SConfirm for comparison later */
606 STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN);
607 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800608
Myles Watson911d1ae2016-11-28 16:44:40 -0800609 p_cb->flags |= SMP_PAIR_FLAGS_CMD_CONFIRM;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800610}
611
612/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800613 * Function smp_proc_init
614 * Description process pairing initializer from peer device
615 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800616void smp_proc_init(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700617 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800618
Myles Watson911d1ae2016-11-28 16:44:40 -0800619 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800620
Myles Watson911d1ae2016-11-28 16:44:40 -0800621 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700622 tSMP_INT_DATA smp_int_data;
623 smp_int_data.status = SMP_INVALID_PARAMETERS;
624 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800625 return;
626 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800627
Myles Watson911d1ae2016-11-28 16:44:40 -0800628 /* save the SRand for comparison */
629 STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800630}
Satya Calloji444a8da2015-03-06 10:38:22 -0800631
632/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800633 * Function smp_proc_rand
634 * Description process pairing random (nonce) from peer device
635 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800636void smp_proc_rand(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700637 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800638
Myles Watson911d1ae2016-11-28 16:44:40 -0800639 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800640
Myles Watson911d1ae2016-11-28 16:44:40 -0800641 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700642 tSMP_INT_DATA smp_int_data;
643 smp_int_data.status = SMP_INVALID_PARAMETERS;
644 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800645 return;
646 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800647
Myles Watson911d1ae2016-11-28 16:44:40 -0800648 /* save the SRand for comparison */
649 STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
Satya Calloji444a8da2015-03-06 10:38:22 -0800650}
651
652/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800653 * Function smp_process_pairing_public_key
654 * Description process pairing public key command from the peer device
655 * - saves the peer public key;
656 * - sets the flag indicating that the peer public key is received;
657 * - calls smp_wait_for_both_public_keys(...).
658 *
659 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800660void smp_process_pairing_public_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700661 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800662
Myles Watson911d1ae2016-11-28 16:44:40 -0800663 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800664
Myles Watson911d1ae2016-11-28 16:44:40 -0800665 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700666 tSMP_INT_DATA smp_int_data;
667 smp_int_data.status = SMP_INVALID_PARAMETERS;
668 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800669 return;
670 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800671
Myles Watson911d1ae2016-11-28 16:44:40 -0800672 STREAM_TO_ARRAY(p_cb->peer_publ_key.x, p, BT_OCTET32_LEN);
673 STREAM_TO_ARRAY(p_cb->peer_publ_key.y, p, BT_OCTET32_LEN);
Andre Eisenbach9181ec22018-03-01 13:27:01 -0800674
675 Point pt;
676 memcpy(pt.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN);
677 memcpy(pt.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN);
678
679 if (!ECC_ValidatePoint(pt)) {
680 android_errorWriteLog(0x534e4554, "72377774");
681 tSMP_INT_DATA smp;
682 smp.status = SMP_PAIR_AUTH_FAIL;
683 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp);
684 return;
685 }
686
Myles Watson911d1ae2016-11-28 16:44:40 -0800687 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY;
Satya Calloji444a8da2015-03-06 10:38:22 -0800688
Myles Watson911d1ae2016-11-28 16:44:40 -0800689 smp_wait_for_both_public_keys(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -0800690}
691
692/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800693 * Function smp_process_pairing_commitment
694 * Description process pairing commitment from peer device
695 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800696void smp_process_pairing_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700697 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800698
Myles Watson911d1ae2016-11-28 16:44:40 -0800699 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800700
Myles Watson911d1ae2016-11-28 16:44:40 -0800701 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700702 tSMP_INT_DATA smp_int_data;
703 smp_int_data.status = SMP_INVALID_PARAMETERS;
704 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800705 return;
706 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800707
Myles Watson911d1ae2016-11-28 16:44:40 -0800708 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM;
Satya Calloji444a8da2015-03-06 10:38:22 -0800709
Myles Watson911d1ae2016-11-28 16:44:40 -0800710 if (p != NULL) {
711 STREAM_TO_ARRAY(p_cb->remote_commitment, p, BT_OCTET16_LEN);
712 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800713}
714
715/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800716 * Function smp_process_dhkey_check
717 * Description process DHKey Check from peer device
718 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800719void smp_process_dhkey_check(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700720 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800721
Myles Watson911d1ae2016-11-28 16:44:40 -0800722 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -0800723
Myles Watson911d1ae2016-11-28 16:44:40 -0800724 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700725 tSMP_INT_DATA smp_int_data;
726 smp_int_data.status = SMP_INVALID_PARAMETERS;
727 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800728 return;
729 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800730
Myles Watson911d1ae2016-11-28 16:44:40 -0800731 if (p != NULL) {
732 STREAM_TO_ARRAY(p_cb->remote_dhkey_check, p, BT_OCTET16_LEN);
733 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800734
Myles Watson911d1ae2016-11-28 16:44:40 -0800735 p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK;
Satya Calloji444a8da2015-03-06 10:38:22 -0800736}
737
738/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800739 * Function smp_process_keypress_notification
740 * Description process pairing keypress notification from peer device
741 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800742void smp_process_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700743 uint8_t* p = p_data->p_data;
Satya Calloji444a8da2015-03-06 10:38:22 -0800744
Myles Watson911d1ae2016-11-28 16:44:40 -0800745 SMP_TRACE_DEBUG("%s", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -0700746 p_cb->status = p_data->status;
Satya Calloji444a8da2015-03-06 10:38:22 -0800747
Myles Watson911d1ae2016-11-28 16:44:40 -0800748 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700749 tSMP_INT_DATA smp_int_data;
750 smp_int_data.status = SMP_INVALID_PARAMETERS;
751 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800752 return;
753 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800754
Myles Watson911d1ae2016-11-28 16:44:40 -0800755 if (p != NULL) {
756 STREAM_TO_UINT8(p_cb->peer_keypress_notification, p);
757 } else {
758 p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE;
759 }
760 p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT;
Satya Calloji444a8da2015-03-06 10:38:22 -0800761}
762
763/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800764 * Function smp_br_process_pairing_command
765 * Description Process the SMP pairing request/response from peer device via
766 * BR/EDR transport.
767 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800768void smp_br_process_pairing_command(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700769 uint8_t* p = p_data->p_data;
Myles Watson911d1ae2016-11-28 16:44:40 -0800770 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(p_cb->pairing_bda);
Satya Calloji444a8da2015-03-06 10:38:22 -0800771
Myles Watson911d1ae2016-11-28 16:44:40 -0800772 SMP_TRACE_DEBUG("%s", __func__);
773 /* rejecting BR pairing request over non-SC BR link */
774 if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700775 tSMP_INT_DATA smp_int_data;
776 smp_int_data.status = SMP_XTRANS_DERIVE_NOT_ALLOW;
777 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800778 return;
779 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800780
Myles Watson911d1ae2016-11-28 16:44:40 -0800781 /* erase all keys if it is slave proc pairing req*/
782 if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
783 btm_sec_clear_ble_keys(p_dev_rec);
Satya Calloji444a8da2015-03-06 10:38:22 -0800784
Myles Watson911d1ae2016-11-28 16:44:40 -0800785 p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR;
Satya Calloji444a8da2015-03-06 10:38:22 -0800786
Myles Watson911d1ae2016-11-28 16:44:40 -0800787 STREAM_TO_UINT8(p_cb->peer_io_caps, p);
788 STREAM_TO_UINT8(p_cb->peer_oob_flag, p);
789 STREAM_TO_UINT8(p_cb->peer_auth_req, p);
790 STREAM_TO_UINT8(p_cb->peer_enc_size, p);
791 STREAM_TO_UINT8(p_cb->peer_i_key, p);
792 STREAM_TO_UINT8(p_cb->peer_r_key, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800793
Myles Watson911d1ae2016-11-28 16:44:40 -0800794 if (smp_command_has_invalid_parameters(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700795 tSMP_INT_DATA smp_int_data;
796 smp_int_data.status = SMP_INVALID_PARAMETERS;
797 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800798 return;
799 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800800
Myles Watson911d1ae2016-11-28 16:44:40 -0800801 /* peer (master) started pairing sending Pairing Request */
802 /* or being master device always use received i/r key as keys to distribute */
803 p_cb->local_i_key = p_cb->peer_i_key;
804 p_cb->local_r_key = p_cb->peer_r_key;
Satya Calloji444a8da2015-03-06 10:38:22 -0800805
Myles Watson911d1ae2016-11-28 16:44:40 -0800806 if (p_cb->role == HCI_ROLE_SLAVE) {
807 p_dev_rec->new_encryption_key_is_p256 = false;
808 /* shortcut to skip Security Grant step */
809 p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
johnshamoonb2dadde2017-05-31 11:32:24 -0700810 } else {
811 /* Master receives pairing response */
Myles Watson911d1ae2016-11-28 16:44:40 -0800812 SMP_TRACE_DEBUG(
813 "%s master rcvs valid PAIRING RESPONSE."
814 " Supposed to move to key distribution phase. ",
815 __func__);
816 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800817
Myles Watson911d1ae2016-11-28 16:44:40 -0800818 /* auth_req received via BR/EDR SM channel is set to 0,
819 but everything derived/exchanged has to be saved */
820 p_cb->peer_auth_req |= SMP_AUTH_BOND;
821 p_cb->loc_auth_req |= SMP_AUTH_BOND;
Satya Calloji444a8da2015-03-06 10:38:22 -0800822}
823
824/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800825 * Function smp_br_process_security_grant
826 * Description process security grant in case of pairing over BR/EDR transport.
827 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800828void smp_br_process_security_grant(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800829 SMP_TRACE_DEBUG("%s", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -0700830 if (p_data->status != SMP_SUCCESS) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800831 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data);
johnshamoonb2dadde2017-05-31 11:32:24 -0700832 } else {
833 /* otherwise, start pairing; send IO request callback */
Myles Watson911d1ae2016-11-28 16:44:40 -0800834 p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT;
835 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800836}
837
838/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800839 * Function smp_br_check_authorization_request
840 * Description sets the SMP kes to be derived/distribute over BR/EDR transport
841 * before starting the distribution/derivation
842 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800843void smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
johnshamoonb2dadde2017-05-31 11:32:24 -0700844 SMP_TRACE_DEBUG("%s rcvs i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
845 __func__, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800846
Myles Watson911d1ae2016-11-28 16:44:40 -0800847 /* In LE SC mode LK field is ignored when BR/EDR transport is used */
848 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
849 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
Satya Calloji444a8da2015-03-06 10:38:22 -0800850
Myles Watson911d1ae2016-11-28 16:44:40 -0800851 /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
852 ** Set local_r_key on master to expect only these keys. */
853 if (p_cb->role == HCI_ROLE_MASTER) {
854 p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
855 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800856
Jakub Pawlowskie7f14a62017-03-20 15:38:56 -0700857 /* Check if H7 function needs to be used for key derivation*/
858 if ((p_cb->loc_auth_req & SMP_H7_SUPPORT_BIT) &&
859 (p_cb->peer_auth_req & SMP_H7_SUPPORT_BIT)) {
860 p_cb->key_derivation_h7_used = TRUE;
861 }
862 SMP_TRACE_DEBUG("%s: use h7 = %d", __func__, p_cb->key_derivation_h7_used);
863
Myles Watson911d1ae2016-11-28 16:44:40 -0800864 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -0700865 "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
Myles Watson911d1ae2016-11-28 16:44:40 -0800866 __func__, p_cb->local_i_key, p_cb->local_r_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800867
Myles Watson911d1ae2016-11-28 16:44:40 -0800868 if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
869 (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
870 (p_cb->local_i_key || p_cb->local_r_key)) {
871 smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -0800872
Myles Watson911d1ae2016-11-28 16:44:40 -0800873 /* if no peer key is expected, start master key distribution */
874 if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0)
875 smp_key_distribution_by_transport(p_cb, NULL);
876 } else {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700877 tSMP_INT_DATA smp_int_data;
878 smp_int_data.status = SMP_SUCCESS;
879 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -0800880 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800881}
882
883/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800884 * Function smp_br_select_next_key
885 * Description selects the next key to derive/send when BR/EDR transport is
886 * used.
887 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800888void smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800889 SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
890 p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
Satya Calloji444a8da2015-03-06 10:38:22 -0800891
Myles Watson911d1ae2016-11-28 16:44:40 -0800892 if (p_cb->role == HCI_ROLE_SLAVE ||
893 (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
894 smp_key_pick_key(p_cb, p_data);
895 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800896
Myles Watson911d1ae2016-11-28 16:44:40 -0800897 if (!p_cb->local_i_key && !p_cb->local_r_key) {
898 /* state check to prevent re-entrance */
899 if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700900 if (p_cb->total_tx_unacked == 0) {
901 tSMP_INT_DATA smp_int_data;
902 smp_int_data.status = SMP_SUCCESS;
903 smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
904 } else {
Myles Watson911d1ae2016-11-28 16:44:40 -0800905 p_cb->wait_for_authorization_complete = true;
Myles Watson5ce55bd2017-09-20 16:41:19 -0700906 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800907 }
Myles Watson911d1ae2016-11-28 16:44:40 -0800908 }
Satya Calloji444a8da2015-03-06 10:38:22 -0800909}
910
The Android Open Source Project5738f832012-12-12 16:00:35 -0800911/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800912 * Function smp_proc_enc_info
913 * Description process encryption information from peer device
914 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800915void smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700916 uint8_t* p = p_data->p_data;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800917
Myles Watson911d1ae2016-11-28 16:44:40 -0800918 SMP_TRACE_DEBUG("%s", __func__);
919 STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800920
Myles Watson911d1ae2016-11-28 16:44:40 -0800921 smp_key_distribution(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800922}
923/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800924 * Function smp_proc_master_id
925 * Description process master ID from slave device
926 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800927void smp_proc_master_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700928 uint8_t* p = p_data->p_data;
Myles Watson911d1ae2016-11-28 16:44:40 -0800929 tBTM_LE_PENC_KEYS le_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800930
Myles Watson911d1ae2016-11-28 16:44:40 -0800931 SMP_TRACE_DEBUG("%s", __func__);
932 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800933
Myles Watson911d1ae2016-11-28 16:44:40 -0800934 STREAM_TO_UINT16(le_key.ediv, p);
935 STREAM_TO_ARRAY(le_key.rand, p, BT_OCTET8_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800936
Myles Watson911d1ae2016-11-28 16:44:40 -0800937 /* store the encryption keys from peer device */
938 memcpy(le_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
939 le_key.sec_level = p_cb->sec_level;
940 le_key.key_size = p_cb->loc_enc_size;
Satya Calloji444a8da2015-03-06 10:38:22 -0800941
Myles Watson911d1ae2016-11-28 16:44:40 -0800942 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
943 (p_cb->loc_auth_req & SMP_AUTH_BOND))
944 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC,
945 (tBTM_LE_KEY_VALUE*)&le_key, true);
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}
Satya Calloji444a8da2015-03-06 10:38:22 -0800949
The Android Open Source Project5738f832012-12-12 16:00:35 -0800950/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800951 * Function smp_proc_enc_info
952 * Description process identity information from peer device
953 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800954void smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700955 uint8_t* p = p_data->p_data;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800956
Myles Watson911d1ae2016-11-28 16:44:40 -0800957 SMP_TRACE_DEBUG("%s", __func__);
958 STREAM_TO_ARRAY(p_cb->tk, p, BT_OCTET16_LEN); /* reuse TK for IRK */
959 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800960}
Satya Calloji444a8da2015-03-06 10:38:22 -0800961
The Android Open Source Project5738f832012-12-12 16:00:35 -0800962/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800963 * Function smp_proc_id_addr
964 * Description process identity address from peer device
965 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800966void smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -0700967 uint8_t* p = p_data->p_data;
Myles Watson911d1ae2016-11-28 16:44:40 -0800968 tBTM_LE_PID_KEYS pid_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800969
Myles Watson911d1ae2016-11-28 16:44:40 -0800970 SMP_TRACE_DEBUG("%s", __func__);
971 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800972
Myles Watson911d1ae2016-11-28 16:44:40 -0800973 STREAM_TO_UINT8(pid_key.addr_type, p);
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700974 STREAM_TO_BDADDR(pid_key.static_addr, p);
Myles Watson911d1ae2016-11-28 16:44:40 -0800975 memcpy(pid_key.irk, p_cb->tk, BT_OCTET16_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800976
Myles Watson911d1ae2016-11-28 16:44:40 -0800977 /* to use as BD_ADDR for lk derived from ltk */
978 p_cb->id_addr_rcvd = true;
979 p_cb->id_addr_type = pid_key.addr_type;
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700980 p_cb->id_addr = pid_key.static_addr;
Chaojing Sune2805532015-04-22 13:40:21 -0700981
Myles Watson911d1ae2016-11-28 16:44:40 -0800982 /* store the ID key from peer device */
983 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
984 (p_cb->loc_auth_req & SMP_AUTH_BOND))
985 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PID,
986 (tBTM_LE_KEY_VALUE*)&pid_key, true);
987 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800988}
Satya Calloji444a8da2015-03-06 10:38:22 -0800989
The Android Open Source Project5738f832012-12-12 16:00:35 -0800990/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800991 * Function smp_proc_srk_info
992 * Description process security information from peer device
993 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -0800994void smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
995 tBTM_LE_PCSRK_KEYS le_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800996
Myles Watson911d1ae2016-11-28 16:44:40 -0800997 SMP_TRACE_DEBUG("%s", __func__);
998 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800999
Myles Watson911d1ae2016-11-28 16:44:40 -08001000 /* save CSRK to security record */
1001 le_key.sec_level = p_cb->sec_level;
johnshamoonb2dadde2017-05-31 11:32:24 -07001002
1003 /* get peer CSRK */
Myles Watson5ce55bd2017-09-20 16:41:19 -07001004 maybe_non_aligned_memcpy(le_key.csrk, p_data->p_data, BT_OCTET16_LEN);
johnshamoonb2dadde2017-05-31 11:32:24 -07001005
1006 /* initialize the peer counter */
1007 le_key.counter = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001008
Myles Watson911d1ae2016-11-28 16:44:40 -08001009 if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
1010 (p_cb->loc_auth_req & SMP_AUTH_BOND))
1011 btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PCSRK,
1012 (tBTM_LE_KEY_VALUE*)&le_key, true);
1013 smp_key_distribution_by_transport(p_cb, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001014}
1015
1016/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001017 * Function smp_proc_compare
1018 * Description process compare value
1019 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001020void smp_proc_compare(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001021 SMP_TRACE_DEBUG("%s", __func__);
1022 if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) {
1023 /* compare the max encryption key size, and save the smaller one for the
1024 * link */
1025 if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1026 p_cb->loc_enc_size = p_cb->peer_enc_size;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001027
Myles Watson911d1ae2016-11-28 16:44:40 -08001028 if (p_cb->role == HCI_ROLE_SLAVE)
1029 smp_sm_event(p_cb, SMP_RAND_EVT, NULL);
1030 else {
1031 /* master device always use received i/r key as keys to distribute */
1032 p_cb->local_i_key = p_cb->peer_i_key;
1033 p_cb->local_r_key = p_cb->peer_r_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001034
Myles Watson911d1ae2016-11-28 16:44:40 -08001035 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001036 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001037
1038 } else {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001039 tSMP_INT_DATA smp_int_data;
1040 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1041 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1042 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001043 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001044}
Satya Calloji444a8da2015-03-06 10:38:22 -08001045
The Android Open Source Project5738f832012-12-12 16:00:35 -08001046/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001047 * Function smp_proc_sl_key
1048 * Description process key ready events.
1049 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001050void smp_proc_sl_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1051 uint8_t key_type = p_data->key.key_type;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001052
Myles Watson911d1ae2016-11-28 16:44:40 -08001053 SMP_TRACE_DEBUG("%s", __func__);
1054 if (key_type == SMP_KEY_TYPE_TK) {
1055 smp_generate_srand_mrand_confirm(p_cb, NULL);
1056 } else if (key_type == SMP_KEY_TYPE_CFM) {
1057 smp_set_state(SMP_STATE_WAIT_CONFIRM);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001058
Myles Watson911d1ae2016-11-28 16:44:40 -08001059 if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM)
1060 smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL);
1061 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001062}
Satya Calloji444a8da2015-03-06 10:38:22 -08001063
The Android Open Source Project5738f832012-12-12 16:00:35 -08001064/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001065 * Function smp_start_enc
1066 * Description start encryption
1067 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001068void smp_start_enc(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1069 tBTM_STATUS cmd;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001070
Myles Watson911d1ae2016-11-28 16:44:40 -08001071 SMP_TRACE_DEBUG("%s", __func__);
1072 if (p_data != NULL)
1073 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, true, p_data->key.p_data);
1074 else
1075 cmd = btm_ble_start_encrypt(p_cb->pairing_bda, false, NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001076
Myles Watson5ce55bd2017-09-20 16:41:19 -07001077 if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) {
1078 tSMP_INT_DATA smp_int_data;
1079 smp_int_data.status = SMP_ENC_FAIL;
1080 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1081 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001082}
1083
1084/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001085 * Function smp_proc_discard
1086 * Description processing for discard security request
1087 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001088void smp_proc_discard(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1089 SMP_TRACE_DEBUG("%s", __func__);
1090 if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
1091 smp_reset_control_value(p_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001092}
The Android Open Source Project5738f832012-12-12 16:00:35 -08001093
1094/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001095 * Function smp_enc_cmpl
1096 * Description encryption success
1097 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001098void smp_enc_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001099 uint8_t enc_enable = p_data->status;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001100
Myles Watson911d1ae2016-11-28 16:44:40 -08001101 SMP_TRACE_DEBUG("%s", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001102 tSMP_INT_DATA smp_int_data;
1103 smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
1104 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001105}
1106
The Android Open Source Project5738f832012-12-12 16:00:35 -08001107/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001108 * Function smp_check_auth_req
1109 * Description check authentication request
1110 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001111void smp_check_auth_req(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001112 uint8_t enc_enable = p_data->status;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001113
Myles Watson911d1ae2016-11-28 16:44:40 -08001114 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -07001115 "%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
Myles Watson911d1ae2016-11-28 16:44:40 -08001116 __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key);
1117 if (enc_enable == 1) {
1118 if (p_cb->le_secure_connections_mode_is_used) {
1119 /* In LE SC mode LTK is used instead of STK and has to be always saved */
1120 p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC;
1121 p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC;
Satya Calloji444a8da2015-03-06 10:38:22 -08001122
Myles Watson911d1ae2016-11-28 16:44:40 -08001123 /* In LE SC mode LK is derived from LTK only if both sides request it */
1124 if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) ||
1125 !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) {
1126 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1127 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
1128 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001129
Myles Watson911d1ae2016-11-28 16:44:40 -08001130 /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer.
1131 ** Set local_r_key on master to expect only these keys.
1132 */
1133 if (p_cb->role == HCI_ROLE_MASTER) {
1134 p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK);
1135 }
1136 } else {
1137 /* in legacy mode derivation of BR/EDR LK is not supported */
1138 p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK;
1139 p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001140 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001141 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -07001142 "%s rcvs upgrades: i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
Myles Watson911d1ae2016-11-28 16:44:40 -08001143 __func__, p_cb->local_i_key, p_cb->local_r_key);
1144
1145 if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) ||
1146 (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/
1147 (p_cb->local_i_key || p_cb->local_r_key)) {
1148 smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001149 } else {
1150 tSMP_INT_DATA smp_int_data;
1151 smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
1152 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
1153 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001154 } else if (enc_enable == 0) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001155 tSMP_INT_DATA smp_int_data;
1156 smp_int_data.status = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
Myles Watson911d1ae2016-11-28 16:44:40 -08001157 /* if failed for encryption after pairing, send callback */
1158 if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR)
Myles Watson5ce55bd2017-09-20 16:41:19 -07001159 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001160 /* if enc failed for old security information */
1161 /* if master device, clean up and abck to idle; slave device do nothing */
1162 else if (p_cb->role == HCI_ROLE_MASTER) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001163 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001164 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001165 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001166}
1167
1168/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001169 * Function smp_key_pick_key
1170 * Description Pick a key distribution function based on the key mask.
1171 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001172void smp_key_pick_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1173 uint8_t key_to_dist =
1174 (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->local_r_key : p_cb->local_i_key;
1175 uint8_t i = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001176
Myles Watson911d1ae2016-11-28 16:44:40 -08001177 SMP_TRACE_DEBUG("%s key_to_dist=0x%x", __func__, key_to_dist);
1178 while (i < SMP_KEY_DIST_TYPE_MAX) {
1179 SMP_TRACE_DEBUG("key to send = %02x, i = %d", key_to_dist, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001180
Myles Watson911d1ae2016-11-28 16:44:40 -08001181 if (key_to_dist & (1 << i)) {
1182 SMP_TRACE_DEBUG("smp_distribute_act[%d]", i);
1183 (*smp_distribute_act[i])(p_cb, p_data);
1184 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001185 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001186 i++;
1187 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001188}
1189/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001190 * Function smp_key_distribution
1191 * Description start key distribution if required.
1192 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001193void smp_key_distribution(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1194 SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", __func__,
1195 p_cb->role, p_cb->local_r_key, p_cb->local_i_key);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001196
Myles Watson911d1ae2016-11-28 16:44:40 -08001197 if (p_cb->role == HCI_ROLE_SLAVE ||
1198 (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) {
1199 smp_key_pick_key(p_cb, p_data);
1200 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001201
Myles Watson911d1ae2016-11-28 16:44:40 -08001202 if (!p_cb->local_i_key && !p_cb->local_r_key) {
1203 /* state check to prevent re-entrant */
1204 if (smp_get_state() == SMP_STATE_BOND_PENDING) {
1205 if (p_cb->derive_lk) {
1206 smp_derive_link_key_from_long_term_key(p_cb, NULL);
1207 p_cb->derive_lk = false;
1208 }
Chaojing Sune2805532015-04-22 13:40:21 -07001209
Myles Watson911d1ae2016-11-28 16:44:40 -08001210 if (p_cb->total_tx_unacked == 0) {
1211 /*
1212 * Instead of declaring authorization complete immediately,
1213 * delay the event from being sent by SMP_DELAYED_AUTH_TIMEOUT_MS.
1214 * This allows the slave to send over Pairing Failed if the
1215 * last key is rejected. During this waiting window, the
1216 * state should remain in SMP_STATE_BOND_PENDING.
1217 */
1218 if (!alarm_is_scheduled(p_cb->delayed_auth_timer_ent)) {
1219 SMP_TRACE_DEBUG("%s delaying auth complete.", __func__);
Jakub Pawlowskibe8bbd72017-09-08 11:26:25 -07001220 alarm_set_on_mloop(p_cb->delayed_auth_timer_ent,
1221 SMP_DELAYED_AUTH_TIMEOUT_MS,
1222 smp_delayed_auth_complete_timeout, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001223 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001224 } else {
1225 p_cb->wait_for_authorization_complete = true;
1226 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001227 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001228 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001229}
Satya Calloji444a8da2015-03-06 10:38:22 -08001230
The Android Open Source Project5738f832012-12-12 16:00:35 -08001231/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001232 * Function smp_decide_association_model
1233 * Description This function is called to select assoc model to be used for
1234 * STK generation and to start STK generation process.
1235 *
1236 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001237void smp_decide_association_model(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001238 uint8_t int_evt = 0;
Myles Watson5ce55bd2017-09-20 16:41:19 -07001239 tSMP_INT_DATA smp_int_data;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001240
Myles Watson911d1ae2016-11-28 16:44:40 -08001241 SMP_TRACE_DEBUG("%s Association Model = %d", __func__,
1242 p_cb->selected_association_model);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001243
Myles Watson911d1ae2016-11-28 16:44:40 -08001244 switch (p_cb->selected_association_model) {
1245 case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */
1246 if (p_cb->role == HCI_ROLE_MASTER &&
1247 ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
1248 ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) {
1249 SMP_TRACE_ERROR(
1250 "IO capability does not meet authentication requirement");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001251 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
Myles Watson911d1ae2016-11-28 16:44:40 -08001252 int_evt = SMP_AUTH_CMPL_EVT;
1253 } else {
1254 p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1255 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1256 p_cb->sec_level);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001257
Myles Watson5ce55bd2017-09-20 16:41:19 -07001258 tSMP_KEY key;
Myles Watson911d1ae2016-11-28 16:44:40 -08001259 key.key_type = SMP_KEY_TYPE_TK;
1260 key.p_data = p_cb->tk;
Myles Watson5ce55bd2017-09-20 16:41:19 -07001261 smp_int_data.key = key;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001262
Myles Watson911d1ae2016-11-28 16:44:40 -08001263 memset(p_cb->tk, 0, BT_OCTET16_LEN);
1264 /* TK, ready */
1265 int_evt = SMP_KEY_READY_EVT;
1266 }
1267 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001268
Myles Watson911d1ae2016-11-28 16:44:40 -08001269 case SMP_MODEL_PASSKEY:
1270 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1271 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1272 p_cb->sec_level);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001273
Myles Watson911d1ae2016-11-28 16:44:40 -08001274 p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1275 int_evt = SMP_TK_REQ_EVT;
1276 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001277
Myles Watson911d1ae2016-11-28 16:44:40 -08001278 case SMP_MODEL_OOB:
1279 SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
1280 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1281 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1282 p_cb->sec_level);
Satya Calloji444a8da2015-03-06 10:38:22 -08001283
Myles Watson911d1ae2016-11-28 16:44:40 -08001284 p_cb->cb_evt = SMP_OOB_REQ_EVT;
1285 int_evt = SMP_TK_REQ_EVT;
1286 break;
Satya Calloji444a8da2015-03-06 10:38:22 -08001287
Myles Watson911d1ae2016-11-28 16:44:40 -08001288 case SMP_MODEL_KEY_NOTIF:
1289 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1290 SMP_TRACE_DEBUG("Need to generate Passkey");
Satya Calloji444a8da2015-03-06 10:38:22 -08001291
Myles Watson911d1ae2016-11-28 16:44:40 -08001292 /* generate passkey and notify application */
1293 smp_generate_passkey(p_cb, NULL);
1294 break;
Satya Calloji444a8da2015-03-06 10:38:22 -08001295
Myles Watson911d1ae2016-11-28 16:44:40 -08001296 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1297 case SMP_MODEL_SEC_CONN_NUM_COMP:
1298 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1299 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1300 case SMP_MODEL_SEC_CONN_OOB:
1301 int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT;
1302 break;
Satya Calloji444a8da2015-03-06 10:38:22 -08001303
Myles Watson911d1ae2016-11-28 16:44:40 -08001304 case SMP_MODEL_OUT_OF_RANGE:
1305 SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001306 smp_int_data.status = SMP_UNKNOWN_IO_CAP;
Myles Watson911d1ae2016-11-28 16:44:40 -08001307 int_evt = SMP_AUTH_CMPL_EVT;
1308 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001309
Myles Watson911d1ae2016-11-28 16:44:40 -08001310 default:
1311 SMP_TRACE_ERROR(
1312 "Association Model = %d (SOMETHING IS WRONG WITH THE CODE)",
1313 p_cb->selected_association_model);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001314 smp_int_data.status = SMP_UNKNOWN_IO_CAP;
Myles Watson911d1ae2016-11-28 16:44:40 -08001315 int_evt = SMP_AUTH_CMPL_EVT;
1316 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001317
Myles Watson911d1ae2016-11-28 16:44:40 -08001318 SMP_TRACE_EVENT("sec_level=%d ", p_cb->sec_level);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001319 if (int_evt) smp_sm_event(p_cb, int_evt, &smp_int_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001320}
1321
1322/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001323 * Function smp_process_io_response
1324 * Description process IO response for a slave device.
1325 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001326void smp_process_io_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001327
Myles Watson911d1ae2016-11-28 16:44:40 -08001328 SMP_TRACE_DEBUG("%s", __func__);
1329 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1330 /* pairing started by local (slave) Security Request */
1331 smp_set_state(SMP_STATE_SEC_REQ_PENDING);
1332 smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb);
1333 } else /* plan to send pairing respond */
1334 {
1335 /* pairing started by peer (master) Pairing Request */
1336 p_cb->selected_association_model = smp_select_association_model(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001337
Myles Watson911d1ae2016-11-28 16:44:40 -08001338 if (p_cb->secure_connections_only_mode_required &&
1339 (!(p_cb->le_secure_connections_mode_is_used) ||
1340 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) {
1341 SMP_TRACE_ERROR(
johnshamoonb2dadde2017-05-31 11:32:24 -07001342 "Slave requires secure connection only mode "
1343 "but it can't be provided -> Slave fails pairing");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001344 tSMP_INT_DATA smp_int_data;
1345 smp_int_data.status = SMP_PAIR_AUTH_FAIL;
1346 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001347 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001348 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001349
1350 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) {
1351 if (smp_request_oob_data(p_cb)) return;
1352 }
1353
1354 // PTS Testing failure modes
1355 if (pts_test_send_authentication_complete_failure(p_cb)) return;
1356
1357 smp_send_pair_rsp(p_cb, NULL);
1358 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001359}
Satya Calloji444a8da2015-03-06 10:38:22 -08001360
1361/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001362 * Function smp_br_process_slave_keys_response
1363 * Description process application keys response for a slave device
1364 * (BR/EDR transport).
1365 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001366void smp_br_process_slave_keys_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1367 smp_br_send_pair_response(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001368}
1369
1370/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001371 * Function smp_br_send_pair_response
Myles Watson9ca07092016-11-28 16:41:53 -08001372 * Description actions related to sending pairing response over BR/EDR
1373 * transport.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001374 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001375void smp_br_send_pair_response(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1376 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001377
Myles Watson911d1ae2016-11-28 16:44:40 -08001378 p_cb->local_i_key &= p_cb->peer_i_key;
1379 p_cb->local_r_key &= p_cb->peer_r_key;
Satya Calloji444a8da2015-03-06 10:38:22 -08001380
Myles Watson911d1ae2016-11-28 16:44:40 -08001381 smp_send_cmd(SMP_OPCODE_PAIRING_RSP, p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001382}
1383
The Android Open Source Project5738f832012-12-12 16:00:35 -08001384/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001385 * Function smp_pairing_cmpl
Myles Watson9ca07092016-11-28 16:41:53 -08001386 * Description This function is called to send the pairing complete
1387 * callback and remove the connection if needed.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001388 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001389void smp_pairing_cmpl(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1390 if (p_cb->total_tx_unacked == 0) {
1391 /* process the pairing complete */
1392 smp_proc_pairing_cmpl(p_cb);
1393 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001394}
Satya Calloji444a8da2015-03-06 10:38:22 -08001395
The Android Open Source Project5738f832012-12-12 16:00:35 -08001396/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001397 * Function smp_pair_terminate
Myles Watson9ca07092016-11-28 16:41:53 -08001398 * Description This function is called to send the pairing complete
1399 * callback and remove the connection if needed.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001400 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001401void smp_pair_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1402 SMP_TRACE_DEBUG("%s", __func__);
1403 p_cb->status = SMP_CONN_TOUT;
1404 smp_proc_pairing_cmpl(p_cb);
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07001405}
1406
1407/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001408 * Function smp_idle_terminate
Myles Watson9ca07092016-11-28 16:41:53 -08001409 * Description This function calledin idle state to determine to send
1410 * authentication complete or not.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001411 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001412void smp_idle_terminate(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1413 if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) {
1414 SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
1415 p_cb->status = SMP_FAIL;
1416 smp_proc_pairing_cmpl(p_cb);
1417 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001418}
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001419
1420/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001421 * Function smp_fast_conn_param
1422 * Description apply default connection parameter for pairing process
1423 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001424void smp_fast_conn_param(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1425 /* Disable L2CAP connection parameter updates while bonding since
1426 some peripherals are not able to revert to fast connection parameters
1427 during the start of service discovery. Connection paramter updates
1428 get enabled again once service discovery completes. */
1429 L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, false);
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001430}
1431
Satya Calloji444a8da2015-03-06 10:38:22 -08001432/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001433 * Function smp_both_have_public_keys
1434 * Description The function is called when both local and peer public keys are
1435 * saved.
1436 * Actions:
1437 * - invokes DHKey computation;
1438 * - on slave side invokes sending local public key to the peer.
1439 * - invokes SC phase 1 process.
1440 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001441void smp_both_have_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1442 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001443
Myles Watson911d1ae2016-11-28 16:44:40 -08001444 /* invokes DHKey computation */
1445 smp_compute_dhkey(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001446
Myles Watson911d1ae2016-11-28 16:44:40 -08001447 /* on slave side invokes sending local public key to the peer */
1448 if (p_cb->role == HCI_ROLE_SLAVE) smp_send_pair_public_key(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001449
Myles Watson911d1ae2016-11-28 16:44:40 -08001450 smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001451}
1452
1453/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001454 * Function smp_start_secure_connection_phase1
Myles Watson9ca07092016-11-28 16:41:53 -08001455 * Description Start Secure Connection phase1 i.e. invokes initialization of
1456 * Secure Connection phase 1 parameters and starts building/sending
1457 * to the peer messages appropriate for the role and association
1458 * model.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001459 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001460void smp_start_secure_connection_phase1(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1461 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001462
Myles Watson911d1ae2016-11-28 16:44:40 -08001463 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1464 p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
1465 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ",
1466 p_cb->sec_level);
1467 } else {
1468 p_cb->sec_level = SMP_SEC_AUTHENTICATED;
1469 SMP_TRACE_EVENT("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ",
1470 p_cb->sec_level);
1471 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001472
Myles Watson911d1ae2016-11-28 16:44:40 -08001473 switch (p_cb->selected_association_model) {
1474 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1475 case SMP_MODEL_SEC_CONN_NUM_COMP:
1476 memset(p_cb->local_random, 0, BT_OCTET16_LEN);
1477 smp_start_nonce_generation(p_cb);
1478 break;
1479 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1480 /* user has to provide passkey */
1481 p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
1482 smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL);
1483 break;
1484 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1485 /* passkey has to be provided to user */
1486 SMP_TRACE_DEBUG("Need to generate SC Passkey");
1487 smp_generate_passkey(p_cb, NULL);
1488 break;
1489 case SMP_MODEL_SEC_CONN_OOB:
1490 /* use the available OOB information */
1491 smp_process_secure_connection_oob_data(p_cb, NULL);
1492 break;
1493 default:
1494 SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1495 p_cb->selected_association_model);
1496 break;
1497 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001498}
1499
1500/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001501 * Function smp_process_local_nonce
1502 * Description The function processes new local nonce.
1503 *
1504 * Note It is supposed to be called in SC phase1.
1505 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001506void smp_process_local_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1507 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001508
Myles Watson911d1ae2016-11-28 16:44:40 -08001509 switch (p_cb->selected_association_model) {
1510 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1511 case SMP_MODEL_SEC_CONN_NUM_COMP:
1512 if (p_cb->role == HCI_ROLE_SLAVE) {
1513 /* slave calculates and sends local commitment */
1514 smp_calculate_local_commitment(p_cb);
1515 smp_send_commitment(p_cb, NULL);
1516 /* slave has to wait for peer nonce */
1517 smp_set_state(SMP_STATE_WAIT_NONCE);
1518 } else /* i.e. master */
1519 {
1520 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1521 /* slave commitment is already received, send local nonce, wait for
1522 * remote nonce*/
1523 SMP_TRACE_DEBUG(
johnshamoonb2dadde2017-05-31 11:32:24 -07001524 "master in assoc mode = %d "
1525 "already rcvd slave commitment - race condition",
Myles Watson911d1ae2016-11-28 16:44:40 -08001526 p_cb->selected_association_model);
1527 p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1528 smp_send_rand(p_cb, NULL);
1529 smp_set_state(SMP_STATE_WAIT_NONCE);
1530 }
1531 }
1532 break;
1533 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1534 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
1535 smp_calculate_local_commitment(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001536
Myles Watson911d1ae2016-11-28 16:44:40 -08001537 if (p_cb->role == HCI_ROLE_MASTER) {
1538 smp_send_commitment(p_cb, NULL);
1539 } else /* slave */
1540 {
1541 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) {
1542 /* master commitment is already received */
1543 smp_send_commitment(p_cb, NULL);
1544 smp_set_state(SMP_STATE_WAIT_NONCE);
1545 }
1546 }
1547 break;
1548 case SMP_MODEL_SEC_CONN_OOB:
1549 if (p_cb->role == HCI_ROLE_MASTER) {
1550 smp_send_rand(p_cb, NULL);
1551 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001552
Myles Watson911d1ae2016-11-28 16:44:40 -08001553 smp_set_state(SMP_STATE_WAIT_NONCE);
1554 break;
1555 default:
1556 SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1557 p_cb->selected_association_model);
1558 break;
1559 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001560}
1561
1562/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001563 * Function smp_process_peer_nonce
Myles Watson9ca07092016-11-28 16:41:53 -08001564 * Description The function processes newly received and saved in CB peer
1565 * nonce. The actions depend on the selected association model and
1566 * the role.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001567 *
1568 * Note It is supposed to be called in SC phase1.
1569 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001570void smp_process_peer_nonce(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001571 SMP_TRACE_DEBUG("%s start ", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001572
Myles Watson911d1ae2016-11-28 16:44:40 -08001573 // PTS Testing failure modes
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301574 if (p_cb->cert_failure == SMP_CONFIRM_VALUE_ERR) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001575 SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001576 tSMP_INT_DATA smp_int_data;
1577 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1578 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1579 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001580 return;
1581 }
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301582 // PTS Testing failure modes (for LT)
1583 if ((p_cb->cert_failure == SMP_NUMERIC_COMPAR_FAIL) &&
1584 (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) &&
1585 (p_cb->role == HCI_ROLE_SLAVE)) {
1586 SMP_TRACE_ERROR("%s failure case = %d", __func__, p_cb->cert_failure);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001587 tSMP_INT_DATA smp_int_data;
1588 smp_int_data.status = SMP_NUMERIC_COMPAR_FAIL;
1589 p_cb->failure = SMP_NUMERIC_COMPAR_FAIL;
1590 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301591 return;
1592 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001593
1594 switch (p_cb->selected_association_model) {
1595 case SMP_MODEL_SEC_CONN_JUSTWORKS:
1596 case SMP_MODEL_SEC_CONN_NUM_COMP:
1597 /* in these models only master receives commitment */
1598 if (p_cb->role == HCI_ROLE_MASTER) {
1599 if (!smp_check_commitment(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001600 tSMP_INT_DATA smp_int_data;
1601 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1602 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1603 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001604 break;
1605 }
1606 } else {
1607 /* slave sends local nonce */
1608 smp_send_rand(p_cb, NULL);
1609 }
1610
1611 if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) {
1612 /* go directly to phase 2 */
1613 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1614 } else /* numeric comparison */
1615 {
1616 smp_set_state(SMP_STATE_WAIT_NONCE);
1617 smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL);
1618 }
1619 break;
1620 case SMP_MODEL_SEC_CONN_PASSKEY_ENT:
1621 case SMP_MODEL_SEC_CONN_PASSKEY_DISP:
ravishankar srivatsafd102ca2017-05-04 10:13:58 +05301622 if (!smp_check_commitment(p_cb) &&
1623 p_cb->cert_failure != SMP_NUMERIC_COMPAR_FAIL) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001624 tSMP_INT_DATA smp_int_data;
1625 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1626 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1627 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001628 break;
1629 }
Nitin Arora0bd0c8f2016-03-15 15:00:36 -07001630
Myles Watson911d1ae2016-11-28 16:44:40 -08001631 if (p_cb->role == HCI_ROLE_SLAVE) {
1632 smp_send_rand(p_cb, NULL);
1633 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001634
Myles Watson911d1ae2016-11-28 16:44:40 -08001635 if (++p_cb->round < 20) {
1636 smp_set_state(SMP_STATE_SEC_CONN_PHS1_START);
1637 p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM;
1638 smp_start_nonce_generation(p_cb);
1639 break;
1640 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001641
Myles Watson911d1ae2016-11-28 16:44:40 -08001642 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1643 break;
1644 case SMP_MODEL_SEC_CONN_OOB:
1645 if (p_cb->role == HCI_ROLE_SLAVE) {
1646 smp_send_rand(p_cb, NULL);
1647 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001648
Myles Watson911d1ae2016-11-28 16:44:40 -08001649 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
1650 break;
1651 default:
1652 SMP_TRACE_ERROR("Association Model = %d is not used in LE SC",
1653 p_cb->selected_association_model);
1654 break;
1655 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001656
Myles Watson911d1ae2016-11-28 16:44:40 -08001657 SMP_TRACE_DEBUG("%s end ", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001658}
1659
1660/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001661 * Function smp_match_dhkey_checks
1662 * Description checks if the calculated peer DHKey Check value is the same as
1663 * received from the peer DHKey check value.
1664 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001665void smp_match_dhkey_checks(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
Satya Calloji444a8da2015-03-06 10:38:22 -08001666
Myles Watson911d1ae2016-11-28 16:44:40 -08001667 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001668
Myles Watson911d1ae2016-11-28 16:44:40 -08001669 if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) {
1670 SMP_TRACE_WARNING("dhkey chcks do no match");
Myles Watson5ce55bd2017-09-20 16:41:19 -07001671 tSMP_INT_DATA smp_int_data;
1672 smp_int_data.status = SMP_DHKEY_CHK_FAIL;
1673 p_cb->failure = SMP_DHKEY_CHK_FAIL;
1674 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001675 return;
1676 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001677
Myles Watson911d1ae2016-11-28 16:44:40 -08001678 SMP_TRACE_EVENT("dhkey chcks match");
Satya Calloji444a8da2015-03-06 10:38:22 -08001679
Myles Watson911d1ae2016-11-28 16:44:40 -08001680 /* compare the max encryption key size, and save the smaller one for the link
1681 */
1682 if (p_cb->peer_enc_size < p_cb->loc_enc_size)
1683 p_cb->loc_enc_size = p_cb->peer_enc_size;
Satya Calloji444a8da2015-03-06 10:38:22 -08001684
Myles Watson911d1ae2016-11-28 16:44:40 -08001685 if (p_cb->role == HCI_ROLE_SLAVE) {
1686 smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL);
1687 } else {
1688 /* master device always use received i/r key as keys to distribute */
1689 p_cb->local_i_key = p_cb->peer_i_key;
1690 p_cb->local_r_key = p_cb->peer_r_key;
1691 smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
1692 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001693}
1694
1695/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001696 * Function smp_move_to_secure_connections_phase2
1697 * Description Signal State Machine to start SC phase 2 initialization (to
1698 * compute local DHKey Check value).
1699 *
1700 * Note SM is supposed to be in the state SMP_STATE_SEC_CONN_PHS2_START.
1701 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001702void smp_move_to_secure_connections_phase2(tSMP_CB* p_cb,
1703 tSMP_INT_DATA* p_data) {
1704 SMP_TRACE_DEBUG("%s", __func__);
1705 smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001706}
1707
1708/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001709 * Function smp_phase_2_dhkey_checks_are_present
Myles Watson9ca07092016-11-28 16:41:53 -08001710 * Description generates event if dhkey check from the peer is already
1711 * received.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001712 *
1713 * Note It is supposed to be used on slave to prevent race condition.
Myles Watson9ca07092016-11-28 16:41:53 -08001714 * It is supposed to be called after slave dhkey check is
1715 * calculated.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001716 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001717void smp_phase_2_dhkey_checks_are_present(tSMP_CB* p_cb,
1718 tSMP_INT_DATA* p_data) {
1719 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001720
Myles Watson911d1ae2016-11-28 16:44:40 -08001721 if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK)
1722 smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001723}
1724
1725/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001726 * Function smp_wait_for_both_public_keys
Myles Watson9ca07092016-11-28 16:41:53 -08001727 * Description generates SMP_BOTH_PUBL_KEYS_RCVD_EVT event when both local and
1728 * master public keys are available.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001729 *
1730 * Note on the slave it is used to prevent race condition.
1731 *
1732 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001733void smp_wait_for_both_public_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1734 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001735
Myles Watson911d1ae2016-11-28 16:44:40 -08001736 if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) &&
1737 (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) {
1738 if ((p_cb->role == HCI_ROLE_SLAVE) &&
1739 ((p_cb->req_oob_type == SMP_OOB_LOCAL) ||
1740 (p_cb->req_oob_type == SMP_OOB_BOTH))) {
1741 smp_set_state(SMP_STATE_PUBLIC_KEY_EXCH);
Satya Calloji444a8da2015-03-06 10:38:22 -08001742 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001743 smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL);
1744 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001745}
1746
1747/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001748 * Function smp_start_passkey_verification
1749 * Description Starts SC passkey entry verification.
1750 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001751void smp_start_passkey_verification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1752 uint8_t* p = NULL;
Satya Calloji444a8da2015-03-06 10:38:22 -08001753
Myles Watson911d1ae2016-11-28 16:44:40 -08001754 SMP_TRACE_DEBUG("%s", __func__);
1755 p = p_cb->local_random;
1756 UINT32_TO_STREAM(p, p_data->passkey);
Satya Calloji444a8da2015-03-06 10:38:22 -08001757
Myles Watson911d1ae2016-11-28 16:44:40 -08001758 p = p_cb->peer_random;
1759 UINT32_TO_STREAM(p, p_data->passkey);
Satya Calloji444a8da2015-03-06 10:38:22 -08001760
Myles Watson911d1ae2016-11-28 16:44:40 -08001761 p_cb->round = 0;
1762 smp_start_nonce_generation(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001763}
1764
1765/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001766 * Function smp_process_secure_connection_oob_data
1767 * Description Processes local/peer SC OOB data received from somewhere.
1768 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001769void smp_process_secure_connection_oob_data(tSMP_CB* p_cb,
1770 tSMP_INT_DATA* p_data) {
1771 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001772
Myles Watson911d1ae2016-11-28 16:44:40 -08001773 tSMP_SC_OOB_DATA* p_sc_oob_data = &p_cb->sc_oob_data;
1774 if (p_sc_oob_data->loc_oob_data.present) {
1775 memcpy(p_cb->local_random, p_sc_oob_data->loc_oob_data.randomizer,
1776 sizeof(p_cb->local_random));
1777 } else {
1778 SMP_TRACE_EVENT("%s: local OOB randomizer is absent", __func__);
1779 memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
1780 }
1781
1782 if (!p_sc_oob_data->peer_oob_data.present) {
1783 SMP_TRACE_EVENT("%s: peer OOB data is absent", __func__);
1784 memset(p_cb->peer_random, 0, sizeof(p_cb->peer_random));
1785 } else {
1786 memcpy(p_cb->peer_random, p_sc_oob_data->peer_oob_data.randomizer,
1787 sizeof(p_cb->peer_random));
1788 memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment,
1789 sizeof(p_cb->remote_commitment));
1790
Myles Watson911d1ae2016-11-28 16:44:40 -08001791 /* check commitment */
1792 if (!smp_check_commitment(p_cb)) {
Myles Watson5ce55bd2017-09-20 16:41:19 -07001793 tSMP_INT_DATA smp_int_data;
1794 smp_int_data.status = SMP_CONFIRM_VALUE_ERR;
1795 p_cb->failure = SMP_CONFIRM_VALUE_ERR;
1796 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001797 return;
Satya Calloji444a8da2015-03-06 10:38:22 -08001798 }
1799
Myles Watson911d1ae2016-11-28 16:44:40 -08001800 if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) {
1801 /* the peer doesn't have local randomiser */
1802 SMP_TRACE_EVENT(
1803 "%s: peer didn't receive local OOB data, set local randomizer to 0",
1804 __func__);
1805 memset(p_cb->local_random, 0, sizeof(p_cb->local_random));
Satya Calloji444a8da2015-03-06 10:38:22 -08001806 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001807 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001808
Myles Watson911d1ae2016-11-28 16:44:40 -08001809 print128(p_cb->local_random, (const uint8_t*)"local OOB randomizer");
1810 print128(p_cb->peer_random, (const uint8_t*)"peer OOB randomizer");
1811 smp_start_nonce_generation(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001812}
1813
1814/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001815 * Function smp_set_local_oob_keys
Myles Watson9ca07092016-11-28 16:41:53 -08001816 * Description Saves calculated private/public keys in
1817 * sc_oob_data.loc_oob_data, starts nonce generation
Myles Watsonee96a3c2016-11-23 14:49:54 -08001818 * (to be saved in sc_oob_data.loc_oob_data.randomizer).
1819 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001820void smp_set_local_oob_keys(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1821 SMP_TRACE_DEBUG("%s", __func__);
Satya Calloji444a8da2015-03-06 10:38:22 -08001822
Myles Watson911d1ae2016-11-28 16:44:40 -08001823 memcpy(p_cb->sc_oob_data.loc_oob_data.private_key_used, p_cb->private_key,
1824 BT_OCTET32_LEN);
1825 p_cb->sc_oob_data.loc_oob_data.publ_key_used = p_cb->loc_publ_key;
1826 smp_start_nonce_generation(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001827}
1828
1829/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001830 * Function smp_set_local_oob_random_commitment
Myles Watson9ca07092016-11-28 16:41:53 -08001831 * Description Saves calculated randomizer and commitment in
1832 * sc_oob_data.loc_oob_data, passes sc_oob_data.loc_oob_data up
1833 * for safekeeping.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001834 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001835void smp_set_local_oob_random_commitment(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1836 SMP_TRACE_DEBUG("%s", __func__);
1837 memcpy(p_cb->sc_oob_data.loc_oob_data.randomizer, p_cb->rand, BT_OCTET16_LEN);
Satya Calloji444a8da2015-03-06 10:38:22 -08001838
Myles Watson911d1ae2016-11-28 16:44:40 -08001839 smp_calculate_f4(p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1840 p_cb->sc_oob_data.loc_oob_data.publ_key_used.x,
1841 p_cb->sc_oob_data.loc_oob_data.randomizer, 0,
1842 p_cb->sc_oob_data.loc_oob_data.commitment);
Satya Calloji444a8da2015-03-06 10:38:22 -08001843
Marie Janssend19e0782016-07-15 12:48:27 -07001844#if (SMP_DEBUG == TRUE)
Myles Watson911d1ae2016-11-28 16:44:40 -08001845 uint8_t* p_print = NULL;
1846 SMP_TRACE_DEBUG("local SC OOB data set:");
1847 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.addr_sent_to;
Jack He648d5132016-12-15 10:56:55 -08001848 smp_debug_print_nbyte_little_endian(p_print, "addr_sent_to",
Myles Watson911d1ae2016-11-28 16:44:40 -08001849 sizeof(tBLE_BD_ADDR));
1850 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.private_key_used;
Jack He648d5132016-12-15 10:56:55 -08001851 smp_debug_print_nbyte_little_endian(p_print, "private_key_used",
1852 BT_OCTET32_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001853 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.x;
Jack He648d5132016-12-15 10:56:55 -08001854 smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.x",
1855 BT_OCTET32_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001856 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.publ_key_used.y;
Jack He648d5132016-12-15 10:56:55 -08001857 smp_debug_print_nbyte_little_endian(p_print, "publ_key_used.y",
1858 BT_OCTET32_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001859 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.randomizer;
Jack He648d5132016-12-15 10:56:55 -08001860 smp_debug_print_nbyte_little_endian(p_print, "randomizer", BT_OCTET16_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001861 p_print = (uint8_t*)&p_cb->sc_oob_data.loc_oob_data.commitment;
Jack He648d5132016-12-15 10:56:55 -08001862 smp_debug_print_nbyte_little_endian(p_print, "commitment", BT_OCTET16_LEN);
Myles Watson911d1ae2016-11-28 16:44:40 -08001863 SMP_TRACE_DEBUG("");
Satya Calloji444a8da2015-03-06 10:38:22 -08001864#endif
1865
Myles Watson911d1ae2016-11-28 16:44:40 -08001866 /* pass created OOB data up */
1867 p_cb->cb_evt = SMP_SC_LOC_OOB_DATA_UP_EVT;
1868 smp_send_app_cback(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001869
Myles Watson911d1ae2016-11-28 16:44:40 -08001870 smp_cb_cleanup(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001871}
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001872
The Android Open Source Project5738f832012-12-12 16:00:35 -08001873/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001874 *
1875 * Function smp_link_encrypted
1876 *
Myles Watson9ca07092016-11-28 16:41:53 -08001877 * Description This function is called when link is encrypted and notified
1878 * to the slave device. Proceed to to send LTK, DIV and ER to
1879 * master if bonding the devices.
Myles Watsonee96a3c2016-11-23 14:49:54 -08001880 *
1881 *
1882 * Returns void
1883 *
1884 ******************************************************************************/
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001885void smp_link_encrypted(const RawAddress& bda, uint8_t encr_enable) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001886 tSMP_CB* p_cb = &smp_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001887
johnshamoonb2dadde2017-05-31 11:32:24 -07001888 SMP_TRACE_DEBUG("%s: encr_enable=%d", __func__, encr_enable);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001889
Jakub Pawlowskic2276b02017-06-09 16:00:25 -07001890 if (smp_cb.pairing_bda == bda) {
johnshamoonb2dadde2017-05-31 11:32:24 -07001891 /* encryption completed with STK, remember the key size now, could be
1892 * overwritten when key exchange happens */
Myles Watson911d1ae2016-11-28 16:44:40 -08001893 if (p_cb->loc_enc_size != 0 && encr_enable) {
1894 /* update the link encryption key size if a SMP pairing just performed */
1895 btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001896 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001897
Myles Watson5ce55bd2017-09-20 16:41:19 -07001898 tSMP_INT_DATA smp_int_data;
1899 smp_int_data.status = encr_enable;
1900 smp_sm_event(&smp_cb, SMP_ENCRYPTED_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001901 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001902}
Satya Calloji444a8da2015-03-06 10:38:22 -08001903
The Android Open Source Project5738f832012-12-12 16:00:35 -08001904/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001905 *
1906 * Function smp_proc_ltk_request
1907 *
1908 * Description This function is called when LTK request is received from
1909 * controller.
1910 *
1911 * Returns void
1912 *
1913 ******************************************************************************/
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001914bool smp_proc_ltk_request(const RawAddress& bda) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001915 SMP_TRACE_DEBUG("%s state = %d", __func__, smp_cb.state);
1916 bool match = false;
Nitin Arora1da48a32015-07-17 18:38:01 -07001917
Jakub Pawlowskic2276b02017-06-09 16:00:25 -07001918 if (bda == smp_cb.pairing_bda) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001919 match = true;
1920 } else {
Myles Watson911d1ae2016-11-28 16:44:40 -08001921 tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
Jakub Pawlowskic2276b02017-06-09 16:00:25 -07001922 if (p_dev_rec != NULL && p_dev_rec->ble.pseudo_addr == smp_cb.pairing_bda &&
Jakub Pawlowskib707f442017-07-03 15:39:36 -07001923 p_dev_rec->ble.pseudo_addr != RawAddress::kEmpty) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001924 match = true;
Nitin Arora1da48a32015-07-17 18:38:01 -07001925 }
Myles Watson911d1ae2016-11-28 16:44:40 -08001926 }
Nitin Arora1da48a32015-07-17 18:38:01 -07001927
Myles Watson911d1ae2016-11-28 16:44:40 -08001928 if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) {
1929 smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL);
1930 return true;
1931 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001932
Myles Watson911d1ae2016-11-28 16:44:40 -08001933 return false;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001934}
Satya Calloji444a8da2015-03-06 10:38:22 -08001935
1936/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001937 *
1938 * Function smp_process_secure_connection_long_term_key
1939 *
1940 * Description This function is called to process SC LTK.
1941 * SC LTK is calculated and used instead of STK.
1942 * Here SC LTK is saved in BLE DB.
1943 *
1944 * Returns void
1945 *
1946 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001947void smp_process_secure_connection_long_term_key(void) {
1948 tSMP_CB* p_cb = &smp_cb;
Satya Calloji444a8da2015-03-06 10:38:22 -08001949
Myles Watson911d1ae2016-11-28 16:44:40 -08001950 SMP_TRACE_DEBUG("%s", __func__);
1951 smp_save_secure_connections_long_term_key(p_cb);
Satya Calloji444a8da2015-03-06 10:38:22 -08001952
Myles Watson911d1ae2016-11-28 16:44:40 -08001953 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
1954 smp_key_distribution(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08001955}
1956
1957/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001958 *
1959 * Function smp_set_derive_link_key
1960 *
1961 * Description This function is called to set flag that indicates that
1962 * BR/EDR LK has to be derived from LTK after all keys are
1963 * distributed.
1964 *
1965 * Returns void
1966 *
1967 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001968void smp_set_derive_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
1969 SMP_TRACE_DEBUG("%s", __func__);
1970 p_cb->derive_lk = true;
1971 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_LK, false);
1972 smp_key_distribution(p_cb, NULL);
Chaojing Sune2805532015-04-22 13:40:21 -07001973}
1974
1975/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001976 *
1977 * Function smp_derive_link_key_from_long_term_key
1978 *
1979 * Description This function is called to derive BR/EDR LK from LTK.
1980 *
1981 * Returns void
1982 *
1983 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08001984void smp_derive_link_key_from_long_term_key(tSMP_CB* p_cb,
1985 tSMP_INT_DATA* p_data) {
1986 tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
Satya Calloji444a8da2015-03-06 10:38:22 -08001987
Myles Watson911d1ae2016-11-28 16:44:40 -08001988 SMP_TRACE_DEBUG("%s", __func__);
1989 if (!smp_calculate_link_key_from_long_term_key(p_cb)) {
1990 SMP_TRACE_ERROR("%s failed", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -07001991 tSMP_INT_DATA smp_int_data;
1992 smp_int_data.status = status;
1993 smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08001994 return;
1995 }
Satya Calloji444a8da2015-03-06 10:38:22 -08001996}
1997
1998/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001999 *
2000 * Function smp_br_process_link_key
2001 *
2002 * Description This function is called to process BR/EDR LK:
2003 * - to derive SMP LTK from BR/EDR LK;
johnshamoonb2dadde2017-05-31 11:32:24 -07002004 * - to save SMP LTK.
Myles Watsonee96a3c2016-11-23 14:49:54 -08002005 *
2006 * Returns void
2007 *
2008 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002009void smp_br_process_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2010 tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN;
Satya Calloji444a8da2015-03-06 10:38:22 -08002011
Myles Watson911d1ae2016-11-28 16:44:40 -08002012 SMP_TRACE_DEBUG("%s", __func__);
2013 if (!smp_calculate_long_term_key_from_link_key(p_cb)) {
johnshamoonb2dadde2017-05-31 11:32:24 -07002014 SMP_TRACE_ERROR("%s: failed", __func__);
Myles Watson5ce55bd2017-09-20 16:41:19 -07002015 tSMP_INT_DATA smp_int_data;
2016 smp_int_data.status = status;
2017 smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &smp_int_data);
Myles Watson911d1ae2016-11-28 16:44:40 -08002018 return;
2019 }
Satya Calloji444a8da2015-03-06 10:38:22 -08002020
Myles Watson911d1ae2016-11-28 16:44:40 -08002021 SMP_TRACE_DEBUG("%s: LTK derivation from LK successfully completed",
2022 __func__);
2023 smp_save_secure_connections_long_term_key(p_cb);
2024 smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
2025 smp_br_select_next_key(p_cb, NULL);
Satya Calloji444a8da2015-03-06 10:38:22 -08002026}
2027
2028/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08002029 * Function smp_key_distribution_by_transport
2030 * Description depending on the transport used at the moment calls either
2031 * smp_key_distribution(...) or smp_br_key_distribution(...).
2032 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002033void smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2034 SMP_TRACE_DEBUG("%s", __func__);
2035 if (p_cb->smp_over_br) {
2036 smp_br_select_next_key(p_cb, NULL);
2037 } else {
2038 smp_key_distribution(p_cb, NULL);
2039 }
Satya Calloji444a8da2015-03-06 10:38:22 -08002040}
2041
2042/*******************************************************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08002043 * Function smp_br_pairing_complete
Myles Watson9ca07092016-11-28 16:41:53 -08002044 * Description This function is called to send the pairing complete
2045 * callback and remove the connection if needed.
Myles Watsonee96a3c2016-11-23 14:49:54 -08002046 ******************************************************************************/
Myles Watson911d1ae2016-11-28 16:44:40 -08002047void smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
2048 SMP_TRACE_DEBUG("%s", __func__);
Satya Callojid0aa8e52015-05-06 09:24:06 -07002049
Myles Watson911d1ae2016-11-28 16:44:40 -08002050 if (p_cb->total_tx_unacked == 0) {
2051 /* process the pairing complete */
2052 smp_proc_pairing_cmpl(p_cb);
2053 }
Satya Calloji444a8da2015-03-06 10:38:22 -08002054}