1 /**
2  * @file smp.c
3  * Security Manager Protocol implementation
4  */
5 
6 /*
7  * Copyright (c) 2017-2025 Nordic Semiconductor ASA
8  * Copyright (c) 2015-2016 Intel Corporation
9  *
10  * SPDX-License-Identifier: Apache-2.0
11  */
12 
13 #include <errno.h>
14 #include <stddef.h>
15 #include <string.h>
16 
17 #include <zephyr/bluetooth/bluetooth.h>
18 #include <zephyr/bluetooth/buf.h>
19 #include <zephyr/bluetooth/conn.h>
20 #include <zephyr/bluetooth/hci.h>
21 #include <zephyr/debug/stack.h>
22 #include <zephyr/kernel.h>
23 #include <zephyr/net_buf.h>
24 #include <zephyr/sys/__assert.h>
25 #include <zephyr/sys/atomic.h>
26 #include <zephyr/sys/byteorder.h>
27 #include <zephyr/sys/check.h>
28 #include <zephyr/sys/util.h>
29 
30 
31 #include "common/bt_str.h"
32 
33 #include "crypto/bt_crypto.h"
34 
35 #include "hci_core.h"
36 #include "ecc.h"
37 #include "keys.h"
38 #include "conn_internal.h"
39 #include "l2cap_internal.h"
40 #include "smp.h"
41 
42 #define LOG_LEVEL CONFIG_BT_SMP_LOG_LEVEL
43 #include <zephyr/logging/log.h>
44 LOG_MODULE_REGISTER(bt_smp);
45 
46 #define SMP_TIMEOUT K_SECONDS(30)
47 
48 #if defined(CONFIG_BT_SIGNING)
49 #define SIGN_DIST BT_SMP_DIST_SIGN
50 #else
51 #define SIGN_DIST 0
52 #endif
53 
54 #if defined(CONFIG_BT_PRIVACY)
55 #define ID_DIST BT_SMP_DIST_ID_KEY
56 #else
57 #define ID_DIST 0
58 #endif
59 
60 #if defined(CONFIG_BT_CLASSIC)
61 #define LINK_DIST BT_SMP_DIST_LINK_KEY
62 #else
63 #define LINK_DIST 0
64 #endif
65 
66 #define RECV_KEYS (BT_SMP_DIST_ENC_KEY | BT_SMP_DIST_ID_KEY | SIGN_DIST |\
67 		   LINK_DIST)
68 #define SEND_KEYS (BT_SMP_DIST_ENC_KEY | ID_DIST | SIGN_DIST | LINK_DIST)
69 
70 #define RECV_KEYS_SC (RECV_KEYS & ~(BT_SMP_DIST_ENC_KEY))
71 #define SEND_KEYS_SC (SEND_KEYS & ~(BT_SMP_DIST_ENC_KEY))
72 
73 #define BR_RECV_KEYS_SC (RECV_KEYS & ~(LINK_DIST))
74 #define BR_SEND_KEYS_SC (SEND_KEYS & ~(LINK_DIST))
75 
76 #define BT_SMP_AUTH_MASK	0x07
77 
78 #if defined(CONFIG_BT_BONDABLE)
79 #define BT_SMP_AUTH_BONDING_FLAGS BT_SMP_AUTH_BONDING
80 #else
81 #define BT_SMP_AUTH_BONDING_FLAGS 0
82 #endif /* CONFIG_BT_BONDABLE */
83 
84 #if defined(CONFIG_BT_CLASSIC)
85 
86 #define BT_SMP_AUTH_MASK_SC	0x2f
87 #if defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
88 #define BT_SMP_AUTH_DEFAULT (BT_SMP_AUTH_BONDING_FLAGS | BT_SMP_AUTH_CT2)
89 #else
90 #define BT_SMP_AUTH_DEFAULT (BT_SMP_AUTH_BONDING_FLAGS | BT_SMP_AUTH_CT2 |\
91 			     BT_SMP_AUTH_SC)
92 #endif /* CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY */
93 
94 #else
95 
96 #define BT_SMP_AUTH_MASK_SC	0x0f
97 #if defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
98 #define BT_SMP_AUTH_DEFAULT (BT_SMP_AUTH_BONDING_FLAGS)
99 #else
100 #define BT_SMP_AUTH_DEFAULT (BT_SMP_AUTH_BONDING_FLAGS | BT_SMP_AUTH_SC)
101 #endif /* CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY */
102 
103 #endif /* CONFIG_BT_CLASSIC */
104 
105 enum pairing_method {
106 	JUST_WORKS,		/* JustWorks pairing */
107 	PASSKEY_INPUT,		/* Passkey Entry input */
108 	PASSKEY_DISPLAY,	/* Passkey Entry display */
109 	PASSKEY_CONFIRM,	/* Passkey confirm */
110 	PASSKEY_ROLE,		/* Passkey Entry depends on role */
111 	LE_SC_OOB,		/* LESC Out of Band */
112 	LEGACY_OOB,		/* Legacy Out of Band */
113 };
114 
115 enum {
116 	SMP_FLAG_CFM_DELAYED,	/* if confirm should be send when TK is valid */
117 	SMP_FLAG_ENC_PENDING,	/* if waiting for an encryption change event */
118 	SMP_FLAG_KEYS_DISTR,	/* if keys distribution phase is in progress */
119 	SMP_FLAG_PAIRING,	/* if pairing is in progress */
120 	SMP_FLAG_TIMEOUT,	/* if SMP timeout occurred */
121 	SMP_FLAG_SC,		/* if LE Secure Connections is used */
122 	SMP_FLAG_PKEY_SEND,	/* if should send Public Key when available */
123 	SMP_FLAG_DHKEY_PENDING,	/* if waiting for local DHKey */
124 	SMP_FLAG_DHKEY_GEN,     /* if generating DHKey */
125 	SMP_FLAG_DHKEY_SEND,	/* if should generate and send DHKey Check */
126 	SMP_FLAG_USER,		/* if waiting for user input */
127 	SMP_FLAG_DISPLAY,       /* if display_passkey() callback was called */
128 	SMP_FLAG_OOB_PENDING,	/* if waiting for OOB data */
129 	SMP_FLAG_BOND,		/* if bonding */
130 	SMP_FLAG_SC_DEBUG_KEY,	/* if Secure Connection are using debug key */
131 	SMP_FLAG_SEC_REQ,	/* if Security Request was sent/received */
132 	SMP_FLAG_DHCHECK_WAIT,	/* if waiting for remote DHCheck (as periph) */
133 	SMP_FLAG_DERIVE_LK,	/* if Link Key should be derived */
134 	SMP_FLAG_BR_CONNECTED,	/* if BR/EDR channel is connected */
135 	SMP_FLAG_BR_PAIR,	/* if should start BR/EDR pairing */
136 	SMP_FLAG_CT2,		/* if should use H7 for keys derivation */
137 
138 	/* Total number of flags - must be at the end */
139 	SMP_NUM_FLAGS,
140 };
141 
142 /* SMP channel specific context */
143 struct bt_smp {
144 	/* Commands that remote is allowed to send */
145 	ATOMIC_DEFINE(allowed_cmds, BT_SMP_NUM_CMDS);
146 
147 	/* Flags for SMP state machine */
148 	ATOMIC_DEFINE(flags, SMP_NUM_FLAGS);
149 
150 	/* Type of method used for pairing */
151 	uint8_t				method;
152 
153 	/* Pairing Request PDU */
154 	uint8_t				preq[7];
155 
156 	/* Pairing Response PDU */
157 	uint8_t				prsp[7];
158 
159 	/* Pairing Confirm PDU */
160 	uint8_t				pcnf[16];
161 
162 	/* Local random number */
163 	uint8_t				prnd[16];
164 
165 	/* Remote random number */
166 	uint8_t				rrnd[16];
167 
168 	/* Temporary key */
169 	uint8_t				tk[16];
170 
171 	/* Remote Public Key for LE SC */
172 	uint8_t				pkey[BT_PUB_KEY_LEN];
173 
174 	/* DHKey */
175 	uint8_t				dhkey[BT_DH_KEY_LEN];
176 
177 	/* Remote DHKey check */
178 	uint8_t				e[16];
179 
180 	/* MacKey */
181 	uint8_t				mackey[16];
182 
183 	/* LE SC passkey */
184 	uint32_t				passkey;
185 
186 	/* LE SC passkey round */
187 	uint8_t				passkey_round;
188 
189 	/* LE SC local OOB data */
190 	const struct bt_le_oob_sc_data	*oobd_local;
191 
192 	/* LE SC remote OOB data */
193 	const struct bt_le_oob_sc_data	*oobd_remote;
194 
195 	/* Local key distribution */
196 	uint8_t				local_dist;
197 
198 	/* Remote key distribution */
199 	uint8_t				remote_dist;
200 
201 	/* The channel this context is associated with.
202 	 * This marks the beginning of the part of the structure that will not
203 	 * be memset to zero in init.
204 	 */
205 	struct bt_l2cap_le_chan		chan;
206 
207 	/* Delayed work for timeout handling */
208 	struct k_work_delayable		work;
209 
210 	/* Used Bluetooth authentication callbacks. */
211 	atomic_ptr_t			auth_cb;
212 
213 	/* Bondable flag */
214 	atomic_t			bondable;
215 };
216 
217 static unsigned int fixed_passkey = BT_PASSKEY_INVALID;
218 
219 #define DISPLAY_FIXED(smp) (IS_ENABLED(CONFIG_BT_FIXED_PASSKEY) && \
220 			    fixed_passkey != BT_PASSKEY_INVALID && \
221 			    (smp)->method == PASSKEY_DISPLAY)
222 
223 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
224 /* based on table 2.8 Core Spec 2.3.5.1 Vol. 3 Part H */
225 static const uint8_t gen_method_legacy[5 /* remote */][5 /* local */] = {
226 	{ JUST_WORKS, JUST_WORKS, PASSKEY_INPUT, JUST_WORKS, PASSKEY_INPUT },
227 	{ JUST_WORKS, JUST_WORKS, PASSKEY_INPUT, JUST_WORKS, PASSKEY_INPUT },
228 	{ PASSKEY_DISPLAY, PASSKEY_DISPLAY, PASSKEY_INPUT, JUST_WORKS,
229 	  PASSKEY_DISPLAY },
230 	{ JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS },
231 	{ PASSKEY_DISPLAY, PASSKEY_DISPLAY, PASSKEY_INPUT, JUST_WORKS,
232 	  PASSKEY_ROLE },
233 };
234 #endif /* CONFIG_BT_SMP_SC_PAIR_ONLY */
235 
236 #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
237 /* based on table 2.8 Core Spec 2.3.5.1 Vol. 3 Part H */
238 static const uint8_t gen_method_sc[5 /* remote */][5 /* local */] = {
239 	{ JUST_WORKS, JUST_WORKS, PASSKEY_INPUT, JUST_WORKS, PASSKEY_INPUT },
240 	{ JUST_WORKS, PASSKEY_CONFIRM, PASSKEY_INPUT, JUST_WORKS,
241 	  PASSKEY_CONFIRM },
242 	{ PASSKEY_DISPLAY, PASSKEY_DISPLAY, PASSKEY_INPUT, JUST_WORKS,
243 	  PASSKEY_DISPLAY },
244 	{ JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS },
245 	{ PASSKEY_DISPLAY, PASSKEY_CONFIRM, PASSKEY_INPUT, JUST_WORKS,
246 	  PASSKEY_CONFIRM },
247 };
248 #endif /* !CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY */
249 
250 #if defined(CONFIG_BT_CLASSIC)
251 /* SMP over BR/EDR channel specific context */
252 struct bt_smp_br {
253 	/* Commands that remote is allowed to send */
254 	ATOMIC_DEFINE(allowed_cmds, BT_SMP_NUM_CMDS);
255 
256 	/* Flags for SMP state machine */
257 	ATOMIC_DEFINE(flags, SMP_NUM_FLAGS);
258 
259 	/* Local key distribution */
260 	uint8_t			local_dist;
261 
262 	/* Remote key distribution */
263 	uint8_t			remote_dist;
264 
265 	/* Encryption Key Size used for connection */
266 	uint8_t 			enc_key_size;
267 
268 	/* The channel this context is associated with.
269 	 * This marks the beginning of the part of the structure that will not
270 	 * be memset to zero in init.
271 	 */
272 	struct bt_l2cap_br_chan	chan;
273 
274 	/* Delayed work for timeout handling */
275 	struct k_work_delayable	work;
276 };
277 
278 static struct bt_smp_br bt_smp_br_pool[CONFIG_BT_MAX_CONN];
279 #endif /* CONFIG_BT_CLASSIC */
280 
281 static struct bt_smp bt_smp_pool[CONFIG_BT_MAX_CONN];
282 static bool bondable = IS_ENABLED(CONFIG_BT_BONDABLE);
283 static bool sc_oobd_present;
284 static bool legacy_oobd_present;
285 static bool sc_supported;
286 static const uint8_t *sc_public_key;
287 
288 static void bt_smp_pkey_ready(const uint8_t *pkey);
289 static struct {
290 	struct k_mutex lock;
291 	struct k_condvar condvar;
292 	struct bt_pub_key_cb cb;
293 } pub_key_gen = {
294 	.lock = Z_MUTEX_INITIALIZER(pub_key_gen.lock),
295 	.condvar = Z_CONDVAR_INITIALIZER(pub_key_gen.condvar),
296 	.cb = {
297 		.func = bt_smp_pkey_ready,
298 	},
299 };
300 
301 /* Pointer to internal data is used to mark that callbacks of given SMP channel are not initialized.
302  * Value of NULL represents no authentication capabilities and cannot be used for that purpose.
303  */
304 #define BT_SMP_AUTH_CB_UNINITIALIZED	((atomic_ptr_val_t)bt_smp_pool)
305 
306 /* Value used to mark that per-connection bondable flag is not initialized.
307  * Value false/true represent if flag is cleared or set and cannot be used for that purpose.
308  */
309 #define BT_SMP_BONDABLE_UNINITIALIZED	((atomic_val_t)-1)
310 
le_sc_supported(void)311 static bool le_sc_supported(void)
312 {
313 	if (IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
314 		return false;
315 	}
316 
317 	return IS_ENABLED(CONFIG_BT_ECC);
318 }
319 
latch_auth_cb(struct bt_smp * smp)320 static const struct bt_conn_auth_cb *latch_auth_cb(struct bt_smp *smp)
321 {
322 	(void)atomic_ptr_cas(&smp->auth_cb, BT_SMP_AUTH_CB_UNINITIALIZED,
323 			     (atomic_ptr_val_t)bt_auth);
324 
325 	return atomic_ptr_get(&smp->auth_cb);
326 }
327 
latch_bondable(struct bt_smp * smp)328 static bool latch_bondable(struct bt_smp *smp)
329 {
330 	(void)atomic_cas(&smp->bondable, BT_SMP_BONDABLE_UNINITIALIZED, (atomic_val_t)bondable);
331 
332 	return atomic_get(&smp->bondable);
333 }
334 
get_io_capa(struct bt_smp * smp)335 static uint8_t get_io_capa(struct bt_smp *smp)
336 {
337 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
338 
339 	if (!smp_auth_cb) {
340 		goto no_callbacks;
341 	}
342 
343 	/* Passkey Confirmation is valid only for LE SC */
344 	if (smp_auth_cb->passkey_display && smp_auth_cb->passkey_entry &&
345 	    (smp_auth_cb->passkey_confirm || !sc_supported)) {
346 		return BT_SMP_IO_KEYBOARD_DISPLAY;
347 	}
348 
349 	/* DisplayYesNo is useful only for LE SC */
350 	if (sc_supported && smp_auth_cb->passkey_display &&
351 	    smp_auth_cb->passkey_confirm) {
352 		return BT_SMP_IO_DISPLAY_YESNO;
353 	}
354 
355 	if (smp_auth_cb->passkey_entry) {
356 		if (IS_ENABLED(CONFIG_BT_FIXED_PASSKEY) &&
357 		    fixed_passkey != BT_PASSKEY_INVALID) {
358 			return BT_SMP_IO_KEYBOARD_DISPLAY;
359 		} else {
360 			return BT_SMP_IO_KEYBOARD_ONLY;
361 		}
362 	}
363 
364 	if (smp_auth_cb->passkey_display) {
365 		return BT_SMP_IO_DISPLAY_ONLY;
366 	}
367 
368 no_callbacks:
369 	if (IS_ENABLED(CONFIG_BT_FIXED_PASSKEY) &&
370 	    fixed_passkey != BT_PASSKEY_INVALID) {
371 		return BT_SMP_IO_DISPLAY_ONLY;
372 	} else {
373 		return BT_SMP_IO_NO_INPUT_OUTPUT;
374 	}
375 }
376 
377 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
378 static uint8_t legacy_get_pair_method(struct bt_smp *smp, uint8_t remote_io);
379 #endif
380 
smp_keys_check(struct bt_conn * conn)381 static bool smp_keys_check(struct bt_conn *conn)
382 {
383 	if (atomic_test_bit(conn->flags, BT_CONN_FORCE_PAIR)) {
384 		return false;
385 	}
386 
387 	if (!conn->le.keys) {
388 		conn->le.keys = bt_keys_find(BT_KEYS_LTK_P256,
389 						     conn->id, &conn->le.dst);
390 		if (!conn->le.keys) {
391 			conn->le.keys = bt_keys_find(BT_KEYS_LTK,
392 						     conn->id,
393 						     &conn->le.dst);
394 		}
395 	}
396 
397 	if (!conn->le.keys ||
398 	    !(conn->le.keys->keys & (BT_KEYS_LTK | BT_KEYS_LTK_P256))) {
399 		return false;
400 	}
401 
402 	if (conn->required_sec_level >= BT_SECURITY_L3 &&
403 	    !(conn->le.keys->flags & BT_KEYS_AUTHENTICATED)) {
404 		return false;
405 	}
406 
407 	if (conn->required_sec_level >= BT_SECURITY_L4 &&
408 	    !((conn->le.keys->flags & BT_KEYS_AUTHENTICATED) &&
409 	      (conn->le.keys->keys & BT_KEYS_LTK_P256) &&
410 	      (conn->le.keys->enc_size == BT_SMP_MAX_ENC_KEY_SIZE))) {
411 		return false;
412 	}
413 
414 	return true;
415 }
416 
get_pair_method(struct bt_smp * smp,uint8_t remote_io)417 static uint8_t get_pair_method(struct bt_smp *smp, uint8_t remote_io)
418 {
419 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
420 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
421 		return legacy_get_pair_method(smp, remote_io);
422 	}
423 #endif
424 
425 #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
426 	struct bt_smp_pairing *req, *rsp;
427 
428 	req = (struct bt_smp_pairing *)&smp->preq[1];
429 	rsp = (struct bt_smp_pairing *)&smp->prsp[1];
430 
431 	if ((req->auth_req & rsp->auth_req) & BT_SMP_AUTH_SC) {
432 		/* if one side has OOB data use OOB */
433 		if ((req->oob_flag | rsp->oob_flag) & BT_SMP_OOB_DATA_MASK) {
434 			return LE_SC_OOB;
435 		}
436 	}
437 
438 	if (remote_io > BT_SMP_IO_KEYBOARD_DISPLAY) {
439 		return JUST_WORKS;
440 	}
441 
442 	/* if none side requires MITM use JustWorks */
443 	if (!((req->auth_req | rsp->auth_req) & BT_SMP_AUTH_MITM)) {
444 		return JUST_WORKS;
445 	}
446 
447 	return gen_method_sc[remote_io][get_io_capa(smp)];
448 #else
449 	return JUST_WORKS;
450 #endif
451 }
452 
security_err_get(uint8_t smp_err)453 static enum bt_security_err security_err_get(uint8_t smp_err)
454 {
455 	switch (smp_err) {
456 	case BT_SMP_ERR_PASSKEY_ENTRY_FAILED:
457 	case BT_SMP_ERR_DHKEY_CHECK_FAILED:
458 	case BT_SMP_ERR_NUMERIC_COMP_FAILED:
459 	case BT_SMP_ERR_CONFIRM_FAILED:
460 		return BT_SECURITY_ERR_AUTH_FAIL;
461 	case BT_SMP_ERR_OOB_NOT_AVAIL:
462 		return BT_SECURITY_ERR_OOB_NOT_AVAILABLE;
463 	case BT_SMP_ERR_AUTH_REQUIREMENTS:
464 	case BT_SMP_ERR_ENC_KEY_SIZE:
465 		return BT_SECURITY_ERR_AUTH_REQUIREMENT;
466 	case BT_SMP_ERR_PAIRING_NOTSUPP:
467 	case BT_SMP_ERR_CMD_NOTSUPP:
468 		return BT_SECURITY_ERR_PAIR_NOT_SUPPORTED;
469 	case BT_SMP_ERR_REPEATED_ATTEMPTS:
470 	case BT_SMP_ERR_BREDR_PAIRING_IN_PROGRESS:
471 	case BT_SMP_ERR_CROSS_TRANSP_NOT_ALLOWED:
472 		return BT_SECURITY_ERR_PAIR_NOT_ALLOWED;
473 	case BT_SMP_ERR_INVALID_PARAMS:
474 		return BT_SECURITY_ERR_INVALID_PARAM;
475 	case BT_SMP_ERR_KEY_REJECTED:
476 		return BT_SECURITY_ERR_KEY_REJECTED;
477 	case BT_SMP_ERR_UNSPECIFIED:
478 	default:
479 		return BT_SECURITY_ERR_UNSPECIFIED;
480 	}
481 }
482 
483 #if defined(CONFIG_BT_SECURITY_ERR_TO_STR)
bt_security_err_to_str(enum bt_security_err err)484 const char *bt_security_err_to_str(enum bt_security_err err)
485 {
486 	#define SEC_ERR(err) [err] = #err
487 
488 	const char * const mapping_table[] = {
489 		SEC_ERR(BT_SECURITY_ERR_SUCCESS),
490 		SEC_ERR(BT_SECURITY_ERR_AUTH_FAIL),
491 		SEC_ERR(BT_SECURITY_ERR_PIN_OR_KEY_MISSING),
492 		SEC_ERR(BT_SECURITY_ERR_OOB_NOT_AVAILABLE),
493 		SEC_ERR(BT_SECURITY_ERR_AUTH_REQUIREMENT),
494 		SEC_ERR(BT_SECURITY_ERR_PAIR_NOT_SUPPORTED),
495 		SEC_ERR(BT_SECURITY_ERR_PAIR_NOT_ALLOWED),
496 		SEC_ERR(BT_SECURITY_ERR_INVALID_PARAM),
497 		SEC_ERR(BT_SECURITY_ERR_KEY_REJECTED),
498 		SEC_ERR(BT_SECURITY_ERR_UNSPECIFIED),
499 	};
500 
501 	if (err < ARRAY_SIZE(mapping_table) && mapping_table[err]) {
502 		return mapping_table[err];
503 	} else {
504 		return "(unknown)";
505 	}
506 
507 	#undef SEC_ERR
508 }
509 #endif /* CONFIG_BT_SECURITY_ERR_TO_STR */
510 
smp_err_get(enum bt_security_err auth_err)511 static uint8_t smp_err_get(enum bt_security_err auth_err)
512 {
513 	switch (auth_err) {
514 	case BT_SECURITY_ERR_OOB_NOT_AVAILABLE:
515 		return BT_SMP_ERR_OOB_NOT_AVAIL;
516 
517 	case BT_SECURITY_ERR_AUTH_FAIL:
518 	case BT_SECURITY_ERR_AUTH_REQUIREMENT:
519 		return BT_SMP_ERR_AUTH_REQUIREMENTS;
520 
521 	case BT_SECURITY_ERR_PAIR_NOT_SUPPORTED:
522 		return BT_SMP_ERR_PAIRING_NOTSUPP;
523 
524 	case BT_SECURITY_ERR_INVALID_PARAM:
525 		return BT_SMP_ERR_INVALID_PARAMS;
526 
527 	case BT_SECURITY_ERR_PIN_OR_KEY_MISSING:
528 	case BT_SECURITY_ERR_PAIR_NOT_ALLOWED:
529 	case BT_SECURITY_ERR_UNSPECIFIED:
530 		return BT_SMP_ERR_UNSPECIFIED;
531 	default:
532 		return 0;
533 	}
534 }
535 
536 #if defined(CONFIG_BT_SMP_ERR_TO_STR)
bt_smp_err_to_str(uint8_t smp_err)537 const char *bt_smp_err_to_str(uint8_t smp_err)
538 {
539 	#define SMP_ERR(err) [err] = #err
540 
541 	const char * const mapping_table[] = {
542 		SMP_ERR(BT_SMP_ERR_SUCCESS),
543 		SMP_ERR(BT_SMP_ERR_PASSKEY_ENTRY_FAILED),
544 		SMP_ERR(BT_SMP_ERR_OOB_NOT_AVAIL),
545 		SMP_ERR(BT_SMP_ERR_AUTH_REQUIREMENTS),
546 		SMP_ERR(BT_SMP_ERR_CONFIRM_FAILED),
547 		SMP_ERR(BT_SMP_ERR_PAIRING_NOTSUPP),
548 		SMP_ERR(BT_SMP_ERR_ENC_KEY_SIZE),
549 		SMP_ERR(BT_SMP_ERR_CMD_NOTSUPP),
550 		SMP_ERR(BT_SMP_ERR_UNSPECIFIED),
551 		SMP_ERR(BT_SMP_ERR_REPEATED_ATTEMPTS),
552 		SMP_ERR(BT_SMP_ERR_INVALID_PARAMS),
553 		SMP_ERR(BT_SMP_ERR_DHKEY_CHECK_FAILED),
554 		SMP_ERR(BT_SMP_ERR_NUMERIC_COMP_FAILED),
555 		SMP_ERR(BT_SMP_ERR_BREDR_PAIRING_IN_PROGRESS),
556 		SMP_ERR(BT_SMP_ERR_CROSS_TRANSP_NOT_ALLOWED),
557 		SMP_ERR(BT_SMP_ERR_KEY_REJECTED),
558 	};
559 
560 	if (smp_err < ARRAY_SIZE(mapping_table) && mapping_table[smp_err]) {
561 		return mapping_table[smp_err];
562 	} else {
563 		return "(unknown)";
564 	}
565 
566 	#undef SMP_ERR
567 }
568 #endif /* CONFIG_BT_SMP_ERR_TO_STR */
569 
smp_create_pdu(struct bt_smp * smp,uint8_t op,size_t len)570 static struct net_buf *smp_create_pdu(struct bt_smp *smp, uint8_t op, size_t len)
571 {
572 	struct bt_smp_hdr *hdr;
573 	struct net_buf *buf;
574 	k_timeout_t timeout;
575 
576 	/* Don't if session had already timed out */
577 	if (atomic_test_bit(smp->flags, SMP_FLAG_TIMEOUT)) {
578 		timeout = K_NO_WAIT;
579 	} else {
580 		timeout = SMP_TIMEOUT;
581 	}
582 
583 	/* Use smaller timeout if returning an error since that could be
584 	 * caused by lack of buffers.
585 	 */
586 	buf = bt_l2cap_create_pdu_timeout(NULL, 0, timeout);
587 	if (!buf) {
588 		/* If it was not possible to allocate a buffer within the
589 		 * timeout marked it as timed out.
590 		 */
591 		atomic_set_bit(smp->flags, SMP_FLAG_TIMEOUT);
592 		return NULL;
593 	}
594 
595 	hdr = net_buf_add(buf, sizeof(*hdr));
596 	hdr->code = op;
597 
598 	return buf;
599 }
600 
get_encryption_key_size(struct bt_smp * smp)601 static uint8_t get_encryption_key_size(struct bt_smp *smp)
602 {
603 	struct bt_smp_pairing *req, *rsp;
604 
605 	req = (struct bt_smp_pairing *)&smp->preq[1];
606 	rsp = (struct bt_smp_pairing *)&smp->prsp[1];
607 
608 	/*
609 	 * The smaller value of the initiating and responding devices maximum
610 	 * encryption key length parameters shall be used as the encryption key
611 	 * size.
612 	 */
613 	return MIN(req->max_key_size, rsp->max_key_size);
614 }
615 
616 /* Check that if a new pairing procedure with an existing bond will not lower
617  * the established security level of the bond.
618  */
update_keys_check(struct bt_smp * smp,struct bt_keys * keys)619 static bool update_keys_check(struct bt_smp *smp, struct bt_keys *keys)
620 {
621 	if (IS_ENABLED(CONFIG_BT_SMP_DISABLE_LEGACY_JW_PASSKEY) &&
622 	    !atomic_test_bit(smp->flags, SMP_FLAG_SC) &&
623 	    smp->method != LEGACY_OOB) {
624 		return false;
625 	}
626 
627 	if (IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) &&
628 	    smp->method != LEGACY_OOB) {
629 		return false;
630 	}
631 
632 	if (!keys ||
633 	    !(keys->keys & (BT_KEYS_LTK_P256 | BT_KEYS_LTK))) {
634 		return true;
635 	}
636 
637 	if (keys->enc_size > get_encryption_key_size(smp)) {
638 		return false;
639 	}
640 
641 	if ((keys->keys & BT_KEYS_LTK_P256) &&
642 	    !atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
643 		return false;
644 	}
645 
646 	if ((keys->flags & BT_KEYS_AUTHENTICATED) &&
647 	     smp->method == JUST_WORKS) {
648 		return false;
649 	}
650 
651 	if (!IS_ENABLED(CONFIG_BT_SMP_ALLOW_UNAUTH_OVERWRITE) &&
652 	    (!(keys->flags & BT_KEYS_AUTHENTICATED)
653 	     && smp->method == JUST_WORKS)) {
654 		if (!IS_ENABLED(CONFIG_BT_ID_ALLOW_UNAUTH_OVERWRITE) ||
655 		    (keys->id == smp->chan.chan.conn->id)) {
656 			return false;
657 		}
658 	}
659 
660 	return true;
661 }
662 
663 #ifndef CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY
update_debug_keys_check(struct bt_smp * smp)664 static bool update_debug_keys_check(struct bt_smp *smp)
665 {
666 	struct bt_conn *conn = smp->chan.chan.conn;
667 
668 	if (!conn->le.keys) {
669 		conn->le.keys = bt_keys_get_addr(conn->id, &conn->le.dst);
670 	}
671 
672 	if (!conn->le.keys ||
673 	    !(conn->le.keys->keys & (BT_KEYS_LTK_P256 | BT_KEYS_LTK))) {
674 		return true;
675 	}
676 
677 	if (conn->le.keys->flags & BT_KEYS_DEBUG) {
678 		return true;
679 	}
680 
681 	return false;
682 }
683 #endif /* CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY */
684 
685 #if defined(CONFIG_BT_PRIVACY) || defined(CONFIG_BT_SIGNING) || \
686 	!defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
687 /* For TX callbacks */
688 static void smp_pairing_complete(struct bt_smp *smp, uint8_t status);
689 #if defined(CONFIG_BT_CLASSIC)
690 static void smp_pairing_br_complete(struct bt_smp_br *smp, uint8_t status);
691 #endif
692 
smp_check_complete(struct bt_conn * conn,uint8_t dist_complete)693 static void smp_check_complete(struct bt_conn *conn, uint8_t dist_complete)
694 {
695 	struct bt_l2cap_chan *chan;
696 
697 	if (conn->type == BT_CONN_TYPE_LE) {
698 		struct bt_smp *smp;
699 
700 		chan = bt_l2cap_le_lookup_tx_cid(conn, BT_L2CAP_CID_SMP);
701 		__ASSERT(chan, "No SMP channel found");
702 
703 		smp = CONTAINER_OF(chan, struct bt_smp, chan.chan);
704 		smp->local_dist &= ~dist_complete;
705 
706 		/* if all keys were distributed, pairing is done */
707 		if (!smp->local_dist && !smp->remote_dist) {
708 			smp_pairing_complete(smp, 0);
709 		}
710 
711 		return;
712 	}
713 
714 #if defined(CONFIG_BT_CLASSIC)
715 	if (conn->type == BT_CONN_TYPE_BR) {
716 		struct bt_smp_br *smp;
717 
718 		chan = bt_l2cap_br_lookup_tx_cid(conn, BT_L2CAP_CID_BR_SMP);
719 		__ASSERT(chan, "No SMP channel found");
720 
721 		smp = CONTAINER_OF(chan, struct bt_smp_br, chan.chan);
722 		smp->local_dist &= ~dist_complete;
723 
724 		/* if all keys were distributed, pairing is done */
725 		if (!smp->local_dist && !smp->remote_dist) {
726 			smp_pairing_br_complete(smp, 0);
727 		}
728 	}
729 #endif
730 }
731 #endif
732 
733 #if defined(CONFIG_BT_PRIVACY)
smp_id_sent(struct bt_conn * conn,void * user_data,int err)734 static void smp_id_sent(struct bt_conn *conn, void *user_data, int err)
735 {
736 	if (!err) {
737 		smp_check_complete(conn, BT_SMP_DIST_ID_KEY);
738 	}
739 }
740 #endif /* CONFIG_BT_PRIVACY */
741 
742 #if defined(CONFIG_BT_SIGNING)
smp_sign_info_sent(struct bt_conn * conn,void * user_data,int err)743 static void smp_sign_info_sent(struct bt_conn *conn, void *user_data, int err)
744 {
745 	if (!err) {
746 		smp_check_complete(conn, BT_SMP_DIST_SIGN);
747 	}
748 }
749 #endif /* CONFIG_BT_SIGNING */
750 
751 #if defined(CONFIG_BT_CLASSIC)
sc_derive_link_key(struct bt_smp * smp)752 static void sc_derive_link_key(struct bt_smp *smp)
753 {
754 	/* constants as specified in Core Spec Vol.3 Part H 2.4.2.4 */
755 	static const uint8_t lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
756 	struct bt_conn *conn = smp->chan.chan.conn;
757 	struct bt_keys_link_key *link_key;
758 	uint8_t ilk[16];
759 
760 	LOG_DBG("");
761 
762 	/* TODO handle errors? */
763 
764 	/*
765 	 * At this point remote device identity is known so we can use
766 	 * destination address here
767 	 */
768 	link_key = bt_keys_get_link_key(&conn->le.dst.a);
769 	if (!link_key) {
770 		return;
771 	}
772 
773 	if (atomic_test_bit(smp->flags, SMP_FLAG_CT2)) {
774 		/* constants as specified in Core Spec Vol.3 Part H 2.4.2.4 */
775 		static const uint8_t salt[16] = { 0x31, 0x70, 0x6d, 0x74,
776 					       0x00, 0x00, 0x00, 0x00,
777 					       0x00, 0x00, 0x00, 0x00,
778 					       0x00, 0x00, 0x00, 0x00 };
779 
780 		if (bt_crypto_h7(salt, conn->le.keys->ltk.val, ilk)) {
781 			bt_keys_link_key_clear(link_key);
782 			return;
783 		}
784 	} else {
785 		/* constants as specified in Core Spec Vol.3 Part H 2.4.2.4 */
786 		static const uint8_t tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
787 
788 		if (bt_crypto_h6(conn->le.keys->ltk.val, tmp1, ilk)) {
789 			bt_keys_link_key_clear(link_key);
790 			return;
791 		}
792 	}
793 
794 	if (bt_crypto_h6(ilk, lebr, link_key->val)) {
795 		bt_keys_link_key_clear(link_key);
796 	}
797 
798 	link_key->flags |= BT_LINK_KEY_SC;
799 
800 	if (conn->le.keys->flags & BT_KEYS_AUTHENTICATED) {
801 		link_key->flags |= BT_LINK_KEY_AUTHENTICATED;
802 	} else {
803 		link_key->flags &= ~BT_LINK_KEY_AUTHENTICATED;
804 	}
805 }
806 
smp_br_reset(struct bt_smp_br * smp)807 static void smp_br_reset(struct bt_smp_br *smp)
808 {
809 	/* Clear flags first in case canceling of timeout fails. The SMP context
810 	 * shall be marked as timed out in that case.
811 	 */
812 	atomic_set(smp->flags, 0);
813 
814 	/* If canceling fails the timeout handler will set the timeout flag and
815 	 * mark the it as timed out. No new pairing procedures shall be started
816 	 * on this connection if that happens.
817 	 */
818 	(void)k_work_cancel_delayable(&smp->work);
819 
820 	atomic_set(smp->allowed_cmds, 0);
821 
822 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_REQ);
823 }
824 
smp_pairing_br_complete(struct bt_smp_br * smp,uint8_t status)825 static void smp_pairing_br_complete(struct bt_smp_br *smp, uint8_t status)
826 {
827 	struct bt_conn *conn = smp->chan.chan.conn;
828 	struct bt_keys *keys;
829 	bt_addr_le_t addr;
830 
831 	LOG_DBG("status 0x%x", status);
832 
833 	/* For dualmode devices LE address is same as BR/EDR address
834 	 * and is of public type.
835 	 */
836 	bt_addr_copy(&addr.a, &conn->br.dst);
837 	addr.type = BT_ADDR_LE_PUBLIC;
838 	keys = bt_keys_find_addr(conn->id, &addr);
839 
840 	if (status) {
841 		struct bt_conn_auth_info_cb *listener, *next;
842 
843 		if (keys) {
844 			bt_keys_clear(keys);
845 		}
846 
847 		SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&bt_auth_info_cbs, listener,
848 						  next, node) {
849 			if (listener->pairing_failed) {
850 				listener->pairing_failed(smp->chan.chan.conn,
851 							 security_err_get(status));
852 			}
853 		}
854 	} else {
855 		bool bond_flag = atomic_test_bit(smp->flags, SMP_FLAG_BOND);
856 		struct bt_conn_auth_info_cb *listener, *next;
857 
858 		if (bond_flag && keys) {
859 			bt_keys_store(keys);
860 		}
861 
862 		SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&bt_auth_info_cbs, listener,
863 						  next, node) {
864 			if (listener->pairing_complete) {
865 				listener->pairing_complete(smp->chan.chan.conn,
866 							   bond_flag);
867 			}
868 		}
869 	}
870 
871 	smp_br_reset(smp);
872 }
873 
smp_br_timeout(struct k_work * work)874 static void smp_br_timeout(struct k_work *work)
875 {
876 	struct k_work_delayable *dwork = k_work_delayable_from_work(work);
877 	struct bt_smp_br *smp = CONTAINER_OF(dwork, struct bt_smp_br, work);
878 
879 	LOG_ERR("SMP Timeout");
880 
881 	smp_pairing_br_complete(smp, BT_SMP_ERR_UNSPECIFIED);
882 	atomic_set_bit(smp->flags, SMP_FLAG_TIMEOUT);
883 }
884 
smp_br_send(struct bt_smp_br * smp,struct net_buf * buf,bt_conn_tx_cb_t cb)885 static void smp_br_send(struct bt_smp_br *smp, struct net_buf *buf,
886 			bt_conn_tx_cb_t cb)
887 {
888 	int err = bt_l2cap_br_send_cb(smp->chan.chan.conn, BT_L2CAP_CID_BR_SMP, buf, cb, NULL);
889 
890 	if (err) {
891 		if (err == -ENOBUFS) {
892 			LOG_ERR("Ran out of TX buffers or contexts.");
893 		}
894 
895 		net_buf_unref(buf);
896 		return;
897 	}
898 
899 	k_work_reschedule(&smp->work, SMP_TIMEOUT);
900 }
901 
bt_smp_br_connected(struct bt_l2cap_chan * chan)902 static void bt_smp_br_connected(struct bt_l2cap_chan *chan)
903 {
904 	struct bt_smp_br *smp = CONTAINER_OF(chan, struct bt_smp_br, chan.chan);
905 
906 	LOG_DBG("chan %p cid 0x%04x", chan,
907 		CONTAINER_OF(chan, struct bt_l2cap_br_chan, chan)->tx.cid);
908 
909 	atomic_set_bit(smp->flags, SMP_FLAG_BR_CONNECTED);
910 
911 	/*
912 	 * if this flag is set it means pairing was requested before channel
913 	 * was connected
914 	 */
915 	if (atomic_test_bit(smp->flags, SMP_FLAG_BR_PAIR)) {
916 		bt_smp_br_send_pairing_req(chan->conn);
917 	}
918 }
919 
bt_smp_br_disconnected(struct bt_l2cap_chan * chan)920 static void bt_smp_br_disconnected(struct bt_l2cap_chan *chan)
921 {
922 	struct bt_smp_br *smp = CONTAINER_OF(chan, struct bt_smp_br, chan.chan);
923 
924 	LOG_DBG("chan %p cid 0x%04x", chan,
925 		CONTAINER_OF(chan, struct bt_l2cap_br_chan, chan)->tx.cid);
926 
927 	/* Channel disconnected callback is always called from a work handler
928 	 * so canceling of the timeout work should always succeed.
929 	 */
930 	(void)k_work_cancel_delayable(&smp->work);
931 
932 	(void)memset(smp, 0, sizeof(*smp));
933 }
934 
smp_br_init(struct bt_smp_br * smp)935 static void smp_br_init(struct bt_smp_br *smp)
936 {
937 	/* Initialize SMP context excluding L2CAP channel context and anything
938 	 * else declared after.
939 	 */
940 	(void)memset(smp, 0, offsetof(struct bt_smp_br, chan));
941 
942 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_FAIL);
943 }
944 
smp_br_derive_ltk(struct bt_smp_br * smp)945 static void smp_br_derive_ltk(struct bt_smp_br *smp)
946 {
947 	/* constants as specified in Core Spec Vol.3 Part H 2.4.2.5 */
948 	static const uint8_t brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
949 	struct bt_conn *conn = smp->chan.chan.conn;
950 	struct bt_keys_link_key *link_key = conn->br.link_key;
951 	struct bt_keys *keys;
952 	bt_addr_le_t addr;
953 	uint8_t ilk[16];
954 
955 	LOG_DBG("");
956 
957 	if (!link_key) {
958 		return;
959 	}
960 
961 	if (IS_ENABLED(CONFIG_BT_SMP_FORCE_BREDR) &&
962 	    conn->encrypt != BT_HCI_ENCRYPTION_ON_BR_AES_CCM) {
963 		LOG_WRN("Using P192 Link Key for P256 LTK derivation");
964 	}
965 
966 	/*
967 	 * For dualmode devices LE address is same as BR/EDR address and is of
968 	 * public type.
969 	 */
970 	bt_addr_copy(&addr.a, &conn->br.dst);
971 	addr.type = BT_ADDR_LE_PUBLIC;
972 
973 	keys = bt_keys_get_type(BT_KEYS_LTK_P256, conn->id, &addr);
974 	if (!keys) {
975 		LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&addr));
976 		return;
977 	}
978 
979 	if (atomic_test_bit(smp->flags, SMP_FLAG_CT2)) {
980 		/* constants as specified in Core Spec Vol.3 Part H 2.4.2.5 */
981 		static const uint8_t salt[16] = { 0x32, 0x70, 0x6d, 0x74,
982 					       0x00, 0x00, 0x00, 0x00,
983 					       0x00, 0x00, 0x00, 0x00,
984 					       0x00, 0x00, 0x00, 0x00 };
985 
986 		if (bt_crypto_h7(salt, link_key->val, ilk)) {
987 			bt_keys_link_key_clear(link_key);
988 			return;
989 		}
990 	} else {
991 		/* constants as specified in Core Spec Vol.3 Part H 2.4.2.5 */
992 		static const uint8_t tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
993 
994 		if (bt_crypto_h6(link_key->val, tmp2, ilk)) {
995 			bt_keys_clear(keys);
996 			return;
997 		}
998 	}
999 
1000 	if (bt_crypto_h6(ilk, brle, keys->ltk.val)) {
1001 		bt_keys_clear(keys);
1002 		return;
1003 	}
1004 
1005 	(void)memset(keys->ltk.ediv, 0, sizeof(keys->ltk.ediv));
1006 	(void)memset(keys->ltk.rand, 0, sizeof(keys->ltk.rand));
1007 	keys->enc_size = smp->enc_key_size;
1008 
1009 	if (link_key->flags & BT_LINK_KEY_AUTHENTICATED) {
1010 		keys->flags |= BT_KEYS_AUTHENTICATED;
1011 	} else {
1012 		keys->flags &= ~BT_KEYS_AUTHENTICATED;
1013 	}
1014 
1015 	LOG_DBG("LTK derived from LinkKey");
1016 }
1017 
smp_br_create_pdu(struct bt_smp_br * smp,uint8_t op,size_t len)1018 static struct net_buf *smp_br_create_pdu(struct bt_smp_br *smp, uint8_t op,
1019 					 size_t len)
1020 {
1021 	struct bt_smp_hdr *hdr;
1022 	struct net_buf *buf;
1023 	k_timeout_t timeout;
1024 
1025 	/* Don't if session had already timed out */
1026 	if (atomic_test_bit(smp->flags, SMP_FLAG_TIMEOUT)) {
1027 		timeout = K_NO_WAIT;
1028 	} else {
1029 		timeout = SMP_TIMEOUT;
1030 	}
1031 
1032 	/* Use smaller timeout if returning an error since that could be
1033 	 * caused by lack of buffers.
1034 	 */
1035 	buf = bt_l2cap_create_pdu_timeout(NULL, 0, timeout);
1036 	if (!buf) {
1037 		/* If it was not possible to allocate a buffer within the
1038 		 * timeout marked it as timed out.
1039 		 */
1040 		atomic_set_bit(smp->flags, SMP_FLAG_TIMEOUT);
1041 		return NULL;
1042 	}
1043 
1044 	hdr = net_buf_add(buf, sizeof(*hdr));
1045 	hdr->code = op;
1046 
1047 	return buf;
1048 }
1049 
smp_br_distribute_keys(struct bt_smp_br * smp)1050 static void smp_br_distribute_keys(struct bt_smp_br *smp)
1051 {
1052 	struct bt_conn *conn = smp->chan.chan.conn;
1053 	struct bt_keys *keys;
1054 	bt_addr_le_t addr;
1055 
1056 	/*
1057 	 * For dualmode devices LE address is same as BR/EDR address and is of
1058 	 * public type.
1059 	 */
1060 	bt_addr_copy(&addr.a, &conn->br.dst);
1061 	addr.type = BT_ADDR_LE_PUBLIC;
1062 
1063 	keys = bt_keys_get_addr(conn->id, &addr);
1064 	if (!keys) {
1065 		LOG_ERR("No keys space for %s", bt_addr_le_str(&addr));
1066 		return;
1067 	}
1068 
1069 #if defined(CONFIG_BT_PRIVACY)
1070 	if (smp->local_dist & BT_SMP_DIST_ID_KEY) {
1071 		struct bt_smp_ident_info *id_info;
1072 		struct bt_smp_ident_addr_info *id_addr_info;
1073 		struct net_buf *buf;
1074 
1075 		smp->local_dist &= ~BT_SMP_DIST_ID_KEY;
1076 
1077 		buf = smp_br_create_pdu(smp, BT_SMP_CMD_IDENT_INFO,
1078 					sizeof(*id_info));
1079 		if (!buf) {
1080 			LOG_ERR("Unable to allocate Ident Info buffer");
1081 			return;
1082 		}
1083 
1084 		id_info = net_buf_add(buf, sizeof(*id_info));
1085 		memcpy(id_info->irk, bt_dev.irk[conn->id], 16);
1086 
1087 		smp_br_send(smp, buf, NULL);
1088 
1089 		buf = smp_br_create_pdu(smp, BT_SMP_CMD_IDENT_ADDR_INFO,
1090 				     sizeof(*id_addr_info));
1091 		if (!buf) {
1092 			LOG_ERR("Unable to allocate Ident Addr Info buffer");
1093 			return;
1094 		}
1095 
1096 		id_addr_info = net_buf_add(buf, sizeof(*id_addr_info));
1097 		bt_addr_le_copy(&id_addr_info->addr, &bt_dev.id_addr[conn->id]);
1098 
1099 		smp_br_send(smp, buf, smp_id_sent);
1100 	}
1101 #endif /* CONFIG_BT_PRIVACY */
1102 
1103 #if defined(CONFIG_BT_SIGNING)
1104 	if (smp->local_dist & BT_SMP_DIST_SIGN) {
1105 		struct bt_smp_signing_info *info;
1106 		struct net_buf *buf;
1107 
1108 		smp->local_dist &= ~BT_SMP_DIST_SIGN;
1109 
1110 		buf = smp_br_create_pdu(smp, BT_SMP_CMD_SIGNING_INFO,
1111 					sizeof(*info));
1112 		if (!buf) {
1113 			LOG_ERR("Unable to allocate Signing Info buffer");
1114 			return;
1115 		}
1116 
1117 		info = net_buf_add(buf, sizeof(*info));
1118 
1119 		if (bt_rand(info->csrk, sizeof(info->csrk))) {
1120 			LOG_ERR("Unable to get random bytes");
1121 			return;
1122 		}
1123 
1124 		if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
1125 			bt_keys_add_type(keys, BT_KEYS_LOCAL_CSRK);
1126 			memcpy(keys->local_csrk.val, info->csrk, 16);
1127 			keys->local_csrk.cnt = 0U;
1128 		}
1129 
1130 		smp_br_send(smp, buf, smp_sign_info_sent);
1131 	}
1132 #endif /* CONFIG_BT_SIGNING */
1133 }
1134 
smp_br_pairing_allowed(struct bt_smp_br * smp)1135 static bool smp_br_pairing_allowed(struct bt_smp_br *smp)
1136 {
1137 	bt_addr_le_t addr;
1138 	struct bt_conn *conn;
1139 	struct bt_keys_link_key *key;
1140 	bool le_bonded;
1141 
1142 	if (!smp->chan.chan.conn) {
1143 		return false;
1144 	}
1145 
1146 	conn = smp->chan.chan.conn;
1147 
1148 	addr.type = BT_ADDR_LE_PUBLIC;
1149 	bt_addr_copy(&addr.a, &conn->br.dst);
1150 	le_bonded = bt_le_bond_exists(BT_ID_DEFAULT, &addr);
1151 
1152 	key = bt_keys_find_link_key(&conn->br.dst);
1153 	if (!key) {
1154 		return false;
1155 	}
1156 
1157 	/**
1158 	 * Core v6.0, Vol 3, Part C, 14.1 Cross-transport key derivation
1159 	 *
1160 	 * If an LE LTK already exists and the BR/EDR link key is weaker in either strength
1161 	 * or MITM protection, then neither device shall generate an LE LTK using cross-transport
1162 	 * key derivation from a BR/EDR link key.
1163 	 */
1164 	if (le_bonded && !(key->flags & BT_LINK_KEY_AUTHENTICATED)) {
1165 		return false;
1166 	}
1167 
1168 	if (conn->encrypt == BT_HCI_ENCRYPTION_ON_BR_AES_CCM) {
1169 		return true;
1170 	}
1171 
1172 	if (IS_ENABLED(CONFIG_BT_SMP_FORCE_BREDR) && conn->encrypt == BT_HCI_ENCRYPTION_ON_BR_E0) {
1173 		LOG_WRN("Allowing BR/EDR SMP with P-192 key");
1174 		return true;
1175 	}
1176 
1177 	return false;
1178 }
1179 
smp_br_pairing_req(struct bt_smp_br * smp,struct net_buf * buf)1180 static uint8_t smp_br_pairing_req(struct bt_smp_br *smp, struct net_buf *buf)
1181 {
1182 	struct bt_smp_pairing *req = (void *)buf->data;
1183 	struct bt_conn *conn = smp->chan.chan.conn;
1184 	struct bt_smp_pairing *rsp;
1185 	struct net_buf *rsp_buf;
1186 	uint8_t max_key_size;
1187 
1188 	LOG_DBG("req: io_capability 0x%02X, oob_flag 0x%02X, auth_req 0x%02X, "
1189 		"max_key_size 0x%02X, init_key_dist 0x%02X, resp_key_dist 0x%02X",
1190 		req->io_capability, req->oob_flag, req->auth_req,
1191 		req->max_key_size, req->init_key_dist, req->resp_key_dist);
1192 
1193 	/*
1194 	 * If a Pairing Request is received over the BR/EDR transport when
1195 	 * either cross-transport key derivation/generation is not supported or
1196 	 * the BR/EDR transport is not encrypted using a Link Key generated
1197 	 * using P256, a Pairing Failed shall be sent with the error code
1198 	 * "Cross-transport Key Derivation/Generation not allowed" (0x0E)."
1199 	 */
1200 	if (!smp_br_pairing_allowed(smp)) {
1201 		return BT_SMP_ERR_CROSS_TRANSP_NOT_ALLOWED;
1202 	}
1203 
1204 	max_key_size = bt_conn_enc_key_size(conn);
1205 	if (!max_key_size) {
1206 		LOG_DBG("Invalid encryption key size");
1207 		return BT_SMP_ERR_UNSPECIFIED;
1208 	}
1209 
1210 	if (req->max_key_size != max_key_size) {
1211 		return BT_SMP_ERR_ENC_KEY_SIZE;
1212 	}
1213 
1214 	rsp_buf = smp_br_create_pdu(smp, BT_SMP_CMD_PAIRING_RSP, sizeof(*rsp));
1215 	if (!rsp_buf) {
1216 		return BT_SMP_ERR_UNSPECIFIED;
1217 	}
1218 
1219 	smp_br_init(smp);
1220 	smp->enc_key_size = max_key_size;
1221 
1222 	/*
1223 	 * If Secure Connections pairing has been initiated over BR/EDR, the IO
1224 	 * Capability, OOB data flag and Auth Req fields of the SM Pairing
1225 	 * Request/Response PDU shall be set to zero on transmission, and
1226 	 * ignored on reception.
1227 	 */
1228 	rsp = net_buf_add(rsp_buf, sizeof(*rsp));
1229 
1230 	rsp->auth_req = BT_SMP_AUTH_CT2;
1231 	rsp->io_capability = 0x00;
1232 	rsp->oob_flag = 0x00;
1233 	rsp->max_key_size = max_key_size;
1234 	rsp->init_key_dist = (req->init_key_dist & BR_RECV_KEYS_SC);
1235 	rsp->resp_key_dist = (req->resp_key_dist & BR_RECV_KEYS_SC);
1236 
1237 	smp->local_dist = rsp->resp_key_dist;
1238 	smp->remote_dist = rsp->init_key_dist;
1239 
1240 	LOG_DBG("rsp: io_capability 0x%02X, oob_flag 0x%02X, auth_req 0x%02X, "
1241 		"max_key_size 0x%02X, init_key_dist 0x%02X, resp_key_dist 0x%02X",
1242 		rsp->io_capability, rsp->oob_flag, rsp->auth_req,
1243 		rsp->max_key_size, rsp->init_key_dist, rsp->resp_key_dist);
1244 
1245 	smp_br_send(smp, rsp_buf, NULL);
1246 
1247 	atomic_set_bit(smp->flags, SMP_FLAG_PAIRING);
1248 
1249 	/* If CT2 bit is set both side, set CT2 flag */
1250 	if ((rsp->auth_req & BT_SMP_AUTH_CT2) &&
1251 	    (req->auth_req & BT_SMP_AUTH_CT2)) {
1252 		atomic_set_bit(smp->flags, SMP_FLAG_CT2);
1253 	}
1254 
1255 	/* derive LTK if requested and clear distribution bits */
1256 	if ((smp->local_dist & BT_SMP_DIST_ENC_KEY) &&
1257 	    (smp->remote_dist & BT_SMP_DIST_ENC_KEY)) {
1258 		smp_br_derive_ltk(smp);
1259 	}
1260 	smp->local_dist &= ~BT_SMP_DIST_ENC_KEY;
1261 	smp->remote_dist &= ~BT_SMP_DIST_ENC_KEY;
1262 
1263 	/* BR/EDR acceptor is like LE Peripheral and distributes keys first */
1264 	smp_br_distribute_keys(smp);
1265 
1266 	if (smp->remote_dist & BT_SMP_DIST_ID_KEY) {
1267 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_IDENT_INFO);
1268 	} else if (smp->remote_dist & BT_SMP_DIST_SIGN) {
1269 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
1270 	}
1271 
1272 	/* if all keys were distributed, pairing is done */
1273 	if (!smp->local_dist && !smp->remote_dist) {
1274 		smp_pairing_br_complete(smp, 0);
1275 	}
1276 
1277 	return 0;
1278 }
1279 
smp_br_pairing_rsp(struct bt_smp_br * smp,struct net_buf * buf)1280 static uint8_t smp_br_pairing_rsp(struct bt_smp_br *smp, struct net_buf *buf)
1281 {
1282 	struct bt_smp_pairing *rsp = (void *)buf->data;
1283 	struct bt_conn *conn = smp->chan.chan.conn;
1284 	uint8_t max_key_size;
1285 
1286 	LOG_DBG("rsp: io_capability 0x%02X, oob_flag 0x%02X, auth_req 0x%02X, "
1287 		"max_key_size 0x%02X, init_key_dist 0x%02X, resp_key_dist 0x%02X",
1288 		rsp->io_capability, rsp->oob_flag, rsp->auth_req,
1289 		rsp->max_key_size, rsp->init_key_dist, rsp->resp_key_dist);
1290 
1291 	max_key_size = bt_conn_enc_key_size(conn);
1292 	if (!max_key_size) {
1293 		LOG_DBG("Invalid encryption key size");
1294 		return BT_SMP_ERR_UNSPECIFIED;
1295 	}
1296 
1297 	if (rsp->max_key_size != max_key_size) {
1298 		return BT_SMP_ERR_ENC_KEY_SIZE;
1299 	}
1300 
1301 	smp->local_dist &= rsp->init_key_dist;
1302 	smp->remote_dist &= rsp->resp_key_dist;
1303 
1304 	smp->local_dist &= BR_SEND_KEYS_SC;
1305 	smp->remote_dist &= BR_RECV_KEYS_SC;
1306 
1307 	/* Peripheral distributes its keys first */
1308 
1309 	if (smp->remote_dist & BT_SMP_DIST_ID_KEY) {
1310 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_IDENT_INFO);
1311 	} else if (smp->remote_dist & BT_SMP_DIST_SIGN) {
1312 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
1313 	}
1314 
1315 	/*
1316 	 * CT2 flag is set in pairing req by bt_smp_br_send_pairing_req.
1317 	 * If CT2 bit is set both side, set CT2 flag.
1318 	 */
1319 	if (rsp->auth_req & BT_SMP_AUTH_CT2) {
1320 		atomic_set_bit(smp->flags, SMP_FLAG_CT2);
1321 	}
1322 
1323 	/* derive LTK if requested and clear distribution bits */
1324 	if ((smp->local_dist & BT_SMP_DIST_ENC_KEY) &&
1325 	    (smp->remote_dist & BT_SMP_DIST_ENC_KEY)) {
1326 		smp_br_derive_ltk(smp);
1327 	}
1328 	smp->local_dist &= ~BT_SMP_DIST_ENC_KEY;
1329 	smp->remote_dist &= ~BT_SMP_DIST_ENC_KEY;
1330 
1331 	/* Pairing acceptor distributes it's keys first */
1332 	if (smp->remote_dist) {
1333 		return 0;
1334 	}
1335 
1336 	smp_br_distribute_keys(smp);
1337 
1338 	/* if all keys were distributed, pairing is done */
1339 	if (!smp->local_dist && !smp->remote_dist) {
1340 		smp_pairing_br_complete(smp, 0);
1341 	}
1342 
1343 	return 0;
1344 }
1345 
smp_br_pairing_failed(struct bt_smp_br * smp,struct net_buf * buf)1346 static uint8_t smp_br_pairing_failed(struct bt_smp_br *smp, struct net_buf *buf)
1347 {
1348 	struct bt_smp_pairing_fail *req = (void *)buf->data;
1349 
1350 	LOG_ERR("pairing failed (peer reason 0x%x)", req->reason);
1351 
1352 	smp_pairing_br_complete(smp, req->reason);
1353 	smp_br_reset(smp);
1354 
1355 	/* return no error to avoid sending Pairing Failed in response */
1356 	return 0;
1357 }
1358 
smp_br_ident_info(struct bt_smp_br * smp,struct net_buf * buf)1359 static uint8_t smp_br_ident_info(struct bt_smp_br *smp, struct net_buf *buf)
1360 {
1361 	struct bt_smp_ident_info *req = (void *)buf->data;
1362 	struct bt_conn *conn = smp->chan.chan.conn;
1363 	struct bt_keys *keys;
1364 	bt_addr_le_t addr;
1365 
1366 	LOG_DBG("");
1367 
1368 	/* TODO should we resolve LE address if matching RPA is connected? */
1369 
1370 	/*
1371 	 * For dualmode devices LE address is same as BR/EDR address and is of
1372 	 * public type.
1373 	 */
1374 	bt_addr_copy(&addr.a, &conn->br.dst);
1375 	addr.type = BT_ADDR_LE_PUBLIC;
1376 
1377 	keys = bt_keys_get_type(BT_KEYS_IRK, conn->id, &addr);
1378 	if (!keys) {
1379 		LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&addr));
1380 		return BT_SMP_ERR_UNSPECIFIED;
1381 	}
1382 
1383 	memcpy(keys->irk.val, req->irk, sizeof(keys->irk.val));
1384 
1385 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_IDENT_ADDR_INFO);
1386 
1387 	return 0;
1388 }
1389 
smp_br_ident_addr_info(struct bt_smp_br * smp,struct net_buf * buf)1390 static uint8_t smp_br_ident_addr_info(struct bt_smp_br *smp,
1391 				      struct net_buf *buf)
1392 {
1393 	struct bt_conn *conn = smp->chan.chan.conn;
1394 	struct bt_smp_ident_addr_info *req = (void *)buf->data;
1395 	bt_addr_le_t addr;
1396 
1397 	LOG_DBG("identity %s", bt_addr_le_str(&req->addr));
1398 
1399 	/*
1400 	 * For dual mode device identity address must be same as BR/EDR address
1401 	 * and be of public type. So if received one doesn't match BR/EDR
1402 	 * address we fail.
1403 	 */
1404 
1405 	bt_addr_copy(&addr.a, &conn->br.dst);
1406 	addr.type = BT_ADDR_LE_PUBLIC;
1407 
1408 	if (!bt_addr_le_eq(&addr, &req->addr)) {
1409 		return BT_SMP_ERR_UNSPECIFIED;
1410 	}
1411 
1412 	smp->remote_dist &= ~BT_SMP_DIST_ID_KEY;
1413 
1414 	if (smp->remote_dist & BT_SMP_DIST_SIGN) {
1415 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
1416 	}
1417 
1418 	if (conn->role == BT_CONN_ROLE_CENTRAL && !smp->remote_dist) {
1419 		smp_br_distribute_keys(smp);
1420 	}
1421 
1422 	/* if all keys were distributed, pairing is done */
1423 	if (!smp->local_dist && !smp->remote_dist) {
1424 		smp_pairing_br_complete(smp, 0);
1425 	}
1426 
1427 	return 0;
1428 }
1429 
1430 #if defined(CONFIG_BT_SIGNING)
smp_br_signing_info(struct bt_smp_br * smp,struct net_buf * buf)1431 static uint8_t smp_br_signing_info(struct bt_smp_br *smp, struct net_buf *buf)
1432 {
1433 	struct bt_smp_signing_info *req = (void *)buf->data;
1434 	struct bt_conn *conn = smp->chan.chan.conn;
1435 	struct bt_keys *keys;
1436 	bt_addr_le_t addr;
1437 
1438 	LOG_DBG("");
1439 
1440 	/*
1441 	 * For dualmode devices LE address is same as BR/EDR address and is of
1442 	 * public type.
1443 	 */
1444 	bt_addr_copy(&addr.a, &conn->br.dst);
1445 	addr.type = BT_ADDR_LE_PUBLIC;
1446 
1447 	keys = bt_keys_get_type(BT_KEYS_REMOTE_CSRK, conn->id, &addr);
1448 	if (!keys) {
1449 		LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&addr));
1450 		return BT_SMP_ERR_UNSPECIFIED;
1451 	}
1452 
1453 	memcpy(keys->remote_csrk.val, req->csrk, sizeof(keys->remote_csrk.val));
1454 
1455 	smp->remote_dist &= ~BT_SMP_DIST_SIGN;
1456 
1457 	if (conn->role == BT_CONN_ROLE_CENTRAL && !smp->remote_dist) {
1458 		smp_br_distribute_keys(smp);
1459 	}
1460 
1461 	/* if all keys were distributed, pairing is done */
1462 	if (!smp->local_dist && !smp->remote_dist) {
1463 		smp_pairing_br_complete(smp, 0);
1464 	}
1465 
1466 	return 0;
1467 }
1468 #else
smp_br_signing_info(struct bt_smp_br * smp,struct net_buf * buf)1469 static uint8_t smp_br_signing_info(struct bt_smp_br *smp, struct net_buf *buf)
1470 {
1471 	return BT_SMP_ERR_CMD_NOTSUPP;
1472 }
1473 #endif /* CONFIG_BT_SIGNING */
1474 
1475 static const struct {
1476 	uint8_t  (*func)(struct bt_smp_br *smp, struct net_buf *buf);
1477 	uint8_t  expect_len;
1478 } br_handlers[] = {
1479 	{ }, /* No op-code defined for 0x00 */
1480 	{ smp_br_pairing_req,      sizeof(struct bt_smp_pairing) },
1481 	{ smp_br_pairing_rsp,      sizeof(struct bt_smp_pairing) },
1482 	{ }, /* pairing confirm not used over BR/EDR */
1483 	{ }, /* pairing random not used over BR/EDR */
1484 	{ smp_br_pairing_failed,   sizeof(struct bt_smp_pairing_fail) },
1485 	{ }, /* encrypt info not used over BR/EDR */
1486 	{ }, /* central ident not used over BR/EDR */
1487 	{ smp_br_ident_info,       sizeof(struct bt_smp_ident_info) },
1488 	{ smp_br_ident_addr_info,  sizeof(struct bt_smp_ident_addr_info) },
1489 	{ smp_br_signing_info,     sizeof(struct bt_smp_signing_info) },
1490 	/* security request not used over BR/EDR */
1491 	/* public key not used over BR/EDR */
1492 	/* DHKey check not used over BR/EDR */
1493 };
1494 
smp_br_error(struct bt_smp_br * smp,uint8_t reason)1495 static int smp_br_error(struct bt_smp_br *smp, uint8_t reason)
1496 {
1497 	struct bt_smp_pairing_fail *rsp;
1498 	struct net_buf *buf;
1499 
1500 	/* reset context and report */
1501 	smp_br_reset(smp);
1502 
1503 	buf = smp_br_create_pdu(smp, BT_SMP_CMD_PAIRING_FAIL, sizeof(*rsp));
1504 	if (!buf) {
1505 		return -ENOBUFS;
1506 	}
1507 
1508 	rsp = net_buf_add(buf, sizeof(*rsp));
1509 	rsp->reason = reason;
1510 
1511 	/*
1512 	 * SMP timer is not restarted for PairingFailed so don't use
1513 	 * smp_br_send
1514 	 */
1515 	if (bt_l2cap_br_send_cb(smp->chan.chan.conn, BT_L2CAP_CID_BR_SMP, buf,
1516 				NULL, NULL)) {
1517 		net_buf_unref(buf);
1518 	}
1519 
1520 	return 0;
1521 }
1522 
bt_smp_br_recv(struct bt_l2cap_chan * chan,struct net_buf * buf)1523 static int bt_smp_br_recv(struct bt_l2cap_chan *chan, struct net_buf *buf)
1524 {
1525 	struct bt_smp_br *smp = CONTAINER_OF(chan, struct bt_smp_br, chan.chan);
1526 	struct bt_smp_hdr *hdr;
1527 	uint8_t err;
1528 
1529 	if (buf->len < sizeof(*hdr)) {
1530 		LOG_ERR("Too small SMP PDU received");
1531 		return 0;
1532 	}
1533 
1534 	hdr = net_buf_pull_mem(buf, sizeof(*hdr));
1535 	LOG_DBG("Received SMP code 0x%02x len %u", hdr->code, buf->len);
1536 
1537 	/*
1538 	 * If SMP timeout occurred "no further SMP commands shall be sent over
1539 	 * the L2CAP Security Manager Channel. A new SM procedure shall only be
1540 	 * performed when a new physical link has been established."
1541 	 */
1542 	if (atomic_test_bit(smp->flags, SMP_FLAG_TIMEOUT)) {
1543 		LOG_WRN("SMP command (code 0x%02x) received after timeout", hdr->code);
1544 		return 0;
1545 	}
1546 
1547 	if (hdr->code >= ARRAY_SIZE(br_handlers) ||
1548 	    !br_handlers[hdr->code].func) {
1549 		LOG_WRN("Unhandled SMP code 0x%02x", hdr->code);
1550 		smp_br_error(smp, BT_SMP_ERR_CMD_NOTSUPP);
1551 		return 0;
1552 	}
1553 
1554 	if (!atomic_test_and_clear_bit(smp->allowed_cmds, hdr->code)) {
1555 		LOG_WRN("Unexpected SMP code 0x%02x", hdr->code);
1556 		smp_br_error(smp, BT_SMP_ERR_UNSPECIFIED);
1557 		return 0;
1558 	}
1559 
1560 	if (buf->len != br_handlers[hdr->code].expect_len) {
1561 		LOG_ERR("Invalid len %u for code 0x%02x", buf->len, hdr->code);
1562 		smp_br_error(smp, BT_SMP_ERR_INVALID_PARAMS);
1563 		return 0;
1564 	}
1565 
1566 	err = br_handlers[hdr->code].func(smp, buf);
1567 	if (err) {
1568 		smp_br_error(smp, err);
1569 	}
1570 
1571 	return 0;
1572 }
1573 
br_sc_supported(void)1574 static bool br_sc_supported(void)
1575 {
1576 	if (IS_ENABLED(CONFIG_BT_SMP_FORCE_BREDR)) {
1577 		LOG_WRN("Enabling BR/EDR SMP without BR/EDR SC support");
1578 		return true;
1579 	}
1580 
1581 	return BT_FEAT_SC(bt_dev.features);
1582 }
1583 
bt_smp_br_accept(struct bt_conn * conn,struct bt_l2cap_chan ** chan)1584 static int bt_smp_br_accept(struct bt_conn *conn, struct bt_l2cap_chan **chan)
1585 {
1586 	static const struct bt_l2cap_chan_ops ops = {
1587 		.connected = bt_smp_br_connected,
1588 		.disconnected = bt_smp_br_disconnected,
1589 		.recv = bt_smp_br_recv,
1590 	};
1591 	int i;
1592 
1593 	/* Check BR/EDR SC is supported */
1594 	if (!br_sc_supported()) {
1595 		return -ENOTSUP;
1596 	}
1597 
1598 	LOG_DBG("conn %p handle %u", conn, conn->handle);
1599 
1600 	for (i = 0; i < ARRAY_SIZE(bt_smp_pool); i++) {
1601 		struct bt_smp_br *smp = &bt_smp_br_pool[i];
1602 
1603 		if (smp->chan.chan.conn) {
1604 			continue;
1605 		}
1606 
1607 		smp->chan.chan.ops = &ops;
1608 
1609 		*chan = &smp->chan.chan;
1610 
1611 		k_work_init_delayable(&smp->work, smp_br_timeout);
1612 		smp_br_reset(smp);
1613 
1614 		return 0;
1615 	}
1616 
1617 	LOG_ERR("No available SMP context for conn %p", conn);
1618 
1619 	return -ENOMEM;
1620 }
1621 
smp_br_chan_get(struct bt_conn * conn)1622 static struct bt_smp_br *smp_br_chan_get(struct bt_conn *conn)
1623 {
1624 	struct bt_l2cap_chan *chan;
1625 
1626 	chan = bt_l2cap_br_lookup_rx_cid(conn, BT_L2CAP_CID_BR_SMP);
1627 	if (!chan) {
1628 		LOG_ERR("Unable to find SMP channel");
1629 		return NULL;
1630 	}
1631 
1632 	return CONTAINER_OF(chan, struct bt_smp_br, chan.chan);
1633 }
1634 
bt_smp_br_send_pairing_req(struct bt_conn * conn)1635 int bt_smp_br_send_pairing_req(struct bt_conn *conn)
1636 {
1637 	struct bt_smp_pairing *req;
1638 	struct net_buf *req_buf;
1639 	uint8_t max_key_size;
1640 	struct bt_smp_br *smp;
1641 	uint8_t remote_fixed_chan;
1642 
1643 	remote_fixed_chan = bt_l2cap_br_get_remote_fixed_chan(conn);
1644 	if (!(remote_fixed_chan & BIT(BT_L2CAP_CID_BR_SMP))) {
1645 		return -ENOTSUP;
1646 	}
1647 
1648 	smp = smp_br_chan_get(conn);
1649 	if (!smp) {
1650 		return -ENOTCONN;
1651 	}
1652 
1653 	/* SMP Timeout */
1654 	if (atomic_test_bit(smp->flags, SMP_FLAG_TIMEOUT)) {
1655 		return -EIO;
1656 	}
1657 
1658 	/* pairing is in progress */
1659 	if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
1660 		return -EBUSY;
1661 	}
1662 
1663 	/* check if we are allowed to start SMP over BR/EDR */
1664 	if (!smp_br_pairing_allowed(smp)) {
1665 		return 0;
1666 	}
1667 
1668 	/* Channel not yet connected, will start pairing once connected */
1669 	if (!atomic_test_bit(smp->flags, SMP_FLAG_BR_CONNECTED)) {
1670 		atomic_set_bit(smp->flags, SMP_FLAG_BR_PAIR);
1671 		return 0;
1672 	}
1673 
1674 	max_key_size = bt_conn_enc_key_size(conn);
1675 	if (!max_key_size) {
1676 		LOG_DBG("Invalid encryption key size");
1677 		return -EIO;
1678 	}
1679 
1680 	smp_br_init(smp);
1681 	smp->enc_key_size = max_key_size;
1682 
1683 	req_buf = smp_br_create_pdu(smp, BT_SMP_CMD_PAIRING_REQ, sizeof(*req));
1684 	if (!req_buf) {
1685 		return -ENOBUFS;
1686 	}
1687 
1688 	req = net_buf_add(req_buf, sizeof(*req));
1689 
1690 	/*
1691 	 * If Secure Connections pairing has been initiated over BR/EDR, the IO
1692 	 * Capability, OOB data flag and Auth Req fields of the SM Pairing
1693 	 * Request/Response PDU shall be set to zero on transmission, and
1694 	 * ignored on reception.
1695 	 */
1696 
1697 	req->auth_req = BT_SMP_AUTH_CT2;
1698 	req->io_capability = 0x00;
1699 	req->oob_flag = 0x00;
1700 	req->max_key_size = max_key_size;
1701 	req->init_key_dist = BR_SEND_KEYS_SC;
1702 	req->resp_key_dist = BR_RECV_KEYS_SC;
1703 
1704 	smp_br_send(smp, req_buf, NULL);
1705 
1706 	smp->local_dist = BR_SEND_KEYS_SC;
1707 	smp->remote_dist = BR_RECV_KEYS_SC;
1708 
1709 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RSP);
1710 
1711 	atomic_set_bit(smp->flags, SMP_FLAG_PAIRING);
1712 
1713 	return 0;
1714 }
1715 #endif /* CONFIG_BT_CLASSIC */
1716 
smp_reset(struct bt_smp * smp)1717 static void smp_reset(struct bt_smp *smp)
1718 {
1719 	struct bt_conn *conn = smp->chan.chan.conn;
1720 
1721 	/* Clear flags first in case canceling of timeout fails. The SMP context
1722 	 * shall be marked as timed out in that case.
1723 	 */
1724 	atomic_set(smp->flags, 0);
1725 
1726 	/* If canceling fails the timeout handler will set the timeout flag and
1727 	 * mark the it as timed out. No new pairing procedures shall be started
1728 	 * on this connection if that happens.
1729 	 */
1730 	(void)k_work_cancel_delayable(&smp->work);
1731 
1732 	smp->method = JUST_WORKS;
1733 	atomic_set(smp->allowed_cmds, 0);
1734 
1735 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
1736 	    conn->role == BT_HCI_ROLE_CENTRAL) {
1737 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SECURITY_REQUEST);
1738 		return;
1739 	}
1740 
1741 	if (IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
1742 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_REQ);
1743 	}
1744 }
1745 
hci_err_get(enum bt_security_err err)1746 static uint8_t hci_err_get(enum bt_security_err err)
1747 {
1748 	switch (err) {
1749 	case BT_SECURITY_ERR_SUCCESS:
1750 		return BT_HCI_ERR_SUCCESS;
1751 	case BT_SECURITY_ERR_AUTH_FAIL:
1752 		return BT_HCI_ERR_AUTH_FAIL;
1753 	case BT_SECURITY_ERR_PIN_OR_KEY_MISSING:
1754 		return BT_HCI_ERR_PIN_OR_KEY_MISSING;
1755 	case BT_SECURITY_ERR_PAIR_NOT_SUPPORTED:
1756 		return BT_HCI_ERR_PAIRING_NOT_SUPPORTED;
1757 	case BT_SECURITY_ERR_PAIR_NOT_ALLOWED:
1758 		return BT_HCI_ERR_PAIRING_NOT_ALLOWED;
1759 	case BT_SECURITY_ERR_INVALID_PARAM:
1760 		return BT_HCI_ERR_INVALID_PARAM;
1761 	default:
1762 		return BT_HCI_ERR_UNSPECIFIED;
1763 	}
1764 }
1765 
1766 /* Note: This function not only does set the status but also calls smp_reset
1767  * at the end which clears any flags previously set.
1768  */
smp_pairing_complete(struct bt_smp * smp,uint8_t status)1769 static void smp_pairing_complete(struct bt_smp *smp, uint8_t status)
1770 {
1771 	struct bt_conn *conn = smp->chan.chan.conn;
1772 
1773 	LOG_DBG("got status 0x%x", status);
1774 
1775 	if (conn->le.keys == NULL) {
1776 		/* We can get here if the application calls `bt_unpair` in the
1777 		 * `security_changed` callback.
1778 		 */
1779 		LOG_WRN("The in-progress pairing has been deleted!");
1780 		status = BT_SMP_ERR_UNSPECIFIED;
1781 	}
1782 
1783 	if (!status) {
1784 #if defined(CONFIG_BT_CLASSIC)
1785 		/*
1786 		 * Don't derive if Debug Keys are used.
1787 		 * TODO should we allow this if BR/EDR is already connected?
1788 		 */
1789 		if (atomic_test_bit(smp->flags, SMP_FLAG_DERIVE_LK) &&
1790 		    (!atomic_test_bit(smp->flags, SMP_FLAG_SC_DEBUG_KEY) ||
1791 		     IS_ENABLED(CONFIG_BT_STORE_DEBUG_KEYS))) {
1792 			sc_derive_link_key(smp);
1793 		}
1794 #endif /* CONFIG_BT_CLASSIC */
1795 		bool bond_flag = atomic_test_bit(smp->flags, SMP_FLAG_BOND);
1796 		struct bt_conn_auth_info_cb *listener, *next;
1797 
1798 		if (IS_ENABLED(CONFIG_BT_LOG_SNIFFER_INFO)) {
1799 			bt_keys_show_sniffer_info(conn->le.keys, NULL);
1800 		}
1801 
1802 		if (bond_flag && conn->le.keys) {
1803 			bt_keys_store(conn->le.keys);
1804 		}
1805 
1806 		SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&bt_auth_info_cbs, listener,
1807 						  next, node) {
1808 			if (listener->pairing_complete) {
1809 				listener->pairing_complete(conn, bond_flag);
1810 			}
1811 		}
1812 	} else {
1813 		enum bt_security_err security_err = security_err_get(status);
1814 
1815 		/* Clear the key pool entry in case of pairing failure if the
1816 		 * keys already existed before the pairing procedure or the
1817 		 * pairing failed during key distribution.
1818 		 */
1819 		if (conn->le.keys &&
1820 		    (!conn->le.keys->enc_size ||
1821 		     atomic_test_bit(smp->flags, SMP_FLAG_KEYS_DISTR))) {
1822 			bt_keys_clear(conn->le.keys);
1823 			conn->le.keys = NULL;
1824 		}
1825 
1826 		if (!atomic_test_bit(smp->flags, SMP_FLAG_KEYS_DISTR)) {
1827 			bt_conn_security_changed(conn,
1828 						 hci_err_get(security_err),
1829 						 security_err);
1830 		}
1831 
1832 		/* Check SMP_FLAG_PAIRING as bt_conn_security_changed may
1833 		 * have called the pairing_failed callback already.
1834 		 */
1835 		if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
1836 			struct bt_conn_auth_info_cb *listener, *next;
1837 
1838 			SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&bt_auth_info_cbs,
1839 							  listener, next,
1840 							  node) {
1841 				if (listener->pairing_failed) {
1842 					listener->pairing_failed(conn, security_err);
1843 				}
1844 			}
1845 		}
1846 	}
1847 
1848 	smp_reset(smp);
1849 
1850 	if (conn->state == BT_CONN_CONNECTED && conn->sec_level != conn->required_sec_level) {
1851 		bt_smp_start_security(conn);
1852 	}
1853 }
1854 
smp_timeout(struct k_work * work)1855 static void smp_timeout(struct k_work *work)
1856 {
1857 	struct k_work_delayable *dwork = k_work_delayable_from_work(work);
1858 	struct bt_smp *smp = CONTAINER_OF(dwork, struct bt_smp, work);
1859 
1860 	LOG_ERR("SMP Timeout");
1861 
1862 	smp_pairing_complete(smp, BT_SMP_ERR_UNSPECIFIED);
1863 
1864 	/* smp_pairing_complete clears flags so setting timeout flag must come
1865 	 * after it.
1866 	 */
1867 	atomic_set_bit(smp->flags, SMP_FLAG_TIMEOUT);
1868 }
1869 
smp_send(struct bt_smp * smp,struct net_buf * buf,bt_conn_tx_cb_t cb,void * user_data)1870 static void smp_send(struct bt_smp *smp, struct net_buf *buf,
1871 		     bt_conn_tx_cb_t cb, void *user_data)
1872 {
1873 	__ASSERT_NO_MSG(user_data == NULL);
1874 
1875 	int err = bt_l2cap_send_pdu(&smp->chan, buf, cb, NULL);
1876 
1877 	if (err) {
1878 		if (err == -ENOBUFS) {
1879 			LOG_ERR("Ran out of TX buffers or contexts.");
1880 		}
1881 
1882 		net_buf_unref(buf);
1883 		return;
1884 	}
1885 
1886 	k_work_reschedule(&smp->work, SMP_TIMEOUT);
1887 }
1888 
smp_error(struct bt_smp * smp,uint8_t reason)1889 static int smp_error(struct bt_smp *smp, uint8_t reason)
1890 {
1891 	struct bt_smp_pairing_fail *rsp;
1892 	struct net_buf *buf;
1893 	bool remote_already_completed;
1894 
1895 	/* By spec, SMP "pairing process" completes successfully when the last
1896 	 * key to distribute is acknowledged at link-layer.
1897 	 */
1898 	remote_already_completed = (atomic_test_bit(smp->flags, SMP_FLAG_KEYS_DISTR) &&
1899 				    !smp->local_dist && !smp->remote_dist);
1900 
1901 	if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING) ||
1902 	    atomic_test_bit(smp->flags, SMP_FLAG_ENC_PENDING) ||
1903 	    atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ)) {
1904 		/* reset context and report */
1905 		smp_pairing_complete(smp, reason);
1906 	}
1907 
1908 	if (remote_already_completed) {
1909 		LOG_WRN("SMP does not allow a pairing failure at this point. Known issue. "
1910 			"Disconnecting instead.");
1911 		/* We are probably here because we are, as a peripheral, rejecting a pairing based
1912 		 * on the central's identity address information, but that was the last key to
1913 		 * be transmitted. In that case, the pairing process is already completed.
1914 		 * The SMP protocol states that the pairing process is completed the moment the
1915 		 * peripheral link-layer confirmed the reception of the PDU with the last key.
1916 		 */
1917 		bt_conn_disconnect(smp->chan.chan.conn, BT_HCI_ERR_AUTH_FAIL);
1918 		return 0;
1919 	}
1920 
1921 	buf = smp_create_pdu(smp, BT_SMP_CMD_PAIRING_FAIL, sizeof(*rsp));
1922 	if (!buf) {
1923 		return -ENOBUFS;
1924 	}
1925 
1926 	rsp = net_buf_add(buf, sizeof(*rsp));
1927 	rsp->reason = reason;
1928 
1929 	/* SMP timer is not restarted for PairingFailed so don't use smp_send */
1930 	if (bt_l2cap_send_pdu(&smp->chan, buf, NULL, NULL)) {
1931 		net_buf_unref(buf);
1932 	}
1933 
1934 	return 0;
1935 }
1936 
smp_send_pairing_random(struct bt_smp * smp)1937 static uint8_t smp_send_pairing_random(struct bt_smp *smp)
1938 {
1939 	struct bt_smp_pairing_random *req;
1940 	struct net_buf *rsp_buf;
1941 
1942 	rsp_buf = smp_create_pdu(smp, BT_SMP_CMD_PAIRING_RANDOM, sizeof(*req));
1943 	if (!rsp_buf) {
1944 		return BT_SMP_ERR_UNSPECIFIED;
1945 	}
1946 
1947 	req = net_buf_add(rsp_buf, sizeof(*req));
1948 	memcpy(req->val, smp->prnd, sizeof(req->val));
1949 
1950 	smp_send(smp, rsp_buf, NULL, NULL);
1951 
1952 	return 0;
1953 }
1954 
1955 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
smp_c1(const uint8_t k[16],const uint8_t r[16],const uint8_t preq[7],const uint8_t pres[7],const bt_addr_le_t * ia,const bt_addr_le_t * ra,uint8_t enc_data[16])1956 static int smp_c1(const uint8_t k[16], const uint8_t r[16],
1957 		  const uint8_t preq[7], const uint8_t pres[7],
1958 		  const bt_addr_le_t *ia, const bt_addr_le_t *ra,
1959 		  uint8_t enc_data[16])
1960 {
1961 	uint8_t p1[16], p2[16];
1962 	int err;
1963 
1964 	LOG_DBG("k %s", bt_hex(k, 16));
1965 	LOG_DBG("r %s", bt_hex(r, 16));
1966 	LOG_DBG("ia %s", bt_addr_le_str(ia));
1967 	LOG_DBG("ra %s", bt_addr_le_str(ra));
1968 	LOG_DBG("preq %s", bt_hex(preq, 7));
1969 	LOG_DBG("pres %s", bt_hex(pres, 7));
1970 
1971 	/* pres, preq, rat and iat are concatenated to generate p1 */
1972 	p1[0] = ia->type;
1973 	p1[1] = ra->type;
1974 	memcpy(p1 + 2, preq, 7);
1975 	memcpy(p1 + 9, pres, 7);
1976 
1977 	LOG_DBG("p1 %s", bt_hex(p1, 16));
1978 
1979 	/* c1 = e(k, e(k, r XOR p1) XOR p2) */
1980 
1981 	/* Using enc_data as temporary output buffer */
1982 	mem_xor_128(enc_data, r, p1);
1983 
1984 	err = bt_encrypt_le(k, enc_data, enc_data);
1985 	if (err) {
1986 		return err;
1987 	}
1988 
1989 	/* ra is concatenated with ia and padding to generate p2 */
1990 	memcpy(p2, ra->a.val, 6);
1991 	memcpy(p2 + 6, ia->a.val, 6);
1992 	(void)memset(p2 + 12, 0, 4);
1993 
1994 	LOG_DBG("p2 %s", bt_hex(p2, 16));
1995 
1996 	mem_xor_128(enc_data, p2, enc_data);
1997 
1998 	return bt_encrypt_le(k, enc_data, enc_data);
1999 }
2000 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
2001 
smp_send_pairing_confirm(struct bt_smp * smp)2002 static uint8_t smp_send_pairing_confirm(struct bt_smp *smp)
2003 {
2004 	struct bt_smp_pairing_confirm *req;
2005 	struct net_buf *buf;
2006 	uint8_t r;
2007 
2008 	switch (smp->method) {
2009 	case PASSKEY_CONFIRM:
2010 	case JUST_WORKS:
2011 		r = 0U;
2012 		break;
2013 	case PASSKEY_DISPLAY:
2014 	case PASSKEY_INPUT:
2015 		/*
2016 		 * In the Passkey Entry protocol, the most significant
2017 		 * bit of Z is set equal to one and the least
2018 		 * significant bit is made up from one bit of the
2019 		 * passkey e.g. if the passkey bit is 1, then Z = 0x81
2020 		 * and if the passkey bit is 0, then Z = 0x80.
2021 		 */
2022 		r = (smp->passkey >> smp->passkey_round) & 0x01;
2023 		r |= 0x80;
2024 		break;
2025 	default:
2026 		LOG_ERR("Unknown pairing method (%u)", smp->method);
2027 		return BT_SMP_ERR_UNSPECIFIED;
2028 	}
2029 
2030 	buf = smp_create_pdu(smp, BT_SMP_CMD_PAIRING_CONFIRM, sizeof(*req));
2031 	if (!buf) {
2032 		return BT_SMP_ERR_UNSPECIFIED;
2033 	}
2034 
2035 	req = net_buf_add(buf, sizeof(*req));
2036 
2037 	if (bt_crypto_f4(sc_public_key, smp->pkey, smp->prnd, r, req->val)) {
2038 		net_buf_unref(buf);
2039 		return BT_SMP_ERR_UNSPECIFIED;
2040 	}
2041 
2042 	smp_send(smp, buf, NULL, NULL);
2043 
2044 	atomic_clear_bit(smp->flags, SMP_FLAG_CFM_DELAYED);
2045 
2046 	return 0;
2047 }
2048 
2049 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
smp_ident_sent(struct bt_conn * conn,void * user_data,int err)2050 static void smp_ident_sent(struct bt_conn *conn, void *user_data, int err)
2051 {
2052 	if (!err) {
2053 		smp_check_complete(conn, BT_SMP_DIST_ENC_KEY);
2054 	}
2055 }
2056 
legacy_distribute_keys(struct bt_smp * smp)2057 static void legacy_distribute_keys(struct bt_smp *smp)
2058 {
2059 	struct bt_conn *conn = smp->chan.chan.conn;
2060 	struct bt_keys *keys = conn->le.keys;
2061 
2062 	if (smp->local_dist & BT_SMP_DIST_ENC_KEY) {
2063 		struct bt_smp_encrypt_info *info;
2064 		struct bt_smp_central_ident *ident;
2065 		struct net_buf *buf;
2066 		/* Use struct to get randomness in single call to bt_rand */
2067 		struct {
2068 			uint8_t key[16];
2069 			uint8_t rand[8];
2070 			uint8_t ediv[2];
2071 		} rand;
2072 
2073 		if (bt_rand((void *)&rand, sizeof(rand))) {
2074 			LOG_ERR("Unable to get random bytes");
2075 			return;
2076 		}
2077 
2078 		buf = smp_create_pdu(smp, BT_SMP_CMD_ENCRYPT_INFO,
2079 				     sizeof(*info));
2080 		if (!buf) {
2081 			LOG_ERR("Unable to allocate Encrypt Info buffer");
2082 			return;
2083 		}
2084 
2085 		info = net_buf_add(buf, sizeof(*info));
2086 
2087 		/* distributed only enc_size bytes of key */
2088 		memcpy(info->ltk, rand.key, keys->enc_size);
2089 		if (keys->enc_size < sizeof(info->ltk)) {
2090 			(void)memset(info->ltk + keys->enc_size, 0,
2091 				     sizeof(info->ltk) - keys->enc_size);
2092 		}
2093 
2094 		smp_send(smp, buf, NULL, NULL);
2095 
2096 		buf = smp_create_pdu(smp, BT_SMP_CMD_CENTRAL_IDENT,
2097 				     sizeof(*ident));
2098 		if (!buf) {
2099 			LOG_ERR("Unable to allocate Central Ident buffer");
2100 			return;
2101 		}
2102 
2103 		ident = net_buf_add(buf, sizeof(*ident));
2104 		memcpy(ident->rand, rand.rand, sizeof(ident->rand));
2105 		memcpy(ident->ediv, rand.ediv, sizeof(ident->ediv));
2106 
2107 		smp_send(smp, buf, smp_ident_sent, NULL);
2108 
2109 		if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
2110 			bt_keys_add_type(keys, BT_KEYS_PERIPH_LTK);
2111 
2112 			memcpy(keys->periph_ltk.val, rand.key,
2113 			       sizeof(keys->periph_ltk.val));
2114 			memcpy(keys->periph_ltk.rand, rand.rand,
2115 			       sizeof(keys->periph_ltk.rand));
2116 			memcpy(keys->periph_ltk.ediv, rand.ediv,
2117 			       sizeof(keys->periph_ltk.ediv));
2118 		}
2119 	}
2120 }
2121 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
2122 
bt_smp_distribute_keys(struct bt_smp * smp)2123 static uint8_t bt_smp_distribute_keys(struct bt_smp *smp)
2124 {
2125 	struct bt_conn *conn = smp->chan.chan.conn;
2126 	struct bt_keys *keys = conn->le.keys;
2127 
2128 	if (!keys) {
2129 		LOG_ERR("No keys space for %s", bt_addr_le_str(&conn->le.dst));
2130 		return BT_SMP_ERR_UNSPECIFIED;
2131 	}
2132 
2133 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
2134 	/* Distribute legacy pairing specific keys */
2135 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
2136 		legacy_distribute_keys(smp);
2137 	}
2138 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
2139 
2140 #if defined(CONFIG_BT_PRIVACY)
2141 	if (smp->local_dist & BT_SMP_DIST_ID_KEY) {
2142 		struct bt_smp_ident_info *id_info;
2143 		struct bt_smp_ident_addr_info *id_addr_info;
2144 		struct net_buf *buf;
2145 
2146 		buf = smp_create_pdu(smp, BT_SMP_CMD_IDENT_INFO,
2147 				     sizeof(*id_info));
2148 		if (!buf) {
2149 			LOG_ERR("Unable to allocate Ident Info buffer");
2150 			return BT_SMP_ERR_UNSPECIFIED;
2151 		}
2152 
2153 		id_info = net_buf_add(buf, sizeof(*id_info));
2154 		memcpy(id_info->irk, bt_dev.irk[conn->id], 16);
2155 
2156 		smp_send(smp, buf, NULL, NULL);
2157 
2158 		buf = smp_create_pdu(smp, BT_SMP_CMD_IDENT_ADDR_INFO,
2159 				     sizeof(*id_addr_info));
2160 		if (!buf) {
2161 			LOG_ERR("Unable to allocate Ident Addr Info buffer");
2162 			return BT_SMP_ERR_UNSPECIFIED;
2163 		}
2164 
2165 		id_addr_info = net_buf_add(buf, sizeof(*id_addr_info));
2166 		bt_addr_le_copy(&id_addr_info->addr, &bt_dev.id_addr[conn->id]);
2167 
2168 		smp_send(smp, buf, smp_id_sent, NULL);
2169 	}
2170 #endif /* CONFIG_BT_PRIVACY */
2171 
2172 #if defined(CONFIG_BT_SIGNING)
2173 	if (smp->local_dist & BT_SMP_DIST_SIGN) {
2174 		struct bt_smp_signing_info *info;
2175 		struct net_buf *buf;
2176 
2177 		buf = smp_create_pdu(smp, BT_SMP_CMD_SIGNING_INFO,
2178 				     sizeof(*info));
2179 		if (!buf) {
2180 			LOG_ERR("Unable to allocate Signing Info buffer");
2181 			return BT_SMP_ERR_UNSPECIFIED;
2182 		}
2183 
2184 		info = net_buf_add(buf, sizeof(*info));
2185 
2186 		if (bt_rand(info->csrk, sizeof(info->csrk))) {
2187 			return BT_SMP_ERR_UNSPECIFIED;
2188 		}
2189 
2190 		if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
2191 			bt_keys_add_type(keys, BT_KEYS_LOCAL_CSRK);
2192 			memcpy(keys->local_csrk.val, info->csrk, 16);
2193 			keys->local_csrk.cnt = 0U;
2194 		}
2195 
2196 		smp_send(smp, buf, smp_sign_info_sent, NULL);
2197 	}
2198 #endif /* CONFIG_BT_SIGNING */
2199 
2200 	return 0;
2201 }
2202 
2203 #if defined(CONFIG_BT_PERIPHERAL)
send_pairing_rsp(struct bt_smp * smp)2204 static uint8_t send_pairing_rsp(struct bt_smp *smp)
2205 {
2206 	struct bt_smp_pairing *rsp;
2207 	struct net_buf *rsp_buf;
2208 
2209 	rsp_buf = smp_create_pdu(smp, BT_SMP_CMD_PAIRING_RSP, sizeof(*rsp));
2210 	if (!rsp_buf) {
2211 		return BT_SMP_ERR_UNSPECIFIED;
2212 	}
2213 
2214 	rsp = net_buf_add(rsp_buf, sizeof(*rsp));
2215 	memcpy(rsp, smp->prsp + 1, sizeof(*rsp));
2216 
2217 	smp_send(smp, rsp_buf, NULL, NULL);
2218 
2219 	return 0;
2220 }
2221 #endif /* CONFIG_BT_PERIPHERAL */
2222 
smp_pairing_accept_query(struct bt_smp * smp,struct bt_smp_pairing * pairing)2223 static uint8_t smp_pairing_accept_query(struct bt_smp *smp, struct bt_smp_pairing *pairing)
2224 {
2225 #if defined(CONFIG_BT_SMP_APP_PAIRING_ACCEPT)
2226 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
2227 	struct bt_conn *conn = smp->chan.chan.conn;
2228 
2229 	if (smp_auth_cb && smp_auth_cb->pairing_accept) {
2230 		const struct bt_conn_pairing_feat feat = {
2231 			.io_capability = pairing->io_capability,
2232 			.oob_data_flag = pairing->oob_flag,
2233 			.auth_req = pairing->auth_req,
2234 			.max_enc_key_size = pairing->max_key_size,
2235 			.init_key_dist = pairing->init_key_dist,
2236 			.resp_key_dist = pairing->resp_key_dist
2237 		};
2238 
2239 		return smp_err_get(smp_auth_cb->pairing_accept(conn, &feat));
2240 	}
2241 #endif /* CONFIG_BT_SMP_APP_PAIRING_ACCEPT */
2242 	return 0;
2243 }
2244 
2245 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
smp_s1(const uint8_t k[16],const uint8_t r1[16],const uint8_t r2[16],uint8_t out[16])2246 static int smp_s1(const uint8_t k[16], const uint8_t r1[16],
2247 		  const uint8_t r2[16], uint8_t out[16])
2248 {
2249 	/* The most significant 64-bits of r1 are discarded to generate
2250 	 * r1' and the most significant 64-bits of r2 are discarded to
2251 	 * generate r2'.
2252 	 * r1' is concatenated with r2' to generate r' which is used as
2253 	 * the 128-bit input parameter plaintextData to security function e:
2254 	 *
2255 	 *    r' = r1' || r2'
2256 	 */
2257 	memcpy(out, r2, 8);
2258 	memcpy(out + 8, r1, 8);
2259 
2260 	/* s1(k, r1 , r2) = e(k, r') */
2261 	return bt_encrypt_le(k, out, out);
2262 }
2263 
legacy_get_pair_method(struct bt_smp * smp,uint8_t remote_io)2264 static uint8_t legacy_get_pair_method(struct bt_smp *smp, uint8_t remote_io)
2265 {
2266 	struct bt_smp_pairing *req, *rsp;
2267 	uint8_t method;
2268 
2269 	if (remote_io > BT_SMP_IO_KEYBOARD_DISPLAY) {
2270 		return JUST_WORKS;
2271 	}
2272 
2273 	req = (struct bt_smp_pairing *)&smp->preq[1];
2274 	rsp = (struct bt_smp_pairing *)&smp->prsp[1];
2275 
2276 	/* if both sides have OOB data use OOB */
2277 	if ((req->oob_flag & rsp->oob_flag) & BT_SMP_OOB_DATA_MASK) {
2278 		return LEGACY_OOB;
2279 	}
2280 
2281 	/* if none side requires MITM use JustWorks */
2282 	if (!((req->auth_req | rsp->auth_req) & BT_SMP_AUTH_MITM)) {
2283 		return JUST_WORKS;
2284 	}
2285 
2286 	method = gen_method_legacy[remote_io][get_io_capa(smp)];
2287 
2288 	/* if both sides have KeyboardDisplay capabilities, initiator displays
2289 	 * and responder inputs
2290 	 */
2291 	if (method == PASSKEY_ROLE) {
2292 		if (smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
2293 			method = PASSKEY_DISPLAY;
2294 		} else {
2295 			method = PASSKEY_INPUT;
2296 		}
2297 	}
2298 
2299 	return method;
2300 }
2301 
legacy_request_tk(struct bt_smp * smp)2302 static uint8_t legacy_request_tk(struct bt_smp *smp)
2303 {
2304 	struct bt_conn *conn = smp->chan.chan.conn;
2305 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
2306 	struct bt_keys *keys;
2307 	uint32_t passkey;
2308 
2309 	/*
2310 	 * Fail if we have keys that are stronger than keys that will be
2311 	 * distributed in new pairing. This is to avoid replacing authenticated
2312 	 * keys with unauthenticated ones.
2313 	  */
2314 	keys = bt_keys_find_addr(conn->id, &conn->le.dst);
2315 	if (keys && (keys->flags & BT_KEYS_AUTHENTICATED) &&
2316 	    smp->method == JUST_WORKS) {
2317 		LOG_ERR("JustWorks failed, authenticated keys present");
2318 		return BT_SMP_ERR_UNSPECIFIED;
2319 	}
2320 
2321 	switch (smp->method) {
2322 	case LEGACY_OOB:
2323 		if (smp_auth_cb && smp_auth_cb->oob_data_request) {
2324 			struct bt_conn_oob_info info = {
2325 				.type = BT_CONN_OOB_LE_LEGACY,
2326 			};
2327 
2328 			atomic_set_bit(smp->flags, SMP_FLAG_USER);
2329 			smp_auth_cb->oob_data_request(smp->chan.chan.conn, &info);
2330 		} else {
2331 			return BT_SMP_ERR_OOB_NOT_AVAIL;
2332 		}
2333 
2334 		break;
2335 	case PASSKEY_DISPLAY:
2336 		if (IS_ENABLED(CONFIG_BT_FIXED_PASSKEY) &&
2337 		    fixed_passkey != BT_PASSKEY_INVALID) {
2338 			passkey = fixed_passkey;
2339 		} else  {
2340 			if (bt_rand(&passkey, sizeof(passkey))) {
2341 				return BT_SMP_ERR_UNSPECIFIED;
2342 			}
2343 
2344 			passkey %= 1000000;
2345 		}
2346 
2347 		if (IS_ENABLED(CONFIG_BT_LOG_SNIFFER_INFO)) {
2348 			LOG_INF("Legacy passkey %u", passkey);
2349 		}
2350 
2351 		if (smp_auth_cb && smp_auth_cb->passkey_display) {
2352 			atomic_set_bit(smp->flags, SMP_FLAG_DISPLAY);
2353 			smp_auth_cb->passkey_display(conn, passkey);
2354 		}
2355 
2356 		sys_put_le32(passkey, smp->tk);
2357 
2358 		break;
2359 	case PASSKEY_INPUT:
2360 		atomic_set_bit(smp->flags, SMP_FLAG_USER);
2361 		smp_auth_cb->passkey_entry(conn);
2362 		break;
2363 	case JUST_WORKS:
2364 		break;
2365 	default:
2366 		LOG_ERR("Unknown pairing method (%u)", smp->method);
2367 		return BT_SMP_ERR_UNSPECIFIED;
2368 	}
2369 
2370 	return 0;
2371 }
2372 
legacy_send_pairing_confirm(struct bt_smp * smp)2373 static uint8_t legacy_send_pairing_confirm(struct bt_smp *smp)
2374 {
2375 	struct bt_conn *conn = smp->chan.chan.conn;
2376 	struct bt_smp_pairing_confirm *req;
2377 	struct net_buf *buf;
2378 
2379 	buf = smp_create_pdu(smp, BT_SMP_CMD_PAIRING_CONFIRM, sizeof(*req));
2380 	if (!buf) {
2381 		return BT_SMP_ERR_UNSPECIFIED;
2382 	}
2383 
2384 	req = net_buf_add(buf, sizeof(*req));
2385 
2386 	if (smp_c1(smp->tk, smp->prnd, smp->preq, smp->prsp,
2387 		   &conn->le.init_addr, &conn->le.resp_addr, req->val)) {
2388 		net_buf_unref(buf);
2389 		return BT_SMP_ERR_UNSPECIFIED;
2390 	}
2391 
2392 	smp_send(smp, buf, NULL, NULL);
2393 
2394 	atomic_clear_bit(smp->flags, SMP_FLAG_CFM_DELAYED);
2395 
2396 	return 0;
2397 }
2398 
2399 #if defined(CONFIG_BT_PERIPHERAL)
legacy_pairing_req(struct bt_smp * smp)2400 static uint8_t legacy_pairing_req(struct bt_smp *smp)
2401 {
2402 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
2403 	uint8_t ret;
2404 
2405 	LOG_DBG("");
2406 
2407 	ret = legacy_request_tk(smp);
2408 	if (ret) {
2409 		return ret;
2410 	}
2411 
2412 	/* ask for consent if pairing is not due to sending SecReq*/
2413 	if ((DISPLAY_FIXED(smp) || smp->method == JUST_WORKS) &&
2414 	    !atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ) &&
2415 	    smp_auth_cb && smp_auth_cb->pairing_confirm) {
2416 		atomic_set_bit(smp->flags, SMP_FLAG_USER);
2417 		smp_auth_cb->pairing_confirm(smp->chan.chan.conn);
2418 		return 0;
2419 	}
2420 
2421 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
2422 	atomic_set_bit(smp->allowed_cmds, BT_SMP_KEYPRESS_NOTIFICATION);
2423 	return send_pairing_rsp(smp);
2424 }
2425 #endif /* CONFIG_BT_PERIPHERAL */
2426 
legacy_pairing_random(struct bt_smp * smp)2427 static uint8_t legacy_pairing_random(struct bt_smp *smp)
2428 {
2429 	struct bt_conn *conn = smp->chan.chan.conn;
2430 	uint8_t tmp[16];
2431 	int err;
2432 
2433 	LOG_DBG("");
2434 
2435 	/* calculate confirmation */
2436 	err = smp_c1(smp->tk, smp->rrnd, smp->preq, smp->prsp,
2437 		     &conn->le.init_addr, &conn->le.resp_addr, tmp);
2438 	if (err) {
2439 		return BT_SMP_ERR_UNSPECIFIED;
2440 	}
2441 
2442 	LOG_DBG("pcnf %s", bt_hex(smp->pcnf, 16));
2443 	LOG_DBG("cfm %s", bt_hex(tmp, 16));
2444 
2445 	if (memcmp(smp->pcnf, tmp, sizeof(smp->pcnf))) {
2446 		return BT_SMP_ERR_CONFIRM_FAILED;
2447 	}
2448 
2449 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
2450 	    conn->role == BT_HCI_ROLE_CENTRAL) {
2451 		uint8_t ediv[2], rand[8];
2452 
2453 		/* No need to store central STK */
2454 		err = smp_s1(smp->tk, smp->rrnd, smp->prnd, tmp);
2455 		if (err) {
2456 			return BT_SMP_ERR_UNSPECIFIED;
2457 		}
2458 
2459 		/* Rand and EDiv are 0 for the STK */
2460 		(void)memset(ediv, 0, sizeof(ediv));
2461 		(void)memset(rand, 0, sizeof(rand));
2462 		if (bt_conn_le_start_encryption(conn, rand, ediv, tmp,
2463 						get_encryption_key_size(smp))) {
2464 			LOG_ERR("Failed to start encryption");
2465 			return BT_SMP_ERR_UNSPECIFIED;
2466 		}
2467 
2468 		atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
2469 
2470 		if (IS_ENABLED(CONFIG_BT_SMP_USB_HCI_CTLR_WORKAROUND)) {
2471 			if (smp->remote_dist & BT_SMP_DIST_ENC_KEY) {
2472 				atomic_set_bit(smp->allowed_cmds,
2473 					       BT_SMP_CMD_ENCRYPT_INFO);
2474 			} else if (smp->remote_dist & BT_SMP_DIST_ID_KEY) {
2475 				atomic_set_bit(smp->allowed_cmds,
2476 					       BT_SMP_CMD_IDENT_INFO);
2477 			} else if (smp->remote_dist & BT_SMP_DIST_SIGN) {
2478 				atomic_set_bit(smp->allowed_cmds,
2479 					       BT_SMP_CMD_SIGNING_INFO);
2480 			}
2481 		}
2482 
2483 		return 0;
2484 	}
2485 
2486 	if (IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
2487 		err = smp_s1(smp->tk, smp->prnd, smp->rrnd, tmp);
2488 		if (err) {
2489 			LOG_ERR("Calculate STK failed");
2490 			return BT_SMP_ERR_UNSPECIFIED;
2491 		}
2492 
2493 		memcpy(smp->tk, tmp, sizeof(smp->tk));
2494 		LOG_DBG("generated STK %s", bt_hex(smp->tk, 16));
2495 
2496 		atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
2497 
2498 		return smp_send_pairing_random(smp);
2499 	}
2500 
2501 	return 0;
2502 }
2503 
legacy_pairing_confirm(struct bt_smp * smp)2504 static uint8_t legacy_pairing_confirm(struct bt_smp *smp)
2505 {
2506 	LOG_DBG("");
2507 
2508 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
2509 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
2510 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
2511 		return legacy_send_pairing_confirm(smp);
2512 	}
2513 
2514 	if (IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
2515 		if (!atomic_test_bit(smp->flags, SMP_FLAG_USER)) {
2516 			atomic_set_bit(smp->allowed_cmds,
2517 				       BT_SMP_CMD_PAIRING_RANDOM);
2518 			return legacy_send_pairing_confirm(smp);
2519 		}
2520 
2521 		atomic_set_bit(smp->flags, SMP_FLAG_CFM_DELAYED);
2522 	}
2523 
2524 	return 0;
2525 }
2526 
legacy_user_tk_entry(struct bt_smp * smp)2527 static void legacy_user_tk_entry(struct bt_smp *smp)
2528 {
2529 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_CFM_DELAYED)) {
2530 		return;
2531 	}
2532 
2533 	/* if confirm failed ie. due to invalid passkey, cancel pairing */
2534 	if (legacy_pairing_confirm(smp)) {
2535 		smp_error(smp, BT_SMP_ERR_PASSKEY_ENTRY_FAILED);
2536 		return;
2537 	}
2538 
2539 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
2540 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
2541 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
2542 		return;
2543 	}
2544 
2545 	if (IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
2546 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
2547 	}
2548 }
2549 
legacy_passkey_entry(struct bt_smp * smp,unsigned int passkey)2550 static void legacy_passkey_entry(struct bt_smp *smp, unsigned int passkey)
2551 {
2552 	passkey = sys_cpu_to_le32(passkey);
2553 	memcpy(smp->tk, &passkey, sizeof(passkey));
2554 
2555 	legacy_user_tk_entry(smp);
2556 }
2557 
smp_encrypt_info(struct bt_smp * smp,struct net_buf * buf)2558 static uint8_t smp_encrypt_info(struct bt_smp *smp, struct net_buf *buf)
2559 {
2560 	LOG_DBG("");
2561 
2562 	if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
2563 		struct bt_smp_encrypt_info *req = (void *)buf->data;
2564 		struct bt_conn *conn = smp->chan.chan.conn;
2565 		struct bt_keys *keys;
2566 
2567 		keys = bt_keys_get_type(BT_KEYS_LTK, conn->id, &conn->le.dst);
2568 		if (!keys) {
2569 			LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&conn->le.dst));
2570 			return BT_SMP_ERR_UNSPECIFIED;
2571 		}
2572 
2573 		memcpy(keys->ltk.val, req->ltk, 16);
2574 	}
2575 
2576 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_CENTRAL_IDENT);
2577 
2578 	return 0;
2579 }
2580 
smp_central_ident(struct bt_smp * smp,struct net_buf * buf)2581 static uint8_t smp_central_ident(struct bt_smp *smp, struct net_buf *buf)
2582 {
2583 	struct bt_conn *conn = smp->chan.chan.conn;
2584 	uint8_t err;
2585 
2586 	LOG_DBG("");
2587 
2588 	if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
2589 		struct bt_smp_central_ident *req = (void *)buf->data;
2590 		struct bt_keys *keys;
2591 
2592 		keys = bt_keys_get_type(BT_KEYS_LTK, conn->id, &conn->le.dst);
2593 		if (!keys) {
2594 			LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&conn->le.dst));
2595 			return BT_SMP_ERR_UNSPECIFIED;
2596 		}
2597 
2598 		memcpy(keys->ltk.ediv, req->ediv, sizeof(keys->ltk.ediv));
2599 		memcpy(keys->ltk.rand, req->rand, sizeof(req->rand));
2600 	}
2601 
2602 	smp->remote_dist &= ~BT_SMP_DIST_ENC_KEY;
2603 
2604 	if (smp->remote_dist & BT_SMP_DIST_ID_KEY) {
2605 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_IDENT_INFO);
2606 	} else if (smp->remote_dist & BT_SMP_DIST_SIGN) {
2607 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
2608 	}
2609 
2610 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
2611 	    conn->role == BT_HCI_ROLE_CENTRAL && !smp->remote_dist) {
2612 		err = bt_smp_distribute_keys(smp);
2613 		if (err) {
2614 			return err;
2615 		}
2616 	}
2617 
2618 	/* if all keys were distributed, pairing is done */
2619 	if (!smp->local_dist && !smp->remote_dist) {
2620 		smp_pairing_complete(smp, 0);
2621 	}
2622 
2623 	return 0;
2624 }
2625 
2626 #if defined(CONFIG_BT_CENTRAL)
legacy_pairing_rsp(struct bt_smp * smp)2627 static uint8_t legacy_pairing_rsp(struct bt_smp *smp)
2628 {
2629 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
2630 	uint8_t ret;
2631 
2632 	LOG_DBG("");
2633 
2634 	ret = legacy_request_tk(smp);
2635 	if (ret) {
2636 		return ret;
2637 	}
2638 
2639 	/* ask for consent if this is due to received SecReq */
2640 	if ((DISPLAY_FIXED(smp) || smp->method == JUST_WORKS) &&
2641 	    atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ) &&
2642 	    smp_auth_cb && smp_auth_cb->pairing_confirm) {
2643 		atomic_set_bit(smp->flags, SMP_FLAG_USER);
2644 		smp_auth_cb->pairing_confirm(smp->chan.chan.conn);
2645 		return 0;
2646 	}
2647 
2648 	if (!atomic_test_bit(smp->flags, SMP_FLAG_USER)) {
2649 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
2650 		atomic_set_bit(smp->allowed_cmds, BT_SMP_KEYPRESS_NOTIFICATION);
2651 		return legacy_send_pairing_confirm(smp);
2652 	}
2653 
2654 	atomic_set_bit(smp->flags, SMP_FLAG_CFM_DELAYED);
2655 
2656 	return 0;
2657 }
2658 #endif /* CONFIG_BT_CENTRAL */
2659 #else
smp_encrypt_info(struct bt_smp * smp,struct net_buf * buf)2660 static uint8_t smp_encrypt_info(struct bt_smp *smp, struct net_buf *buf)
2661 {
2662 	return BT_SMP_ERR_CMD_NOTSUPP;
2663 }
2664 
smp_central_ident(struct bt_smp * smp,struct net_buf * buf)2665 static uint8_t smp_central_ident(struct bt_smp *smp, struct net_buf *buf)
2666 {
2667 	return BT_SMP_ERR_CMD_NOTSUPP;
2668 }
2669 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
2670 
smp_init(struct bt_smp * smp)2671 static int smp_init(struct bt_smp *smp)
2672 {
2673 	/* Initialize SMP context excluding L2CAP channel context and anything
2674 	 * else declared after.
2675 	 */
2676 	(void)memset(smp, 0, offsetof(struct bt_smp, chan));
2677 
2678 	/* Generate local random number */
2679 	if (bt_rand(smp->prnd, 16)) {
2680 		return BT_SMP_ERR_UNSPECIFIED;
2681 	}
2682 
2683 	LOG_DBG("prnd %s", bt_hex(smp->prnd, 16));
2684 
2685 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_FAIL);
2686 
2687 #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
2688 	sc_public_key = bt_pub_key_get();
2689 #endif
2690 
2691 	return 0;
2692 }
2693 
bt_set_bondable(bool enable)2694 void bt_set_bondable(bool enable)
2695 {
2696 	bondable = enable;
2697 }
2698 
bt_get_bondable(void)2699 bool bt_get_bondable(void)
2700 {
2701 	return bondable;
2702 }
2703 
bt_le_oob_set_sc_flag(bool enable)2704 void bt_le_oob_set_sc_flag(bool enable)
2705 {
2706 	sc_oobd_present = enable;
2707 }
2708 
bt_le_oob_set_legacy_flag(bool enable)2709 void bt_le_oob_set_legacy_flag(bool enable)
2710 {
2711 	legacy_oobd_present = enable;
2712 }
2713 
get_auth(struct bt_smp * smp,uint8_t auth)2714 static uint8_t get_auth(struct bt_smp *smp, uint8_t auth)
2715 {
2716 	struct bt_conn *conn = smp->chan.chan.conn;
2717 
2718 	if (sc_supported) {
2719 		auth &= BT_SMP_AUTH_MASK_SC;
2720 	} else {
2721 		auth &= BT_SMP_AUTH_MASK;
2722 	}
2723 
2724 	if ((get_io_capa(smp) == BT_SMP_IO_NO_INPUT_OUTPUT) ||
2725 	    (!IS_ENABLED(CONFIG_BT_SMP_ENFORCE_MITM) &&
2726 	    (conn->required_sec_level < BT_SECURITY_L3))) {
2727 		auth &= ~(BT_SMP_AUTH_MITM);
2728 	} else {
2729 		auth |= BT_SMP_AUTH_MITM;
2730 	}
2731 
2732 	if (latch_bondable(smp)) {
2733 		auth |= BT_SMP_AUTH_BONDING;
2734 	} else {
2735 		auth &= ~BT_SMP_AUTH_BONDING;
2736 	}
2737 
2738 	if (IS_ENABLED(CONFIG_BT_PASSKEY_KEYPRESS)) {
2739 		auth |= BT_SMP_AUTH_KEYPRESS;
2740 	} else {
2741 		auth &= ~BT_SMP_AUTH_KEYPRESS;
2742 	}
2743 
2744 #if defined(CONFIG_BT_CLASSIC)
2745 	auth |= BT_SMP_AUTH_CT2;
2746 #endif /* CONFIG_BT_CLASSIC */
2747 
2748 	return auth;
2749 }
2750 
remote_sec_level_reachable(struct bt_smp * smp)2751 static uint8_t remote_sec_level_reachable(struct bt_smp *smp)
2752 {
2753 	bt_security_t sec = smp->chan.chan.conn->required_sec_level;
2754 
2755 	if (IS_ENABLED(CONFIG_BT_SMP_SC_ONLY)) {
2756 		sec = BT_SECURITY_L4;
2757 	}
2758 	if (IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
2759 		sec = BT_SECURITY_L3;
2760 	}
2761 
2762 	switch (sec) {
2763 	case BT_SECURITY_L1:
2764 	case BT_SECURITY_L2:
2765 		return 0;
2766 
2767 	case BT_SECURITY_L4:
2768 		if (get_encryption_key_size(smp) != BT_SMP_MAX_ENC_KEY_SIZE) {
2769 			return BT_SMP_ERR_ENC_KEY_SIZE;
2770 		}
2771 
2772 		if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
2773 			return BT_SMP_ERR_AUTH_REQUIREMENTS;
2774 		}
2775 		__fallthrough;
2776 	case BT_SECURITY_L3:
2777 		if (smp->method == JUST_WORKS) {
2778 			return BT_SMP_ERR_AUTH_REQUIREMENTS;
2779 		}
2780 
2781 		return 0;
2782 	default:
2783 		return BT_SMP_ERR_UNSPECIFIED;
2784 	}
2785 }
2786 
sec_level_reachable(struct bt_smp * smp)2787 static bool sec_level_reachable(struct bt_smp *smp)
2788 {
2789 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
2790 
2791 	switch (smp->chan.chan.conn->required_sec_level) {
2792 	case BT_SECURITY_L1:
2793 	case BT_SECURITY_L2:
2794 		return true;
2795 	case BT_SECURITY_L3:
2796 		return get_io_capa(smp) != BT_SMP_IO_NO_INPUT_OUTPUT ||
2797 		       (smp_auth_cb && smp_auth_cb->oob_data_request);
2798 	case BT_SECURITY_L4:
2799 		return (get_io_capa(smp) != BT_SMP_IO_NO_INPUT_OUTPUT ||
2800 		       (smp_auth_cb && smp_auth_cb->oob_data_request)) && sc_supported;
2801 	default:
2802 		return false;
2803 	}
2804 }
2805 
smp_chan_get(struct bt_conn * conn)2806 static struct bt_smp *smp_chan_get(struct bt_conn *conn)
2807 {
2808 	struct bt_l2cap_chan *chan;
2809 
2810 	chan = bt_l2cap_le_lookup_rx_cid(conn, BT_L2CAP_CID_SMP);
2811 	if (!chan) {
2812 		LOG_ERR("Unable to find SMP channel");
2813 		return NULL;
2814 	}
2815 
2816 	return CONTAINER_OF(chan, struct bt_smp, chan.chan);
2817 }
2818 
bt_smp_request_ltk(struct bt_conn * conn,uint64_t rand,uint16_t ediv,uint8_t * ltk)2819 bool bt_smp_request_ltk(struct bt_conn *conn, uint64_t rand, uint16_t ediv, uint8_t *ltk)
2820 {
2821 	struct bt_smp *smp;
2822 	uint8_t enc_size;
2823 
2824 	smp = smp_chan_get(conn);
2825 	if (!smp) {
2826 		return false;
2827 	}
2828 
2829 	/*
2830 	 * Both legacy STK and LE SC LTK have rand and ediv equal to zero.
2831 	 * If pairing is in progress use the TK for encryption.
2832 	 */
2833 	if (ediv == 0U && rand == 0U &&
2834 	    atomic_test_bit(smp->flags, SMP_FLAG_PAIRING) &&
2835 	    atomic_test_bit(smp->flags, SMP_FLAG_ENC_PENDING)) {
2836 		enc_size = get_encryption_key_size(smp);
2837 
2838 		/*
2839 		 * We keep both legacy STK and LE SC LTK in TK.
2840 		 * Also use only enc_size bytes of key for encryption.
2841 		 */
2842 		memcpy(ltk, smp->tk, enc_size);
2843 		if (enc_size < BT_SMP_MAX_ENC_KEY_SIZE) {
2844 			(void)memset(ltk + enc_size, 0,
2845 				     BT_SMP_MAX_ENC_KEY_SIZE - enc_size);
2846 		}
2847 
2848 		atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
2849 		return true;
2850 	}
2851 
2852 	if (!conn->le.keys) {
2853 		conn->le.keys = bt_keys_find(BT_KEYS_LTK_P256, conn->id,
2854 					     &conn->le.dst);
2855 		if (!conn->le.keys) {
2856 			conn->le.keys = bt_keys_find(BT_KEYS_PERIPH_LTK,
2857 						     conn->id, &conn->le.dst);
2858 		}
2859 	}
2860 
2861 	if (ediv == 0U && rand == 0U &&
2862 	    conn->le.keys && (conn->le.keys->keys & BT_KEYS_LTK_P256)) {
2863 		enc_size = conn->le.keys->enc_size;
2864 
2865 		memcpy(ltk, conn->le.keys->ltk.val, enc_size);
2866 		if (enc_size < BT_SMP_MAX_ENC_KEY_SIZE) {
2867 			(void)memset(ltk + enc_size, 0,
2868 				     BT_SMP_MAX_ENC_KEY_SIZE - enc_size);
2869 		}
2870 
2871 		atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
2872 		return true;
2873 	}
2874 
2875 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
2876 	if (conn->le.keys && (conn->le.keys->keys & BT_KEYS_PERIPH_LTK) &&
2877 	    !memcmp(conn->le.keys->periph_ltk.rand, &rand, 8) &&
2878 	    !memcmp(conn->le.keys->periph_ltk.ediv, &ediv, 2)) {
2879 		enc_size = conn->le.keys->enc_size;
2880 
2881 		memcpy(ltk, conn->le.keys->periph_ltk.val, enc_size);
2882 		if (enc_size < BT_SMP_MAX_ENC_KEY_SIZE) {
2883 			(void)memset(ltk + enc_size, 0,
2884 				     BT_SMP_MAX_ENC_KEY_SIZE - enc_size);
2885 		}
2886 
2887 		atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
2888 		return true;
2889 	}
2890 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
2891 
2892 	if (atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ)) {
2893 		/* Notify higher level that security failed if security was
2894 		 * initiated by peripheral.
2895 		 */
2896 		bt_conn_security_changed(conn, BT_HCI_ERR_PIN_OR_KEY_MISSING,
2897 					 BT_SECURITY_ERR_PIN_OR_KEY_MISSING);
2898 	}
2899 
2900 	smp_reset(smp);
2901 	return false;
2902 }
2903 
2904 #if defined(CONFIG_BT_PERIPHERAL)
smp_send_security_req(struct bt_conn * conn)2905 static int smp_send_security_req(struct bt_conn *conn)
2906 {
2907 	struct bt_smp *smp;
2908 	struct bt_smp_security_request *req;
2909 	struct net_buf *req_buf;
2910 	int err;
2911 
2912 	LOG_DBG("");
2913 	smp = smp_chan_get(conn);
2914 	if (!smp) {
2915 		return -ENOTCONN;
2916 	}
2917 
2918 	/* SMP Timeout */
2919 	if (atomic_test_bit(smp->flags, SMP_FLAG_TIMEOUT)) {
2920 		return -EIO;
2921 	}
2922 
2923 	/* pairing is in progress */
2924 	if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
2925 		return -EBUSY;
2926 	}
2927 
2928 	if (atomic_test_bit(smp->flags, SMP_FLAG_ENC_PENDING)) {
2929 		return -EBUSY;
2930 	}
2931 
2932 	/* early verify if required sec level if reachable */
2933 	if (!(sec_level_reachable(smp) || smp_keys_check(conn))) {
2934 		return -EINVAL;
2935 	}
2936 
2937 	if (!conn->le.keys) {
2938 		conn->le.keys = bt_keys_get_addr(conn->id, &conn->le.dst);
2939 		if (!conn->le.keys) {
2940 			return -ENOMEM;
2941 		}
2942 	}
2943 
2944 	if (smp_init(smp) != 0) {
2945 		return -ENOBUFS;
2946 	}
2947 
2948 	req_buf = smp_create_pdu(smp, BT_SMP_CMD_SECURITY_REQUEST,
2949 				 sizeof(*req));
2950 	if (!req_buf) {
2951 		return -ENOBUFS;
2952 	}
2953 
2954 	req = net_buf_add(req_buf, sizeof(*req));
2955 	req->auth_req = get_auth(smp, BT_SMP_AUTH_DEFAULT);
2956 
2957 	/* SMP timer is not restarted for SecRequest so don't use smp_send */
2958 	err = bt_l2cap_send_pdu(&smp->chan, req_buf, NULL, NULL);
2959 	if (err) {
2960 		net_buf_unref(req_buf);
2961 		return err;
2962 	}
2963 
2964 	atomic_set_bit(smp->flags, SMP_FLAG_SEC_REQ);
2965 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_REQ);
2966 
2967 	return 0;
2968 }
2969 
smp_pairing_req(struct bt_smp * smp,struct net_buf * buf)2970 static uint8_t smp_pairing_req(struct bt_smp *smp, struct net_buf *buf)
2971 {
2972 	struct bt_conn *conn = smp->chan.chan.conn;
2973 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
2974 
2975 	struct bt_smp_pairing *req = (void *)buf->data;
2976 	struct bt_smp_pairing *rsp;
2977 	uint8_t err;
2978 
2979 	LOG_DBG("req: io_capability 0x%02X, oob_flag 0x%02X, auth_req 0x%02X, "
2980 		"max_key_size 0x%02X, init_key_dist 0x%02X, resp_key_dist 0x%02X",
2981 		req->io_capability, req->oob_flag, req->auth_req,
2982 		req->max_key_size, req->init_key_dist, req->resp_key_dist);
2983 
2984 	if ((req->max_key_size > BT_SMP_MAX_ENC_KEY_SIZE) ||
2985 	    (req->max_key_size < BT_SMP_MIN_ENC_KEY_SIZE)) {
2986 		return BT_SMP_ERR_ENC_KEY_SIZE;
2987 	}
2988 
2989 	if (!conn->le.keys) {
2990 		conn->le.keys = bt_keys_get_addr(conn->id, &conn->le.dst);
2991 		if (!conn->le.keys) {
2992 			LOG_DBG("Unable to get keys for %s", bt_addr_le_str(&conn->le.dst));
2993 			return BT_SMP_ERR_UNSPECIFIED;
2994 		}
2995 	}
2996 
2997 	/* If we already sent a security request then the SMP context
2998 	 * is already initialized.
2999 	 */
3000 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ)) {
3001 		int ret = smp_init(smp);
3002 
3003 		if (ret) {
3004 			return ret;
3005 		}
3006 	}
3007 
3008 	/* Store req for later use */
3009 	smp->preq[0] = BT_SMP_CMD_PAIRING_REQ;
3010 	memcpy(smp->preq + 1, req, sizeof(*req));
3011 
3012 	/* create rsp, it will be used later on */
3013 	smp->prsp[0] = BT_SMP_CMD_PAIRING_RSP;
3014 	rsp = (struct bt_smp_pairing *)&smp->prsp[1];
3015 
3016 	rsp->auth_req = get_auth(smp, req->auth_req);
3017 	rsp->io_capability = get_io_capa(smp);
3018 	rsp->max_key_size = BT_SMP_MAX_ENC_KEY_SIZE;
3019 	rsp->init_key_dist = (req->init_key_dist & RECV_KEYS);
3020 	rsp->resp_key_dist = (req->resp_key_dist & SEND_KEYS);
3021 
3022 	if ((rsp->auth_req & BT_SMP_AUTH_SC) &&
3023 	    (req->auth_req & BT_SMP_AUTH_SC)) {
3024 		atomic_set_bit(smp->flags, SMP_FLAG_SC);
3025 
3026 		rsp->init_key_dist &= RECV_KEYS_SC;
3027 		rsp->resp_key_dist &= SEND_KEYS_SC;
3028 	}
3029 
3030 	if (atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
3031 		rsp->oob_flag = sc_oobd_present ? BT_SMP_OOB_PRESENT :
3032 				BT_SMP_OOB_NOT_PRESENT;
3033 	} else {
3034 		rsp->oob_flag = legacy_oobd_present ? BT_SMP_OOB_PRESENT :
3035 				BT_SMP_OOB_NOT_PRESENT;
3036 	}
3037 
3038 	if ((rsp->auth_req & BT_SMP_AUTH_CT2) &&
3039 	    (req->auth_req & BT_SMP_AUTH_CT2)) {
3040 		atomic_set_bit(smp->flags, SMP_FLAG_CT2);
3041 	}
3042 
3043 	if ((rsp->auth_req & BT_SMP_AUTH_BONDING) &&
3044 	    (req->auth_req & BT_SMP_AUTH_BONDING)) {
3045 		atomic_set_bit(smp->flags, SMP_FLAG_BOND);
3046 	} else if (IS_ENABLED(CONFIG_BT_BONDING_REQUIRED)) {
3047 		/* Reject pairing req if not both intend to bond */
3048 		LOG_DBG("Bonding required");
3049 		return BT_SMP_ERR_UNSPECIFIED;
3050 	} else {
3051 		rsp->init_key_dist = 0;
3052 		rsp->resp_key_dist = 0;
3053 	}
3054 
3055 	smp->local_dist = rsp->resp_key_dist;
3056 	smp->remote_dist = rsp->init_key_dist;
3057 
3058 	atomic_set_bit(smp->flags, SMP_FLAG_PAIRING);
3059 
3060 	smp->method = get_pair_method(smp, req->io_capability);
3061 
3062 	if (!update_keys_check(smp, conn->le.keys)) {
3063 		return BT_SMP_ERR_AUTH_REQUIREMENTS;
3064 	}
3065 
3066 	err = remote_sec_level_reachable(smp);
3067 	if (err) {
3068 		return err;
3069 	}
3070 
3071 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
3072 #if defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
3073 		return BT_SMP_ERR_AUTH_REQUIREMENTS;
3074 #else
3075 		if (IS_ENABLED(CONFIG_BT_SMP_APP_PAIRING_ACCEPT)) {
3076 			err = smp_pairing_accept_query(smp, req);
3077 			if (err) {
3078 				return err;
3079 			}
3080 		}
3081 
3082 		return legacy_pairing_req(smp);
3083 #endif /* CONFIG_BT_SMP_SC_PAIR_ONLY */
3084 	}
3085 
3086 	if (IS_ENABLED(CONFIG_BT_SMP_APP_PAIRING_ACCEPT)) {
3087 		err = smp_pairing_accept_query(smp, req);
3088 		if (err) {
3089 			return err;
3090 		}
3091 	}
3092 
3093 	if (!IS_ENABLED(CONFIG_BT_SMP_SC_PAIR_ONLY) &&
3094 	    (DISPLAY_FIXED(smp) || smp->method == JUST_WORKS) &&
3095 	    !atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ) &&
3096 	    smp_auth_cb && smp_auth_cb->pairing_confirm) {
3097 		atomic_set_bit(smp->flags, SMP_FLAG_USER);
3098 		smp_auth_cb->pairing_confirm(conn);
3099 		return 0;
3100 	}
3101 
3102 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PUBLIC_KEY);
3103 
3104 	LOG_DBG("rsp: io_capability 0x%02X, oob_flag 0x%02X, auth_req 0x%02X, "
3105 		"max_key_size 0x%02X, init_key_dist 0x%02X, resp_key_dist 0x%02X",
3106 		rsp->io_capability, rsp->oob_flag, rsp->auth_req,
3107 		rsp->max_key_size, rsp->init_key_dist, rsp->resp_key_dist);
3108 
3109 	return send_pairing_rsp(smp);
3110 }
3111 #else
smp_pairing_req(struct bt_smp * smp,struct net_buf * buf)3112 static uint8_t smp_pairing_req(struct bt_smp *smp, struct net_buf *buf)
3113 {
3114 	return BT_SMP_ERR_CMD_NOTSUPP;
3115 }
3116 #endif /* CONFIG_BT_PERIPHERAL */
3117 
sc_send_public_key(struct bt_smp * smp)3118 static uint8_t sc_send_public_key(struct bt_smp *smp)
3119 {
3120 	struct bt_smp_public_key *req;
3121 	struct net_buf *req_buf;
3122 
3123 	req_buf = smp_create_pdu(smp, BT_SMP_CMD_PUBLIC_KEY, sizeof(*req));
3124 	if (!req_buf) {
3125 		return BT_SMP_ERR_UNSPECIFIED;
3126 	}
3127 
3128 	req = net_buf_add(req_buf, sizeof(*req));
3129 
3130 	memcpy(req->x, sc_public_key, sizeof(req->x));
3131 	memcpy(req->y, &sc_public_key[32], sizeof(req->y));
3132 
3133 	smp_send(smp, req_buf, NULL, NULL);
3134 
3135 	if (IS_ENABLED(CONFIG_BT_USE_DEBUG_KEYS)) {
3136 		atomic_set_bit(smp->flags, SMP_FLAG_SC_DEBUG_KEY);
3137 	}
3138 
3139 	return 0;
3140 }
3141 
3142 #if defined(CONFIG_BT_CENTRAL)
smp_send_pairing_req(struct bt_conn * conn)3143 static int smp_send_pairing_req(struct bt_conn *conn)
3144 {
3145 	struct bt_smp *smp;
3146 	struct bt_smp_pairing *req;
3147 	struct net_buf *req_buf;
3148 
3149 	LOG_DBG("");
3150 
3151 	smp = smp_chan_get(conn);
3152 	if (!smp) {
3153 		return -ENOTCONN;
3154 	}
3155 
3156 	/* SMP Timeout */
3157 	if (atomic_test_bit(smp->flags, SMP_FLAG_TIMEOUT)) {
3158 		return -EIO;
3159 	}
3160 
3161 	/* A higher security level is requested during the key distribution
3162 	 * phase, once pairing is complete a new pairing procedure will start.
3163 	 */
3164 	if (atomic_test_bit(smp->flags, SMP_FLAG_KEYS_DISTR)) {
3165 		return 0;
3166 	}
3167 
3168 	/* pairing is in progress */
3169 	if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
3170 		return -EBUSY;
3171 	}
3172 
3173 	/* Encryption is in progress */
3174 	if (atomic_test_bit(smp->flags, SMP_FLAG_ENC_PENDING)) {
3175 		return -EBUSY;
3176 	}
3177 
3178 	/* early verify if required sec level if reachable */
3179 	if (!sec_level_reachable(smp)) {
3180 		return -EINVAL;
3181 	}
3182 
3183 	if (!conn->le.keys) {
3184 		conn->le.keys = bt_keys_get_addr(conn->id, &conn->le.dst);
3185 		if (!conn->le.keys) {
3186 			return -ENOMEM;
3187 		}
3188 	}
3189 
3190 	if (smp_init(smp)) {
3191 		return -ENOBUFS;
3192 	}
3193 
3194 	req_buf = smp_create_pdu(smp, BT_SMP_CMD_PAIRING_REQ, sizeof(*req));
3195 	if (!req_buf) {
3196 		return -ENOBUFS;
3197 	}
3198 
3199 	req = net_buf_add(req_buf, sizeof(*req));
3200 
3201 	req->auth_req = get_auth(smp, BT_SMP_AUTH_DEFAULT);
3202 	req->io_capability = get_io_capa(smp);
3203 
3204 	/* At this point is it unknown if pairing will be legacy or LE SC so
3205 	 * set OOB flag if any OOB data is present and assume to peer device
3206 	 * provides OOB data that will match it's pairing type.
3207 	 */
3208 	req->oob_flag = (legacy_oobd_present || sc_oobd_present) ?
3209 				BT_SMP_OOB_PRESENT : BT_SMP_OOB_NOT_PRESENT;
3210 
3211 	req->max_key_size = BT_SMP_MAX_ENC_KEY_SIZE;
3212 
3213 	if (req->auth_req & BT_SMP_AUTH_BONDING) {
3214 		req->init_key_dist = SEND_KEYS;
3215 		req->resp_key_dist = RECV_KEYS;
3216 	} else {
3217 		req->init_key_dist = 0;
3218 		req->resp_key_dist = 0;
3219 	}
3220 
3221 	smp->local_dist = req->init_key_dist;
3222 	smp->remote_dist = req->resp_key_dist;
3223 
3224 	/* Store req for later use */
3225 	smp->preq[0] = BT_SMP_CMD_PAIRING_REQ;
3226 	memcpy(smp->preq + 1, req, sizeof(*req));
3227 
3228 	LOG_DBG("req: io_capability 0x%02X, oob_flag 0x%02X, auth_req 0x%02X, "
3229 		"max_key_size 0x%02X, init_key_dist 0x%02X, resp_key_dist 0x%02X",
3230 		req->io_capability, req->oob_flag, req->auth_req,
3231 		req->max_key_size, req->init_key_dist, req->resp_key_dist);
3232 
3233 	smp_send(smp, req_buf, NULL, NULL);
3234 
3235 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RSP);
3236 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SECURITY_REQUEST);
3237 	atomic_set_bit(smp->flags, SMP_FLAG_PAIRING);
3238 
3239 	return 0;
3240 }
3241 
smp_pairing_rsp(struct bt_smp * smp,struct net_buf * buf)3242 static uint8_t smp_pairing_rsp(struct bt_smp *smp, struct net_buf *buf)
3243 {
3244 	struct bt_conn *conn = smp->chan.chan.conn;
3245 	struct bt_smp_pairing *rsp = (void *)buf->data;
3246 	struct bt_smp_pairing *req = (struct bt_smp_pairing *)&smp->preq[1];
3247 	uint8_t err;
3248 
3249 	LOG_DBG("rsp: io_capability 0x%02X, oob_flag 0x%02X, auth_req 0x%02X, "
3250 		"max_key_size 0x%02X, init_key_dist 0x%02X, resp_key_dist 0x%02X",
3251 		rsp->io_capability, rsp->oob_flag, rsp->auth_req,
3252 		rsp->max_key_size, rsp->init_key_dist, rsp->resp_key_dist);
3253 
3254 	if ((rsp->max_key_size > BT_SMP_MAX_ENC_KEY_SIZE) ||
3255 	    (rsp->max_key_size < BT_SMP_MIN_ENC_KEY_SIZE)) {
3256 		return BT_SMP_ERR_ENC_KEY_SIZE;
3257 	}
3258 
3259 	smp->local_dist &= rsp->init_key_dist;
3260 	smp->remote_dist &= rsp->resp_key_dist;
3261 
3262 	/* Store rsp for later use */
3263 	smp->prsp[0] = BT_SMP_CMD_PAIRING_RSP;
3264 	memcpy(smp->prsp + 1, rsp, sizeof(*rsp));
3265 
3266 	if ((rsp->auth_req & BT_SMP_AUTH_SC) &&
3267 	    (req->auth_req & BT_SMP_AUTH_SC)) {
3268 		atomic_set_bit(smp->flags, SMP_FLAG_SC);
3269 	}
3270 
3271 	if ((rsp->auth_req & BT_SMP_AUTH_CT2) &&
3272 	    (req->auth_req & BT_SMP_AUTH_CT2)) {
3273 		atomic_set_bit(smp->flags, SMP_FLAG_CT2);
3274 	}
3275 
3276 	if ((rsp->auth_req & BT_SMP_AUTH_BONDING) &&
3277 	    (req->auth_req & BT_SMP_AUTH_BONDING)) {
3278 		atomic_set_bit(smp->flags, SMP_FLAG_BOND);
3279 	} else if (IS_ENABLED(CONFIG_BT_BONDING_REQUIRED)) {
3280 		/* Reject pairing req if not both intend to bond */
3281 		LOG_DBG("Bonding required");
3282 		return BT_SMP_ERR_UNSPECIFIED;
3283 	} else {
3284 		smp->local_dist = 0;
3285 		smp->remote_dist = 0;
3286 	}
3287 
3288 	smp->method = get_pair_method(smp, rsp->io_capability);
3289 
3290 	if (!update_keys_check(smp, conn->le.keys)) {
3291 		return BT_SMP_ERR_AUTH_REQUIREMENTS;
3292 	}
3293 
3294 	err = remote_sec_level_reachable(smp);
3295 	if (err) {
3296 		return err;
3297 	}
3298 
3299 	/* the OR operation evaluated by "if" statement below seems redundant
3300 	 * when CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY is enabled, because in
3301 	 * that case the SMP_FLAG_SC will always be set to false. But it's
3302 	 * needed in order to inform the compiler that the inside of the "if"
3303 	 * is the return point for CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY enabled
3304 	 * builds. This avoids compiler warnings regarding the code after the
3305 	 * "if" statement, that would happen for builds with
3306 	 * CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY enabled
3307 	 */
3308 	if (IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) ||
3309 	    !atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
3310 #if defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
3311 		return BT_SMP_ERR_AUTH_REQUIREMENTS;
3312 #else
3313 		if (IS_ENABLED(CONFIG_BT_SMP_APP_PAIRING_ACCEPT)) {
3314 			err = smp_pairing_accept_query(smp, rsp);
3315 			if (err) {
3316 				return err;
3317 			}
3318 		}
3319 
3320 		return legacy_pairing_rsp(smp);
3321 #endif /* CONFIG_BT_SMP_SC_PAIR_ONLY */
3322 	}
3323 
3324 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
3325 
3326 	smp->local_dist &= SEND_KEYS_SC;
3327 	smp->remote_dist &= RECV_KEYS_SC;
3328 
3329 	if (IS_ENABLED(CONFIG_BT_SMP_APP_PAIRING_ACCEPT)) {
3330 		err = smp_pairing_accept_query(smp, rsp);
3331 		if (err) {
3332 			return err;
3333 		}
3334 	}
3335 
3336 	if (!IS_ENABLED(CONFIG_BT_SMP_SC_PAIR_ONLY) &&
3337 	    (DISPLAY_FIXED(smp) || smp->method == JUST_WORKS) &&
3338 	    atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ) &&
3339 	    smp_auth_cb && smp_auth_cb->pairing_confirm) {
3340 		atomic_set_bit(smp->flags, SMP_FLAG_USER);
3341 		smp_auth_cb->pairing_confirm(conn);
3342 		return 0;
3343 	}
3344 
3345 	if (!sc_public_key) {
3346 		atomic_set_bit(smp->flags, SMP_FLAG_PKEY_SEND);
3347 		return 0;
3348 	}
3349 
3350 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PUBLIC_KEY);
3351 	atomic_clear_bit(smp->allowed_cmds, BT_SMP_CMD_SECURITY_REQUEST);
3352 
3353 	return sc_send_public_key(smp);
3354 }
3355 #else
smp_pairing_rsp(struct bt_smp * smp,struct net_buf * buf)3356 static uint8_t smp_pairing_rsp(struct bt_smp *smp, struct net_buf *buf)
3357 {
3358 	return BT_SMP_ERR_CMD_NOTSUPP;
3359 }
3360 #endif /* CONFIG_BT_CENTRAL */
3361 
smp_pairing_confirm(struct bt_smp * smp,struct net_buf * buf)3362 static uint8_t smp_pairing_confirm(struct bt_smp *smp, struct net_buf *buf)
3363 {
3364 	struct bt_smp_pairing_confirm *req = (void *)buf->data;
3365 
3366 	LOG_DBG("");
3367 
3368 	atomic_clear_bit(smp->flags, SMP_FLAG_DISPLAY);
3369 
3370 	memcpy(smp->pcnf, req->val, sizeof(smp->pcnf));
3371 
3372 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
3373 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
3374 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
3375 		return smp_send_pairing_random(smp);
3376 	}
3377 
3378 	if (!IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
3379 		return 0;
3380 	}
3381 
3382 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
3383 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
3384 		return legacy_pairing_confirm(smp);
3385 	}
3386 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
3387 
3388 	switch (smp->method) {
3389 	case PASSKEY_DISPLAY:
3390 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
3391 		return smp_send_pairing_confirm(smp);
3392 	case PASSKEY_INPUT:
3393 		if (atomic_test_bit(smp->flags, SMP_FLAG_USER)) {
3394 			atomic_set_bit(smp->flags, SMP_FLAG_CFM_DELAYED);
3395 			return 0;
3396 		}
3397 
3398 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
3399 		return smp_send_pairing_confirm(smp);
3400 	case JUST_WORKS:
3401 	case PASSKEY_CONFIRM:
3402 	default:
3403 		LOG_ERR("Unknown pairing method (%u)", smp->method);
3404 		return BT_SMP_ERR_UNSPECIFIED;
3405 	}
3406 }
3407 
sc_smp_send_dhkey_check(struct bt_smp * smp,const uint8_t * e)3408 static uint8_t sc_smp_send_dhkey_check(struct bt_smp *smp, const uint8_t *e)
3409 {
3410 	struct bt_smp_dhkey_check *req;
3411 	struct net_buf *buf;
3412 
3413 	LOG_DBG("");
3414 
3415 	buf = smp_create_pdu(smp, BT_SMP_DHKEY_CHECK, sizeof(*req));
3416 	if (!buf) {
3417 		return BT_SMP_ERR_UNSPECIFIED;
3418 	}
3419 
3420 	req = net_buf_add(buf, sizeof(*req));
3421 	memcpy(req->e, e, sizeof(req->e));
3422 
3423 	smp_send(smp, buf, NULL, NULL);
3424 
3425 	return 0;
3426 }
3427 
3428 #if defined(CONFIG_BT_CENTRAL)
compute_and_send_central_dhcheck(struct bt_smp * smp)3429 static uint8_t compute_and_send_central_dhcheck(struct bt_smp *smp)
3430 {
3431 	uint8_t e[16], r[16];
3432 
3433 	(void)memset(r, 0, sizeof(r));
3434 
3435 	switch (smp->method) {
3436 	case JUST_WORKS:
3437 	case PASSKEY_CONFIRM:
3438 		break;
3439 	case PASSKEY_DISPLAY:
3440 	case PASSKEY_INPUT:
3441 		memcpy(r, &smp->passkey, sizeof(smp->passkey));
3442 		break;
3443 	case LE_SC_OOB:
3444 		if (smp->oobd_remote) {
3445 			memcpy(r, smp->oobd_remote->r, sizeof(r));
3446 		}
3447 		break;
3448 	default:
3449 		LOG_ERR("Unknown pairing method (%u)", smp->method);
3450 		return BT_SMP_ERR_UNSPECIFIED;
3451 	}
3452 
3453 	/* calculate LTK and mackey */
3454 	if (bt_crypto_f5(smp->dhkey, smp->prnd, smp->rrnd, &smp->chan.chan.conn->le.init_addr,
3455 			 &smp->chan.chan.conn->le.resp_addr, smp->mackey, smp->tk)) {
3456 		LOG_ERR("Calculate LTK failed");
3457 		return BT_SMP_ERR_UNSPECIFIED;
3458 	}
3459 	/* calculate local DHKey check */
3460 	if (bt_crypto_f6(smp->mackey, smp->prnd, smp->rrnd, r, &smp->preq[1],
3461 			 &smp->chan.chan.conn->le.init_addr, &smp->chan.chan.conn->le.resp_addr,
3462 			 e)) {
3463 		LOG_ERR("Calculate local DHKey check failed");
3464 		return BT_SMP_ERR_UNSPECIFIED;
3465 	}
3466 
3467 	atomic_set_bit(smp->allowed_cmds, BT_SMP_DHKEY_CHECK);
3468 	return sc_smp_send_dhkey_check(smp, e);
3469 }
3470 #endif /* CONFIG_BT_CENTRAL */
3471 
3472 #if defined(CONFIG_BT_PERIPHERAL)
compute_and_check_and_send_periph_dhcheck(struct bt_smp * smp)3473 static uint8_t compute_and_check_and_send_periph_dhcheck(struct bt_smp *smp)
3474 {
3475 	uint8_t re[16], e[16], r[16];
3476 	uint8_t err;
3477 
3478 	(void)memset(r, 0, sizeof(r));
3479 
3480 	switch (smp->method) {
3481 	case JUST_WORKS:
3482 	case PASSKEY_CONFIRM:
3483 		break;
3484 	case PASSKEY_DISPLAY:
3485 	case PASSKEY_INPUT:
3486 		memcpy(r, &smp->passkey, sizeof(smp->passkey));
3487 		break;
3488 	case LE_SC_OOB:
3489 		if (smp->oobd_remote) {
3490 			memcpy(r, smp->oobd_remote->r, sizeof(r));
3491 		}
3492 		break;
3493 	default:
3494 		LOG_ERR("Unknown pairing method (%u)", smp->method);
3495 		return BT_SMP_ERR_UNSPECIFIED;
3496 	}
3497 
3498 	/* calculate LTK and mackey */
3499 	if (bt_crypto_f5(smp->dhkey, smp->rrnd, smp->prnd, &smp->chan.chan.conn->le.init_addr,
3500 			 &smp->chan.chan.conn->le.resp_addr, smp->mackey, smp->tk)) {
3501 		LOG_ERR("Calculate LTK failed");
3502 		return BT_SMP_ERR_UNSPECIFIED;
3503 	}
3504 
3505 	/* calculate local DHKey check */
3506 	if (bt_crypto_f6(smp->mackey, smp->prnd, smp->rrnd, r, &smp->prsp[1],
3507 			 &smp->chan.chan.conn->le.resp_addr, &smp->chan.chan.conn->le.init_addr,
3508 			 e)) {
3509 		LOG_ERR("Calculate local DHKey check failed");
3510 		return BT_SMP_ERR_UNSPECIFIED;
3511 	}
3512 
3513 	if (smp->method == LE_SC_OOB) {
3514 		if (smp->oobd_local) {
3515 			memcpy(r, smp->oobd_local->r, sizeof(r));
3516 		} else {
3517 			memset(r, 0, sizeof(r));
3518 		}
3519 	}
3520 
3521 	/* calculate remote DHKey check */
3522 	if (bt_crypto_f6(smp->mackey, smp->rrnd, smp->prnd, r, &smp->preq[1],
3523 			 &smp->chan.chan.conn->le.init_addr, &smp->chan.chan.conn->le.resp_addr,
3524 			 re)) {
3525 		LOG_ERR("Calculate remote DHKey check failed");
3526 		return BT_SMP_ERR_UNSPECIFIED;
3527 	}
3528 
3529 	/* compare received E with calculated remote */
3530 	if (memcmp(smp->e, re, 16)) {
3531 		return BT_SMP_ERR_DHKEY_CHECK_FAILED;
3532 	}
3533 
3534 	/* send local e */
3535 	err = sc_smp_send_dhkey_check(smp, e);
3536 	if (err) {
3537 		return err;
3538 	}
3539 
3540 	atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
3541 	return 0;
3542 }
3543 #endif /* CONFIG_BT_PERIPHERAL */
3544 
3545 static void bt_smp_dhkey_ready(const uint8_t *dhkey);
smp_dhkey_generate(struct bt_smp * smp)3546 static uint8_t smp_dhkey_generate(struct bt_smp *smp)
3547 {
3548 	int err;
3549 
3550 	atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_GEN);
3551 	err = bt_dh_key_gen(smp->pkey, bt_smp_dhkey_ready);
3552 	if (err) {
3553 		atomic_clear_bit(smp->flags, SMP_FLAG_DHKEY_GEN);
3554 
3555 		LOG_ERR("Failed to generate DHKey");
3556 		return BT_SMP_ERR_UNSPECIFIED;
3557 	}
3558 
3559 	return 0;
3560 }
3561 
smp_dhkey_ready(struct bt_smp * smp,const uint8_t * dhkey)3562 static uint8_t smp_dhkey_ready(struct bt_smp *smp, const uint8_t *dhkey)
3563 {
3564 	if (!dhkey) {
3565 		return BT_SMP_ERR_DHKEY_CHECK_FAILED;
3566 	}
3567 
3568 	atomic_clear_bit(smp->flags, SMP_FLAG_DHKEY_PENDING);
3569 	memcpy(smp->dhkey, dhkey, BT_DH_KEY_LEN);
3570 
3571 	/* wait for user passkey confirmation */
3572 	if (atomic_test_bit(smp->flags, SMP_FLAG_USER)) {
3573 		atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
3574 		return 0;
3575 	}
3576 
3577 	/* wait for remote DHKey Check */
3578 	if (atomic_test_bit(smp->flags, SMP_FLAG_DHCHECK_WAIT)) {
3579 		atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
3580 		return 0;
3581 	}
3582 
3583 	if (atomic_test_bit(smp->flags, SMP_FLAG_DHKEY_SEND)) {
3584 #if defined(CONFIG_BT_CENTRAL)
3585 		if (smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
3586 			return compute_and_send_central_dhcheck(smp);
3587 		}
3588 
3589 #endif /* CONFIG_BT_CENTRAL */
3590 
3591 #if defined(CONFIG_BT_PERIPHERAL)
3592 		return  compute_and_check_and_send_periph_dhcheck(smp);
3593 #endif /* CONFIG_BT_PERIPHERAL */
3594 	}
3595 
3596 	return 0;
3597 }
3598 
smp_find(int flag)3599 static struct bt_smp *smp_find(int flag)
3600 {
3601 	for (int i = 0; i < ARRAY_SIZE(bt_smp_pool); i++) {
3602 		if (atomic_test_bit(bt_smp_pool[i].flags, flag)) {
3603 			return &bt_smp_pool[i];
3604 		}
3605 	}
3606 
3607 	return NULL;
3608 }
3609 
bt_smp_dhkey_ready(const uint8_t * dhkey)3610 static void bt_smp_dhkey_ready(const uint8_t *dhkey)
3611 {
3612 	LOG_DBG("%p", (void *)dhkey);
3613 	int err;
3614 
3615 	struct bt_smp *smp = smp_find(SMP_FLAG_DHKEY_GEN);
3616 	if (smp) {
3617 		atomic_clear_bit(smp->flags, SMP_FLAG_DHKEY_GEN);
3618 		err = smp_dhkey_ready(smp, dhkey);
3619 		if (err) {
3620 			smp_error(smp, err);
3621 		}
3622 	}
3623 
3624 	err = 0;
3625 	do {
3626 		smp = smp_find(SMP_FLAG_DHKEY_PENDING);
3627 		if (smp) {
3628 			err = smp_dhkey_generate(smp);
3629 			if (err) {
3630 				smp_error(smp, err);
3631 			}
3632 		}
3633 	} while (smp && err);
3634 }
3635 
sc_smp_check_confirm(struct bt_smp * smp)3636 static uint8_t sc_smp_check_confirm(struct bt_smp *smp)
3637 {
3638 	uint8_t cfm[16];
3639 	uint8_t r;
3640 
3641 	switch (smp->method) {
3642 	case LE_SC_OOB:
3643 		return 0;
3644 	case PASSKEY_CONFIRM:
3645 	case JUST_WORKS:
3646 		r = 0U;
3647 		break;
3648 	case PASSKEY_DISPLAY:
3649 	case PASSKEY_INPUT:
3650 		/*
3651 		 * In the Passkey Entry protocol, the most significant
3652 		 * bit of Z is set equal to one and the least
3653 		 * significant bit is made up from one bit of the
3654 		 * passkey e.g. if the passkey bit is 1, then Z = 0x81
3655 		 * and if the passkey bit is 0, then Z = 0x80.
3656 		 */
3657 		r = (smp->passkey >> smp->passkey_round) & 0x01;
3658 		r |= 0x80;
3659 		break;
3660 	default:
3661 		LOG_ERR("Unknown pairing method (%u)", smp->method);
3662 		return BT_SMP_ERR_UNSPECIFIED;
3663 	}
3664 
3665 	if (bt_crypto_f4(smp->pkey, sc_public_key, smp->rrnd, r, cfm)) {
3666 		LOG_ERR("Calculate confirm failed");
3667 		return BT_SMP_ERR_UNSPECIFIED;
3668 	}
3669 
3670 	LOG_DBG("pcnf %s", bt_hex(smp->pcnf, 16));
3671 	LOG_DBG("cfm %s", bt_hex(cfm, 16));
3672 
3673 	if (memcmp(smp->pcnf, cfm, 16)) {
3674 		return BT_SMP_ERR_CONFIRM_FAILED;
3675 	}
3676 
3677 	return 0;
3678 }
3679 
le_sc_oob_data_req_check(struct bt_smp * smp)3680 static bool le_sc_oob_data_req_check(struct bt_smp *smp)
3681 {
3682 	struct bt_smp_pairing *req = (struct bt_smp_pairing *)&smp->preq[1];
3683 
3684 	return ((req->oob_flag & BT_SMP_OOB_DATA_MASK) == BT_SMP_OOB_PRESENT);
3685 }
3686 
le_sc_oob_data_rsp_check(struct bt_smp * smp)3687 static bool le_sc_oob_data_rsp_check(struct bt_smp *smp)
3688 {
3689 	struct bt_smp_pairing *rsp = (struct bt_smp_pairing *)&smp->prsp[1];
3690 
3691 	return ((rsp->oob_flag & BT_SMP_OOB_DATA_MASK) == BT_SMP_OOB_PRESENT);
3692 }
3693 
le_sc_oob_config_set(struct bt_smp * smp,struct bt_conn_oob_info * info)3694 __maybe_unused static void le_sc_oob_config_set(struct bt_smp *smp,
3695 						struct bt_conn_oob_info *info)
3696 {
3697 	bool req_oob_present = le_sc_oob_data_req_check(smp);
3698 	bool rsp_oob_present = le_sc_oob_data_rsp_check(smp);
3699 	int oob_config = BT_CONN_OOB_NO_DATA;
3700 
3701 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
3702 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
3703 		oob_config = req_oob_present ? BT_CONN_OOB_REMOTE_ONLY :
3704 					       BT_CONN_OOB_NO_DATA;
3705 
3706 		if (rsp_oob_present) {
3707 			oob_config = (oob_config == BT_CONN_OOB_REMOTE_ONLY) ?
3708 				     BT_CONN_OOB_BOTH_PEERS :
3709 				     BT_CONN_OOB_LOCAL_ONLY;
3710 		}
3711 	} else if (IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
3712 		oob_config = req_oob_present ? BT_CONN_OOB_LOCAL_ONLY :
3713 					       BT_CONN_OOB_NO_DATA;
3714 
3715 		if (rsp_oob_present) {
3716 			oob_config = (oob_config == BT_CONN_OOB_LOCAL_ONLY) ?
3717 				     BT_CONN_OOB_BOTH_PEERS :
3718 				     BT_CONN_OOB_REMOTE_ONLY;
3719 		}
3720 	}
3721 
3722 	info->lesc.oob_config = oob_config;
3723 }
3724 
smp_pairing_random(struct bt_smp * smp,struct net_buf * buf)3725 static uint8_t smp_pairing_random(struct bt_smp *smp, struct net_buf *buf)
3726 {
3727 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
3728 	struct bt_smp_pairing_random *req = (void *)buf->data;
3729 	uint32_t passkey;
3730 	uint8_t err;
3731 
3732 	LOG_DBG("");
3733 
3734 	memcpy(smp->rrnd, req->val, sizeof(smp->rrnd));
3735 
3736 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
3737 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
3738 		return legacy_pairing_random(smp);
3739 	}
3740 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
3741 
3742 #if defined(CONFIG_BT_CENTRAL)
3743 	if (smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
3744 		err = sc_smp_check_confirm(smp);
3745 		if (err) {
3746 			return err;
3747 		}
3748 
3749 		switch (smp->method) {
3750 		case PASSKEY_CONFIRM:
3751 			/* compare passkey before calculating LTK */
3752 			if (bt_crypto_g2(sc_public_key, smp->pkey, smp->prnd, smp->rrnd,
3753 					 &passkey)) {
3754 				return BT_SMP_ERR_UNSPECIFIED;
3755 			}
3756 
3757 			atomic_set_bit(smp->flags, SMP_FLAG_USER);
3758 			atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
3759 			smp_auth_cb->passkey_confirm(smp->chan.chan.conn, passkey);
3760 			return 0;
3761 		case JUST_WORKS:
3762 			break;
3763 		case LE_SC_OOB:
3764 			break;
3765 		case PASSKEY_DISPLAY:
3766 		case PASSKEY_INPUT:
3767 			smp->passkey_round++;
3768 			if (smp->passkey_round == 20U) {
3769 				break;
3770 			}
3771 
3772 			if (bt_rand(smp->prnd, 16)) {
3773 				return BT_SMP_ERR_UNSPECIFIED;
3774 			}
3775 
3776 			atomic_set_bit(smp->allowed_cmds,
3777 				       BT_SMP_CMD_PAIRING_CONFIRM);
3778 			return smp_send_pairing_confirm(smp);
3779 		default:
3780 			LOG_ERR("Unknown pairing method (%u)", smp->method);
3781 			return BT_SMP_ERR_UNSPECIFIED;
3782 		}
3783 
3784 		/* wait for DHKey being generated */
3785 		if (atomic_test_bit(smp->flags, SMP_FLAG_DHKEY_PENDING)) {
3786 			atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
3787 			return 0;
3788 		}
3789 
3790 		return compute_and_send_central_dhcheck(smp);
3791 	}
3792 #endif /* CONFIG_BT_CENTRAL */
3793 
3794 #if defined(CONFIG_BT_PERIPHERAL)
3795 	switch (smp->method) {
3796 	case PASSKEY_CONFIRM:
3797 		if (bt_crypto_g2(smp->pkey, sc_public_key, smp->rrnd, smp->prnd, &passkey)) {
3798 			return BT_SMP_ERR_UNSPECIFIED;
3799 		}
3800 
3801 		atomic_set_bit(smp->flags, SMP_FLAG_USER);
3802 		smp_auth_cb->passkey_confirm(smp->chan.chan.conn, passkey);
3803 		break;
3804 	case JUST_WORKS:
3805 		break;
3806 	case PASSKEY_DISPLAY:
3807 	case PASSKEY_INPUT:
3808 		err = sc_smp_check_confirm(smp);
3809 		if (err) {
3810 			return err;
3811 		}
3812 
3813 		atomic_set_bit(smp->allowed_cmds,
3814 			       BT_SMP_CMD_PAIRING_CONFIRM);
3815 		err = smp_send_pairing_random(smp);
3816 		if (err) {
3817 			return err;
3818 		}
3819 
3820 		smp->passkey_round++;
3821 		if (smp->passkey_round == 20U) {
3822 			atomic_set_bit(smp->allowed_cmds, BT_SMP_DHKEY_CHECK);
3823 			atomic_set_bit(smp->flags, SMP_FLAG_DHCHECK_WAIT);
3824 			return 0;
3825 		}
3826 
3827 		if (bt_rand(smp->prnd, 16)) {
3828 			return BT_SMP_ERR_UNSPECIFIED;
3829 		}
3830 
3831 		return 0;
3832 	case LE_SC_OOB:
3833 		/* Step 6: Select random N */
3834 		if (bt_rand(smp->prnd, 16)) {
3835 			return BT_SMP_ERR_UNSPECIFIED;
3836 		}
3837 
3838 		if (!IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) && smp_auth_cb &&
3839 		    smp_auth_cb->oob_data_request) {
3840 			struct bt_conn_oob_info info = {
3841 				.type = BT_CONN_OOB_LE_SC,
3842 				.lesc.oob_config = BT_CONN_OOB_NO_DATA,
3843 			};
3844 
3845 			le_sc_oob_config_set(smp, &info);
3846 
3847 			smp->oobd_local = NULL;
3848 			smp->oobd_remote = NULL;
3849 
3850 			atomic_set_bit(smp->flags, SMP_FLAG_OOB_PENDING);
3851 			smp_auth_cb->oob_data_request(smp->chan.chan.conn, &info);
3852 
3853 			return 0;
3854 		} else {
3855 			return BT_SMP_ERR_OOB_NOT_AVAIL;
3856 		}
3857 	default:
3858 		LOG_ERR("Unknown pairing method (%u)", smp->method);
3859 		return BT_SMP_ERR_UNSPECIFIED;
3860 	}
3861 
3862 	atomic_set_bit(smp->allowed_cmds, BT_SMP_DHKEY_CHECK);
3863 	atomic_set_bit(smp->flags, SMP_FLAG_DHCHECK_WAIT);
3864 	return smp_send_pairing_random(smp);
3865 #else
3866 	return BT_SMP_ERR_PAIRING_NOTSUPP;
3867 #endif /* CONFIG_BT_PERIPHERAL */
3868 }
3869 
smp_pairing_failed(struct bt_smp * smp,struct net_buf * buf)3870 static uint8_t smp_pairing_failed(struct bt_smp *smp, struct net_buf *buf)
3871 {
3872 	struct bt_conn *conn = smp->chan.chan.conn;
3873 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
3874 	struct bt_smp_pairing_fail *req = (void *)buf->data;
3875 
3876 	LOG_ERR("pairing failed (peer reason 0x%x)", req->reason);
3877 
3878 	if (atomic_test_and_clear_bit(smp->flags, SMP_FLAG_USER) ||
3879 	    atomic_test_and_clear_bit(smp->flags, SMP_FLAG_DISPLAY)) {
3880 		if (smp_auth_cb && smp_auth_cb->cancel) {
3881 			smp_auth_cb->cancel(conn);
3882 		}
3883 	}
3884 
3885 	smp_pairing_complete(smp, req->reason);
3886 
3887 	/* return no error to avoid sending Pairing Failed in response */
3888 	return 0;
3889 }
3890 
smp_ident_info(struct bt_smp * smp,struct net_buf * buf)3891 static uint8_t smp_ident_info(struct bt_smp *smp, struct net_buf *buf)
3892 {
3893 	LOG_DBG("");
3894 
3895 	if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
3896 		struct bt_smp_ident_info *req = (void *)buf->data;
3897 		struct bt_conn *conn = smp->chan.chan.conn;
3898 		struct bt_keys *keys;
3899 
3900 		keys = bt_keys_get_type(BT_KEYS_IRK, conn->id, &conn->le.dst);
3901 		if (!keys) {
3902 			LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&conn->le.dst));
3903 			return BT_SMP_ERR_UNSPECIFIED;
3904 		}
3905 
3906 		memcpy(keys->irk.val, req->irk, 16);
3907 	}
3908 
3909 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_IDENT_ADDR_INFO);
3910 
3911 	return 0;
3912 }
3913 
smp_id_add_replace(struct bt_smp * smp,struct bt_keys * new_bond)3914 static uint8_t smp_id_add_replace(struct bt_smp *smp, struct bt_keys *new_bond)
3915 {
3916 	struct bt_keys *conflict;
3917 
3918 	/* Sanity check: It does not make sense to finalize a bond before we
3919 	 * have the remote identity.
3920 	 */
3921 	__ASSERT_NO_MSG(!(smp->remote_dist & BT_SMP_DIST_ID_KEY));
3922 
3923 	conflict = bt_id_find_conflict(new_bond);
3924 	if (conflict) {
3925 		LOG_DBG("New bond conflicts with a bond on id %d.", conflict->id);
3926 	}
3927 
3928 	if (conflict && !IS_ENABLED(CONFIG_BT_ID_UNPAIR_MATCHING_BONDS)) {
3929 		LOG_WRN("Refusing new pairing. The old bond must be unpaired first.");
3930 		return BT_SMP_ERR_AUTH_REQUIREMENTS;
3931 	}
3932 
3933 	if (conflict && IS_ENABLED(CONFIG_BT_ID_UNPAIR_MATCHING_BONDS)) {
3934 		bool trust_ok;
3935 		int unpair_err;
3936 
3937 		trust_ok = update_keys_check(smp, conflict);
3938 		if (!trust_ok) {
3939 			LOG_WRN("Refusing new pairing. The old bond has more trust.");
3940 			return BT_SMP_ERR_AUTH_REQUIREMENTS;
3941 		}
3942 
3943 		LOG_DBG("Un-pairing old conflicting bond and finalizing new.");
3944 
3945 		unpair_err = bt_unpair(conflict->id, &conflict->addr);
3946 		__ASSERT_NO_MSG(!unpair_err);
3947 	}
3948 
3949 	__ASSERT_NO_MSG(!bt_id_find_conflict(new_bond));
3950 	bt_id_add(new_bond);
3951 	return 0;
3952 }
3953 
3954 struct addr_match {
3955 	const bt_addr_le_t *rpa;
3956 	const bt_addr_le_t *id_addr;
3957 };
3958 
convert_to_id_on_match(struct bt_conn * conn,void * data)3959 static void convert_to_id_on_match(struct bt_conn *conn, void *data)
3960 {
3961 	struct addr_match *addr_match = data;
3962 
3963 	if (bt_addr_le_eq(&conn->le.dst, addr_match->rpa)) {
3964 		bt_addr_le_copy(&conn->le.dst, addr_match->id_addr);
3965 	}
3966 }
3967 
smp_ident_addr_info(struct bt_smp * smp,struct net_buf * buf)3968 static uint8_t smp_ident_addr_info(struct bt_smp *smp, struct net_buf *buf)
3969 {
3970 	struct bt_conn *conn = smp->chan.chan.conn;
3971 	struct bt_smp_ident_addr_info *req = (void *)buf->data;
3972 	uint8_t err;
3973 
3974 	LOG_DBG("identity %s", bt_addr_le_str(&req->addr));
3975 
3976 	smp->remote_dist &= ~BT_SMP_DIST_ID_KEY;
3977 
3978 	if (!bt_addr_le_is_identity(&req->addr)) {
3979 		LOG_ERR("Invalid identity %s", bt_addr_le_str(&req->addr));
3980 		LOG_ERR(" for %s", bt_addr_le_str(&conn->le.dst));
3981 		return BT_SMP_ERR_INVALID_PARAMS;
3982 	}
3983 
3984 	if (!bt_addr_le_eq(&conn->le.dst, &req->addr)) {
3985 		struct bt_keys *keys = bt_keys_find_addr(conn->id, &req->addr);
3986 
3987 		if (keys) {
3988 			if (!update_keys_check(smp, keys)) {
3989 				return BT_SMP_ERR_UNSPECIFIED;
3990 			}
3991 
3992 			bt_keys_clear(keys);
3993 		}
3994 	}
3995 
3996 	if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
3997 		const bt_addr_le_t *dst;
3998 		struct bt_keys *keys;
3999 
4000 		keys = bt_keys_get_type(BT_KEYS_IRK, conn->id, &conn->le.dst);
4001 		if (!keys) {
4002 			LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&conn->le.dst));
4003 			return BT_SMP_ERR_UNSPECIFIED;
4004 		}
4005 
4006 		/*
4007 		 * We can't use conn->dst here as this might already contain
4008 		 * identity address known from previous pairing. Since all keys
4009 		 * are cleared on re-pairing we wouldn't store IRK distributed
4010 		 * in new pairing.
4011 		 */
4012 		if (conn->role == BT_HCI_ROLE_CENTRAL) {
4013 			dst = &conn->le.resp_addr;
4014 		} else {
4015 			dst = &conn->le.init_addr;
4016 		}
4017 
4018 		if (bt_addr_le_is_rpa(dst)) {
4019 			/* always update last use RPA */
4020 			bt_addr_copy(&keys->irk.rpa, &dst->a);
4021 
4022 			/*
4023 			 * Update connection address and notify about identity
4024 			 * resolved only if connection wasn't already reported
4025 			 * with identity address. This may happen if IRK was
4026 			 * present before ie. due to re-pairing.
4027 			 */
4028 			if (!bt_addr_le_is_identity(&conn->le.dst)) {
4029 				struct addr_match addr_match = {
4030 					.rpa = &conn->le.dst,
4031 					.id_addr = &req->addr,
4032 				};
4033 
4034 				bt_conn_foreach(BT_CONN_TYPE_LE,
4035 						convert_to_id_on_match,
4036 						&addr_match);
4037 				bt_addr_le_copy(&keys->addr, &req->addr);
4038 
4039 				bt_conn_identity_resolved(conn);
4040 			}
4041 		}
4042 
4043 		err = smp_id_add_replace(smp, keys);
4044 		if (err) {
4045 			return err;
4046 		}
4047 	}
4048 
4049 	if (smp->remote_dist & BT_SMP_DIST_SIGN) {
4050 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
4051 	}
4052 
4053 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
4054 	    conn->role == BT_HCI_ROLE_CENTRAL && !smp->remote_dist) {
4055 		err = bt_smp_distribute_keys(smp);
4056 		if (err) {
4057 			return err;
4058 		}
4059 	}
4060 
4061 	/* if all keys were distributed, pairing is done */
4062 	if (!smp->local_dist && !smp->remote_dist) {
4063 		smp_pairing_complete(smp, 0);
4064 	}
4065 
4066 	return 0;
4067 }
4068 
4069 #if defined(CONFIG_BT_SIGNING)
smp_signing_info(struct bt_smp * smp,struct net_buf * buf)4070 static uint8_t smp_signing_info(struct bt_smp *smp, struct net_buf *buf)
4071 {
4072 	struct bt_conn *conn = smp->chan.chan.conn;
4073 	uint8_t err;
4074 
4075 	LOG_DBG("");
4076 
4077 	if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
4078 		struct bt_smp_signing_info *req = (void *)buf->data;
4079 		struct bt_keys *keys;
4080 
4081 		keys = bt_keys_get_type(BT_KEYS_REMOTE_CSRK, conn->id,
4082 					&conn->le.dst);
4083 		if (!keys) {
4084 			LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&conn->le.dst));
4085 			return BT_SMP_ERR_UNSPECIFIED;
4086 		}
4087 
4088 		memcpy(keys->remote_csrk.val, req->csrk,
4089 		       sizeof(keys->remote_csrk.val));
4090 	}
4091 
4092 	smp->remote_dist &= ~BT_SMP_DIST_SIGN;
4093 
4094 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
4095 	    conn->role == BT_HCI_ROLE_CENTRAL && !smp->remote_dist) {
4096 		err = bt_smp_distribute_keys(smp);
4097 		if (err) {
4098 			return err;
4099 		}
4100 	}
4101 
4102 	/* if all keys were distributed, pairing is done */
4103 	if (!smp->local_dist && !smp->remote_dist) {
4104 		smp_pairing_complete(smp, 0);
4105 	}
4106 
4107 	return 0;
4108 }
4109 #else
smp_signing_info(struct bt_smp * smp,struct net_buf * buf)4110 static uint8_t smp_signing_info(struct bt_smp *smp, struct net_buf *buf)
4111 {
4112 	return BT_SMP_ERR_CMD_NOTSUPP;
4113 }
4114 #endif /* CONFIG_BT_SIGNING */
4115 
4116 #if defined(CONFIG_BT_CENTRAL)
smp_security_request(struct bt_smp * smp,struct net_buf * buf)4117 static uint8_t smp_security_request(struct bt_smp *smp, struct net_buf *buf)
4118 {
4119 	struct bt_conn *conn = smp->chan.chan.conn;
4120 	struct bt_smp_security_request *req = (void *)buf->data;
4121 	uint8_t auth;
4122 
4123 	LOG_DBG("");
4124 
4125 	/* A higher security level is requested during the key distribution
4126 	 * phase, once pairing is complete a new pairing procedure will start.
4127 	 */
4128 	if (atomic_test_bit(smp->flags, SMP_FLAG_KEYS_DISTR)) {
4129 		return 0;
4130 	}
4131 
4132 	if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
4133 		/* We have already started pairing process */
4134 		return 0;
4135 	}
4136 
4137 	if (atomic_test_bit(smp->flags, SMP_FLAG_ENC_PENDING)) {
4138 		/* We have already started encryption procedure */
4139 		return 0;
4140 	}
4141 
4142 	if (sc_supported) {
4143 		auth = req->auth_req & BT_SMP_AUTH_MASK_SC;
4144 	} else {
4145 		auth = req->auth_req & BT_SMP_AUTH_MASK;
4146 	}
4147 
4148 	if (IS_ENABLED(CONFIG_BT_SMP_SC_PAIR_ONLY) &&
4149 	    !(auth & BT_SMP_AUTH_SC)) {
4150 		return BT_SMP_ERR_AUTH_REQUIREMENTS;
4151 	}
4152 
4153 	if (IS_ENABLED(CONFIG_BT_BONDING_REQUIRED) &&
4154 	    !(latch_bondable(smp) && (auth & BT_SMP_AUTH_BONDING))) {
4155 		/* Reject security req if not both intend to bond */
4156 		LOG_DBG("Bonding required");
4157 		return BT_SMP_ERR_UNSPECIFIED;
4158 	}
4159 
4160 	if (conn->le.keys) {
4161 		/* Make sure we have an LTK to encrypt with */
4162 		if (!(conn->le.keys->keys & (BT_KEYS_LTK_P256 | BT_KEYS_LTK))) {
4163 			goto pair;
4164 		}
4165 	} else {
4166 		conn->le.keys = bt_keys_find(BT_KEYS_LTK_P256, conn->id,
4167 					     &conn->le.dst);
4168 		if (!conn->le.keys) {
4169 			conn->le.keys = bt_keys_find(BT_KEYS_LTK, conn->id,
4170 						     &conn->le.dst);
4171 		}
4172 	}
4173 
4174 	if (!conn->le.keys) {
4175 		goto pair;
4176 	}
4177 
4178 	/* if MITM required key must be authenticated */
4179 	if ((auth & BT_SMP_AUTH_MITM) &&
4180 	    !(conn->le.keys->flags & BT_KEYS_AUTHENTICATED)) {
4181 		if (get_io_capa(smp) != BT_SMP_IO_NO_INPUT_OUTPUT) {
4182 			LOG_INF("New auth requirements: 0x%x, repairing", auth);
4183 			goto pair;
4184 		}
4185 
4186 		LOG_WRN("Unsupported auth requirements: 0x%x, repairing", auth);
4187 		goto pair;
4188 	}
4189 
4190 	/* if LE SC required and no p256 key present repair */
4191 	if ((auth & BT_SMP_AUTH_SC) &&
4192 	    !(conn->le.keys->keys & BT_KEYS_LTK_P256)) {
4193 		LOG_INF("New auth requirements: 0x%x, repairing", auth);
4194 		goto pair;
4195 	}
4196 
4197 	if (bt_conn_le_start_encryption(conn, conn->le.keys->ltk.rand,
4198 					conn->le.keys->ltk.ediv,
4199 					conn->le.keys->ltk.val,
4200 					conn->le.keys->enc_size) < 0) {
4201 		LOG_ERR("Failed to start encryption");
4202 		return BT_SMP_ERR_UNSPECIFIED;
4203 	}
4204 
4205 	atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
4206 
4207 	return 0;
4208 pair:
4209 	if (smp_send_pairing_req(conn) < 0) {
4210 		return BT_SMP_ERR_UNSPECIFIED;
4211 	}
4212 
4213 	atomic_set_bit(smp->flags, SMP_FLAG_SEC_REQ);
4214 
4215 	return 0;
4216 }
4217 #else
smp_security_request(struct bt_smp * smp,struct net_buf * buf)4218 static uint8_t smp_security_request(struct bt_smp *smp, struct net_buf *buf)
4219 {
4220 	return BT_SMP_ERR_CMD_NOTSUPP;
4221 }
4222 #endif /* CONFIG_BT_CENTRAL */
4223 
generate_dhkey(struct bt_smp * smp)4224 __maybe_unused static uint8_t generate_dhkey(struct bt_smp *smp)
4225 {
4226 	if (IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
4227 		return BT_SMP_ERR_UNSPECIFIED;
4228 	}
4229 
4230 	atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_PENDING);
4231 	if (!smp_find(SMP_FLAG_DHKEY_GEN)) {
4232 		return smp_dhkey_generate(smp);
4233 	}
4234 
4235 	return 0;
4236 }
4237 
display_passkey(struct bt_smp * smp)4238 __maybe_unused static uint8_t display_passkey(struct bt_smp *smp)
4239 {
4240 	struct bt_conn *conn = smp->chan.chan.conn;
4241 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
4242 
4243 	if (IS_ENABLED(CONFIG_BT_FIXED_PASSKEY) &&
4244 	    fixed_passkey != BT_PASSKEY_INVALID) {
4245 		smp->passkey = fixed_passkey;
4246 	} else {
4247 		if (bt_rand(&smp->passkey, sizeof(smp->passkey))) {
4248 			return BT_SMP_ERR_UNSPECIFIED;
4249 		}
4250 
4251 		smp->passkey %= 1000000;
4252 	}
4253 
4254 	smp->passkey_round = 0U;
4255 
4256 	if (smp_auth_cb && smp_auth_cb->passkey_display) {
4257 		atomic_set_bit(smp->flags, SMP_FLAG_DISPLAY);
4258 		smp_auth_cb->passkey_display(conn, smp->passkey);
4259 	}
4260 
4261 	smp->passkey = sys_cpu_to_le32(smp->passkey);
4262 
4263 	return 0;
4264 }
4265 
4266 #if defined(CONFIG_BT_PERIPHERAL)
smp_public_key_periph(struct bt_smp * smp)4267 static uint8_t smp_public_key_periph(struct bt_smp *smp)
4268 {
4269 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
4270 	uint8_t err;
4271 
4272 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC_DEBUG_KEY) &&
4273 	    memcmp(smp->pkey, sc_public_key, BT_PUB_KEY_COORD_LEN) == 0) {
4274 		/* Deny public key with identitcal X coordinate unless it is the
4275 		 * debug public key.
4276 		 */
4277 		LOG_WRN("Remote public key rejected");
4278 		return BT_SMP_ERR_UNSPECIFIED;
4279 	}
4280 
4281 	err = sc_send_public_key(smp);
4282 	if (err) {
4283 		return err;
4284 	}
4285 
4286 	switch (smp->method) {
4287 	case PASSKEY_CONFIRM:
4288 	case JUST_WORKS:
4289 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
4290 
4291 		err = smp_send_pairing_confirm(smp);
4292 		if (err) {
4293 			return err;
4294 		}
4295 		break;
4296 	case PASSKEY_DISPLAY:
4297 		err = display_passkey(smp);
4298 		if (err) {
4299 			return err;
4300 		}
4301 
4302 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
4303 		atomic_set_bit(smp->allowed_cmds, BT_SMP_KEYPRESS_NOTIFICATION);
4304 		break;
4305 	case PASSKEY_INPUT:
4306 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
4307 		atomic_set_bit(smp->allowed_cmds, BT_SMP_KEYPRESS_NOTIFICATION);
4308 		atomic_set_bit(smp->flags, SMP_FLAG_USER);
4309 		smp_auth_cb->passkey_entry(smp->chan.chan.conn);
4310 		break;
4311 	case LE_SC_OOB:
4312 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
4313 		break;
4314 	default:
4315 		LOG_ERR("Unknown pairing method (%u)", smp->method);
4316 		return BT_SMP_ERR_UNSPECIFIED;
4317 	}
4318 
4319 	return generate_dhkey(smp);
4320 }
4321 #endif /* CONFIG_BT_PERIPHERAL */
4322 
4323 #ifdef CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY
smp_public_key(struct bt_smp * smp,struct net_buf * buf)4324 static uint8_t smp_public_key(struct bt_smp *smp, struct net_buf *buf)
4325 {
4326 	return BT_SMP_ERR_AUTH_REQUIREMENTS;
4327 }
4328 #else
smp_public_key(struct bt_smp * smp,struct net_buf * buf)4329 static uint8_t smp_public_key(struct bt_smp *smp, struct net_buf *buf)
4330 {
4331 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
4332 	struct bt_smp_public_key *req = (void *)buf->data;
4333 	uint8_t err;
4334 
4335 	LOG_DBG("");
4336 
4337 	memcpy(smp->pkey, req->x, BT_PUB_KEY_COORD_LEN);
4338 	memcpy(&smp->pkey[BT_PUB_KEY_COORD_LEN], req->y, BT_PUB_KEY_COORD_LEN);
4339 
4340 	/* mark key as debug if remote is using it */
4341 	if (bt_pub_key_is_debug(smp->pkey)) {
4342 		LOG_INF("Remote is using Debug Public key");
4343 		atomic_set_bit(smp->flags, SMP_FLAG_SC_DEBUG_KEY);
4344 
4345 		/* Don't allow a bond established without debug key to be
4346 		 * updated using LTK generated from debug key.
4347 		 */
4348 		if (!update_debug_keys_check(smp)) {
4349 			return BT_SMP_ERR_AUTH_REQUIREMENTS;
4350 		}
4351 	} else if (!bt_pub_key_is_valid(smp->pkey)) {
4352 		LOG_WRN("Received invalid public key");
4353 		return BT_SMP_ERR_INVALID_PARAMS;
4354 	}
4355 
4356 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
4357 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
4358 		if (!atomic_test_bit(smp->flags, SMP_FLAG_SC_DEBUG_KEY) &&
4359 		    memcmp(smp->pkey, sc_public_key, BT_PUB_KEY_COORD_LEN) == 0) {
4360 			/* Deny public key with identitcal X coordinate unless
4361 			 * it is the debug public key.
4362 			 */
4363 			LOG_WRN("Remote public key rejected");
4364 			return BT_SMP_ERR_UNSPECIFIED;
4365 		}
4366 
4367 		switch (smp->method) {
4368 		case PASSKEY_CONFIRM:
4369 		case JUST_WORKS:
4370 			atomic_set_bit(smp->allowed_cmds,
4371 				       BT_SMP_CMD_PAIRING_CONFIRM);
4372 			break;
4373 		case PASSKEY_DISPLAY:
4374 			err = display_passkey(smp);
4375 			if (err) {
4376 				return err;
4377 			}
4378 
4379 			atomic_set_bit(smp->allowed_cmds,
4380 				       BT_SMP_CMD_PAIRING_CONFIRM);
4381 
4382 			atomic_set_bit(smp->allowed_cmds,
4383 				       BT_SMP_KEYPRESS_NOTIFICATION);
4384 
4385 			err = smp_send_pairing_confirm(smp);
4386 			if (err) {
4387 				return err;
4388 			}
4389 			break;
4390 		case PASSKEY_INPUT:
4391 			atomic_set_bit(smp->flags, SMP_FLAG_USER);
4392 			smp_auth_cb->passkey_entry(smp->chan.chan.conn);
4393 
4394 			atomic_set_bit(smp->allowed_cmds,
4395 				       BT_SMP_KEYPRESS_NOTIFICATION);
4396 
4397 			break;
4398 		case LE_SC_OOB:
4399 			/* Step 6: Select random N */
4400 			if (bt_rand(smp->prnd, 16)) {
4401 				return BT_SMP_ERR_UNSPECIFIED;
4402 			}
4403 
4404 			if (smp_auth_cb && smp_auth_cb->oob_data_request) {
4405 				struct bt_conn_oob_info info = {
4406 					.type = BT_CONN_OOB_LE_SC,
4407 					.lesc.oob_config = BT_CONN_OOB_NO_DATA,
4408 				};
4409 
4410 				le_sc_oob_config_set(smp, &info);
4411 
4412 				smp->oobd_local = NULL;
4413 				smp->oobd_remote = NULL;
4414 
4415 				atomic_set_bit(smp->flags,
4416 					       SMP_FLAG_OOB_PENDING);
4417 				smp_auth_cb->oob_data_request(smp->chan.chan.conn, &info);
4418 			} else {
4419 				return BT_SMP_ERR_OOB_NOT_AVAIL;
4420 			}
4421 			break;
4422 		default:
4423 			LOG_ERR("Unknown pairing method (%u)", smp->method);
4424 			return BT_SMP_ERR_UNSPECIFIED;
4425 		}
4426 
4427 		return generate_dhkey(smp);
4428 	}
4429 
4430 #if defined(CONFIG_BT_PERIPHERAL)
4431 	if (!sc_public_key) {
4432 		atomic_set_bit(smp->flags, SMP_FLAG_PKEY_SEND);
4433 		return 0;
4434 	}
4435 
4436 	err = smp_public_key_periph(smp);
4437 	if (err) {
4438 		return err;
4439 	}
4440 #endif /* CONFIG_BT_PERIPHERAL */
4441 
4442 	return 0;
4443 }
4444 #endif /* CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY */
4445 
smp_dhkey_check(struct bt_smp * smp,struct net_buf * buf)4446 static uint8_t smp_dhkey_check(struct bt_smp *smp, struct net_buf *buf)
4447 {
4448 	struct bt_smp_dhkey_check *req = (void *)buf->data;
4449 
4450 	LOG_DBG("");
4451 
4452 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
4453 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
4454 		uint8_t e[16], r[16], enc_size;
4455 		uint8_t ediv[2], rand[8];
4456 
4457 		(void)memset(r, 0, sizeof(r));
4458 
4459 		switch (smp->method) {
4460 		case JUST_WORKS:
4461 		case PASSKEY_CONFIRM:
4462 			break;
4463 		case PASSKEY_DISPLAY:
4464 		case PASSKEY_INPUT:
4465 			memcpy(r, &smp->passkey, sizeof(smp->passkey));
4466 			break;
4467 		case LE_SC_OOB:
4468 			if (smp->oobd_local) {
4469 				memcpy(r, smp->oobd_local->r, sizeof(r));
4470 			}
4471 			break;
4472 		default:
4473 			LOG_ERR("Unknown pairing method (%u)", smp->method);
4474 			return BT_SMP_ERR_UNSPECIFIED;
4475 		}
4476 
4477 		/* calculate remote DHKey check for comparison */
4478 		if (bt_crypto_f6(smp->mackey, smp->rrnd, smp->prnd, r, &smp->prsp[1],
4479 				 &smp->chan.chan.conn->le.resp_addr,
4480 				 &smp->chan.chan.conn->le.init_addr, e)) {
4481 			return BT_SMP_ERR_UNSPECIFIED;
4482 		}
4483 
4484 		if (memcmp(e, req->e, 16)) {
4485 			return BT_SMP_ERR_DHKEY_CHECK_FAILED;
4486 		}
4487 
4488 		enc_size = get_encryption_key_size(smp);
4489 
4490 		/* Rand and EDiv are 0 */
4491 		(void)memset(ediv, 0, sizeof(ediv));
4492 		(void)memset(rand, 0, sizeof(rand));
4493 		if (bt_conn_le_start_encryption(smp->chan.chan.conn, rand, ediv,
4494 						smp->tk, enc_size) < 0) {
4495 			LOG_ERR("Failed to start encryption");
4496 			return BT_SMP_ERR_UNSPECIFIED;
4497 		}
4498 
4499 		atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
4500 
4501 		if (IS_ENABLED(CONFIG_BT_SMP_USB_HCI_CTLR_WORKAROUND)) {
4502 			if (smp->remote_dist & BT_SMP_DIST_ID_KEY) {
4503 				atomic_set_bit(smp->allowed_cmds,
4504 					       BT_SMP_CMD_IDENT_INFO);
4505 			} else if (smp->remote_dist & BT_SMP_DIST_SIGN) {
4506 				atomic_set_bit(smp->allowed_cmds,
4507 					       BT_SMP_CMD_SIGNING_INFO);
4508 			}
4509 		}
4510 
4511 		return 0;
4512 	}
4513 
4514 #if defined(CONFIG_BT_PERIPHERAL)
4515 	if (smp->chan.chan.conn->role == BT_HCI_ROLE_PERIPHERAL) {
4516 		atomic_clear_bit(smp->flags, SMP_FLAG_DHCHECK_WAIT);
4517 		memcpy(smp->e, req->e, sizeof(smp->e));
4518 
4519 		/* wait for DHKey being generated */
4520 		if (atomic_test_bit(smp->flags, SMP_FLAG_DHKEY_PENDING)) {
4521 			atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
4522 			return 0;
4523 		}
4524 
4525 		/* waiting for user to confirm passkey */
4526 		if (atomic_test_bit(smp->flags, SMP_FLAG_USER)) {
4527 			atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
4528 			return 0;
4529 		}
4530 
4531 		return compute_and_check_and_send_periph_dhcheck(smp);
4532 	}
4533 #endif /* CONFIG_BT_PERIPHERAL */
4534 
4535 	return 0;
4536 }
4537 
4538 #if defined(CONFIG_BT_PASSKEY_KEYPRESS)
smp_keypress_notif(struct bt_smp * smp,struct net_buf * buf)4539 static uint8_t smp_keypress_notif(struct bt_smp *smp, struct net_buf *buf)
4540 {
4541 	const struct bt_conn_auth_cb *smp_auth_cb = latch_auth_cb(smp);
4542 	struct bt_conn *conn = smp->chan.chan.conn;
4543 	struct bt_smp_keypress_notif *notif = (void *)buf->data;
4544 	enum bt_conn_auth_keypress type = notif->type;
4545 
4546 	LOG_DBG("Keypress from conn %u, type %u", bt_conn_index(conn), type);
4547 
4548 	/* For now, keypress notifications are always accepted. In the future we
4549 	 * should be smarter about this. We might also want to enforce something
4550 	 * about the 'start' and 'end' messages.
4551 	 */
4552 	atomic_set_bit(smp->allowed_cmds, BT_SMP_KEYPRESS_NOTIFICATION);
4553 
4554 	if (!IN_RANGE(type,
4555 		      BT_CONN_AUTH_KEYPRESS_ENTRY_STARTED,
4556 		      BT_CONN_AUTH_KEYPRESS_ENTRY_COMPLETED)) {
4557 		LOG_WRN("Received unknown keypress event type %u. Discarding.", type);
4558 		return BT_SMP_ERR_INVALID_PARAMS;
4559 	}
4560 
4561 	/* Reset SMP timeout, like the spec says. */
4562 	k_work_reschedule(&smp->work, SMP_TIMEOUT);
4563 
4564 	if (smp_auth_cb->passkey_display_keypress) {
4565 		smp_auth_cb->passkey_display_keypress(conn, type);
4566 	}
4567 
4568 	return 0;
4569 }
4570 #else
smp_keypress_notif(struct bt_smp * smp,struct net_buf * buf)4571 static uint8_t smp_keypress_notif(struct bt_smp *smp, struct net_buf *buf)
4572 {
4573 	ARG_UNUSED(smp);
4574 	ARG_UNUSED(buf);
4575 
4576 	LOG_DBG("");
4577 
4578 	/* Ignore packets until keypress notifications are fully supported. */
4579 	atomic_set_bit(smp->allowed_cmds, BT_SMP_KEYPRESS_NOTIFICATION);
4580 	return 0;
4581 }
4582 #endif
4583 
4584 static const struct {
4585 	uint8_t  (*func)(struct bt_smp *smp, struct net_buf *buf);
4586 	uint8_t  expect_len;
4587 } handlers[] = {
4588 	{ }, /* No op-code defined for 0x00 */
4589 	{ smp_pairing_req,         sizeof(struct bt_smp_pairing) },
4590 	{ smp_pairing_rsp,         sizeof(struct bt_smp_pairing) },
4591 	{ smp_pairing_confirm,     sizeof(struct bt_smp_pairing_confirm) },
4592 	{ smp_pairing_random,      sizeof(struct bt_smp_pairing_random) },
4593 	{ smp_pairing_failed,      sizeof(struct bt_smp_pairing_fail) },
4594 	{ smp_encrypt_info,        sizeof(struct bt_smp_encrypt_info) },
4595 	{ smp_central_ident,       sizeof(struct bt_smp_central_ident) },
4596 	{ smp_ident_info,          sizeof(struct bt_smp_ident_info) },
4597 	{ smp_ident_addr_info,     sizeof(struct bt_smp_ident_addr_info) },
4598 	{ smp_signing_info,        sizeof(struct bt_smp_signing_info) },
4599 	{ smp_security_request,    sizeof(struct bt_smp_security_request) },
4600 	{ smp_public_key,          sizeof(struct bt_smp_public_key) },
4601 	{ smp_dhkey_check,         sizeof(struct bt_smp_dhkey_check) },
4602 	{ smp_keypress_notif,      sizeof(struct bt_smp_keypress_notif) },
4603 };
4604 
is_in_pairing_procedure(struct bt_smp * smp)4605 static bool is_in_pairing_procedure(struct bt_smp *smp)
4606 {
4607 	return atomic_test_bit(smp->flags, SMP_FLAG_PAIRING);
4608 }
4609 
bt_smp_recv(struct bt_l2cap_chan * chan,struct net_buf * buf)4610 static int bt_smp_recv(struct bt_l2cap_chan *chan, struct net_buf *buf)
4611 {
4612 	struct bt_smp *smp = CONTAINER_OF(chan, struct bt_smp, chan.chan);
4613 	struct bt_smp_hdr *hdr;
4614 	uint8_t err;
4615 
4616 	if (buf->len < sizeof(*hdr)) {
4617 		LOG_ERR("Too small SMP PDU received");
4618 		return 0;
4619 	}
4620 
4621 	hdr = net_buf_pull_mem(buf, sizeof(*hdr));
4622 	LOG_DBG("Received SMP code 0x%02x len %u", hdr->code, buf->len);
4623 
4624 	/*
4625 	 * If SMP timeout occurred "no further SMP commands shall be sent over
4626 	 * the L2CAP Security Manager Channel. A new SM procedure shall only be
4627 	 * performed when a new physical link has been established."
4628 	 */
4629 	if (atomic_test_bit(smp->flags, SMP_FLAG_TIMEOUT)) {
4630 		LOG_WRN("SMP command (code 0x%02x) received after timeout", hdr->code);
4631 		return 0;
4632 	}
4633 
4634 	/*
4635 	 * Bluetooth Core Specification Version 5.2, Vol 3, Part H, page 1667:
4636 	 * If a packet is received with a Code that is reserved for future use
4637 	 * it shall be ignored.
4638 	 */
4639 	if (hdr->code >= ARRAY_SIZE(handlers)) {
4640 		LOG_WRN("Received reserved SMP code 0x%02x", hdr->code);
4641 		return 0;
4642 	}
4643 
4644 	if (!handlers[hdr->code].func) {
4645 		LOG_WRN("Unhandled SMP code 0x%02x", hdr->code);
4646 		smp_error(smp, BT_SMP_ERR_CMD_NOTSUPP);
4647 		return 0;
4648 	}
4649 
4650 	if (!atomic_test_and_clear_bit(smp->allowed_cmds, hdr->code)) {
4651 		LOG_WRN("Unexpected SMP code 0x%02x", hdr->code);
4652 		/* Do not send errors outside of pairing procedure. */
4653 		if (is_in_pairing_procedure(smp)) {
4654 			smp_error(smp, BT_SMP_ERR_UNSPECIFIED);
4655 		}
4656 		return 0;
4657 	}
4658 
4659 	if (buf->len != handlers[hdr->code].expect_len) {
4660 		LOG_ERR("Invalid len %u for code 0x%02x", buf->len, hdr->code);
4661 		smp_error(smp, BT_SMP_ERR_INVALID_PARAMS);
4662 		return 0;
4663 	}
4664 
4665 	err = handlers[hdr->code].func(smp, buf);
4666 	if (err) {
4667 		smp_error(smp, err);
4668 	}
4669 
4670 	return 0;
4671 }
4672 
pub_key_ready_notify(void)4673 static void pub_key_ready_notify(void)
4674 {
4675 	int err;
4676 
4677 	ARG_UNUSED(err);
4678 
4679 	err = k_mutex_lock(&pub_key_gen.lock, K_FOREVER);
4680 	__ASSERT_NO_MSG(err == 0);
4681 
4682 	(void)k_condvar_broadcast(&pub_key_gen.condvar);
4683 
4684 	err = k_mutex_unlock(&pub_key_gen.lock);
4685 	__ASSERT_NO_MSG(err == 0);
4686 }
4687 
bt_smp_pkey_ready(const uint8_t * pkey)4688 static void bt_smp_pkey_ready(const uint8_t *pkey)
4689 {
4690 	int i;
4691 
4692 	LOG_DBG("");
4693 
4694 	sc_public_key = pkey;
4695 
4696 	pub_key_ready_notify();
4697 
4698 	if (!pkey) {
4699 		LOG_WRN("Public key not available");
4700 		return;
4701 	}
4702 
4703 	for (i = 0; i < ARRAY_SIZE(bt_smp_pool); i++) {
4704 		struct bt_smp *smp = &bt_smp_pool[i];
4705 		uint8_t err;
4706 
4707 		if (!atomic_test_bit(smp->flags, SMP_FLAG_PKEY_SEND)) {
4708 			continue;
4709 		}
4710 
4711 		if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
4712 		    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
4713 			err = sc_send_public_key(smp);
4714 			if (err) {
4715 				smp_error(smp, err);
4716 			}
4717 
4718 			atomic_set_bit(smp->allowed_cmds,
4719 				       BT_SMP_CMD_PUBLIC_KEY);
4720 			continue;
4721 		}
4722 
4723 #if defined(CONFIG_BT_PERIPHERAL)
4724 		err = smp_public_key_periph(smp);
4725 		if (err) {
4726 			smp_error(smp, err);
4727 		}
4728 #endif /* CONFIG_BT_PERIPHERAL */
4729 	}
4730 }
4731 
bt_smp_connected(struct bt_l2cap_chan * chan)4732 static void bt_smp_connected(struct bt_l2cap_chan *chan)
4733 {
4734 	struct bt_smp *smp = CONTAINER_OF(chan, struct bt_smp, chan.chan);
4735 
4736 	LOG_DBG("chan %p cid 0x%04x", chan,
4737 		CONTAINER_OF(chan, struct bt_l2cap_le_chan, chan)->tx.cid);
4738 
4739 	k_work_init_delayable(&smp->work, smp_timeout);
4740 	smp_reset(smp);
4741 
4742 	atomic_ptr_set(&smp->auth_cb, BT_SMP_AUTH_CB_UNINITIALIZED);
4743 	atomic_set(&smp->bondable, BT_SMP_BONDABLE_UNINITIALIZED);
4744 }
4745 
bt_smp_disconnected(struct bt_l2cap_chan * chan)4746 static void bt_smp_disconnected(struct bt_l2cap_chan *chan)
4747 {
4748 	struct bt_smp *smp = CONTAINER_OF(chan, struct bt_smp, chan.chan);
4749 	struct bt_keys *keys = chan->conn->le.keys;
4750 
4751 	LOG_DBG("chan %p cid 0x%04x", chan,
4752 		CONTAINER_OF(chan, struct bt_l2cap_le_chan, chan)->tx.cid);
4753 
4754 	/* Channel disconnected callback is always called from a work handler
4755 	 * so canceling of the timeout work should always succeed.
4756 	 */
4757 	(void)k_work_cancel_delayable(&smp->work);
4758 
4759 	if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING) ||
4760 	    atomic_test_bit(smp->flags, SMP_FLAG_ENC_PENDING) ||
4761 	    atomic_test_bit(smp->flags, SMP_FLAG_SEC_REQ)) {
4762 		/* reset context and report */
4763 		smp_pairing_complete(smp, BT_SMP_ERR_UNSPECIFIED);
4764 	}
4765 
4766 	if (keys) {
4767 		/*
4768 		 * If debug keys were used for pairing remove them.
4769 		 * No keys indicate no bonding so free keys storage.
4770 		 */
4771 		if (!keys->keys || (!IS_ENABLED(CONFIG_BT_STORE_DEBUG_KEYS) &&
4772 		    (keys->flags & BT_KEYS_DEBUG))) {
4773 			bt_keys_clear(keys);
4774 		}
4775 	}
4776 
4777 	(void)memset(smp, 0, sizeof(*smp));
4778 }
4779 
bt_smp_encrypt_change(struct bt_l2cap_chan * chan,uint8_t hci_status)4780 static void bt_smp_encrypt_change(struct bt_l2cap_chan *chan,
4781 				  uint8_t hci_status)
4782 {
4783 	struct bt_smp *smp = CONTAINER_OF(chan, struct bt_smp, chan.chan);
4784 	struct bt_conn *conn = chan->conn;
4785 
4786 	LOG_DBG("chan %p conn %p handle %u encrypt 0x%02x hci status 0x%02x %s", chan, conn,
4787 		conn->handle, conn->encrypt, hci_status, bt_hci_err_to_str(hci_status));
4788 
4789 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_ENC_PENDING)) {
4790 		/* We where not waiting for encryption procedure.
4791 		 * This happens when encrypt change is called to notify that
4792 		 * security has failed before starting encryption.
4793 		 */
4794 		return;
4795 	}
4796 
4797 	if (hci_status) {
4798 		if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
4799 			uint8_t smp_err = smp_err_get(
4800 				bt_security_err_get(hci_status));
4801 
4802 			/* Fail as if it happened during key distribution */
4803 			atomic_set_bit(smp->flags, SMP_FLAG_KEYS_DISTR);
4804 			smp_pairing_complete(smp, smp_err);
4805 		}
4806 
4807 		return;
4808 	}
4809 
4810 	if (!conn->encrypt) {
4811 		return;
4812 	}
4813 
4814 	/* We were waiting for encryption but with no pairing in progress.
4815 	 * This can happen if paired peripheral sent Security Request and we
4816 	 * enabled encryption.
4817 	 */
4818 	if (!atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
4819 		smp_reset(smp);
4820 		return;
4821 	}
4822 
4823 	/* derive BR/EDR LinkKey if supported by both sides */
4824 	if (atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
4825 		if ((smp->local_dist & BT_SMP_DIST_LINK_KEY) &&
4826 		    (smp->remote_dist & BT_SMP_DIST_LINK_KEY)) {
4827 			/*
4828 			 * Link Key will be derived after key distribution to
4829 			 * make sure remote device identity is known
4830 			 */
4831 			atomic_set_bit(smp->flags, SMP_FLAG_DERIVE_LK);
4832 		}
4833 		/*
4834 		 * Those are used as pairing finished indicator so generated
4835 		 * but not distributed keys must be cleared here.
4836 		 */
4837 		smp->local_dist &= ~BT_SMP_DIST_LINK_KEY;
4838 		smp->remote_dist &= ~BT_SMP_DIST_LINK_KEY;
4839 	}
4840 
4841 	if (smp->remote_dist & BT_SMP_DIST_ENC_KEY) {
4842 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_ENCRYPT_INFO);
4843 	} else if (smp->remote_dist & BT_SMP_DIST_ID_KEY) {
4844 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_IDENT_INFO);
4845 	} else if (smp->remote_dist & BT_SMP_DIST_SIGN) {
4846 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
4847 	}
4848 
4849 	/* This is the last point that is common for all code paths in the
4850 	 * pairing process (during which we still have the option to send
4851 	 * Pairing Failed). That makes it convenient to update the RL here. We
4852 	 * want to update the RL during the pairing process so that we can fail
4853 	 * it in case there is a conflict with an existing bond.
4854 	 *
4855 	 * We can do the update here only if the peer does not intend to send us
4856 	 * any identity information. In this case we already have everything
4857 	 * that goes into the RL.
4858 	 *
4859 	 * We need an entry in the RL despite the remote not using privacy. This
4860 	 * is because we are using privacy locally and need to associate correct
4861 	 * local IRK with the peer.
4862 	 *
4863 	 * If the peer does intend to send us identity information, we must wait
4864 	 * for that information to enter it in the RL. In that case, we call
4865 	 * `smp_id_add_replace` not here, but later. If neither we nor the peer
4866 	 * are using privacy, there is no need for an entry in the RL.
4867 	 */
4868 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
4869 	    IS_ENABLED(CONFIG_BT_PRIVACY) &&
4870 	    conn->role == BT_HCI_ROLE_CENTRAL &&
4871 	    !(smp->remote_dist & BT_SMP_DIST_ID_KEY)) {
4872 		uint8_t smp_err;
4873 
4874 		smp_err = smp_id_add_replace(smp, conn->le.keys);
4875 		if (smp_err) {
4876 			smp_pairing_complete(smp, smp_err);
4877 		}
4878 	}
4879 
4880 	atomic_set_bit(smp->flags, SMP_FLAG_KEYS_DISTR);
4881 
4882 	/* Peripheral distributes it's keys first */
4883 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
4884 	    conn->role == BT_HCI_ROLE_CENTRAL && smp->remote_dist) {
4885 		return;
4886 	}
4887 
4888 	if (IS_ENABLED(CONFIG_BT_TESTING)) {
4889 		/* Avoid the HCI-USB race condition where HCI data and
4890 		 * HCI events can be re-ordered, and pairing information appears
4891 		 * to be sent unencrypted.
4892 		 */
4893 		k_sleep(K_MSEC(100));
4894 	}
4895 
4896 	if (bt_smp_distribute_keys(smp)) {
4897 		return;
4898 	}
4899 
4900 	/* if all keys were distributed, pairing is done */
4901 	if (!smp->local_dist && !smp->remote_dist) {
4902 		smp_pairing_complete(smp, 0);
4903 	}
4904 }
4905 
4906 #if defined(CONFIG_BT_SIGNING) || defined(CONFIG_BT_SMP_SELFTEST)
4907 /* Sign message using msg as a buffer, len is a size of the message,
4908  * msg buffer contains message itself, 32 bit count and signature,
4909  * so total buffer size is len + 4 + 8 octets.
4910  * API is Little Endian to make it suitable for Bluetooth.
4911  */
smp_sign_buf(const uint8_t * key,uint8_t * msg,uint16_t len)4912 static int smp_sign_buf(const uint8_t *key, uint8_t *msg, uint16_t len)
4913 {
4914 	uint8_t *m = msg;
4915 	uint32_t cnt = UNALIGNED_GET((uint32_t *)&msg[len]);
4916 	uint8_t *sig = msg + len;
4917 	uint8_t key_s[16], tmp[16];
4918 	int err;
4919 
4920 	LOG_DBG("Signing msg %s len %u key %s", bt_hex(msg, len), len, bt_hex(key, 16));
4921 
4922 	sys_mem_swap(m, len + sizeof(cnt));
4923 	sys_memcpy_swap(key_s, key, 16);
4924 
4925 	err = bt_crypto_aes_cmac(key_s, m, len + sizeof(cnt), tmp);
4926 	if (err) {
4927 		LOG_ERR("Data signing failed");
4928 		return err;
4929 	}
4930 
4931 	sys_mem_swap(tmp, sizeof(tmp));
4932 	memcpy(tmp + 4, &cnt, sizeof(cnt));
4933 
4934 	/* Swap original message back */
4935 	sys_mem_swap(m, len + sizeof(cnt));
4936 
4937 	memcpy(sig, tmp + 4, 12);
4938 
4939 	LOG_DBG("sig %s", bt_hex(sig, 12));
4940 
4941 	return 0;
4942 }
4943 #endif
4944 
4945 #if defined(CONFIG_BT_SIGNING)
bt_smp_sign_verify(struct bt_conn * conn,struct net_buf * buf)4946 int bt_smp_sign_verify(struct bt_conn *conn, struct net_buf *buf)
4947 {
4948 	struct bt_keys *keys;
4949 	uint8_t sig[12];
4950 	uint32_t cnt;
4951 	int err;
4952 
4953 	/* Store signature incl. count */
4954 	memcpy(sig, net_buf_tail(buf) - sizeof(sig), sizeof(sig));
4955 
4956 	keys = bt_keys_find(BT_KEYS_REMOTE_CSRK, conn->id, &conn->le.dst);
4957 	if (!keys) {
4958 		LOG_ERR("Unable to find Remote CSRK for %s", bt_addr_le_str(&conn->le.dst));
4959 		return -ENOENT;
4960 	}
4961 
4962 	/* Copy signing count */
4963 	cnt = sys_cpu_to_le32(keys->remote_csrk.cnt);
4964 	memcpy(net_buf_tail(buf) - sizeof(sig), &cnt, sizeof(cnt));
4965 
4966 	LOG_DBG("Sign data len %zu key %s count %u", buf->len - sizeof(sig),
4967 		bt_hex(keys->remote_csrk.val, 16), keys->remote_csrk.cnt);
4968 
4969 	err = smp_sign_buf(keys->remote_csrk.val, buf->data,
4970 			   buf->len - sizeof(sig));
4971 	if (err) {
4972 		LOG_ERR("Unable to create signature for %s", bt_addr_le_str(&conn->le.dst));
4973 		return -EIO;
4974 	}
4975 
4976 	if (memcmp(sig, net_buf_tail(buf) - sizeof(sig), sizeof(sig))) {
4977 		LOG_ERR("Unable to verify signature for %s", bt_addr_le_str(&conn->le.dst));
4978 		return -EBADMSG;
4979 	}
4980 
4981 	keys->remote_csrk.cnt++;
4982 
4983 	return 0;
4984 }
4985 
bt_smp_sign(struct bt_conn * conn,struct net_buf * buf)4986 int bt_smp_sign(struct bt_conn *conn, struct net_buf *buf)
4987 {
4988 	struct bt_keys *keys;
4989 	uint32_t cnt;
4990 	int err;
4991 
4992 	keys = bt_keys_find(BT_KEYS_LOCAL_CSRK, conn->id, &conn->le.dst);
4993 	if (!keys) {
4994 		LOG_ERR("Unable to find local CSRK for %s", bt_addr_le_str(&conn->le.dst));
4995 		return -ENOENT;
4996 	}
4997 
4998 	/* Reserve space for data signature */
4999 	net_buf_add(buf, 12);
5000 
5001 	/* Copy signing count */
5002 	cnt = sys_cpu_to_le32(keys->local_csrk.cnt);
5003 	memcpy(net_buf_tail(buf) - 12, &cnt, sizeof(cnt));
5004 
5005 	LOG_DBG("Sign data len %u key %s count %u", buf->len, bt_hex(keys->local_csrk.val, 16),
5006 		keys->local_csrk.cnt);
5007 
5008 	err = smp_sign_buf(keys->local_csrk.val, buf->data, buf->len - 12);
5009 	if (err) {
5010 		LOG_ERR("Unable to create signature for %s", bt_addr_le_str(&conn->le.dst));
5011 		return -EIO;
5012 	}
5013 
5014 	keys->local_csrk.cnt++;
5015 
5016 	return 0;
5017 }
5018 #else
bt_smp_sign_verify(struct bt_conn * conn,struct net_buf * buf)5019 int bt_smp_sign_verify(struct bt_conn *conn, struct net_buf *buf)
5020 {
5021 	return -ENOTSUP;
5022 }
5023 
bt_smp_sign(struct bt_conn * conn,struct net_buf * buf)5024 int bt_smp_sign(struct bt_conn *conn, struct net_buf *buf)
5025 {
5026 	return -ENOTSUP;
5027 }
5028 #endif /* CONFIG_BT_SIGNING */
5029 
smp_d1(const uint8_t * key,uint16_t d,uint16_t r,uint8_t res[16])5030 static int smp_d1(const uint8_t *key, uint16_t d, uint16_t r, uint8_t res[16])
5031 {
5032 	int err;
5033 
5034 	LOG_DBG("key %s d %u r %u", bt_hex(key, 16), d, r);
5035 
5036 	sys_put_le16(d, &res[0]);
5037 	sys_put_le16(r, &res[2]);
5038 	memset(&res[4], 0, 16 - 4);
5039 
5040 	err = bt_encrypt_le(key, res, res);
5041 	if (err) {
5042 		return err;
5043 	}
5044 
5045 	LOG_DBG("res %s", bt_hex(res, 16));
5046 	return 0;
5047 }
5048 
bt_smp_irk_get(uint8_t * ir,uint8_t * irk)5049 int bt_smp_irk_get(uint8_t *ir, uint8_t *irk)
5050 {
5051 	uint8_t invalid_ir[16] = { 0 };
5052 
5053 	if (!memcmp(ir, invalid_ir, 16)) {
5054 		return -EINVAL;
5055 	}
5056 
5057 	return smp_d1(ir, 1, 0, irk);
5058 }
5059 
5060 #if defined(CONFIG_BT_SMP_SELFTEST)
5061 /* Test vectors are taken from RFC 4493
5062  * https://tools.ietf.org/html/rfc4493
5063  * Same mentioned in the Bluetooth Spec.
5064  */
5065 static const uint8_t key[] = {
5066 	0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
5067 	0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
5068 };
5069 
5070 static const uint8_t M[] = {
5071 	0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
5072 	0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
5073 	0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
5074 	0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
5075 	0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
5076 	0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
5077 	0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
5078 	0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
5079 };
5080 
aes_test(const char * prefix,const uint8_t * in_key,const uint8_t * m,uint16_t len,const uint8_t * mac)5081 static int aes_test(const char *prefix, const uint8_t *in_key, const uint8_t *m,
5082 		    uint16_t len, const uint8_t *mac)
5083 {
5084 	uint8_t out[16];
5085 
5086 	LOG_DBG("%s: AES CMAC of message with len %u", prefix, len);
5087 
5088 	bt_crypto_aes_cmac(in_key, m, len, out);
5089 	if (!memcmp(out, mac, 16)) {
5090 		LOG_DBG("%s: Success", prefix);
5091 	} else {
5092 		LOG_ERR("%s: Failed", prefix);
5093 		return -1;
5094 	}
5095 
5096 	return 0;
5097 }
5098 
smp_aes_cmac_test(void)5099 static int smp_aes_cmac_test(void)
5100 {
5101 	uint8_t mac1[] = {
5102 		0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
5103 		0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46
5104 	};
5105 	uint8_t mac2[] = {
5106 		0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
5107 		0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c
5108 	};
5109 	uint8_t mac3[] = {
5110 		0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30,
5111 		0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27
5112 	};
5113 	uint8_t mac4[] = {
5114 		0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
5115 		0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe
5116 	};
5117 	int err;
5118 
5119 	err = aes_test("Test aes-cmac0", key, M, 0, mac1);
5120 	if (err) {
5121 		return err;
5122 	}
5123 
5124 	err = aes_test("Test aes-cmac16", key, M, 16, mac2);
5125 	if (err) {
5126 		return err;
5127 	}
5128 
5129 	err = aes_test("Test aes-cmac40", key, M, 40, mac3);
5130 	if (err) {
5131 		return err;
5132 	}
5133 
5134 	err = aes_test("Test aes-cmac64", key, M, 64, mac4);
5135 	if (err) {
5136 		return err;
5137 	}
5138 
5139 	return 0;
5140 }
5141 
sign_test(const char * prefix,const uint8_t * sign_key,const uint8_t * m,uint16_t len,const uint8_t * sig)5142 static int sign_test(const char *prefix, const uint8_t *sign_key, const uint8_t *m,
5143 		     uint16_t len, const uint8_t *sig)
5144 {
5145 	uint8_t msg[len + sizeof(uint32_t) + 8];
5146 	uint8_t orig[len + sizeof(uint32_t) + 8];
5147 	uint8_t *out = msg + len;
5148 	int err;
5149 
5150 	LOG_DBG("%s: Sign message with len %u", prefix, len);
5151 
5152 	(void)memset(msg, 0, sizeof(msg));
5153 	memcpy(msg, m, len);
5154 	(void)memset(msg + len, 0, sizeof(uint32_t));
5155 
5156 	memcpy(orig, msg, sizeof(msg));
5157 
5158 	err = smp_sign_buf(sign_key, msg, len);
5159 	if (err) {
5160 		return err;
5161 	}
5162 
5163 	/* Check original message */
5164 	if (!memcmp(msg, orig, len + sizeof(uint32_t))) {
5165 		LOG_DBG("%s: Original message intact", prefix);
5166 	} else {
5167 		LOG_ERR("%s: Original message modified", prefix);
5168 		LOG_DBG("%s: orig %s", prefix, bt_hex(orig, sizeof(orig)));
5169 		LOG_DBG("%s: msg %s", prefix, bt_hex(msg, sizeof(msg)));
5170 		return -1;
5171 	}
5172 
5173 	if (!memcmp(out, sig, 12)) {
5174 		LOG_DBG("%s: Success", prefix);
5175 	} else {
5176 		LOG_ERR("%s: Failed", prefix);
5177 		return -1;
5178 	}
5179 
5180 	return 0;
5181 }
5182 
smp_sign_test(void)5183 static int smp_sign_test(void)
5184 {
5185 	const uint8_t sig1[] = {
5186 		0x00, 0x00, 0x00, 0x00, 0xb3, 0xa8, 0x59, 0x41,
5187 		0x27, 0xeb, 0xc2, 0xc0
5188 	};
5189 	const uint8_t sig2[] = {
5190 		0x00, 0x00, 0x00, 0x00, 0x27, 0x39, 0x74, 0xf4,
5191 		0x39, 0x2a, 0x23, 0x2a
5192 	};
5193 	const uint8_t sig3[] = {
5194 		0x00, 0x00, 0x00, 0x00, 0xb7, 0xca, 0x94, 0xab,
5195 		0x87, 0xc7, 0x82, 0x18
5196 	};
5197 	const uint8_t sig4[] = {
5198 		0x00, 0x00, 0x00, 0x00, 0x44, 0xe1, 0xe6, 0xce,
5199 		0x1d, 0xf5, 0x13, 0x68
5200 	};
5201 	uint8_t key_s[16];
5202 	int err;
5203 
5204 	/* Use the same key as aes-cmac but swap bytes */
5205 	sys_memcpy_swap(key_s, key, 16);
5206 
5207 	err = sign_test("Test sign0", key_s, M, 0, sig1);
5208 	if (err) {
5209 		return err;
5210 	}
5211 
5212 	err = sign_test("Test sign16", key_s, M, 16, sig2);
5213 	if (err) {
5214 		return err;
5215 	}
5216 
5217 	err = sign_test("Test sign40", key_s, M, 40, sig3);
5218 	if (err) {
5219 		return err;
5220 	}
5221 
5222 	err = sign_test("Test sign64", key_s, M, 64, sig4);
5223 	if (err) {
5224 		return err;
5225 	}
5226 
5227 	return 0;
5228 }
5229 
smp_f4_test(void)5230 static int smp_f4_test(void)
5231 {
5232 	uint8_t u[32] = { 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
5233 			  0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
5234 			  0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
5235 			  0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
5236 	uint8_t v[32] = { 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
5237 			  0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
5238 			  0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
5239 			  0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
5240 	uint8_t x[16] = { 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
5241 			  0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
5242 	uint8_t z = 0x00;
5243 	uint8_t exp[16] = { 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
5244 			    0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
5245 	uint8_t res[16];
5246 	int err;
5247 
5248 	err = bt_crypto_f4(u, v, x, z, res);
5249 	if (err) {
5250 		return err;
5251 	}
5252 
5253 	if (memcmp(res, exp, 16)) {
5254 		return -EINVAL;
5255 	}
5256 
5257 	return 0;
5258 }
5259 
smp_f5_test(void)5260 static int smp_f5_test(void)
5261 {
5262 	uint8_t w[32] = { 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
5263 			  0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
5264 			  0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
5265 			  0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
5266 	uint8_t n1[16] = { 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
5267 			   0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
5268 	uint8_t n2[16] = { 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
5269 			   0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
5270 	bt_addr_le_t a1 = { .type = 0x00,
5271 			    .a.val = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56 } };
5272 	bt_addr_le_t a2 = { .type = 0x00,
5273 			    .a.val = {0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7 } };
5274 	uint8_t exp_ltk[16] = { 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05,
5275 				0x98, 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79,
5276 				0x86, 0x69 };
5277 	uint8_t exp_mackey[16] = { 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f,
5278 				   0xfd, 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1,
5279 				   0x65, 0x29 };
5280 	uint8_t mackey[16], ltk[16];
5281 	int err;
5282 
5283 	err = bt_crypto_f5(w, n1, n2, &a1, &a2, mackey, ltk);
5284 	if (err) {
5285 		return err;
5286 	}
5287 
5288 	if (memcmp(mackey, exp_mackey, 16) || memcmp(ltk, exp_ltk, 16)) {
5289 		return -EINVAL;
5290 	}
5291 
5292 	return 0;
5293 }
5294 
smp_f6_test(void)5295 static int smp_f6_test(void)
5296 {
5297 	uint8_t w[16] = { 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
5298 			  0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
5299 	uint8_t n1[16] = { 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
5300 			   0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
5301 	uint8_t n2[16] = { 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
5302 			   0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
5303 	uint8_t r[16] = { 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
5304 			  0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
5305 	uint8_t io_cap[3] = { 0x02, 0x01, 0x01 };
5306 	bt_addr_le_t a1 = { .type = 0x00,
5307 			    .a.val = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56 } };
5308 	bt_addr_le_t a2 = { .type = 0x00,
5309 			    .a.val = {0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7 } };
5310 	uint8_t exp[16] = { 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
5311 			    0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
5312 	uint8_t res[16];
5313 	int err;
5314 
5315 	err = bt_crypto_f6(w, n1, n2, r, io_cap, &a1, &a2, res);
5316 	if (err) {
5317 		return err;
5318 	}
5319 
5320 	if (memcmp(res, exp, 16)) {
5321 		return -EINVAL;
5322 	}
5323 
5324 	return 0;
5325 }
5326 
smp_g2_test(void)5327 static int smp_g2_test(void)
5328 {
5329 	uint8_t u[32] = { 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
5330 			  0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
5331 			  0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
5332 			  0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
5333 	uint8_t v[32] = { 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
5334 			  0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
5335 			  0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
5336 			  0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
5337 	uint8_t x[16] = { 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
5338 			  0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
5339 	uint8_t y[16] = { 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
5340 			  0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
5341 	uint32_t exp_val = 0x2f9ed5ba % 1000000;
5342 	uint32_t val;
5343 	int err;
5344 
5345 	err = bt_crypto_g2(u, v, x, y, &val);
5346 	if (err) {
5347 		return err;
5348 	}
5349 
5350 	if (val != exp_val) {
5351 		return -EINVAL;
5352 	}
5353 
5354 	return 0;
5355 }
5356 
5357 #if defined(CONFIG_BT_CLASSIC)
smp_h6_test(void)5358 static int smp_h6_test(void)
5359 {
5360 	uint8_t w[16] = { 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
5361 			  0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
5362 	uint8_t key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
5363 	uint8_t exp_res[16] = { 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
5364 				0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d};
5365 	uint8_t res[16];
5366 	int err;
5367 
5368 	err = bt_crypto_h6(w, key_id, res);
5369 	if (err) {
5370 		return err;
5371 	}
5372 
5373 	if (memcmp(res, exp_res, 16)) {
5374 		return -EINVAL;
5375 	}
5376 
5377 	return 0;
5378 }
5379 
smp_h7_test(void)5380 static int smp_h7_test(void)
5381 {
5382 	uint8_t salt[16] = { 0x31, 0x70, 0x6d, 0x74, 0x00, 0x00, 0x00, 0x00,
5383 			     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
5384 	uint8_t w[16] = { 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
5385 			  0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
5386 	uint8_t exp_res[16] = { 0x11, 0x70, 0xa5, 0x75, 0x2a, 0x8c, 0x99, 0xd2,
5387 				0xec, 0xc0, 0xa3, 0xc6, 0x97, 0x35, 0x17, 0xfb};
5388 	uint8_t res[16];
5389 	int err;
5390 
5391 	err = bt_crypto_h7(salt, w, res);
5392 	if (err) {
5393 		return err;
5394 	}
5395 
5396 	if (memcmp(res, exp_res, 16)) {
5397 		return -EINVAL;
5398 	}
5399 
5400 	return 0;
5401 }
5402 #endif /* CONFIG_BT_CLASSIC */
5403 
smp_h8_test(void)5404 static int smp_h8_test(void)
5405 {
5406 	uint8_t k[16] = {0xec, 0x02, 0x34, 0xa3, 0x57, 0xc8, 0xad, 0x05,
5407 			 0x34, 0x10, 0x10, 0xa6, 0x0a, 0x39, 0x7d, 0x9b};
5408 	uint8_t s[16] = {0x15, 0x36, 0xd1, 0x8d, 0xe3, 0xd2, 0x0d, 0xf9,
5409 			 0x9b, 0x70, 0x44, 0xc1, 0x2f, 0x9e, 0xd5, 0xba};
5410 	uint8_t key_id[4] = {0xcc, 0x03, 0x01, 0x48};
5411 
5412 	uint8_t exp_res[16] = {0xe5, 0xe5, 0xbe, 0xba, 0xae, 0x72, 0x28, 0xe7,
5413 			       0x22, 0xa3, 0x89, 0x04, 0xed, 0x35, 0x0f, 0x6d};
5414 	uint8_t res[16];
5415 	int err;
5416 
5417 	err = bt_crypto_h8(k, s, key_id, res);
5418 	if (err) {
5419 		return err;
5420 	}
5421 
5422 	if (memcmp(res, exp_res, 16)) {
5423 		return -EINVAL;
5424 	}
5425 
5426 	return 0;
5427 }
5428 
smp_self_test(void)5429 static int smp_self_test(void)
5430 {
5431 	int err;
5432 
5433 	err = smp_aes_cmac_test();
5434 	if (err) {
5435 		LOG_ERR("SMP AES-CMAC self tests failed");
5436 		return err;
5437 	}
5438 
5439 	err = smp_sign_test();
5440 	if (err) {
5441 		LOG_ERR("SMP signing self tests failed");
5442 		return err;
5443 	}
5444 
5445 	err = smp_f4_test();
5446 	if (err) {
5447 		LOG_ERR("SMP f4 self test failed");
5448 		return err;
5449 	}
5450 
5451 	err = smp_f5_test();
5452 	if (err) {
5453 		LOG_ERR("SMP f5 self test failed");
5454 		return err;
5455 	}
5456 
5457 	err = smp_f6_test();
5458 	if (err) {
5459 		LOG_ERR("SMP f6 self test failed");
5460 		return err;
5461 	}
5462 
5463 	err = smp_g2_test();
5464 	if (err) {
5465 		LOG_ERR("SMP g2 self test failed");
5466 		return err;
5467 	}
5468 
5469 #if defined(CONFIG_BT_CLASSIC)
5470 	err = smp_h6_test();
5471 	if (err) {
5472 		LOG_ERR("SMP h6 self test failed");
5473 		return err;
5474 	}
5475 
5476 	err = smp_h7_test();
5477 	if (err) {
5478 		LOG_ERR("SMP h7 self test failed");
5479 		return err;
5480 	}
5481 #endif /* CONFIG_BT_CLASSIC */
5482 	err = smp_h8_test();
5483 	if (err) {
5484 		LOG_ERR("SMP h8 self test failed");
5485 		return err;
5486 	}
5487 
5488 	return 0;
5489 }
5490 #else
smp_self_test(void)5491 static inline int smp_self_test(void)
5492 {
5493 	return 0;
5494 }
5495 #endif
5496 
5497 #if defined(CONFIG_BT_BONDABLE_PER_CONNECTION)
bt_conn_set_bondable(struct bt_conn * conn,bool enable)5498 int bt_conn_set_bondable(struct bt_conn *conn, bool enable)
5499 {
5500 	struct bt_smp *smp;
5501 
5502 	if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) {
5503 		LOG_DBG("Invalid connection type: %u for %p", conn->type, conn);
5504 		return -EINVAL;
5505 	}
5506 
5507 	if (IS_ENABLED(CONFIG_BT_CLASSIC) && (conn->type == BT_CONN_TYPE_BR)) {
5508 		if (enable && atomic_test_and_set_bit(conn->flags, BT_CONN_BR_BONDABLE)) {
5509 			return -EALREADY;
5510 		}
5511 		if (!enable && !atomic_test_and_clear_bit(conn->flags, BT_CONN_BR_BONDABLE)) {
5512 			return -EALREADY;
5513 		}
5514 		return 0;
5515 	}
5516 
5517 	smp = smp_chan_get(conn);
5518 	if (!smp) {
5519 		return -EINVAL;
5520 	}
5521 
5522 	if (atomic_cas(&smp->bondable, BT_SMP_BONDABLE_UNINITIALIZED, (atomic_val_t)enable)) {
5523 		return 0;
5524 	} else {
5525 		return -EALREADY;
5526 	}
5527 }
5528 #endif
5529 
bt_smp_auth_cb_overlay(struct bt_conn * conn,const struct bt_conn_auth_cb * cb)5530 int bt_smp_auth_cb_overlay(struct bt_conn *conn, const struct bt_conn_auth_cb *cb)
5531 {
5532 	struct bt_smp *smp;
5533 
5534 	smp = smp_chan_get(conn);
5535 	if (!smp) {
5536 		return -EINVAL;
5537 	}
5538 
5539 	if (atomic_ptr_cas(&smp->auth_cb, BT_SMP_AUTH_CB_UNINITIALIZED, (atomic_ptr_val_t)cb)) {
5540 		return 0;
5541 	} else {
5542 		return -EALREADY;
5543 	}
5544 }
5545 
5546 #if defined(CONFIG_BT_PASSKEY_KEYPRESS)
smp_send_keypress_notif(struct bt_smp * smp,uint8_t type)5547 static int smp_send_keypress_notif(struct bt_smp *smp, uint8_t type)
5548 {
5549 	struct bt_smp_keypress_notif *req;
5550 	struct net_buf *buf;
5551 
5552 	buf = smp_create_pdu(smp, BT_SMP_KEYPRESS_NOTIFICATION, sizeof(*req));
5553 	if (!buf) {
5554 		return -ENOMEM;
5555 	}
5556 
5557 	req = net_buf_add(buf, sizeof(*req));
5558 	req->type = type;
5559 
5560 	smp_send(smp, buf, NULL, NULL);
5561 
5562 	return 0;
5563 }
5564 #endif
5565 
5566 #if defined(CONFIG_BT_PASSKEY_KEYPRESS)
bt_smp_auth_keypress_notify(struct bt_conn * conn,enum bt_conn_auth_keypress type)5567 int bt_smp_auth_keypress_notify(struct bt_conn *conn, enum bt_conn_auth_keypress type)
5568 {
5569 	struct bt_smp *smp;
5570 
5571 	smp = smp_chan_get(conn);
5572 	if (!smp) {
5573 		return -EINVAL;
5574 	}
5575 
5576 	CHECKIF(!IN_RANGE(type,
5577 			  BT_CONN_AUTH_KEYPRESS_ENTRY_STARTED,
5578 			  BT_CONN_AUTH_KEYPRESS_ENTRY_COMPLETED)) {
5579 		LOG_ERR("Refusing to send unknown event type %u", type);
5580 		return -EINVAL;
5581 	}
5582 
5583 	if (smp->method != PASSKEY_INPUT ||
5584 	    !atomic_test_bit(smp->flags, SMP_FLAG_USER)) {
5585 		LOG_ERR("Refusing to send keypress: Not waiting for passkey input.");
5586 		return -EINVAL;
5587 	}
5588 
5589 	return smp_send_keypress_notif(smp, type);
5590 }
5591 #endif
5592 
bt_smp_auth_passkey_entry(struct bt_conn * conn,unsigned int passkey)5593 int bt_smp_auth_passkey_entry(struct bt_conn *conn, unsigned int passkey)
5594 {
5595 	struct bt_smp *smp;
5596 	uint8_t err;
5597 
5598 	smp = smp_chan_get(conn);
5599 	if (!smp) {
5600 		return -EINVAL;
5601 	}
5602 
5603 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_USER)) {
5604 		return -EINVAL;
5605 	}
5606 
5607 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
5608 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
5609 		legacy_passkey_entry(smp, passkey);
5610 		return 0;
5611 	}
5612 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
5613 
5614 	smp->passkey = sys_cpu_to_le32(passkey);
5615 
5616 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
5617 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
5618 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
5619 		err = smp_send_pairing_confirm(smp);
5620 		if (err) {
5621 			smp_error(smp, BT_SMP_ERR_PASSKEY_ENTRY_FAILED);
5622 			return 0;
5623 		}
5624 		return 0;
5625 	}
5626 
5627 	if (IS_ENABLED(CONFIG_BT_PERIPHERAL) &&
5628 	    atomic_test_bit(smp->flags, SMP_FLAG_CFM_DELAYED)) {
5629 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
5630 		err = smp_send_pairing_confirm(smp);
5631 		if (err) {
5632 			smp_error(smp, BT_SMP_ERR_PASSKEY_ENTRY_FAILED);
5633 			return 0;
5634 		}
5635 	}
5636 
5637 	return 0;
5638 }
5639 
bt_smp_auth_passkey_confirm(struct bt_conn * conn)5640 int bt_smp_auth_passkey_confirm(struct bt_conn *conn)
5641 {
5642 	struct bt_smp *smp;
5643 
5644 	smp = smp_chan_get(conn);
5645 	if (!smp) {
5646 		return -EINVAL;
5647 	}
5648 
5649 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_USER)) {
5650 		return -EINVAL;
5651 	}
5652 
5653 	/* wait for DHKey being generated */
5654 	if (atomic_test_bit(smp->flags, SMP_FLAG_DHKEY_PENDING)) {
5655 		atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
5656 		return 0;
5657 	}
5658 
5659 	/* wait for remote DHKey Check */
5660 	if (atomic_test_bit(smp->flags, SMP_FLAG_DHCHECK_WAIT)) {
5661 		atomic_set_bit(smp->flags, SMP_FLAG_DHKEY_SEND);
5662 		return 0;
5663 	}
5664 
5665 	if (atomic_test_bit(smp->flags, SMP_FLAG_DHKEY_SEND)) {
5666 		uint8_t err;
5667 
5668 #if defined(CONFIG_BT_CENTRAL)
5669 		if (smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
5670 			err = compute_and_send_central_dhcheck(smp);
5671 			if (err) {
5672 				smp_error(smp, err);
5673 			}
5674 			return 0;
5675 		}
5676 #endif /* CONFIG_BT_CENTRAL */
5677 
5678 #if defined(CONFIG_BT_PERIPHERAL)
5679 		err = compute_and_check_and_send_periph_dhcheck(smp);
5680 		if (err) {
5681 			smp_error(smp, err);
5682 		}
5683 #endif /* CONFIG_BT_PERIPHERAL */
5684 	}
5685 
5686 	return 0;
5687 }
5688 
5689 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
bt_smp_le_oob_set_tk(struct bt_conn * conn,const uint8_t * tk)5690 int bt_smp_le_oob_set_tk(struct bt_conn *conn, const uint8_t *tk)
5691 {
5692 	struct bt_smp *smp;
5693 
5694 	smp = smp_chan_get(conn);
5695 	if (!smp || !tk) {
5696 		return -EINVAL;
5697 	}
5698 
5699 	LOG_DBG("%s", bt_hex(tk, 16));
5700 
5701 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_USER)) {
5702 		return -EINVAL;
5703 	}
5704 
5705 	if (IS_ENABLED(CONFIG_BT_LOG_SNIFFER_INFO)) {
5706 		uint8_t oob[16];
5707 
5708 		sys_memcpy_swap(oob, tk, 16);
5709 		LOG_INF("Legacy OOB data 0x%s", bt_hex(oob, 16));
5710 	}
5711 
5712 	memcpy(smp->tk, tk, 16*sizeof(uint8_t));
5713 
5714 	legacy_user_tk_entry(smp);
5715 
5716 	return 0;
5717 }
5718 #endif /* !defined(CONFIG_BT_SMP_SC_PAIR_ONLY) */
5719 
bt_smp_le_oob_generate_sc_data(struct bt_le_oob_sc_data * le_sc_oob)5720 int bt_smp_le_oob_generate_sc_data(struct bt_le_oob_sc_data *le_sc_oob)
5721 {
5722 	int err;
5723 
5724 	if (!le_sc_supported()) {
5725 		return -ENOTSUP;
5726 	}
5727 
5728 	if (!sc_public_key) {
5729 		/* Public key request has not been finished yet, or finished, but generation failed.
5730 		 * Retrying.
5731 		 */
5732 		err = k_mutex_lock(&pub_key_gen.lock, K_FOREVER);
5733 		__ASSERT_NO_MSG(err == 0);
5734 
5735 		err = bt_pub_key_gen(&pub_key_gen.cb);
5736 		if (err && err != -EALREADY) {
5737 			LOG_WRN("Public key re-generation request failed (%d)", err);
5738 
5739 			int mutex_err;
5740 
5741 			mutex_err = k_mutex_unlock(&pub_key_gen.lock);
5742 			__ASSERT_NO_MSG(mutex_err == 0);
5743 
5744 			return err;
5745 		}
5746 
5747 		/* 30 seconds is an arbitrary number. Increase if fails earlier on certain
5748 		 * platforms.
5749 		 */
5750 		err = k_condvar_wait(&pub_key_gen.condvar,
5751 				     &pub_key_gen.lock,
5752 				     K_SECONDS(30));
5753 		if (err) {
5754 			LOG_WRN("Public key generation timeout");
5755 			return err;
5756 		}
5757 
5758 		err = k_mutex_unlock(&pub_key_gen.lock);
5759 		__ASSERT_NO_MSG(err == 0);
5760 
5761 		/* Public key has been re-requested but generation failed. */
5762 		if (!sc_public_key) {
5763 			return -EAGAIN;
5764 		}
5765 	}
5766 
5767 	if (IS_ENABLED(CONFIG_BT_OOB_DATA_FIXED)) {
5768 		uint8_t rand_num[] = {
5769 			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
5770 			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
5771 		};
5772 
5773 		memcpy(le_sc_oob->r, rand_num, sizeof(le_sc_oob->r));
5774 	} else {
5775 		err = bt_rand(le_sc_oob->r, 16);
5776 		if (err) {
5777 			return err;
5778 		}
5779 	}
5780 
5781 	err = bt_crypto_f4(sc_public_key, sc_public_key, le_sc_oob->r, 0,
5782 		     le_sc_oob->c);
5783 	if (err) {
5784 		return err;
5785 	}
5786 
5787 	return 0;
5788 }
5789 
5790 #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
le_sc_oob_data_check(struct bt_smp * smp,bool oobd_local_present,bool oobd_remote_present)5791 static bool le_sc_oob_data_check(struct bt_smp *smp, bool oobd_local_present,
5792 				 bool oobd_remote_present)
5793 {
5794 	bool req_oob_present = le_sc_oob_data_req_check(smp);
5795 	bool rsp_oob_present = le_sc_oob_data_rsp_check(smp);
5796 
5797 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
5798 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
5799 		if ((req_oob_present != oobd_remote_present) &&
5800 		    (rsp_oob_present != oobd_local_present)) {
5801 			return false;
5802 		}
5803 	} else if (IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
5804 		if ((req_oob_present != oobd_local_present) &&
5805 		    (rsp_oob_present != oobd_remote_present)) {
5806 			return false;
5807 		}
5808 	}
5809 
5810 	return true;
5811 }
5812 
le_sc_oob_pairing_continue(struct bt_smp * smp)5813 static int le_sc_oob_pairing_continue(struct bt_smp *smp)
5814 {
5815 	if (smp->oobd_remote) {
5816 		int err;
5817 		uint8_t c[16];
5818 
5819 		err = bt_crypto_f4(smp->pkey, smp->pkey, smp->oobd_remote->r, 0, c);
5820 		if (err) {
5821 			return err;
5822 		}
5823 
5824 		bool match = (memcmp(c, smp->oobd_remote->c, sizeof(c)) == 0);
5825 
5826 		if (!match) {
5827 			smp_error(smp, BT_SMP_ERR_CONFIRM_FAILED);
5828 			return 0;
5829 		}
5830 	}
5831 
5832 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
5833 	    smp->chan.chan.conn->role == BT_HCI_ROLE_CENTRAL) {
5834 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
5835 	} else if (IS_ENABLED(CONFIG_BT_PERIPHERAL)) {
5836 		atomic_set_bit(smp->allowed_cmds, BT_SMP_DHKEY_CHECK);
5837 		atomic_set_bit(smp->flags, SMP_FLAG_DHCHECK_WAIT);
5838 	}
5839 
5840 	return smp_send_pairing_random(smp);
5841 }
5842 
bt_smp_le_oob_set_sc_data(struct bt_conn * conn,const struct bt_le_oob_sc_data * oobd_local,const struct bt_le_oob_sc_data * oobd_remote)5843 int bt_smp_le_oob_set_sc_data(struct bt_conn *conn,
5844 			      const struct bt_le_oob_sc_data *oobd_local,
5845 			      const struct bt_le_oob_sc_data *oobd_remote)
5846 {
5847 	struct bt_smp *smp;
5848 
5849 	smp = smp_chan_get(conn);
5850 	if (!smp) {
5851 		return -EINVAL;
5852 	}
5853 
5854 	if (!le_sc_oob_data_check(smp, (oobd_local != NULL),
5855 				  (oobd_remote != NULL))) {
5856 		return -EINVAL;
5857 	}
5858 
5859 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_OOB_PENDING)) {
5860 		return -EINVAL;
5861 	}
5862 
5863 	smp->oobd_local = oobd_local;
5864 	smp->oobd_remote = oobd_remote;
5865 
5866 	return le_sc_oob_pairing_continue(smp);
5867 }
5868 
bt_smp_le_oob_get_sc_data(struct bt_conn * conn,const struct bt_le_oob_sc_data ** oobd_local,const struct bt_le_oob_sc_data ** oobd_remote)5869 int bt_smp_le_oob_get_sc_data(struct bt_conn *conn,
5870 			      const struct bt_le_oob_sc_data **oobd_local,
5871 			      const struct bt_le_oob_sc_data **oobd_remote)
5872 {
5873 	struct bt_smp *smp;
5874 
5875 	smp = smp_chan_get(conn);
5876 	if (!smp) {
5877 		return -EINVAL;
5878 	}
5879 
5880 	if (!smp->oobd_local && !smp->oobd_remote) {
5881 		return -ESRCH;
5882 	}
5883 
5884 	if (oobd_local) {
5885 		*oobd_local = smp->oobd_local;
5886 	}
5887 
5888 	if (oobd_remote) {
5889 		*oobd_remote = smp->oobd_remote;
5890 	}
5891 
5892 	return 0;
5893 }
5894 #endif /* !CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY */
5895 
bt_smp_auth_cancel(struct bt_conn * conn)5896 int bt_smp_auth_cancel(struct bt_conn *conn)
5897 {
5898 	struct bt_smp *smp;
5899 
5900 	smp = smp_chan_get(conn);
5901 	if (!smp) {
5902 		return -EINVAL;
5903 	}
5904 
5905 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_USER)) {
5906 		return -EINVAL;
5907 	}
5908 
5909 	LOG_DBG("");
5910 
5911 	switch (smp->method) {
5912 	case PASSKEY_INPUT:
5913 	case PASSKEY_DISPLAY:
5914 		return smp_error(smp, BT_SMP_ERR_PASSKEY_ENTRY_FAILED);
5915 	case PASSKEY_CONFIRM:
5916 		return smp_error(smp, BT_SMP_ERR_CONFIRM_FAILED);
5917 	case LE_SC_OOB:
5918 	case LEGACY_OOB:
5919 		return smp_error(smp, BT_SMP_ERR_OOB_NOT_AVAIL);
5920 	case JUST_WORKS:
5921 		return smp_error(smp, BT_SMP_ERR_UNSPECIFIED);
5922 	default:
5923 		LOG_ERR("Unknown pairing method (%u)", smp->method);
5924 		return 0;
5925 	}
5926 }
5927 
5928 #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
bt_smp_auth_pairing_confirm(struct bt_conn * conn)5929 int bt_smp_auth_pairing_confirm(struct bt_conn *conn)
5930 {
5931 	struct bt_smp *smp;
5932 
5933 	smp = smp_chan_get(conn);
5934 	if (!smp) {
5935 		return -EINVAL;
5936 	}
5937 
5938 	if (!atomic_test_and_clear_bit(smp->flags, SMP_FLAG_USER)) {
5939 		return -EINVAL;
5940 	}
5941 
5942 	if (IS_ENABLED(CONFIG_BT_CENTRAL) &&
5943 	    conn->role == BT_CONN_ROLE_CENTRAL) {
5944 		if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
5945 			atomic_set_bit(smp->allowed_cmds,
5946 				       BT_SMP_CMD_PAIRING_CONFIRM);
5947 			return legacy_send_pairing_confirm(smp);
5948 		}
5949 
5950 		if (!sc_public_key) {
5951 			atomic_set_bit(smp->flags, SMP_FLAG_PKEY_SEND);
5952 			return 0;
5953 		}
5954 
5955 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PUBLIC_KEY);
5956 		return sc_send_public_key(smp);
5957 	}
5958 
5959 #if defined(CONFIG_BT_PERIPHERAL)
5960 	if (!atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
5961 		atomic_set_bit(smp->allowed_cmds,
5962 			       BT_SMP_CMD_PAIRING_CONFIRM);
5963 		return send_pairing_rsp(smp);
5964 	}
5965 
5966 	atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_PUBLIC_KEY);
5967 	if (send_pairing_rsp(smp)) {
5968 		return -EIO;
5969 	}
5970 #endif /* CONFIG_BT_PERIPHERAL */
5971 
5972 	return 0;
5973 }
5974 #else
bt_smp_auth_pairing_confirm(struct bt_conn * conn)5975 int bt_smp_auth_pairing_confirm(struct bt_conn *conn)
5976 {
5977 	/* confirm_pairing will never be called in LE SC only mode */
5978 	return -EINVAL;
5979 }
5980 #endif /* !CONFIG_BT_SMP_SC_PAIR_ONLY */
5981 
5982 #if defined(CONFIG_BT_FIXED_PASSKEY)
bt_passkey_set(unsigned int passkey)5983 int bt_passkey_set(unsigned int passkey)
5984 {
5985 	if (passkey == BT_PASSKEY_INVALID) {
5986 		fixed_passkey = BT_PASSKEY_INVALID;
5987 		return 0;
5988 	}
5989 
5990 	if (passkey > 999999) {
5991 		return -EINVAL;
5992 	}
5993 
5994 	fixed_passkey = passkey;
5995 	return 0;
5996 }
5997 #endif /* CONFIG_BT_FIXED_PASSKEY */
5998 
bt_smp_start_security(struct bt_conn * conn)5999 int bt_smp_start_security(struct bt_conn *conn)
6000 {
6001 	switch (conn->role) {
6002 #if defined(CONFIG_BT_CENTRAL)
6003 	case BT_HCI_ROLE_CENTRAL:
6004 	{
6005 		int err;
6006 		struct bt_smp *smp;
6007 
6008 		smp = smp_chan_get(conn);
6009 		if (!smp) {
6010 			return -ENOTCONN;
6011 		}
6012 
6013 		/* pairing is in progress */
6014 		if (atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
6015 			return -EBUSY;
6016 		}
6017 
6018 		/* Encryption is in progress */
6019 		if (atomic_test_bit(smp->flags, SMP_FLAG_ENC_PENDING)) {
6020 			return -EBUSY;
6021 		}
6022 
6023 		if (!smp_keys_check(conn)) {
6024 			return smp_send_pairing_req(conn);
6025 		}
6026 
6027 		/* LE SC LTK and legacy central LTK are stored in same place */
6028 		err = bt_conn_le_start_encryption(conn,
6029 						  conn->le.keys->ltk.rand,
6030 						  conn->le.keys->ltk.ediv,
6031 						  conn->le.keys->ltk.val,
6032 						  conn->le.keys->enc_size);
6033 		if (err) {
6034 			return err;
6035 		}
6036 
6037 		atomic_set_bit(smp->allowed_cmds, BT_SMP_CMD_SECURITY_REQUEST);
6038 		atomic_set_bit(smp->flags, SMP_FLAG_ENC_PENDING);
6039 		return 0;
6040 	}
6041 #endif /* CONFIG_BT_CENTRAL && CONFIG_BT_SMP */
6042 #if defined(CONFIG_BT_PERIPHERAL)
6043 	case BT_HCI_ROLE_PERIPHERAL:
6044 		return smp_send_security_req(conn);
6045 #endif /* CONFIG_BT_PERIPHERAL && CONFIG_BT_SMP */
6046 	default:
6047 		return -EINVAL;
6048 	}
6049 }
6050 
bt_smp_update_keys(struct bt_conn * conn)6051 void bt_smp_update_keys(struct bt_conn *conn)
6052 {
6053 	struct bt_smp *smp;
6054 
6055 	smp = smp_chan_get(conn);
6056 	if (!smp) {
6057 		return;
6058 	}
6059 
6060 	if (!atomic_test_bit(smp->flags, SMP_FLAG_PAIRING)) {
6061 		return;
6062 	}
6063 
6064 	/*
6065 	 * If link was successfully encrypted cleanup old keys as from now on
6066 	 * only keys distributed in this pairing or LTK from LE SC will be used.
6067 	 */
6068 	if (conn->le.keys) {
6069 		bt_keys_clear(conn->le.keys);
6070 	}
6071 
6072 	conn->le.keys = bt_keys_get_addr(conn->id, &conn->le.dst);
6073 	if (!conn->le.keys) {
6074 		LOG_ERR("Unable to get keys for %s", bt_addr_le_str(&conn->le.dst));
6075 		smp_error(smp, BT_SMP_ERR_UNSPECIFIED);
6076 		return;
6077 	}
6078 
6079 	/* mark keys as debug */
6080 	if (atomic_test_bit(smp->flags, SMP_FLAG_SC_DEBUG_KEY)) {
6081 		conn->le.keys->flags |= BT_KEYS_DEBUG;
6082 	}
6083 
6084 	/*
6085 	 * store key type deducted from pairing method used
6086 	 * it is important to store it since type is used to determine
6087 	 * security level upon encryption
6088 	 */
6089 	switch (smp->method) {
6090 	case LE_SC_OOB:
6091 	case LEGACY_OOB:
6092 		conn->le.keys->flags |= BT_KEYS_OOB;
6093 		/* fallthrough */
6094 	case PASSKEY_DISPLAY:
6095 	case PASSKEY_INPUT:
6096 	case PASSKEY_CONFIRM:
6097 		conn->le.keys->flags |= BT_KEYS_AUTHENTICATED;
6098 		break;
6099 	case JUST_WORKS:
6100 	default:
6101 		/* unauthenticated key, clear it */
6102 		conn->le.keys->flags &= ~BT_KEYS_OOB;
6103 		conn->le.keys->flags &= ~BT_KEYS_AUTHENTICATED;
6104 		break;
6105 	}
6106 
6107 	conn->le.keys->enc_size = get_encryption_key_size(smp);
6108 
6109 	/*
6110 	 * Store LTK if LE SC is used, this is safe since LE SC is mutually
6111 	 * exclusive with legacy pairing. Other keys are added on keys
6112 	 * distribution.
6113 	 */
6114 	if (atomic_test_bit(smp->flags, SMP_FLAG_SC)) {
6115 		conn->le.keys->flags |= BT_KEYS_SC;
6116 
6117 		if (atomic_test_bit(smp->flags, SMP_FLAG_BOND)) {
6118 			bt_keys_add_type(conn->le.keys, BT_KEYS_LTK_P256);
6119 			memcpy(conn->le.keys->ltk.val, smp->tk,
6120 			       sizeof(conn->le.keys->ltk.val));
6121 			(void)memset(conn->le.keys->ltk.rand, 0,
6122 				     sizeof(conn->le.keys->ltk.rand));
6123 			(void)memset(conn->le.keys->ltk.ediv, 0,
6124 				     sizeof(conn->le.keys->ltk.ediv));
6125 		} else if (IS_ENABLED(CONFIG_BT_LOG_SNIFFER_INFO)) {
6126 			uint8_t ltk[16];
6127 
6128 			sys_memcpy_swap(ltk, smp->tk, conn->le.keys->enc_size);
6129 			LOG_INF("SC LTK: 0x%s (No bonding)", bt_hex(ltk, conn->le.keys->enc_size));
6130 		}
6131 	} else {
6132 		conn->le.keys->flags &= ~BT_KEYS_SC;
6133 	}
6134 }
6135 
bt_smp_accept(struct bt_conn * conn,struct bt_l2cap_chan ** chan)6136 static int bt_smp_accept(struct bt_conn *conn, struct bt_l2cap_chan **chan)
6137 {
6138 	int i;
6139 	static const struct bt_l2cap_chan_ops ops = {
6140 		.connected = bt_smp_connected,
6141 		.disconnected = bt_smp_disconnected,
6142 		.encrypt_change = bt_smp_encrypt_change,
6143 		.recv = bt_smp_recv,
6144 	};
6145 
6146 	LOG_DBG("conn %p handle %u", conn, conn->handle);
6147 
6148 	for (i = 0; i < ARRAY_SIZE(bt_smp_pool); i++) {
6149 		struct bt_smp *smp = &bt_smp_pool[i];
6150 
6151 		if (smp->chan.chan.conn) {
6152 			continue;
6153 		}
6154 
6155 		smp->chan.chan.ops = &ops;
6156 
6157 		*chan = &smp->chan.chan;
6158 
6159 		return 0;
6160 	}
6161 
6162 	LOG_ERR("No available SMP context for conn %p", conn);
6163 
6164 	return -ENOMEM;
6165 }
6166 
6167 BT_L2CAP_CHANNEL_DEFINE(smp_fixed_chan, BT_L2CAP_CID_SMP, bt_smp_accept, NULL);
6168 #if defined(CONFIG_BT_CLASSIC)
6169 BT_L2CAP_BR_CHANNEL_DEFINE(smp_br_fixed_chan, BT_L2CAP_CID_BR_SMP,
6170 			bt_smp_br_accept);
6171 #endif /* CONFIG_BT_CLASSIC */
6172 
bt_smp_init(void)6173 int bt_smp_init(void)
6174 {
6175 	sc_supported = le_sc_supported();
6176 	if (IS_ENABLED(CONFIG_BT_SMP_SC_PAIR_ONLY) && !sc_supported) {
6177 		LOG_ERR("SC Pair Only Mode selected but LE SC not supported");
6178 		return -ENOENT;
6179 	}
6180 
6181 	if (IS_ENABLED(CONFIG_BT_SMP_USB_HCI_CTLR_WORKAROUND)) {
6182 		LOG_WRN("BT_SMP_USB_HCI_CTLR_WORKAROUND is enabled, which "
6183 			"exposes a security vulnerability!");
6184 	}
6185 
6186 	LOG_DBG("LE SC %s", sc_supported ? "enabled" : "disabled");
6187 
6188 	if (!IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
6189 		bt_pub_key_gen(&pub_key_gen.cb);
6190 	}
6191 
6192 	return smp_self_test();
6193 }
6194