123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- /**************************************************************************************************
-
- Phyplus Microelectronics Limited confidential and proprietary.
- All rights reserved.
- IMPORTANT: All rights of this software belong to Phyplus Microelectronics
- Limited ("Phyplus"). Your use of this Software is limited to those
- specific rights granted under the terms of the business contract, the
- confidential agreement, the non-disclosure agreement and any other forms
- of agreements as a customer or a partner of Phyplus. You may not use this
- Software unless you agree to abide by the terms of these agreements.
- You acknowledge that the Software may not be modified, copied,
- distributed or disclosed unless embedded on a Phyplus Bluetooth Low Energy
- (BLE) integrated circuit, either as a product or is integrated into your
- products. Other than for the aforementioned purposes, you may not use,
- reproduce, copy, prepare derivative works of, modify, distribute, perform,
- display or sell this Software and/or its documentation for any purposes.
- YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
- PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
- INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
- NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
- PHYPLUS OR ITS SUBSIDIARIES BE LIABLE OR OBLIGATED UNDER CONTRACT,
- NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
- LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
- INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
- OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
- OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
- (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
-
- **************************************************************************************************/
- /**************************************************************************************************
- **************************************************************************************************/
- #ifndef SM_INTERNAL_H
- #define SM_INTERNAL_H
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /*********************************************************************
- * INCLUDES
- */
- #include "bcomdef.h"
- #include "l2cap.h"
- #include "smp.h"
- #include "linkdb.h"
- /*********************************************************************
- * MACROS
- */
-
- /*********************************************************************
- * CONSTANTS
- */
-
- // Security Manager Task Events
- #define SM_TIMEOUT_EVT 0x0001 // Message timeout event
- #define SM_PAIRING_STATE_EVT 0x0002 // Event used to progress to the next pairing state
-
- // Pairing states
- #define SM_PAIRING_STATE_INITIALIZE 0 // Pairing has started
- #define SM_PAIRING_STATE_PAIRING_REQ_SENT 1 // Initiator: Pairing Request has been sent, Responder: waiting for Pairing Request.
- #define SM_PAIRING_STATE_WAIT_CONFIRM 2 // Waiting for Confirm message
- #define SM_PAIRING_STATE_WAIT_PASSKEY 3 // Waiting for Passkey from app/profile
- #define SM_PAIRING_STATE_WAIT_CONFIRM_PASSKEY 4 // Received Initiator Confirm message and waiting for Passkey from app/profile (responder only)
- #define SM_PAIRING_STATE_WAIT_RANDOM 5 // Waiting for Random message
- #define SM_PAIRING_STATE_WAIT_STK 6 // Waiting for STK process to finish
- #define SM_PAIRING_STATE_WAIT_SLAVE_ENCRYPTION_INFO 7 // Waiting for Slave Encryption Info to be sent
- #define SM_PAIRING_STATE_WAIT_SLAVE_MASTER_INFO 8 // Waiting for Slave Master Info to be sent
- #define SM_PAIRING_STATE_WAIT_SLAVE_IDENTITY_INFO 9 // Waiting for Slave Identity Info to be sent
- #define SM_PAIRING_STATE_WAIT_SLAVE_IDENTITY_ADDR_INFO 10 // Waiting for Slave Identity Addr Info to be sent
- #define SM_PAIRING_STATE_WAIT_SLAVE_SIGNING_INFO 11 // Waiting for Slave Signing Info to be sent
- #define SM_PAIRING_STATE_WAIT_MASTER_ENCRYPTION_INFO 12 // Waiting for Master Encryption Info to be sent
- #define SM_PAIRING_STATE_WAIT_MASTER_MASTER_INFO 13 // Waiting for Master Master Info to be sent
- #define SM_PAIRING_STATE_WAIT_MASTER_IDENTITY_INFO 14 // Waiting for Master Identity Info to be sent
- #define SM_PAIRING_STATE_WAIT_MASTER_IDENTITY_ADDR_INFO 15 // Waiting for Master Identity Addr Info to be sent
- #define SM_PAIRING_STATE_WAIT_MASTER_SIGNING_INFO 16 // Waiting for Master Signing Info to be sent
- #define SM_PAIRING_STATE_WAIT_ENCRYPT 17 // Waiting for LTK process to finish
- #define SM_PAIRING_STATE_DONE 18 // Closing out the pairing process
-
- #if defined ( TESTMODES )
- // SM TestModes
- #define SM_TESTMODE_OFF 0 // No Test mode
- #define SM_TESTMODE_NO_RESPONSE 1 // Don't respond to any SM message
- #define SM_TESTMODE_SEND_BAD_CONFIRM 2 // Force a bad confirm value in the Confirm Message
- #define SM_TESTMODE_BAD_CONFIRM_VERIFY 3 // Force a bad confirm check of the received Confirm Message
- #define SM_TESTMODE_SEND_CONFIRM 4 // Force a SMP Confirm message
- #endif // TESTMODES
- // Pairing Types
- #define SM_PAIRING_TYPE_INIT 0 // Pairing has been started but the type hasn't been determined yet
- #define SM_PAIRING_TYPE_JUST_WORKS 1 // Pairing is Just Works
- #define SM_PAIRING_TYPE_PASSKEY_INITIATOR_INPUTS 2 // Pairing is MITM Passkey with initiator inputs passkey
- #define SM_PAIRING_TYPE_PASSKEY_RESPONDER_INPUTS 3 // Pairing is MITM Passkey with responder inputs passkey
- #define SM_PAIRING_TYPE_PASSKEY_BOTH_INPUTS 4 // Pairing is MITM Passkey with both initiator and responder input passkey
- #define SM_PAIRING_TYPE_OOB 5 // Pairing is MITM OOB
- #define SM_PAIRING_STATE_WAIT 500 // The default wait time between key distribution messages.
- /*********************************************************************
- * TYPEDEFS
- */
- typedef struct
- {
- uint8 confirm[KEYLEN]; // calculated confirm value
- uint8 rand[SMP_RANDOM_LEN]; // First MRand or Srand, then RAND
- } devPairing_t;
- typedef struct
- {
- // From the start
- uint8 initiator; // TRUE if initiator
- uint8 state; // Pairing state
- uint8 taskID; // Task ID of the app/profile that requested the pairing
- uint16 connectionHandle; // Connection Handle from controller,
- smLinkSecurityReq_t *pSecReqs; // Pairing Control info
- uint8 tk[KEYLEN]; // Holds tk from app
- uint8 authState; // uses SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING
-
- // During pairing
- smpPairingReq_t *pPairDev; // Info of paired device.
- uint8 type; // ie. SM_PAIRING_TYPE_JUST_WORKS
-
- // device information
- devPairing_t myComp; // This device's pairing components
- devPairing_t devComp; // The other device's components
-
- // Encrypt Params
- smSecurityInfo_t *pEncParams; // Your (device's) encryption parameters
- smSecurityInfo_t *pDevEncParams; // Connected device's encryption parameters
- smIdentityInfo_t *pIdInfo; // Connected device's identity parameters
- smSigningInfo_t *pSigningInfo; // Connected device's signing parameters
-
- } smPairingParams_t;
- // Callback when an SMP message has been received on the Initiator or Responder.
- typedef uint8 (*smProcessMsg_t)( linkDBItem_t *pLinkItem, uint8 cmdID, smpMsgs_t *pParsedMsg );
- // Callback to send next key message, and sets state for next event on the Initiator or Responder.
- typedef void (*smSendNextKeyInfo_t)( void );
- // Callback to send Start Encrypt through HCI on the Initiator.
- typedef bStatus_t (*smStartEncryption_t)( uint16 connHandle, uint8 *pLTK, uint16 div,
- uint8 *pRandNum, uint8 keyLen );
- // Callback when an HCI BLE LTK Request has been received on the Responder.
- typedef uint8 (*smProcessLTKReq_t)( uint16 connectionHandle, uint8 *pRandom, uint16 encDiv );
- // Initiator callback structure - must be setup by the Initiator.
- typedef struct
- {
- smProcessMsg_t pfnProcessMsg; // When SMP message received
- smSendNextKeyInfo_t pfnSendNextKeyInfo; // When need to send next key message
- smStartEncryption_t pfnStartEncryption; // When Start Encrypt requested
- } smInitiatorCBs_t;
- // Responder callback structure - must be setup by the Initiator.
- typedef struct
- {
- smProcessMsg_t pfnProcessMsg; // When SMP message received
- smSendNextKeyInfo_t pfnSendNextKeyInfo; // When need to send next key message
- smProcessLTKReq_t pfnProcessLTKReq; // When HCI BLE LTK Request received
- } smResponderCBs_t;
- /*********************************************************************
- * GLOBAL VARIABLES
- */
-
- // Security Manager's OSAL task ID
- extern uint8 smTaskID;
- extern smPairingParams_t *pPairingParams;
- extern smResponderCBs_t *pfnResponderCBs;
- /*********************************************************************
- * FUNCTIONS - API
- */
- /*********************************************************************
- * Application Level Functions
- */
- /*
- * smLinkCheck - link database callback function.
- */
- extern void smLinkCheck( uint16 connectionHandle, uint8 changeType );
-
- /*
- * smProcessRandComplete - Process the HCI Random Complete Event.
- */
- extern uint8 smProcessRandComplete( uint8 status, uint8 *rand );
- /*
- * smTimedOut - Process the SM timeout.
- */
- extern void smTimedOut( void );
-
- /*
- * smStartRspTimer - Start the SM Response Timer.
- */
- extern void smStartRspTimer( void );
-
- /*
- * smStopRspTimer - Stop the SM Response Timer.
- */
- extern void smStopRspTimer( void );
-
- /*
- * smProcessDataMsg - Process incoming L2CAP messages.
- */
- extern void smProcessDataMsg( l2capDataEvent_t *pMsg );
-
- /*
- * smProcessEncryptChange - Process the HCI BLE Encrypt Change Event.
- */
- extern uint8 smProcessEncryptChange( uint16 connectionHandle, uint8 reason );
-
- /*
- * smInProcess - Is SM already processing something?
- */
- extern uint8 smInProcess( void );
- /*
- * sm_d1 - SM diversifying function d1
- */
- extern bStatus_t sm_d1( uint8 *pK, uint16 d, uint8 *pD1 );
- /*
- * sm_ah - Random address hash function
- */
- extern bStatus_t sm_ah( uint8 *pK, uint8 *pR, uint8 *pAh );
- /*
- * sm_dm - SM DIV Maxk generation function dm
- */
- extern bStatus_t sm_dm( uint8 *pK, uint8 *pR, uint16 *pDm );
- /*
- * sm_c1 - SM Confirm value generation function c1
- */
- extern bStatus_t sm_c1( uint8 *pK, uint8 *pR, uint8 *pC1 );
- /*
- * sm_c1new - SM Confirm value generation function c1
- */
- extern bStatus_t sm_c1new( uint8 *pK, uint8 *pR, uint8 *pRes, uint8 *pReq,
- uint8 iat, uint8 *pIA, uint8 rat, uint8 *pRA, uint8 *pC1 );
- /*
- * sm_s1 - SM key generation function s1
- */
- extern bStatus_t sm_s1( uint8 *pK, uint8 *pR1, uint8 *pR2, uint8 *pS1 );
-
- /*
- * smGenerateRandBuf - generate a buffer of random numbers
- */
- extern void smGenerateRandBuf( uint8 *pRandNum, uint8 len );
- /*
- * smEncLTK - start LTK Encryption
- */
- extern void smEncLTK( void );
- /*
- * smNextPairingState - trigger next state machine
- */
- extern void smNextPairingState( void );
-
- /*
- * smAuthReqToUint8 - conversion function
- */
- extern uint8 smAuthReqToUint8( authReq_t *pAuthReq );
- /*
- * smUint8ToAuthReq - conversion function
- */
- extern void smUint8ToAuthReq( authReq_t *pAuthReq, uint8 authReqUint8 );
-
- /*
- * smpResponderProcessPairingReq - Process an incoming Pairing Request message
- */
- extern uint8 smpResponderProcessPairingReq( smpPairingReq_t *pParsedMsg );
-
- /*
- * smSendFailAndEnd - Send the pairing failed message and end existing pairing
- */
- extern bStatus_t smSendFailAndEnd( uint16 connHandle, smpPairingFailed_t *pFailedMsg );
- /*
- * generateRandMsg - Generate a Pairing Random
- */
- extern bStatus_t smGenerateRandMsg( void );
- /*
- * smSavePairInfo - Save the Pairing Req or Rsp information
- */
- extern bStatus_t smSavePairInfo( smpPairingReq_t *pPair );
- /*
- * generateConfirm - Generate a Pairing Confirm
- */
- extern bStatus_t smGenerateConfirm( void );
- /*
- * smEndPairing - Pairing mode has ended. Yeah. Notify the GAP and free
- * up the memory used.
- */
- extern void smEndPairing( uint8 status );
- /*
- * determineKeySize - Determine the maximum encryption key size
- */
- extern uint8 smDetermineKeySize( void );
- /*
- * smGeneratePairingReqRsp - Generate a pairing req or response
- */
- extern bStatus_t smGeneratePairingReqRsp( void );
- /*
- * smPairingSendEncInfo - Send SM Encryption Information message
- */
- extern void smPairingSendEncInfo( uint16 connHandle, uint8 *pLTK );
- /*
- * smPairingSendMasterID - Send SM Master Identification message
- */
- extern void smPairingSendMasterID( uint16 connHandle, uint16 ediv, uint8 *pRand );
- /*
- * smPairingSendIdentityInfo - Send SM Identity Information message
- */
- extern void smPairingSendIdentityInfo( uint16 connHandle, uint8 *pIRK );
- /*
- * smPairingSendIdentityAddrInfo - Send SM Identity Addr Information message
- */
- extern void smPairingSendIdentityAddrInfo( uint16 connHandle, uint8 addrType, uint8 *pMACAddr );
- /*
- * smPairingSendSingingInfo - Send SM Signing Information message
- */
- extern void smPairingSendSingingInfo( uint16 connHandle, uint8 *pSRK );
- /*
- * smPairingSendEncInfo - Send SM Encryption Information message
- */
- extern void smPairingSendEncInfo( uint16 connHandle, uint8 *pLTK );
- /*
- * smProcessPairingReq - Process Pairing Request
- */
- extern void smProcessPairingReq( linkDBItem_t *pLinkItem, gapPairingReq_t *pPairReq );
- /*
- * smStartEncryption - Perform Encrypt through HCI
- */
- extern bStatus_t smStartEncryption( uint16 connHandle, uint8 *pLTK, uint16 div,
- uint8 *pRandNum, uint8 keyLen );
- /*
- * smRegisterInitiator - egister Initiator's processing function with SM task
- */
- extern void smRegisterInitiator( smInitiatorCBs_t *pfnCBs );
- /*
- * smRegisterResponder - Register Responder's processing function with SM task
- */
- extern void smRegisterResponder( smResponderCBs_t *pfnCBs );
- /*********************************************************************
- *********************************************************************/
- #ifdef __cplusplus
- }
- #endif
- #endif /* SM_INTERNAL_H */
|