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
61#define SMP_CMD_PAIRING_CONFIRM 0x03
62struct smp_cmd_pairing_confirm {
63 __u8 confirm_val[16];
64} __packed;
65
66#define SMP_CMD_PAIRING_RANDOM 0x04
67struct smp_cmd_pairing_random {
68 __u8 rand_val[16];
69} __packed;
70
71#define SMP_CMD_PAIRING_FAIL 0x05
72struct smp_cmd_pairing_fail {
73 __u8 reason;
74} __packed;
75
76#define SMP_CMD_ENCRYPT_INFO 0x06
77struct smp_cmd_encrypt_info {
78 __u8 ltk[16];
79} __packed;
80
81#define SMP_CMD_MASTER_IDENT 0x07
82struct smp_cmd_master_ident {
83 __le16 ediv;
84 __le64 rand;
85} __packed;
86
87#define SMP_CMD_IDENT_INFO 0x08
88struct smp_cmd_ident_info {
89 __u8 irk[16];
90} __packed;
91
92#define SMP_CMD_IDENT_ADDR_INFO 0x09
93struct smp_cmd_ident_addr_info {
94 __u8 addr_type;
95 bdaddr_t bdaddr;
96} __packed;
97
98#define SMP_CMD_SIGN_INFO 0x0a
99struct smp_cmd_sign_info {
100 __u8 csrk[16];
101} __packed;
102
103#define SMP_CMD_SECURITY_REQ 0x0b
104struct smp_cmd_security_req {
105 __u8 auth_req;
106} __packed;
107
108#define SMP_CMD_PUBLIC_KEY 0x0c
109struct smp_cmd_public_key {
110 __u8 x[32];
111 __u8 y[32];
112} __packed;
113
114#define SMP_CMD_DHKEY_CHECK 0x0d
115struct smp_cmd_dhkey_check {
116 __u8 e[16];
117} __packed;
118
119#define SMP_CMD_KEYPRESS_NOTIFY 0x0e
120struct smp_cmd_keypress_notify {
121 __u8 value;
122} __packed;
123
124#define SMP_CMD_MAX 0x0e
125
126#define SMP_PASSKEY_ENTRY_FAILED 0x01
127#define SMP_OOB_NOT_AVAIL 0x02
128#define SMP_AUTH_REQUIREMENTS 0x03
129#define SMP_CONFIRM_FAILED 0x04
130#define SMP_PAIRING_NOTSUPP 0x05
131#define SMP_ENC_KEY_SIZE 0x06
132#define SMP_CMD_NOTSUPP 0x07
133#define SMP_UNSPECIFIED 0x08
134#define SMP_REPEATED_ATTEMPTS 0x09
135#define SMP_INVALID_PARAMS 0x0a
136#define SMP_DHKEY_CHECK_FAILED 0x0b
137#define SMP_NUMERIC_COMP_FAILED 0x0c
138#define SMP_BREDR_PAIRING_IN_PROGRESS 0x0d
139#define SMP_CROSS_TRANSP_NOT_ALLOWED 0x0e
140
141#define SMP_MIN_ENC_KEY_SIZE 7
142#define SMP_MAX_ENC_KEY_SIZE 16
143
144
145enum {
146 SMP_STK,
147 SMP_LTK,
148 SMP_LTK_SLAVE,
149 SMP_LTK_P256,
150 SMP_LTK_P256_DEBUG,
151};
152
153static inline bool smp_ltk_is_sc(struct smp_ltk *key)
154{
155 switch (key->type) {
156 case SMP_LTK_P256:
157 case SMP_LTK_P256_DEBUG:
158 return true;
159 }
160
161 return false;
162}
163
164static inline u8 smp_ltk_sec_level(struct smp_ltk *key)
165{
166 if (key->authenticated) {
167 if (smp_ltk_is_sc(key))
168 return BT_SECURITY_FIPS;
169 else
170 return BT_SECURITY_HIGH;
171 }
172
173 return BT_SECURITY_MEDIUM;
174}
175
176
177enum smp_key_pref {
178 SMP_ALLOW_STK,
179 SMP_USE_LTK,
180};
181
182
183bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
184 enum smp_key_pref key_pref);
185int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
186int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey);
187
188bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
189 const bdaddr_t *bdaddr);
190int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa);
191
192int smp_register(struct hci_dev *hdev);
193void smp_unregister(struct hci_dev *hdev);
194
195#endif
196