2011-06-10 01:50:40 +04:00
/*
BlueZ - Bluetooth protocol stack for Linux
Copyright ( C ) 2011 Nokia Corporation and / or its subsidiary ( - ies ) .
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation ;
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS
OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS .
IN NO EVENT SHALL THE COPYRIGHT HOLDER ( S ) AND AUTHOR ( S ) BE LIABLE FOR ANY
CLAIM , OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES , OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN
ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE .
ALL LIABILITY , INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS ,
COPYRIGHTS , TRADEMARKS OR OTHER RIGHTS , RELATING TO USE OF THIS
SOFTWARE IS DISCLAIMED .
*/
2011-02-11 04:38:54 +03:00
# ifndef __SMP_H
# define __SMP_H
struct smp_command_hdr {
__u8 code ;
} __packed ;
# define SMP_CMD_PAIRING_REQ 0x01
# define SMP_CMD_PAIRING_RSP 0x02
struct smp_cmd_pairing {
__u8 io_capability ;
__u8 oob_flag ;
__u8 auth_req ;
__u8 max_key_size ;
__u8 init_key_dist ;
__u8 resp_key_dist ;
} __packed ;
2011-06-10 01:50:42 +04:00
# define SMP_IO_DISPLAY_ONLY 0x00
# define SMP_IO_DISPLAY_YESNO 0x01
# define SMP_IO_KEYBOARD_ONLY 0x02
# define SMP_IO_NO_INPUT_OUTPUT 0x03
# define SMP_IO_KEYBOARD_DISPLAY 0x04
# define SMP_OOB_NOT_PRESENT 0x00
# define SMP_OOB_PRESENT 0x01
# define SMP_DIST_ENC_KEY 0x01
# define SMP_DIST_ID_KEY 0x02
# define SMP_DIST_SIGN 0x04
2014-05-08 15:02:22 +04:00
# define SMP_DIST_LINK_KEY 0x08
2011-06-10 01:50:42 +04:00
# define SMP_AUTH_NONE 0x00
# define SMP_AUTH_BONDING 0x01
# define SMP_AUTH_MITM 0x04
2014-05-08 15:02:22 +04:00
# define SMP_AUTH_SC 0x08
# define SMP_AUTH_KEYPRESS 0x10
2011-06-10 01:50:42 +04:00
2011-02-11 04:38:54 +03:00
# define SMP_CMD_PAIRING_CONFIRM 0x03
struct smp_cmd_pairing_confirm {
__u8 confirm_val [ 16 ] ;
} __packed ;
# define SMP_CMD_PAIRING_RANDOM 0x04
struct smp_cmd_pairing_random {
__u8 rand_val [ 16 ] ;
} __packed ;
# define SMP_CMD_PAIRING_FAIL 0x05
struct smp_cmd_pairing_fail {
__u8 reason ;
} __packed ;
# define SMP_CMD_ENCRYPT_INFO 0x06
struct smp_cmd_encrypt_info {
__u8 ltk [ 16 ] ;
} __packed ;
# define SMP_CMD_MASTER_IDENT 0x07
struct smp_cmd_master_ident {
2012-03-12 14:13:06 +04:00
__le16 ediv ;
2014-02-28 04:00:28 +04:00
__le64 rand ;
2011-02-11 04:38:54 +03:00
} __packed ;
# define SMP_CMD_IDENT_INFO 0x08
struct smp_cmd_ident_info {
__u8 irk [ 16 ] ;
} __packed ;
# define SMP_CMD_IDENT_ADDR_INFO 0x09
struct smp_cmd_ident_addr_info {
__u8 addr_type ;
bdaddr_t bdaddr ;
} __packed ;
# define SMP_CMD_SIGN_INFO 0x0a
struct smp_cmd_sign_info {
__u8 csrk [ 16 ] ;
} __packed ;
# define SMP_CMD_SECURITY_REQ 0x0b
struct smp_cmd_security_req {
__u8 auth_req ;
} __packed ;
2014-05-08 15:02:22 +04:00
# define SMP_CMD_PUBLIC_KEY 0x0c
struct smp_cmd_public_key {
__u8 x [ 32 ] ;
__u8 y [ 32 ] ;
} __packed ;
# define SMP_CMD_DHKEY_CHECK 0x0d
struct smp_cmd_dhkey_check {
__u8 e [ 16 ] ;
} __packed ;
# define SMP_CMD_KEYPRESS_NOTIFY 0x0e
struct smp_cmd_keypress_notify {
__u8 value ;
} __packed ;
# define SMP_CMD_MAX 0x0e
2014-09-05 23:19:55 +04:00
2011-02-11 04:38:54 +03:00
# define SMP_PASSKEY_ENTRY_FAILED 0x01
# define SMP_OOB_NOT_AVAIL 0x02
# define SMP_AUTH_REQUIREMENTS 0x03
# define SMP_CONFIRM_FAILED 0x04
# define SMP_PAIRING_NOTSUPP 0x05
# define SMP_ENC_KEY_SIZE 0x06
2012-07-19 18:03:44 +04:00
# define SMP_CMD_NOTSUPP 0x07
# define SMP_UNSPECIFIED 0x08
2011-02-11 04:38:54 +03:00
# define SMP_REPEATED_ATTEMPTS 0x09
2014-05-08 15:19:11 +04:00
# define SMP_INVALID_PARAMS 0x0a
2014-05-08 15:02:22 +04:00
# define SMP_DHKEY_CHECK_FAILED 0x0b
# define SMP_NUMERIC_COMP_FAILED 0x0c
# define SMP_BREDR_PAIRING_IN_PROGRESS 0x0d
# define SMP_CROSS_TRANSP_NOT_ALLOWED 0x0e
2011-02-11 04:38:54 +03:00
2011-06-14 20:37:42 +04:00
# define SMP_MIN_ENC_KEY_SIZE 7
# define SMP_MAX_ENC_KEY_SIZE 16
2014-06-16 20:25:16 +04:00
/* LTK types used in internal storage (struct smp_ltk) */
enum {
SMP_STK ,
SMP_LTK ,
SMP_LTK_SLAVE ,
2014-05-23 14:15:37 +04:00
SMP_LTK_P256 ,
SMP_LTK_P256_DEBUG ,
2014-06-16 20:25:16 +04:00
} ;
2014-05-23 14:15:37 +04:00
static inline bool smp_ltk_is_sc ( struct smp_ltk * key )
{
switch ( key - > type ) {
case SMP_LTK_P256 :
case SMP_LTK_P256_DEBUG :
return true ;
}
return false ;
}
2014-09-11 04:37:45 +04:00
static inline u8 smp_ltk_sec_level ( struct smp_ltk * key )
{
2014-05-23 14:36:10 +04:00
if ( key - > authenticated ) {
if ( smp_ltk_is_sc ( key ) )
return BT_SECURITY_FIPS ;
else
return BT_SECURITY_HIGH ;
}
2014-09-11 04:37:45 +04:00
return BT_SECURITY_MEDIUM ;
}
2014-11-13 11:55:18 +03:00
/* Key preferences for smp_sufficient security */
enum smp_key_pref {
SMP_ALLOW_STK ,
SMP_USE_LTK ,
} ;
2011-06-10 01:50:40 +04:00
/* SMP Commands */
2014-11-13 11:55:18 +03:00
bool smp_sufficient_security ( struct hci_conn * hcon , u8 sec_level ,
enum smp_key_pref key_pref ) ;
2012-08-24 04:32:43 +04:00
int smp_conn_security ( struct hci_conn * hcon , __u8 sec_level ) ;
2011-12-22 04:12:12 +04:00
int smp_user_confirm_reply ( struct hci_conn * conn , u16 mgmt_op , __le32 passkey ) ;
2011-06-10 01:50:40 +04:00
2014-12-02 14:37:41 +03:00
bool smp_irk_matches ( struct hci_dev * hdev , const u8 irk [ 16 ] ,
const bdaddr_t * bdaddr ) ;
int smp_generate_rpa ( struct hci_dev * hdev , const u8 irk [ 16 ] , bdaddr_t * rpa ) ;
2015-03-16 11:10:22 +03:00
int smp_generate_oob ( struct hci_dev * hdev , u8 hash [ 16 ] , u8 rand [ 16 ] ) ;
2014-02-18 12:19:31 +04:00
2014-08-08 10:32:52 +04:00
int smp_register ( struct hci_dev * hdev ) ;
void smp_unregister ( struct hci_dev * hdev ) ;
2014-12-30 10:50:39 +03:00
# if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
int bt_selftest_smp ( void ) ;
# else
static inline int bt_selftest_smp ( void )
{
return 0 ;
}
# endif
2011-02-11 04:38:54 +03:00
# endif /* __SMP_H */