1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef __SMP_H
24#define __SMP_H
25
26struct smp_command_hdr {
27 __u8 code;
28} __packed;
29
30#define SMP_CMD_PAIRING_REQ 0x01
31#define SMP_CMD_PAIRING_RSP 0x02
32struct smp_cmd_pairing {
33 __u8 io_capability;
34 __u8 oob_flag;
35 __u8 auth_req;
36 __u8 max_key_size;
37 __u8 init_key_dist;
38 __u8 resp_key_dist;
39} __packed;
40
41#define SMP_IO_DISPLAY_ONLY 0x00
42#define SMP_IO_DISPLAY_YESNO 0x01
43#define SMP_IO_KEYBOARD_ONLY 0x02
44#define SMP_IO_NO_INPUT_OUTPUT 0x03
45#define SMP_IO_KEYBOARD_DISPLAY 0x04
46
47#define SMP_OOB_NOT_PRESENT 0x00
48#define SMP_OOB_PRESENT 0x01
49
50#define SMP_DIST_ENC_KEY 0x01
51#define SMP_DIST_ID_KEY 0x02
52#define SMP_DIST_SIGN 0x04
53#define SMP_DIST_LINK_KEY 0x08
54
55#define SMP_AUTH_NONE 0x00
56#define SMP_AUTH_BONDING 0x01
57#define SMP_AUTH_MITM 0x04
58#define SMP_AUTH_SC 0x08
59#define SMP_AUTH_KEYPRESS 0x10
60#define SMP_AUTH_CT2 0x20
61
62#define SMP_CMD_PAIRING_CONFIRM 0x03
63struct smp_cmd_pairing_confirm {
64 __u8 confirm_val[16];
65} __packed;
66
67#define SMP_CMD_PAIRING_RANDOM 0x04
68struct smp_cmd_pairing_random {
69 __u8 rand_val[16];
70} __packed;
71
72#define SMP_CMD_PAIRING_FAIL 0x05
73struct smp_cmd_pairing_fail {
74 __u8 reason;
75} __packed;
76
77#define SMP_CMD_ENCRYPT_INFO 0x06
78struct smp_cmd_encrypt_info {
79 __u8 ltk[16];
80} __packed;
81
82#define SMP_CMD_MASTER_IDENT 0x07
83struct smp_cmd_master_ident {
84 __le16 ediv;
85 __le64 rand;
86} __packed;
87
88#define SMP_CMD_IDENT_INFO 0x08
89struct smp_cmd_ident_info {
90 __u8 irk[16];
91} __packed;
92
93#define SMP_CMD_IDENT_ADDR_INFO 0x09
94struct smp_cmd_ident_addr_info {
95 __u8 addr_type;
96 bdaddr_t bdaddr;
97} __packed;
98
99#define SMP_CMD_SIGN_INFO 0x0a
100struct smp_cmd_sign_info {
101 __u8 csrk[16];
102} __packed;
103
104#define SMP_CMD_SECURITY_REQ 0x0b
105struct smp_cmd_security_req {
106 __u8 auth_req;
107} __packed;
108
109#define SMP_CMD_PUBLIC_KEY 0x0c
110struct smp_cmd_public_key {
111 __u8 x[32];
112 __u8 y[32];
113} __packed;
114
115#define SMP_CMD_DHKEY_CHECK 0x0d
116struct smp_cmd_dhkey_check {
117 __u8 e[16];
118} __packed;
119
120#define SMP_CMD_KEYPRESS_NOTIFY 0x0e
121struct smp_cmd_keypress_notify {
122 __u8 value;
123} __packed;
124
125#define SMP_CMD_MAX 0x0e
126
127#define SMP_PASSKEY_ENTRY_FAILED 0x01
128#define SMP_OOB_NOT_AVAIL 0x02
129#define SMP_AUTH_REQUIREMENTS 0x03
130#define SMP_CONFIRM_FAILED 0x04
131#define SMP_PAIRING_NOTSUPP 0x05
132#define SMP_ENC_KEY_SIZE 0x06
133#define SMP_CMD_NOTSUPP 0x07
134#define SMP_UNSPECIFIED 0x08
135#define SMP_REPEATED_ATTEMPTS 0x09
136#define SMP_INVALID_PARAMS 0x0a
137#define SMP_DHKEY_CHECK_FAILED 0x0b
138#define SMP_NUMERIC_COMP_FAILED 0x0c
139#define SMP_BREDR_PAIRING_IN_PROGRESS 0x0d
140#define SMP_CROSS_TRANSP_NOT_ALLOWED 0x0e
141
142#define SMP_MIN_ENC_KEY_SIZE 7
143#define SMP_MAX_ENC_KEY_SIZE 16
144
145
146enum {
147 SMP_STK,
148 SMP_LTK,
149 SMP_LTK_SLAVE,
150 SMP_LTK_P256,
151 SMP_LTK_P256_DEBUG,
152};
153
154static inline bool smp_ltk_is_sc(struct smp_ltk *key)
155{
156 switch (key->type) {
157 case SMP_LTK_P256:
158 case SMP_LTK_P256_DEBUG:
159 return true;
160 }
161
162 return false;
163}
164
165static inline u8 smp_ltk_sec_level(struct smp_ltk *key)
166{
167 if (key->authenticated) {
168 if (smp_ltk_is_sc(key))
169 return BT_SECURITY_FIPS;
170 else
171 return BT_SECURITY_HIGH;
172 }
173
174 return BT_SECURITY_MEDIUM;
175}
176
177
178enum smp_key_pref {
179 SMP_ALLOW_STK,
180 SMP_USE_LTK,
181};
182
183
184void smp_cancel_pairing(struct hci_conn *hcon);
185bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
186 enum smp_key_pref key_pref);
187int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
188int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey);
189
190bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
191 const bdaddr_t *bdaddr);
192int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa);
193int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16]);
194
195int smp_register(struct hci_dev *hdev);
196void smp_unregister(struct hci_dev *hdev);
197
198#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
199
200int bt_selftest_smp(void);
201
202#else
203
204static inline int bt_selftest_smp(void)
205{
206 return 0;
207}
208
209#endif
210
211#endif
212