diff options
Diffstat (limited to 'net/bluetooth/smp.h')
-rw-r--r-- | net/bluetooth/smp.h | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/net/bluetooth/smp.h b/net/bluetooth/smp.h index f76083b85005..3296bf42ae80 100644 --- a/net/bluetooth/smp.h +++ b/net/bluetooth/smp.h | |||
@@ -50,10 +50,13 @@ struct smp_cmd_pairing { | |||
50 | #define SMP_DIST_ENC_KEY 0x01 | 50 | #define SMP_DIST_ENC_KEY 0x01 |
51 | #define SMP_DIST_ID_KEY 0x02 | 51 | #define SMP_DIST_ID_KEY 0x02 |
52 | #define SMP_DIST_SIGN 0x04 | 52 | #define SMP_DIST_SIGN 0x04 |
53 | #define SMP_DIST_LINK_KEY 0x08 | ||
53 | 54 | ||
54 | #define SMP_AUTH_NONE 0x00 | 55 | #define SMP_AUTH_NONE 0x00 |
55 | #define SMP_AUTH_BONDING 0x01 | 56 | #define SMP_AUTH_BONDING 0x01 |
56 | #define SMP_AUTH_MITM 0x04 | 57 | #define SMP_AUTH_MITM 0x04 |
58 | #define SMP_AUTH_SC 0x08 | ||
59 | #define SMP_AUTH_KEYPRESS 0x10 | ||
57 | 60 | ||
58 | #define SMP_CMD_PAIRING_CONFIRM 0x03 | 61 | #define SMP_CMD_PAIRING_CONFIRM 0x03 |
59 | struct smp_cmd_pairing_confirm { | 62 | struct smp_cmd_pairing_confirm { |
@@ -102,7 +105,23 @@ struct smp_cmd_security_req { | |||
102 | __u8 auth_req; | 105 | __u8 auth_req; |
103 | } __packed; | 106 | } __packed; |
104 | 107 | ||
105 | #define SMP_CMD_MAX 0x0b | 108 | #define SMP_CMD_PUBLIC_KEY 0x0c |
109 | struct smp_cmd_public_key { | ||
110 | __u8 x[32]; | ||
111 | __u8 y[32]; | ||
112 | } __packed; | ||
113 | |||
114 | #define SMP_CMD_DHKEY_CHECK 0x0d | ||
115 | struct smp_cmd_dhkey_check { | ||
116 | __u8 e[16]; | ||
117 | } __packed; | ||
118 | |||
119 | #define SMP_CMD_KEYPRESS_NOTIFY 0x0e | ||
120 | struct smp_cmd_keypress_notify { | ||
121 | __u8 value; | ||
122 | } __packed; | ||
123 | |||
124 | #define SMP_CMD_MAX 0x0e | ||
106 | 125 | ||
107 | #define SMP_PASSKEY_ENTRY_FAILED 0x01 | 126 | #define SMP_PASSKEY_ENTRY_FAILED 0x01 |
108 | #define SMP_OOB_NOT_AVAIL 0x02 | 127 | #define SMP_OOB_NOT_AVAIL 0x02 |
@@ -114,6 +133,10 @@ struct smp_cmd_security_req { | |||
114 | #define SMP_UNSPECIFIED 0x08 | 133 | #define SMP_UNSPECIFIED 0x08 |
115 | #define SMP_REPEATED_ATTEMPTS 0x09 | 134 | #define SMP_REPEATED_ATTEMPTS 0x09 |
116 | #define SMP_INVALID_PARAMS 0x0a | 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 | ||
117 | 140 | ||
118 | #define SMP_MIN_ENC_KEY_SIZE 7 | 141 | #define SMP_MIN_ENC_KEY_SIZE 7 |
119 | #define SMP_MAX_ENC_KEY_SIZE 16 | 142 | #define SMP_MAX_ENC_KEY_SIZE 16 |
@@ -123,12 +146,29 @@ enum { | |||
123 | SMP_STK, | 146 | SMP_STK, |
124 | SMP_LTK, | 147 | SMP_LTK, |
125 | SMP_LTK_SLAVE, | 148 | SMP_LTK_SLAVE, |
149 | SMP_LTK_P256, | ||
150 | SMP_LTK_P256_DEBUG, | ||
126 | }; | 151 | }; |
127 | 152 | ||
153 | static 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 | |||
128 | static inline u8 smp_ltk_sec_level(struct smp_ltk *key) | 164 | static inline u8 smp_ltk_sec_level(struct smp_ltk *key) |
129 | { | 165 | { |
130 | if (key->authenticated) | 166 | if (key->authenticated) { |
131 | return BT_SECURITY_HIGH; | 167 | if (smp_ltk_is_sc(key)) |
168 | return BT_SECURITY_FIPS; | ||
169 | else | ||
170 | return BT_SECURITY_HIGH; | ||
171 | } | ||
132 | 172 | ||
133 | return BT_SECURITY_MEDIUM; | 173 | return BT_SECURITY_MEDIUM; |
134 | } | 174 | } |
@@ -145,8 +185,9 @@ bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level, | |||
145 | int smp_conn_security(struct hci_conn *hcon, __u8 sec_level); | 185 | int smp_conn_security(struct hci_conn *hcon, __u8 sec_level); |
146 | int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey); | 186 | int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey); |
147 | 187 | ||
148 | bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr); | 188 | bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16], |
149 | int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa); | 189 | const bdaddr_t *bdaddr); |
190 | int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa); | ||
150 | 191 | ||
151 | int smp_register(struct hci_dev *hdev); | 192 | int smp_register(struct hci_dev *hdev); |
152 | void smp_unregister(struct hci_dev *hdev); | 193 | void smp_unregister(struct hci_dev *hdev); |