This source file includes following definitions.
- smp_ltk_is_sc
- smp_ltk_sec_level
- bt_selftest_smp
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
26 struct smp_command_hdr {
27 __u8 code;
28 } __packed;
29
30 #define SMP_CMD_PAIRING_REQ 0x01
31 #define SMP_CMD_PAIRING_RSP 0x02
32 struct 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
63 struct smp_cmd_pairing_confirm {
64 __u8 confirm_val[16];
65 } __packed;
66
67 #define SMP_CMD_PAIRING_RANDOM 0x04
68 struct smp_cmd_pairing_random {
69 __u8 rand_val[16];
70 } __packed;
71
72 #define SMP_CMD_PAIRING_FAIL 0x05
73 struct smp_cmd_pairing_fail {
74 __u8 reason;
75 } __packed;
76
77 #define SMP_CMD_ENCRYPT_INFO 0x06
78 struct smp_cmd_encrypt_info {
79 __u8 ltk[16];
80 } __packed;
81
82 #define SMP_CMD_MASTER_IDENT 0x07
83 struct smp_cmd_master_ident {
84 __le16 ediv;
85 __le64 rand;
86 } __packed;
87
88 #define SMP_CMD_IDENT_INFO 0x08
89 struct smp_cmd_ident_info {
90 __u8 irk[16];
91 } __packed;
92
93 #define SMP_CMD_IDENT_ADDR_INFO 0x09
94 struct smp_cmd_ident_addr_info {
95 __u8 addr_type;
96 bdaddr_t bdaddr;
97 } __packed;
98
99 #define SMP_CMD_SIGN_INFO 0x0a
100 struct smp_cmd_sign_info {
101 __u8 csrk[16];
102 } __packed;
103
104 #define SMP_CMD_SECURITY_REQ 0x0b
105 struct smp_cmd_security_req {
106 __u8 auth_req;
107 } __packed;
108
109 #define SMP_CMD_PUBLIC_KEY 0x0c
110 struct smp_cmd_public_key {
111 __u8 x[32];
112 __u8 y[32];
113 } __packed;
114
115 #define SMP_CMD_DHKEY_CHECK 0x0d
116 struct smp_cmd_dhkey_check {
117 __u8 e[16];
118 } __packed;
119
120 #define SMP_CMD_KEYPRESS_NOTIFY 0x0e
121 struct 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
146 enum {
147 SMP_STK,
148 SMP_LTK,
149 SMP_LTK_SLAVE,
150 SMP_LTK_P256,
151 SMP_LTK_P256_DEBUG,
152 };
153
154 static 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
165 static 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
178 enum smp_key_pref {
179 SMP_ALLOW_STK,
180 SMP_USE_LTK,
181 };
182
183
184 int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
185 u8 addr_type);
186 bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
187 enum smp_key_pref key_pref);
188 int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
189 int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey);
190
191 bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
192 const bdaddr_t *bdaddr);
193 int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa);
194 int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16]);
195
196 int smp_register(struct hci_dev *hdev);
197 void smp_unregister(struct hci_dev *hdev);
198
199 #if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
200
201 int bt_selftest_smp(void);
202
203 #else
204
205 static inline int bt_selftest_smp(void)
206 {
207 return 0;
208 }
209
210 #endif
211
212 #endif