^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) BlueZ - Bluetooth protocol stack for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) published by the Free Software Foundation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) SOFTWARE IS DISCLAIMED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #ifndef __SMP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define __SMP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct smp_command_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) __u8 code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define SMP_CMD_PAIRING_REQ 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define SMP_CMD_PAIRING_RSP 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct smp_cmd_pairing {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) __u8 io_capability;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) __u8 oob_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) __u8 auth_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) __u8 max_key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) __u8 init_key_dist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) __u8 resp_key_dist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define SMP_IO_DISPLAY_ONLY 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define SMP_IO_DISPLAY_YESNO 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define SMP_IO_KEYBOARD_ONLY 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define SMP_IO_NO_INPUT_OUTPUT 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define SMP_IO_KEYBOARD_DISPLAY 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define SMP_OOB_NOT_PRESENT 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define SMP_OOB_PRESENT 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define SMP_DIST_ENC_KEY 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define SMP_DIST_ID_KEY 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define SMP_DIST_SIGN 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define SMP_DIST_LINK_KEY 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define SMP_AUTH_NONE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define SMP_AUTH_BONDING 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define SMP_AUTH_MITM 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define SMP_AUTH_SC 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define SMP_AUTH_KEYPRESS 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define SMP_AUTH_CT2 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define SMP_CMD_PAIRING_CONFIRM 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct smp_cmd_pairing_confirm {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) __u8 confirm_val[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define SMP_CMD_PAIRING_RANDOM 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct smp_cmd_pairing_random {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) __u8 rand_val[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define SMP_CMD_PAIRING_FAIL 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct smp_cmd_pairing_fail {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) __u8 reason;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define SMP_CMD_ENCRYPT_INFO 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct smp_cmd_encrypt_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) __u8 ltk[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define SMP_CMD_MASTER_IDENT 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct smp_cmd_master_ident {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) __le16 ediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) __le64 rand;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define SMP_CMD_IDENT_INFO 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct smp_cmd_ident_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) __u8 irk[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define SMP_CMD_IDENT_ADDR_INFO 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct smp_cmd_ident_addr_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) __u8 addr_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) bdaddr_t bdaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define SMP_CMD_SIGN_INFO 0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct smp_cmd_sign_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) __u8 csrk[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define SMP_CMD_SECURITY_REQ 0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct smp_cmd_security_req {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) __u8 auth_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define SMP_CMD_PUBLIC_KEY 0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct smp_cmd_public_key {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) __u8 x[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) __u8 y[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define SMP_CMD_DHKEY_CHECK 0x0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct smp_cmd_dhkey_check {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) __u8 e[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define SMP_CMD_KEYPRESS_NOTIFY 0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct smp_cmd_keypress_notify {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) __u8 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define SMP_CMD_MAX 0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SMP_PASSKEY_ENTRY_FAILED 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define SMP_OOB_NOT_AVAIL 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define SMP_AUTH_REQUIREMENTS 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define SMP_CONFIRM_FAILED 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define SMP_PAIRING_NOTSUPP 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SMP_ENC_KEY_SIZE 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define SMP_CMD_NOTSUPP 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define SMP_UNSPECIFIED 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define SMP_REPEATED_ATTEMPTS 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SMP_INVALID_PARAMS 0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define SMP_DHKEY_CHECK_FAILED 0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define SMP_NUMERIC_COMP_FAILED 0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define SMP_BREDR_PAIRING_IN_PROGRESS 0x0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SMP_CROSS_TRANSP_NOT_ALLOWED 0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SMP_MIN_ENC_KEY_SIZE 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define SMP_MAX_ENC_KEY_SIZE 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* LTK types used in internal storage (struct smp_ltk) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) SMP_STK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) SMP_LTK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) SMP_LTK_SLAVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) SMP_LTK_P256,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) SMP_LTK_P256_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static inline bool smp_ltk_is_sc(struct smp_ltk *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) switch (key->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) case SMP_LTK_P256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) case SMP_LTK_P256_DEBUG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static inline u8 smp_ltk_sec_level(struct smp_ltk *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) if (key->authenticated) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) if (smp_ltk_is_sc(key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) return BT_SECURITY_FIPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) return BT_SECURITY_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return BT_SECURITY_MEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /* Key preferences for smp_sufficient security */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) enum smp_key_pref {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) SMP_ALLOW_STK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) SMP_USE_LTK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /* SMP Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) u8 addr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) enum smp_key_pref key_pref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) const bdaddr_t *bdaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) int smp_register(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) void smp_unregister(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) int bt_selftest_smp(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) static inline int bt_selftest_smp(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #endif /* __SMP_H */