📄 zdsecmgr.c
字号:
/******************************************************************************
Filename: ZDSecMgr.c
Revised: $Date: 2007-03-16 17:30:34 -0700 (Fri, 16 Mar 2007) $
Revision: $Revision: 13778 $
Description:
The ZigBee Device Security Manager.
Copyright (c) 2006 by Texas Instruments, Inc.
All Rights Reserved. Permission to use, reproduce, copy, prepare
derivative works, modify, distribute, perform, display or sell this
software and/or its documentation for any purpose is prohibited
without the express written consent of Texas Instruments, Inc.
******************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif
/******************************************************************************
* INCLUDES
*/
#include "ZComdef.h"
#include "osal.h"
#include "ZGlobals.h"
#include "ssp.h"
#include "nwk_globals.h"
#include "nwk.h"
#include "NLMEDE.h"
#include "AddrMgr.h"
#include "AssocList.h"
#include "APSMEDE.h"
#include "AF.h"
#include "ZDConfig.h"
#include "ZDApp.h"
#include "ZDSecMgr.h"
/******************************************************************************
* CONSTANTS
*/
// maximum number of devices managed by this Security Manager
#define ZDSECMGR_DEVICE_MAX 3
// total number of preconfigured devices (EXT address, MASTER key)
#define ZDSECMGR_PRECONFIG_MAX ZDSECMGR_DEVICE_MAX
// maximum number of MASTER keys this device may hold
#define ZDSECMGR_MASTERKEY_MAX ZDSECMGR_DEVICE_MAX
// maximum number of LINK keys this device may store
#define ZDSECMGR_ENTRY_MAX ZDSECMGR_DEVICE_MAX
// total number of devices under control - authentication, SKKE, etc.
#define ZDSECMGR_CTRL_MAX ZDSECMGR_DEVICE_MAX
// total number of restricted devices
#define ZDSECMGR_RESTRICTED_DEVICES 2
#define ZDSECMGR_CTRL_NONE 0
#define ZDSECMGR_CTRL_INIT 1
#define ZDSECMGR_CTRL_TK_MASTER 2
#define ZDSECMGR_CTRL_SKKE_INIT 3
#define ZDSECMGR_CTRL_SKKE_WAIT 4
#define ZDSECMGR_CTRL_SKKE_DONE 5
#define ZDSECMGR_CTRL_TK_NWK 6
#define ZDSECMGR_CTRL_BASE_CNTR 1
#define ZDSECMGR_CTRL_SKKE_INIT_CNTR 10
#define ZDSECMGR_CTRL_SKKE_WAIT_CNTR 100
#define ZDSECMGR_CTRL_TK_NWK_CNTR 10
// set SKKE slot maximum
#define ZDSECMGR_SKKE_SLOT_MAX 1
// APSME Stub Implementations
#define ZDSecMgrMasterKeyGet APSME_MasterKeyGet
#define ZDSecMgrLinkKeySet APSME_LinkKeySet
#define ZDSecMgrLinkKeyDataGet APSME_LinkKeyDataGet
#define ZDSecMgrKeyFwdToChild APSME_KeyFwdToChild
/******************************************************************************
* TYPEDEFS
*/
typedef struct
{
uint8 extAddr[Z_EXTADDR_LEN];
uint8 key[SEC_KEY_LEN];
} ZDSecMgrPreConfigData_t;
typedef struct
{
uint16 ami;
uint8 key[SEC_KEY_LEN];
} ZDSecMgrMasterKeyData_t;
//should match APSME_LinkKeyData_t;
typedef struct
{
uint8 key[SEC_KEY_LEN];
APSME_LinkKeyData_t apsmelkd;
} ZDSecMgrLinkKeyData_t;
typedef struct
{
uint16 ami;
ZDSecMgrLinkKeyData_t lkd;
} ZDSecMgrEntry_t;
typedef struct
{
ZDSecMgrEntry_t* entry;
uint16 parentAddr;
uint8 secure;
uint8 state;
uint8 cntr;
//uint8 next;
} ZDSecMgrCtrl_t;
typedef struct
{
uint16 nwkAddr;
uint8* extAddr;
uint16 parentAddr;
uint8 secure;
ZDSecMgrCtrl_t* ctrl;
} ZDSecMgrDevice_t;
/******************************************************************************
* LOCAL VARIABLES
*/
#if defined ( ZDSECMGR_SECURE ) && defined ( ZDO_COORDINATOR )
uint8 ZDSecMgrRestrictedDevices[ZDSECMGR_RESTRICTED_DEVICES][Z_EXTADDR_LEN] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
};
#endif // defined ( ZDSECMGR_SECURE ) && defined ( ZDO_COORDINATOR )
#if defined ( ZDSECMGR_COMMERCIAL )
#if ( ZDSECMGR_PRECONFIG_MAX != 0 )
const ZDSecMgrPreConfigData_t ZDSecMgrPreConfigData[ZDSECMGR_PRECONFIG_MAX] =
{
//---------------------------------------------------------------------------
// DEVICE A
//---------------------------------------------------------------------------
{
// extAddr
{0x7C,0x01,0x12,0x13,0x14,0x15,0x16,0x17},
// key
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
},
//---------------------------------------------------------------------------
// DEVICE B
//---------------------------------------------------------------------------
{
// extAddr
{0x84,0x03,0x00,0x00,0x00,0x4B,0x12,0x00},
// key
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
},
//---------------------------------------------------------------------------
// DEVICE C
//---------------------------------------------------------------------------
{
// extAddr
{0x3E,0x01,0x12,0x13,0x14,0x15,0x16,0x17},
// key
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
},
};
#endif // ( ZDSECMGR_PRECONFIG_MAX != 0 )
#endif // defined ( ZDSECMGR_COMMERCIAL )
#if defined ( ZDSECMGR_COMMERCIAL )
ZDSecMgrMasterKeyData_t* ZDSecMgrMasterKeyData = NULL;
ZDSecMgrEntry_t* ZDSecMgrEntries = NULL;
ZDSecMgrCtrl_t* ZDSecMgrCtrlData = NULL;
void ZDSecMgrAddrMgrUpdate( uint16 ami, uint16 nwkAddr );
void ZDSecMgrAddrMgrCB( uint8 update, AddrMgrEntry_t* newEntry, AddrMgrEntry_t* oldEntry );
#endif // defined ( ZDSECMGR_COMMERCIAL )
#if defined ( ZDSECMGR_SECURE ) && defined ( ZDO_COORDINATOR )
uint8 ZDSecMgrPermitJoiningEnabled;
uint8 ZDSecMgrPermitJoiningTimed;
#endif // defined ( ZDSECMGR_SECURE ) && defined ( ZDO_COORDINATOR )
#if defined ( ZDSECMGR_SECURE )
/******************************************************************************
* PRIVATE FUNCTIONS
*
* ZDSecMgrMasterKeyInit
* ZDSecMgrExtAddrLookup
* ZDSecMgrExtAddrStore
* ZDSecMgrMasterKeyLookup
* ZDSecMgrMasterKeyStore
* ZDSecMgrEntryInit
* ZDSecMgrEntryLookup
* ZDSecMgrEntryLookupAMI
* ZDSecMgrEntryLookupExt
* ZDSecMgrEntryFree
* ZDSecMgrEntryNew
* ZDSecMgrCtrlInit
* ZDSecMgrCtrlRelease
* ZDSecMgrCtrlLookup
* ZDSecMgrCtrlSet
* ZDSecMgrCtrlAdd
* ZDSecMgrCtrlTerm
* ZDSecMgrCtrlReset
* ZDSecMgrMasterKeyLoad
* ZDSecMgrAppKeyGet
* ZDSecMgrAppKeyReq
* ZDSecMgrEstablishKey
* ZDSecMgrSendMasterKey
* ZDSecMgrSendNwkKey
* ZDSecMgrDeviceEntryRemove
* ZDSecMgrDeviceEntryAdd
* ZDSecMgrDeviceCtrlHandler
* ZDSecMgrDeviceCtrlSetup
* ZDSecMgrDeviceCtrlUpdate
* ZDSecMgrDeviceRemove
* ZDSecMgrDeviceValidateSKKE
* ZDSecMgrDeviceValidateRM
* ZDSecMgrDeviceValidateCM
* ZDSecMgrDeviceValidate
* ZDSecMgrDeviceJoin
* ZDSecMgrDeviceJoinDirect
* ZDSecMgrDeviceJoinFwd
* ZDSecMgrDeviceNew
* ZDSecMgrAssocDeviceAuth
*/
//-----------------------------------------------------------------------------
// master key data
//-----------------------------------------------------------------------------
void ZDSecMgrMasterKeyInit( void );
//-----------------------------------------------------------------------------
// EXT address management
//-----------------------------------------------------------------------------
ZStatus_t ZDSecMgrExtAddrLookup( uint8* extAddr, uint16* ami );
ZStatus_t ZDSecMgrExtAddrStore( uint8* extAddr, uint16* ami );
//-----------------------------------------------------------------------------
// MASTER key data
//-----------------------------------------------------------------------------
ZStatus_t ZDSecMgrMasterKeyLookup( uint16 ami, uint8** key );
ZStatus_t ZDSecMgrMasterKeyStore( uint16 ami, uint8* key );
//-----------------------------------------------------------------------------
// entry data
//-----------------------------------------------------------------------------
void ZDSecMgrEntryInit( void );
ZStatus_t ZDSecMgrEntryLookup( uint16 nwkAddr, ZDSecMgrEntry_t** entry );
ZStatus_t ZDSecMgrEntryLookupAMI( uint16 ami, ZDSecMgrEntry_t** entry );
ZStatus_t ZDSecMgrEntryLookupExt( uint8* extAddr, ZDSecMgrEntry_t** entry );
void ZDSecMgrEntryFree( ZDSecMgrEntry_t* entry );
ZStatus_t ZDSecMgrEntryNew( ZDSecMgrEntry_t** entry );
//-----------------------------------------------------------------------------
// control data
//-----------------------------------------------------------------------------
void ZDSecMgrCtrlInit( void );
void ZDSecMgrCtrlRelease( ZDSecMgrCtrl_t* ctrl );
void ZDSecMgrCtrlLookup( ZDSecMgrEntry_t* entry, ZDSecMgrCtrl_t** ctrl );
void ZDSecMgrCtrlSet( ZDSecMgrDevice_t* device,
ZDSecMgrEntry_t* entry,
ZDSecMgrCtrl_t* ctrl );
ZStatus_t ZDSecMgrCtrlAdd( ZDSecMgrDevice_t* device, ZDSecMgrEntry_t* entry );
void ZDSecMgrCtrlTerm( ZDSecMgrEntry_t* entry );
ZStatus_t ZDSecMgrCtrlReset( ZDSecMgrDevice_t* device,
ZDSecMgrEntry_t* entry );
//-----------------------------------------------------------------------------
// key support
//-----------------------------------------------------------------------------
void ZDSecMgrMasterKeyLoad( uint16 nwkAddr, uint8* extAddr, uint8* key );
ZStatus_t ZDSecMgrAppKeyGet( uint16 initNwkAddr,
uint8* initExtAddr,
uint16 partNwkAddr,
uint8* partExtAddr,
uint8** key,
uint8* keyType );
void ZDSecMgrAppKeyReq( ZDO_RequestKeyInd_t* ind );
ZStatus_t ZDSecMgrEstablishKey( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrSendMasterKey( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrSendNwkKey( ZDSecMgrDevice_t* device );
//-----------------------------------------------------------------------------
// device entry
//-----------------------------------------------------------------------------
void ZDSecMgrDeviceEntryRemove( ZDSecMgrEntry_t* entry );
ZStatus_t ZDSecMgrDeviceEntryAdd( ZDSecMgrDevice_t* device, uint16 ami );
//-----------------------------------------------------------------------------
// device control
//-----------------------------------------------------------------------------
void ZDSecMgrDeviceCtrlHandler( ZDSecMgrDevice_t* device );
void ZDSecMgrDeviceCtrlSetup( ZDSecMgrDevice_t* device );
void ZDSecMgrDeviceCtrlUpdate( uint8* extAddr, uint8 state );
//-----------------------------------------------------------------------------
// device management
//-----------------------------------------------------------------------------
void ZDSecMgrDeviceRemove( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceValidateSKKE( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceValidateRM( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceValidateCM( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceValidate( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceJoin( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceJoinDirect( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceJoinFwd( ZDSecMgrDevice_t* device );
ZStatus_t ZDSecMgrDeviceNew( ZDSecMgrDevice_t* device );
//-----------------------------------------------------------------------------
// association management
//-----------------------------------------------------------------------------
void ZDSecMgrAssocDeviceAuth( associated_devices_t* assoc );
#if defined ( ZDSECMGR_COMMERCIAL )
/******************************************************************************
* @fn ZDSecMgrMasterKeyInit ]
*
* @brief Initialize master key data.
*
* @param none
*
* @return none
*/
void ZDSecMgrMasterKeyInit( void )
{
uint16 index;
uint16 size;
AddrMgrEntry_t entry;
// allocate MASTER key data
size = (short)( sizeof(ZDSecMgrMasterKeyData_t) * ZDSECMGR_MASTERKEY_MAX );
ZDSecMgrMasterKeyData = osal_mem_alloc( size );
// initialize MASTER key data
if ( ZDSecMgrMasterKeyData != NULL )
{
for ( index = 0; index < ZDSECMGR_MASTERKEY_MAX; index++ )
{
ZDSecMgrMasterKeyData[index].ami = INVALID_NODE_ADDR;
}
// check if preconfigured keys are enabled
//-------------------------------------------------------------------------
#if ( ZDSECMGR_PRECONFIG_MAX != 0 )
//-------------------------------------------------------------------------
if ( zgPreConfigKeys == TRUE )
{
// sync configured data
entry.user = ADDRMGR_USER_SECURITY;
for ( index = 0; index < ZDSECMGR_PRECONFIG_MAX; index++ )
{
// check for Address Manager entry
AddrMgrExtAddrSet( entry.extAddr,
(uint8*)ZDSecMgrPreConfigData[index].extAddr );
if ( AddrMgrEntryLookupExt( &entry ) != TRUE )
{
// update Address Manager
AddrMgrEntryUpdate( &entry );
}
if ( entry.index != INVALID_NODE_ADDR )
{
// sync MASTER keys with Address Manager index
ZDSecMgrMasterKeyData[index].ami = entry.index;
osal_cpyExtAddr( ZDSecMgrMasterKeyData[index].key,
(void*)ZDSecMgrPreConfigData[index].key );
}
}
}
//-------------------------------------------------------------------------
#endif // ( ZDSECMGR_PRECONFIG_MAX != 0 )
//-------------------------------------------------------------------------
}
}
#endif // defined ( ZDSECMGR_COMMERCIAL )
#if defined ( ZDSECMGR_COMMERCIAL )
/******************************************************************************
* @fn ZDSecMgrExtAddrLookup
*
* @brief Lookup index for specified EXT address.
*
* @param extAddr - [in] EXT address
* @param ami - [out] Address Manager index
*
* @return ZStatus_t
*/
ZStatus_t ZDSecMgrExtAddrLookup( uint8* extAddr, uint16* ami )
{
ZStatus_t status;
AddrMgrEntry_t entry;
// lookup entry
entry.user = ADDRMGR_USER_SECURITY;
AddrMgrExtAddrSet( entry.extAddr, extAddr );
if ( AddrMgrEntryLookupExt( &entry ) == TRUE )
{
// return successful results
*ami = entry.index;
status = ZSuccess;
}
else
{
// return failed results
*ami = entry.index;
status = ZNwkUnknownDevice;
}
return status;
}
#endif // defined ( ZDSECMGR_COMMERCIAL )
#if defined ( ZDSECMGR_COMMERCIAL )
/******************************************************************************
* @fn ZDSecMgrExtAddrStore
*
* @brief Store EXT address.
*
* @param extAddr - [in] EXT address
* @param ami - [out] Address Manager index
*
* @return ZStatus_t
*/
ZStatus_t ZDSecMgrExtAddrStore( uint8* extAddr, uint16* ami )
{
ZStatus_t status;
AddrMgrEntry_t entry;
// add entry
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -