484 lines
18 KiB
C
484 lines
18 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 1999-2012 Broadcom Corporation
|
|
*
|
|
* 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:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* 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.
|
|
*
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* This file contains the SMP API function external definitions.
|
|
*
|
|
******************************************************************************/
|
|
#ifndef SMP_API_H
|
|
#define SMP_API_H
|
|
|
|
#include "bt_target.h"
|
|
|
|
#define SMP_PIN_CODE_LEN_MAX PIN_CODE_LEN
|
|
#define SMP_PIN_CODE_LEN_MIN 6
|
|
|
|
#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
|
|
/* SMP command code */
|
|
#define SMP_OPCODE_PAIRING_REQ 0x01
|
|
#define SMP_OPCODE_PAIRING_RSP 0x02
|
|
#define SMP_OPCODE_CONFIRM 0x03
|
|
#define SMP_OPCODE_RAND 0x04
|
|
#define SMP_OPCODE_PAIRING_FAILED 0x05
|
|
#define SMP_OPCODE_ENCRYPT_INFO 0x06
|
|
#define SMP_OPCODE_MASTER_ID 0x07
|
|
#define SMP_OPCODE_IDENTITY_INFO 0x08
|
|
#define SMP_OPCODE_ID_ADDR 0x09
|
|
#define SMP_OPCODE_SIGN_INFO 0x0A
|
|
#define SMP_OPCODE_SEC_REQ 0x0B
|
|
#define SMP_OPCODE_PAIR_PUBLIC_KEY 0x0C
|
|
#define SMP_OPCODE_PAIR_DHKEY_CHECK 0x0D
|
|
#define SMP_OPCODE_PAIR_KEYPR_NOTIF 0x0E
|
|
#define SMP_OPCODE_MAX SMP_OPCODE_PAIR_KEYPR_NOTIF
|
|
#define SMP_OPCODE_MIN SMP_OPCODE_PAIRING_REQ
|
|
#define SMP_OPCODE_PAIR_COMMITM 0x0F
|
|
#endif
|
|
|
|
/* SMP event type */
|
|
#define SMP_IO_CAP_REQ_EVT 1 /* IO capability request event */
|
|
#define SMP_SEC_REQUEST_EVT 2 /* SMP pairing request */
|
|
#define SMP_PASSKEY_NOTIF_EVT 3 /* passkey notification event */
|
|
#define SMP_PASSKEY_REQ_EVT 4 /* passkey request event */
|
|
#define SMP_OOB_REQ_EVT 5 /* OOB request event */
|
|
#define SMP_NC_REQ_EVT 6 /* Numeric Comparison request event */
|
|
#define SMP_COMPLT_EVT 7 /* SMP complete event */
|
|
#define SMP_PEER_KEYPR_NOT_EVT 8 /* Peer keypress notification received event */
|
|
#define SMP_SC_OOB_REQ_EVT 9 /* SC OOB request event (both local and peer OOB data */
|
|
/* can be expected in response) */
|
|
#define SMP_SC_LOC_OOB_DATA_UP_EVT 10 /* SC OOB local data set is created */
|
|
/* (as result of SMP_CrLocScOobData(...)) */
|
|
#define SMP_BR_KEYS_REQ_EVT 12 /* SMP over BR keys request event */
|
|
typedef UINT8 tSMP_EVT;
|
|
|
|
|
|
/* pairing failure reason code */
|
|
#define SMP_PASSKEY_ENTRY_FAIL 0x01
|
|
#define SMP_OOB_FAIL 0x02
|
|
#define SMP_PAIR_AUTH_FAIL 0x03
|
|
#define SMP_CONFIRM_VALUE_ERR 0x04
|
|
#define SMP_PAIR_NOT_SUPPORT 0x05
|
|
#define SMP_ENC_KEY_SIZE 0x06
|
|
#define SMP_INVALID_CMD 0x07
|
|
#define SMP_PAIR_FAIL_UNKNOWN 0x08
|
|
#define SMP_REPEATED_ATTEMPTS 0x09
|
|
#define SMP_INVALID_PARAMETERS 0x0A
|
|
#define SMP_DHKEY_CHK_FAIL 0x0B
|
|
#define SMP_NUMERIC_COMPAR_FAIL 0x0C
|
|
#define SMP_BR_PARING_IN_PROGR 0x0D
|
|
#define SMP_XTRANS_DERIVE_NOT_ALLOW 0x0E
|
|
#define SMP_MAX_FAIL_RSN_PER_SPEC SMP_XTRANS_DERIVE_NOT_ALLOW
|
|
|
|
/* self defined error code */
|
|
#define SMP_PAIR_INTERNAL_ERR (SMP_MAX_FAIL_RSN_PER_SPEC + 0x01) /* 0x0E */
|
|
|
|
/* 0x0F unknown IO capability, unable to decide association model */
|
|
#define SMP_UNKNOWN_IO_CAP (SMP_MAX_FAIL_RSN_PER_SPEC + 0x02) /* 0x0F */
|
|
|
|
#define SMP_INIT_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x03) /* 0x10 */
|
|
#define SMP_CONFIRM_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x04) /* 0x11 */
|
|
#define SMP_BUSY (SMP_MAX_FAIL_RSN_PER_SPEC + 0x05) /* 0x12 */
|
|
#define SMP_ENC_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x06) /* 0x13 */
|
|
#define SMP_STARTED (SMP_MAX_FAIL_RSN_PER_SPEC + 0x07) /* 0x14 */
|
|
#define SMP_RSP_TIMEOUT (SMP_MAX_FAIL_RSN_PER_SPEC + 0x08) /* 0x15 */
|
|
#define SMP_DIV_NOT_AVAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x09) /* 0x16 */
|
|
|
|
/* 0x17 unspecified failed reason */
|
|
#define SMP_FAIL (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0A) /* 0x17 */
|
|
|
|
#define SMP_CONN_TOUT (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0B)
|
|
#define SMP_SUCCESS 0
|
|
|
|
typedef UINT8 tSMP_STATUS;
|
|
|
|
|
|
/* Device IO capability */
|
|
#define SMP_IO_CAP_OUT BTM_IO_CAP_OUT /* DisplayOnly */
|
|
#define SMP_IO_CAP_IO BTM_IO_CAP_IO /* DisplayYesNo */
|
|
#define SMP_IO_CAP_IN BTM_IO_CAP_IN /* KeyboardOnly */
|
|
#define SMP_IO_CAP_NONE BTM_IO_CAP_NONE /* NoInputNoOutput */
|
|
#define SMP_IO_CAP_KBDISP BTM_IO_CAP_KBDISP /* Keyboard Display */
|
|
#define SMP_IO_CAP_MAX BTM_IO_CAP_MAX
|
|
typedef UINT8 tSMP_IO_CAP;
|
|
|
|
#ifndef SMP_DEFAULT_IO_CAPS
|
|
#define SMP_DEFAULT_IO_CAPS SMP_IO_CAP_KBDISP
|
|
#endif
|
|
|
|
/* OOB data present or not */
|
|
enum {
|
|
SMP_OOB_NONE,
|
|
SMP_OOB_PRESENT,
|
|
SMP_OOB_UNKNOWN
|
|
};
|
|
typedef UINT8 tSMP_OOB_FLAG;
|
|
|
|
/* type of OOB data required from application */
|
|
enum {
|
|
SMP_OOB_INVALID_TYPE,
|
|
SMP_OOB_PEER,
|
|
SMP_OOB_LOCAL,
|
|
SMP_OOB_BOTH
|
|
};
|
|
typedef UINT8 tSMP_OOB_DATA_TYPE;
|
|
|
|
#define SMP_AUTH_NO_BOND 0x00
|
|
#define SMP_AUTH_GEN_BOND 0x01 //todo sdh change GEN_BOND to BOND
|
|
|
|
/* SMP Authentication requirement */
|
|
#define SMP_AUTH_YN_BIT (1 << 2)
|
|
#define SMP_SC_SUPPORT_BIT (1 << 3)
|
|
#define SMP_KP_SUPPORT_BIT (1 << 4)
|
|
|
|
#define SMP_AUTH_MASK (SMP_AUTH_GEN_BOND|SMP_AUTH_YN_BIT|SMP_SC_SUPPORT_BIT|SMP_KP_SUPPORT_BIT)
|
|
|
|
#define SMP_AUTH_BOND SMP_AUTH_GEN_BOND
|
|
|
|
/* no MITM, No Bonding, encryption only */
|
|
#define SMP_AUTH_NB_ENC_ONLY 0x00 //(SMP_AUTH_MASK | BTM_AUTH_SP_NO)
|
|
|
|
/* MITM, No Bonding, Use IO Capability to determine authentication procedure */
|
|
#define SMP_AUTH_NB_IOCAP (SMP_AUTH_NO_BOND | SMP_AUTH_YN_BIT)
|
|
|
|
/* No MITM, General Bonding, Encryption only */
|
|
#define SMP_AUTH_GB_ENC_ONLY (SMP_AUTH_GEN_BOND )
|
|
|
|
/* MITM, General Bonding, Use IO Capability to determine authentication procedure */
|
|
#define SMP_AUTH_GB_IOCAP (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT)
|
|
|
|
/* Secure Connections, no MITM, no Bonding */
|
|
#define SMP_AUTH_SC_ENC_ONLY (SMP_SC_SUPPORT_BIT)
|
|
|
|
/* Secure Connections, no MITM, Bonding */
|
|
#define SMP_AUTH_SC_GB (SMP_SC_SUPPORT_BIT | SMP_AUTH_GEN_BOND)
|
|
|
|
/* Secure Connections, MITM, no Bonding */
|
|
#define SMP_AUTH_SC_MITM_NB (SMP_SC_SUPPORT_BIT | SMP_AUTH_YN_BIT | SMP_AUTH_NO_BOND)
|
|
|
|
/* Secure Connections, MITM, Bonding */
|
|
#define SMP_AUTH_SC_MITM_GB (SMP_SC_SUPPORT_BIT | SMP_AUTH_YN_BIT | SMP_AUTH_GEN_BOND)
|
|
|
|
/* All AuthReq RFU bits are set to 1 - NOTE: reserved bit in Bonding_Flags is not set */
|
|
#define SMP_AUTH_ALL_RFU_SET 0xF8
|
|
|
|
typedef UINT8 tSMP_AUTH_REQ;
|
|
|
|
#define SMP_SEC_NONE 0
|
|
#define SMP_SEC_UNAUTHENTICATE (1 << 0)
|
|
#define SMP_SEC_AUTHENTICATED (1 << 2)
|
|
typedef UINT8 tSMP_SEC_LEVEL;
|
|
|
|
/* Maximum Encryption Key Size range */
|
|
#define SMP_ENCR_KEY_SIZE_MIN 7
|
|
#define SMP_ENCR_KEY_SIZE_MAX 16
|
|
|
|
/* SMP key types */
|
|
#define SMP_SEC_KEY_TYPE_ENC (1 << 0) /* encryption key */
|
|
#define SMP_SEC_KEY_TYPE_ID (1 << 1) /* identity key */
|
|
#define SMP_SEC_KEY_TYPE_CSRK (1 << 2) /* slave CSRK */
|
|
#define SMP_SEC_KEY_TYPE_LK (1 << 3) /* BR/EDR link key */
|
|
typedef UINT8 tSMP_KEYS;
|
|
|
|
#define SMP_BR_SEC_DEFAULT_KEY (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | \
|
|
SMP_SEC_KEY_TYPE_CSRK)
|
|
|
|
/* default security key distribution value */
|
|
#define SMP_SEC_DEFAULT_KEY (SMP_SEC_KEY_TYPE_ENC | SMP_SEC_KEY_TYPE_ID | \
|
|
SMP_SEC_KEY_TYPE_CSRK | SMP_SEC_KEY_TYPE_LK)
|
|
|
|
#define SMP_SC_KEY_STARTED 0 /* passkey entry started */
|
|
#define SMP_SC_KEY_ENTERED 1 /* passkey digit entered */
|
|
#define SMP_SC_KEY_ERASED 2 /* passkey digit erased */
|
|
#define SMP_SC_KEY_CLEARED 3 /* passkey cleared */
|
|
#define SMP_SC_KEY_COMPLT 4 /* passkey entry completed */
|
|
#define SMP_SC_KEY_OUT_OF_RANGE 5 /* out of range */
|
|
typedef UINT8 tSMP_SC_KEY_TYPE;
|
|
|
|
/* data type for BTM_SP_IO_REQ_EVT */
|
|
typedef struct {
|
|
tSMP_IO_CAP io_cap; /* local IO capabilities */
|
|
tSMP_OOB_FLAG oob_data; /* OOB data present (locally) for the peer device */
|
|
tSMP_AUTH_REQ auth_req; /* Authentication required (for local device) */
|
|
UINT8 max_key_size; /* max encryption key size */
|
|
tSMP_KEYS init_keys; /* initiator keys to be distributed */
|
|
tSMP_KEYS resp_keys; /* responder keys */
|
|
} tSMP_IO_REQ;
|
|
|
|
typedef struct {
|
|
tSMP_STATUS reason;
|
|
tSMP_SEC_LEVEL sec_level;
|
|
BOOLEAN is_pair_cancel;
|
|
BOOLEAN smp_over_br;
|
|
} tSMP_CMPL;
|
|
|
|
typedef struct {
|
|
BT_OCTET32 x;
|
|
BT_OCTET32 y;
|
|
} tSMP_PUBLIC_KEY;
|
|
|
|
/* the data associated with the info sent to the peer via OOB interface */
|
|
typedef struct {
|
|
BOOLEAN present;
|
|
BT_OCTET16 randomizer;
|
|
BT_OCTET16 commitment;
|
|
|
|
tBLE_BD_ADDR addr_sent_to;
|
|
BT_OCTET32 private_key_used; /* is used to calculate: */
|
|
/* publ_key_used = P-256(private_key_used, curve_p256.G) - send it to the */
|
|
/* other side */
|
|
/* dhkey = P-256(private_key_used, publ key rcvd from the other side) */
|
|
tSMP_PUBLIC_KEY publ_key_used; /* P-256(private_key_used, curve_p256.G) */
|
|
} tSMP_LOC_OOB_DATA;
|
|
|
|
/* the data associated with the info received from the peer via OOB interface */
|
|
typedef struct {
|
|
BOOLEAN present;
|
|
BT_OCTET16 randomizer;
|
|
BT_OCTET16 commitment;
|
|
tBLE_BD_ADDR addr_rcvd_from;
|
|
} tSMP_PEER_OOB_DATA;
|
|
|
|
typedef struct {
|
|
tSMP_LOC_OOB_DATA loc_oob_data;
|
|
tSMP_PEER_OOB_DATA peer_oob_data;
|
|
} tSMP_SC_OOB_DATA;
|
|
|
|
|
|
typedef union {
|
|
UINT32 passkey;
|
|
tSMP_IO_REQ io_req; /* IO request */
|
|
tSMP_CMPL cmplt;
|
|
tSMP_OOB_DATA_TYPE req_oob_type;
|
|
tSMP_LOC_OOB_DATA loc_oob_data;
|
|
} tSMP_EVT_DATA;
|
|
|
|
|
|
/* AES Encryption output */
|
|
typedef struct {
|
|
UINT8 status;
|
|
UINT8 param_len;
|
|
UINT16 opcode;
|
|
UINT8 param_buf[BT_OCTET16_LEN];
|
|
} tSMP_ENC;
|
|
|
|
/* Security Manager events - Called by the stack when Security Manager related events occur.*/
|
|
typedef UINT8 (tSMP_CALLBACK) (tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data);
|
|
|
|
/* callback function for CMAC algorithm
|
|
*/
|
|
typedef void (tCMAC_CMPL_CBACK)(UINT8 *p_mac, UINT16 tlen, UINT32 sign_counter);
|
|
|
|
/*****************************************************************************
|
|
** External Function Declarations
|
|
*****************************************************************************/
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
/* API of SMP */
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_Init
|
|
**
|
|
** Description This function initializes the SMP unit.
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
extern void SMP_Init(void);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_SetTraceLevel
|
|
**
|
|
** Description This function sets the trace level for SMP. If called with
|
|
** a value of 0xFF, it simply returns the current trace level.
|
|
**
|
|
** Returns The new or current trace level
|
|
**
|
|
*******************************************************************************/
|
|
extern UINT8 SMP_SetTraceLevel (UINT8 new_level);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_Register
|
|
**
|
|
** Description This function register for the SMP service callback.
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
extern BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_Pair
|
|
**
|
|
** Description This function is called to start a SMP pairing.
|
|
**
|
|
** Returns SMP_STARTED if bond started, else otherwise exception.
|
|
**
|
|
*******************************************************************************/
|
|
extern tSMP_STATUS SMP_Pair (BD_ADDR bd_addr);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_BR_PairWith
|
|
**
|
|
** Description This function is called to start a SMP pairing over BR/EDR.
|
|
**
|
|
** Returns SMP_STARTED if pairing started, otherwise reason for failure.
|
|
**
|
|
*******************************************************************************/
|
|
extern tSMP_STATUS SMP_BR_PairWith (BD_ADDR bd_addr);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_PairCancel
|
|
**
|
|
** Description This function is called to cancel a SMP pairing.
|
|
**
|
|
** Returns TRUE - pairing cancelled
|
|
**
|
|
*******************************************************************************/
|
|
extern BOOLEAN SMP_PairCancel (BD_ADDR bd_addr);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_SecurityGrant
|
|
**
|
|
** Description This function is called to grant security process.
|
|
**
|
|
** Parameters bd_addr - peer device bd address.
|
|
** res - result of the operation SMP_SUCCESS if success.
|
|
** Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts.
|
|
**
|
|
** Returns None
|
|
**
|
|
*******************************************************************************/
|
|
extern void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_PasskeyReply
|
|
**
|
|
** Description This function is called after Security Manager submitted
|
|
** Passkey request to the application.
|
|
**
|
|
** Parameters: bd_addr - Address of the device for which PIN was requested
|
|
** res - result of the operation SMP_SUCCESS if success
|
|
** passkey - numeric value in the range of
|
|
** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
|
|
**
|
|
*******************************************************************************/
|
|
extern void SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_ConfirmReply
|
|
**
|
|
** Description This function is called after Security Manager submitted
|
|
** numeric comparison request to the application.
|
|
**
|
|
** Parameters: bd_addr - Address of the device with which numeric
|
|
** comparison was requested
|
|
** res - comparison result SMP_SUCCESS if success
|
|
**
|
|
*******************************************************************************/
|
|
extern void SMP_ConfirmReply (BD_ADDR bd_addr, UINT8 res);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_OobDataReply
|
|
**
|
|
** Description This function is called to provide the OOB data for
|
|
** SMP in response to SMP_OOB_REQ_EVT
|
|
**
|
|
** Parameters: bd_addr - Address of the peer device
|
|
** res - result of the operation SMP_SUCCESS if success
|
|
** p_data - SM Randomizer C.
|
|
**
|
|
*******************************************************************************/
|
|
extern void SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len,
|
|
UINT8 *p_data);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_SecureConnectionOobDataReply
|
|
**
|
|
** Description This function is called to provide the SC OOB data for
|
|
** SMP in response to SMP_SC_OOB_REQ_EVT
|
|
**
|
|
** Parameters: p_data - pointer to the data
|
|
**
|
|
*******************************************************************************/
|
|
extern void SMP_SecureConnectionOobDataReply(UINT8 *p_data);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_Encrypt
|
|
**
|
|
** Description This function is called to encrypt the data with the specified
|
|
** key
|
|
**
|
|
** Parameters: key - Pointer to key key[0] conatins the MSB
|
|
** key_len - key length
|
|
** plain_text - Pointer to data to be encrypted
|
|
** plain_text[0] conatins the MSB
|
|
** pt_len - plain text length
|
|
** p_out - pointer to the encrypted outputs
|
|
**
|
|
** Returns Boolean - TRUE: encryption is successful
|
|
*******************************************************************************/
|
|
extern BOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len,
|
|
UINT8 *plain_text, UINT8 pt_len,
|
|
tSMP_ENC *p_out);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_KeypressNotification
|
|
**
|
|
** Description This function is called to notify SM about Keypress Notification.
|
|
**
|
|
** Parameters: bd_addr - Address of the device to send keypress
|
|
** notification to
|
|
** value - keypress notification parameter value
|
|
**
|
|
*******************************************************************************/
|
|
extern void SMP_KeypressNotification (BD_ADDR bd_addr, UINT8 value);
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function SMP_CreateLocalSecureConnectionsOobData
|
|
**
|
|
** Description This function is called to start creation of local SC OOB
|
|
** data set (tSMP_LOC_OOB_DATA).
|
|
**
|
|
** Parameters: bd_addr - Address of the device to send OOB data block
|
|
** to.
|
|
**
|
|
** Returns Boolean - TRUE: creation of local SC OOB data set started.
|
|
*******************************************************************************/
|
|
extern BOOLEAN SMP_CreateLocalSecureConnectionsOobData (
|
|
tBLE_BD_ADDR *addr_to_send_to);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* SMP_API_H */
|