123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- /**
- * @file
- * @author chipsea
- * @brief
- * @version 0.1
- * @date 2020-11-30
- * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
- * @note
- */
- /**************************************************************************************************
- **************************************************************************************************/
- #ifndef SMP_H
- #define SMP_H
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /*********************************************************************
- * INCLUDES
- */
- #include "bcomdef.h"
-
- #include "sm_internal.h"
- /*********************************************************************
- * MACROS
- */
- /*********************************************************************
- * CONSTANTS
- */
-
- // Code field of the SMP Command format
- #define SMP_PAIRING_REQ 0x01
- #define SMP_PAIRING_RSP 0x02
- #define SMP_PAIRING_CONFIRM 0x03
- #define SMP_PAIRING_RANDOM 0x04
- #define SMP_PAIRING_FAILED 0x05
- #define SMP_ENCRYPTION_INFORMATION 0x06
- #define SMP_MASTER_IDENTIFICATION 0x07
- #define SMP_IDENTITY_INFORMATION 0x08
- #define SMP_IDENTITY_ADDR_INFORMATION 0x09
- #define SMP_SIGNING_INFORMATION 0x0A
- #define SMP_SECURITY_REQUEST 0x0B
- // Pairing Request & Response - IO Capabilities
- #define SMP_IO_CAP_DISPLAY_ONLY 0x00
- #define SMP_IO_CAP_DISPLAY_YES_NO 0x01
- #define SMP_IO_CAP_KEYBOARD_ONLY 0x02
- #define SMP_IO_CAP_NO_INPUT_NO_OUTPUT 0x03
- #define SMP_IO_CAP_KEYBOARD_DISPLAY 0x04
-
- // Pairing Request & Response - Out Of Bound (OOB) data flag values
- #define SMP_OOB_AUTH_DATA_NOT_PRESENT 0x00
- #define SMP_OOB_AUTH_DATA_REMOTE_DEVICE_PRESENT 0x01
-
- // Pairing Request & Response - authReq field
- // - This field contains 2 sub-fields:
- // bonding flags - bits 1 & 0
- #define SMP_AUTHREQ_BONDING 0x01
- // Man-In-The-Middle (MITM) - bit 2
- #define SMP_AUTHREQ_MITM 0x04
-
- #define SMP_CONFIRM_LEN 16
- #define SMP_RANDOM_LEN 16
-
- // Pairing Failed - "reason" field
- #define SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED 0x01 //!< The user input of the passkey failed, for example, the user cancelled the operation.
- #define SMP_PAIRING_FAILED_OOB_NOT_AVAIL 0x02 //!< The OOB data is not available
- #define SMP_PAIRING_FAILED_AUTH_REQ 0x03 //!< The pairing procedure can't be performed as authentication requirements can't be met due to IO capabilities of one or both devices
- #define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value
- #define SMP_PAIRING_FAILED_NOT_SUPPORTED 0x05 //!< Pairing isn't supported by the device
- #define SMP_PAIRING_FAILED_ENC_KEY_SIZE 0x06 //!< The resultant encryption key size is insufficient for the security requirements of this device.
- #define SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED 0x07 //!< The SMP command received is not supported on this device.
- #define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason
- #define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authenication procedure is disallowed because too little time has elapsed since the last pairing request or security request.
-
- #define SMP_PAIRING_FAILED_LOCAL_KEY_FAILURE 0x0A // Local value - not sent over the air
- // Message lengths
- #define SMP_PAIRING_REQ_LEN 7
- #define SMP_PAIRING_RSP_LEN 7
- #define SMP_PAIRING_CONFIRM_LEN 17
- #define SMP_PAIRING_RANDOM_LEN 17
- #define SMP_PAIRING_FAILED_LEN 2
- #define SMP_ENCRYPTION_INFORMATION_LEN 17
- #define SMP_MASTER_IDENTIFICATION_LEN 11
- #define SMP_IDENTITY_INFORMATION_LEN 17
- #define SMP_IDENTITY_ADDR_INFORMATION_LEN 8
- #define SMP_SIGNING_INFORMATION_LEN 17
- #define SMP_SECURITY_REQUEST_LEN 2
-
- // Macros to use the smSendSMMsg() function to send all of the Security Manager Protocol messages
- #define smSendPairingReq( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_PAIRING_REQ_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildPairingReq) )
- #define smSendPairingRsp( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_PAIRING_RSP_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildPairingRsp) )
- #define smSendPairingConfirm( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_PAIRING_CONFIRM_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildPairingConfirm) )
- #define smSendPairingRandom( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_PAIRING_RANDOM_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildPairingRandom) )
- #define smSendPairingFailed( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_PAIRING_FAILED_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildPairingFailed) )
- #define smSendEncInfo( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_ENCRYPTION_INFORMATION_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildEncInfo) )
- #define smSendMasterID( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_MASTER_IDENTIFICATION_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildMasterID) )
- #define smSendIdentityInfo( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_IDENTITY_INFORMATION_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildIdentityInfo) )
- #define smSendIdentityAddrInfo( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_IDENTITY_ADDR_INFORMATION_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildIdentityAddrInfo) )
-
- #define smSendSigningInfo( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_SIGNING_INFORMATION_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildSigningInfo) )
- #define smSendSecurityReq( connHandle, msgStruct ) \
- smSendSMMsg( (connHandle), SMP_SECURITY_REQUEST_LEN, \
- (smpMsgs_t *)(msgStruct), \
- (pfnSMBuildCmd_t)(smpBuildSecurityReq) )
- /*********************************************************************
- * TYPEDEFS
- */
-
- // Pairing Request
- typedef struct
- {
- uint8 ioCapability; // ex. SMP_IO_CAP_DISPLAY_YES_NO
- uint8 oobDataFlag; // Out of Bound data flag
- authReq_t authReq; // Authentication fields
- uint8 maxEncKeySize; // Encryption Key size max bytes (7 - 16)
- keyDist_t keyDist; // Key Distribution Field - bit struct
- } smpPairingReq_t;
- // Pairing Response - same as Pairing Request
- typedef smpPairingReq_t smpPairingRsp_t;
- // Pairing Confirm
- typedef struct
- {
- uint8 confirmValue[SMP_CONFIRM_LEN];
- } smpPairingConfirm_t;
- // Pairing Random
- typedef struct
- {
- uint8 randomValue[SMP_RANDOM_LEN];
- } smpPairingRandom_t;
- // Pairing Failed
- typedef struct
- {
- uint8 reason;
- } smpPairingFailed_t;
- // Encryption Information
- typedef struct
- {
- uint8 ltk[KEYLEN];
- } smpEncInfo_t;
- // Master Identification
- typedef struct
- {
- uint16 ediv;
- uint16 rand[B_RANDOM_NUM_SIZE];
- } smpMasterID_t;
- // Identity Information
- typedef struct
- {
- uint8 irk[KEYLEN];
- } smpIdentityInfo_t;
- // Identity Address Information
- typedef struct
- {
- uint8 addrType;
- uint8 bdAddr[B_ADDR_LEN];
- } smpIdentityAddrInfo_t;
- // Signing Information
- typedef struct
- {
- uint8 signature[KEYLEN];
- } smpSigningInfo_t;
- // Slave Security Request
- typedef struct
- {
- authReq_t authReq;
- } smpSecurityReq_t;
- // Union with all of the SM messages.
- typedef union
- {
- smpPairingReq_t pairingReq;
- smpPairingReq_t pairingRsp;
- smpPairingConfirm_t pairingConfirm;
- smpPairingRandom_t pairingRandom;
- smpPairingFailed_t pairingFailed;
- smpEncInfo_t encInfo;
- smpMasterID_t masterID;
- smpIdentityInfo_t idInfo;
- smpIdentityAddrInfo_t idAddrInfo;
- smpSigningInfo_t signingInfo;
- smpSecurityReq_t secReq;
- } smpMsgs_t;
- typedef uint8 (*pfnSMBuildCmd_t)( smpMsgs_t *pMsgStruct, uint8 *pBuf );
- /*********************************************************************
- * GLOBAL VARIABLES
- */
- extern smpPairingReq_t pairingReg;
- /*********************************************************************
- * FUNCTIONS
- */
- /*
- * smpBuildPairingReq - Build an SM Pairing Request
- */
- extern bStatus_t smpBuildPairingReq( smpPairingReq_t *pPairingReq, uint8 *pBuf );
- /*
- * smpBuildPairingRsp - Build an SM Pairing Response
- */
- extern bStatus_t smpBuildPairingRsp( smpPairingRsp_t *pPairingRsp, uint8 *pBuf );
- /*
- * smpBuildPairingReqRsp - Build an SM Pairing Request or Response
- */
- extern bStatus_t smpBuildPairingReqRsp( uint8 opCode, smpPairingReq_t *pPairingReq, uint8 *pBuf );
- /*
- * smpParsePairingReq - Parse an SM Pairing Request
- */
- extern bStatus_t smpParsePairingReq( uint8 *pBuf, smpPairingReq_t *pPairingReq );
- /*
- * smpParsePairingRsp - Parse an SM Pairing Response
- */
- #define smpParsePairingRsp( a, b ) smpParsePairingReq( (a), (b) )
-
- /*
- * smpBuildPairingConfirm - Build an SM Pairing Confirm
- */
- extern bStatus_t smpBuildPairingConfirm( smpPairingConfirm_t *pPairingConfirm,
- uint8 *pBuf );
-
- /*
- * smpParsePairingConfirm - Parse an SM Pairing Confirm
- */
- extern bStatus_t smpParsePairingConfirm( uint8 *pBuf,
- smpPairingConfirm_t *pPairingConfirm );
-
- /*
- * smpBuildPairingRandom - Build an SM Pairing Random
- */
- extern bStatus_t smpBuildPairingRandom( smpPairingRandom_t *pPairingRandom,
- uint8 *pBuf );
- /*
- * smpParsePairingRandom - Parse an SM Pairing Random
- */
- extern bStatus_t smpParsePairingRandom( uint8 *pBuf,
- smpPairingRandom_t *pPairingRandom );
-
- /*
- * smpBuildPairingFailed - Build an SM Pairing Failed
- */
- extern bStatus_t smpBuildPairingFailed( smpPairingFailed_t *pPairingFailed,
- uint8 *pBuf );
- /*
- * smpParsePairingFailed - Parse an SM Pairing Failed
- */
- extern bStatus_t smpParsePairingFailed( uint8 *pBuf,
- smpPairingFailed_t *pPairingFailed );
-
- /*
- * smpBuildEncInfo - Build an SM Encryption Information
- */
- extern bStatus_t smpBuildEncInfo( smpEncInfo_t *pEncInfo, uint8 *pBuf );
- /*
- * smpParseEncInfo - Parse an SM Encryption Information
- */
- extern bStatus_t smpParseEncInfo( uint8 *buf, smpEncInfo_t *encInfo );
-
- /*
- * smpBuildMasterID - Build an SM Master Identification
- */
- extern bStatus_t smpBuildMasterID( smpMasterID_t *pMasterID, uint8 *pBuf );
-
- /*
- * smpParseMasterID - Parse an SM Master Identification
- */
- extern bStatus_t smpParseMasterID( uint8 *pBuf, smpMasterID_t *pMasterID );
-
- /*
- * smpBuildIdentityInfo - Build an SM Identity Information
- */
- extern bStatus_t smpBuildIdentityInfo( smpIdentityInfo_t *pIdInfo, uint8 *pBuf );
- /*
- * smpBuildIdentityAddrInfo - Build an SM Identity Address Information
- */
- extern bStatus_t smpBuildIdentityAddrInfo( smpIdentityAddrInfo_t *pIdInfo, uint8 *pBuf );
- /*
- * smpParseIdentityInfo - Parse an SM Identity Information
- */
- extern bStatus_t smpParseIdentityInfo( uint8 *pBuf, smpIdentityInfo_t *pIdInfo );
-
- /*
- * smpParseIdentityAddrInfo - Parse an SM Identity Address Information
- */
- extern bStatus_t smpParseIdentityAddrInfo( uint8 *pBuf, smpIdentityAddrInfo_t *pIdInfo );
-
- /*
- * smpBuildSigningInfo - Build an SM Signing Information
- */
- extern bStatus_t smpBuildSigningInfo( smpSigningInfo_t *pSigningInfo, uint8 *pBuf );
- /*
- * smpParseSigningInfo - Parse an SM Signing Information
- */
- extern bStatus_t smpParseSigningInfo( uint8 *pBuf, smpSigningInfo_t *pSigningInfo );
-
- /*
- * smpBuildSecurityReq - Build an SM Slave Security Request
- */
- extern bStatus_t smpBuildSecurityReq( smpSecurityReq_t *pSecReq, uint8 *pBuf );
- /*
- * smpParseSecurityReq - Parse an SM Slave Security Request
- */
- extern bStatus_t smpParseSecurityReq( uint8 *pBuf, smpSecurityReq_t *pSecReq );
-
- /*
- * smSendSMMsg - Generic Send L2CAP SM message function
- */
- extern bStatus_t smSendSMMsg( uint16 connHandle, uint8 bufLen, smpMsgs_t *pMsg, pfnSMBuildCmd_t buildFn );
- /*********************************************************************
- *********************************************************************/
- #ifdef __cplusplus
- }
- #endif
- #endif /* SMP_H */
|