2015-05-06 17:16:45 +08:00
|
|
|
/**
|
|
|
|
* @file smp.h
|
|
|
|
* Security Manager Protocol implementation header
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (c) 2015 Intel Corporation
|
|
|
|
*
|
2015-10-07 00:00:37 +08:00
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
2015-05-06 17:16:45 +08:00
|
|
|
*
|
2015-10-07 00:00:37 +08:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2015-05-06 17:16:45 +08:00
|
|
|
*
|
2015-10-07 00:00:37 +08:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
2015-05-06 17:16:45 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
struct bt_smp_hdr {
|
|
|
|
uint8_t code;
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-06 17:16:45 +08:00
|
|
|
|
|
|
|
#define BT_SMP_ERR_PASSKEY_ENTRY_FAILED 0x01
|
|
|
|
#define BT_SMP_ERR_OOB_NOT_AVAIL 0x02
|
|
|
|
#define BT_SMP_ERR_AUTH_REQUIREMENTS 0x03
|
|
|
|
#define BT_SMP_ERR_CONFIRM_FAILED 0x04
|
|
|
|
#define BT_SMP_ERR_PAIRING_NOTSUPP 0x05
|
|
|
|
#define BT_SMP_ERR_ENC_KEY_SIZE 0x06
|
|
|
|
#define BT_SMP_ERR_CMD_NOTSUPP 0x07
|
|
|
|
#define BT_SMP_ERR_UNSPECIFIED 0x08
|
|
|
|
#define BT_SMP_ERR_REPEATED_ATTEMPTS 0x09
|
|
|
|
#define BT_SMP_ERR_INVALID_PARAMS 0x0a
|
|
|
|
#define BT_SMP_ERR_DHKEY_CHECK_FAILED 0x0b
|
|
|
|
#define BT_SMP_ERR_NUMERIC_COMP_FAILED 0x0c
|
|
|
|
#define BT_SMP_ERR_BREDR_PAIRING_IN_PROGRESS 0x0d
|
|
|
|
#define BT_SMP_ERR_CROSS_TRANSP_NOT_ALLOWED 0x0e
|
|
|
|
|
2015-05-07 19:53:02 +08:00
|
|
|
#define BT_SMP_IO_DISPLAY_ONLY 0x00
|
|
|
|
#define BT_SMP_IO_DISPLAY_YESNO 0x01
|
|
|
|
#define BT_SMP_IO_KEYBOARD_ONLY 0x02
|
|
|
|
#define BT_SMP_IO_NO_INPUT_OUTPUT 0x03
|
|
|
|
#define BT_SMP_IO_KEYBOARD_DISPLAY 0x04
|
|
|
|
|
|
|
|
#define BT_SMP_OOB_NOT_PRESENT 0x00
|
|
|
|
#define BT_SMP_OOB_PRESENT 0x01
|
|
|
|
|
Bluetooth: SMP: Add support for encryption key size reduction
This allows to pair with devices that use reduced encryption key size.
Encryption key size is stored with keys for future use. LTKs are kept
in full form (16 bytes) and are reduced only when used.
As master:
< ACL Data TX: Handle 64 flags 0x00 dlen 11
SMP: Pairing Request (0x01) len 6
IO capability: NoInputNoOutput (0x03)
OOB data: Authentication data not present (0x00)
Authentication requirement: Bonding, No MITM, Legacy,
No Keypresses (0x01)
Max encryption key size: 16
Initiator key distribution: EncKey Sign (0x05)
Responder key distribution: EncKey IdKey Sign (0x07)
> ACL Data RX: Handle 64 flags 0x02 dlen 11
SMP: Pairing Response (0x02) len 6
IO capability: KeyboardDisplay (0x04)
OOB data: Authentication data not present (0x00)
Authentication requirement: No bonding, No MITM, Legacy,
No Keypresses (0x00)
Max encryption key size: 7
Initiator key distribution: <none> (0x00)
Responder key distribution: <none> (0x00)
...
< HCI Command: LE Start Encryption (0x08|0x0019) plen 28
Handle: 64
Random number: 0x0000000000000000
Encrypted diversifier: 0x0000
Long term key: df3cff52a981d6000000000000000000
As slave:
> ACL Data RX: Handle 64 flags 0x02 dlen 11
SMP: Pairing Request (0x01) len 6
IO capability: KeyboardDisplay (0x04)
OOB data: Authentication data not present (0x00)
Authentication requirement: No bonding, No MITM, Legacy,
No Keypresses (0x00)
Max encryption key size: 7
Initiator key distribution: <none> (0x00)
Responder key distribution: <none> (0x00)
< ACL Data TX: Handle 64 flags 0x00 dlen 11
SMP: Pairing Response (0x02) len 6
IO capability: NoInputNoOutput (0x03)
OOB data: Authentication data not present (0x00)
Authentication requirement: No bonding, No MITM, Legacy,
No Keypresses (0x00)
Max encryption key size: 16
Initiator key distribution: <none> (0x00)
Responder key distribution: <none> (0x00)
...
> HCI Event: LE Meta Event (0x3e) plen 13
LE Long Term Key Request (0x05)
Handle: 64
Random number: 0x0000000000000000
Encrypted diversifier: 0x0000
< HCI Command: LE Long Term Key Request Reply (0x08|0x001a) plen 18
Handle: 64
Long term key: 701b431a9e17bb000000000000000000
Change-Id: Ibc70aa01c040aff0d39410d273d6880d35aa5ae0
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2015-10-07 18:33:45 +08:00
|
|
|
#define BT_SMP_MIN_ENC_KEY_SIZE 7
|
2015-05-07 19:53:02 +08:00
|
|
|
#define BT_SMP_MAX_ENC_KEY_SIZE 16
|
|
|
|
|
2015-05-22 18:55:31 +08:00
|
|
|
#define BT_SMP_DIST_ENC_KEY 0x01
|
|
|
|
#define BT_SMP_DIST_ID_KEY 0x02
|
|
|
|
#define BT_SMP_DIST_SIGN 0x04
|
|
|
|
#define BT_SMP_DIST_LINK_KEY 0x08
|
|
|
|
|
|
|
|
#define BT_SMP_DIST_MASK 0x0f
|
|
|
|
|
|
|
|
#define BT_SMP_AUTH_NONE 0x00
|
|
|
|
#define BT_SMP_AUTH_BONDING 0x01
|
|
|
|
#define BT_SMP_AUTH_MITM 0x04
|
|
|
|
|
2015-10-15 20:07:19 +08:00
|
|
|
#define BT_SMP_AUTH_MASK 0x07
|
2015-05-22 18:55:31 +08:00
|
|
|
|
2015-05-07 19:53:02 +08:00
|
|
|
#define BT_SMP_CMD_PAIRING_REQ 0x01
|
|
|
|
#define BT_SMP_CMD_PAIRING_RSP 0x02
|
|
|
|
struct bt_smp_pairing {
|
|
|
|
uint8_t io_capability;
|
|
|
|
uint8_t oob_flag;
|
|
|
|
uint8_t auth_req;
|
|
|
|
uint8_t max_key_size;
|
|
|
|
uint8_t init_key_dist;
|
|
|
|
uint8_t resp_key_dist;
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-07 19:53:02 +08:00
|
|
|
|
2015-05-07 21:37:50 +08:00
|
|
|
#define BT_SMP_CMD_PAIRING_CONFIRM 0x03
|
|
|
|
struct bt_smp_pairing_confirm {
|
|
|
|
uint8_t val[16];
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-07 21:37:50 +08:00
|
|
|
|
2015-05-20 02:22:19 +08:00
|
|
|
#define BT_SMP_CMD_PAIRING_RANDOM 0x04
|
|
|
|
struct bt_smp_pairing_random {
|
|
|
|
uint8_t val[16];
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-20 02:22:19 +08:00
|
|
|
|
2015-05-06 19:59:42 +08:00
|
|
|
#define BT_SMP_CMD_PAIRING_FAIL 0x05
|
|
|
|
struct bt_smp_pairing_fail {
|
2015-05-11 20:05:01 +08:00
|
|
|
uint8_t reason;
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-06 19:59:42 +08:00
|
|
|
|
2015-05-22 18:55:31 +08:00
|
|
|
#define BT_SMP_CMD_ENCRYPT_INFO 0x06
|
|
|
|
struct bt_smp_encrypt_info {
|
|
|
|
uint8_t ltk[16];
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-22 18:55:31 +08:00
|
|
|
|
|
|
|
#define BT_SMP_CMD_MASTER_IDENT 0x07
|
|
|
|
struct bt_smp_master_ident {
|
|
|
|
uint16_t ediv;
|
|
|
|
uint64_t rand;
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-22 18:55:31 +08:00
|
|
|
|
2015-05-31 23:58:10 +08:00
|
|
|
#define BT_SMP_CMD_IDENT_INFO 0x08
|
|
|
|
struct bt_smp_ident_info {
|
|
|
|
uint8_t irk[16];
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-31 23:58:10 +08:00
|
|
|
|
|
|
|
#define BT_SMP_CMD_IDENT_ADDR_INFO 0x09
|
|
|
|
struct bt_smp_ident_addr_info {
|
|
|
|
bt_addr_le_t addr;
|
2015-06-04 12:20:48 +08:00
|
|
|
} __packed;
|
2015-05-31 23:58:10 +08:00
|
|
|
|
2015-07-28 20:08:06 +08:00
|
|
|
#define BT_SMP_CMD_SIGNING_INFO 0x0a
|
|
|
|
struct bt_smp_signing_info {
|
|
|
|
uint8_t csrk[16];
|
|
|
|
} __packed;
|
|
|
|
|
2015-06-30 17:47:25 +08:00
|
|
|
#define BT_SMP_CMD_SECURITY_REQUEST 0x0b
|
|
|
|
struct bt_smp_security_request {
|
|
|
|
uint8_t auth_req;
|
|
|
|
} __packed;
|
|
|
|
|
2015-06-01 01:18:44 +08:00
|
|
|
bool bt_smp_irk_matches(const uint8_t irk[16], const bt_addr_t *addr);
|
2015-07-06 20:47:06 +08:00
|
|
|
int bt_smp_send_pairing_req(struct bt_conn *conn);
|
2015-07-03 16:45:20 +08:00
|
|
|
int bt_smp_send_security_req(struct bt_conn *conn);
|
2015-06-01 01:18:44 +08:00
|
|
|
|
2015-07-07 21:04:51 +08:00
|
|
|
int bt_smp_init(void);
|
2015-07-15 22:06:35 +08:00
|
|
|
|
|
|
|
/** brief Verify signed message
|
|
|
|
*
|
|
|
|
* @param conn Bluetooth connection
|
|
|
|
* @param buf received packet buffer with message and signature
|
|
|
|
*
|
|
|
|
* @return 0 in success, error code otherwise
|
|
|
|
*/
|
|
|
|
int bt_smp_sign_verify(struct bt_conn *conn, struct bt_buf *buf);
|
2015-07-30 18:56:04 +08:00
|
|
|
|
|
|
|
/** brief Sign message
|
|
|
|
*
|
|
|
|
* @param conn Bluetooth connection
|
|
|
|
* @param buf message buffer
|
|
|
|
*
|
|
|
|
* @return 0 in success, error code otherwise
|
|
|
|
*/
|
|
|
|
int bt_smp_sign(struct bt_conn *conn, struct bt_buf *buf);
|