📄 zdsecmgr.lst
字号:
924 {
925 //---------------------------------------------------------------------------
926 #if defined ( ZDO_COORDINATOR )
927 //---------------------------------------------------------------------------
928 ZStatus_t status;
929 uint16 index;
930
931
932 // initialize results
933 status = ZNwkUnknownDevice;
934
935 // verify data is available
936 if ( ZDSecMgrCtrlData != NULL )
937 {
938 // look for an empty slot
939 for ( index = 0; index < ZDSECMGR_CTRL_MAX; index++ )
940 {
941 if ( ZDSecMgrCtrlData[index].state == ZDSECMGR_CTRL_NONE )
942 {
943 // return successful results
944 ZDSecMgrCtrlSet( device, entry, &ZDSecMgrCtrlData[index] );
945
946 status = ZSuccess;
947
948 // break from loop
949 index = ZDSECMGR_CTRL_MAX;
950 }
951 }
952 }
953
954 return status;
955 //---------------------------------------------------------------------------
956 #else // !defined ( ZDO_COORDINATOR )
957 //---------------------------------------------------------------------------
958 return ZSuccess;
959 //---------------------------------------------------------------------------
960 #endif // !defined ( ZDO_COORDINATOR )
961 //---------------------------------------------------------------------------
962 }
963 #endif // defined ( ZDSECMGR_COMMERCIAL )
964
965 #if defined ( ZDSECMGR_COMMERCIAL )
966 /******************************************************************************
967 * @fn ZDSecMgrCtrlTerm
968 *
969 * @brief Terminate device control.
970 *
971 * @param entry - [in] valid entry data
972 *
973 * @return none
974 */
975 void ZDSecMgrCtrlTerm( ZDSecMgrEntry_t* entry )
976 {
977 //---------------------------------------------------------------------------
978 #if defined ( ZDO_COORDINATOR )
979 //---------------------------------------------------------------------------
980 ZDSecMgrCtrl_t* ctrl;
981
982
983 // remove device from control data
984 ZDSecMgrCtrlLookup ( entry, &ctrl );
985
986 if ( ctrl != NULL )
987 {
988 ZDSecMgrCtrlRelease ( ctrl );
989 }
990 //---------------------------------------------------------------------------
991 #endif // defined ( ZDO_COORDINATOR )
992 //---------------------------------------------------------------------------
993 }
994 #endif // defined ( ZDSECMGR_COMMERCIAL )
995
996 #if defined ( ZDSECMGR_COMMERCIAL )
997 /******************************************************************************
998 * @fn ZDSecMgrCtrlReset
999 *
1000 * @brief Reset control data.
1001 *
1002 * @param device - [in] valid device data
1003 * @param entry - [in] valid entry data
1004 *
1005 * @return none
1006 */
1007 ZStatus_t ZDSecMgrCtrlReset( ZDSecMgrDevice_t* device, ZDSecMgrEntry_t* entry )
1008 {
1009 //---------------------------------------------------------------------------
1010 #if defined ( ZDO_COORDINATOR )
1011 //---------------------------------------------------------------------------
1012 ZStatus_t status;
1013 ZDSecMgrCtrl_t* ctrl;
1014
1015
1016 // initialize results
1017 status = ZNwkUnknownDevice;
1018
1019 // look for a match for the entry
1020 ZDSecMgrCtrlLookup( entry, &ctrl );
1021
1022 if ( ctrl != NULL )
1023 {
1024 ZDSecMgrCtrlSet( device, entry, ctrl );
1025
1026 status = ZSuccess;
1027 }
1028 else
1029 {
1030 status = ZDSecMgrCtrlAdd( device, entry );
1031 }
1032
1033 return status;
1034 //---------------------------------------------------------------------------
1035 #else // !defined ( ZDO_COORDINATOR )
1036 //---------------------------------------------------------------------------
1037 return ZSuccess;
1038 //---------------------------------------------------------------------------
1039 #endif // !defined ( ZDO_COORDINATOR )
1040 //---------------------------------------------------------------------------
1041 }
1042 #endif // defined ( ZDSECMGR_COMMERCIAL )
1043
1044 #if defined ( ZDSECMGR_COMMERCIAL )
1045 /******************************************************************************
1046 * @fn ZDSecMgrMasterKeyLoad
1047 *
1048 * @brief Load the MASTER key for device with specified EXT
1049 * address.
1050 *
1051 * @param nwkAddr - [in] NWK address of Trust Center
1052 * @param extAddr - [in] EXT address of Trust Center
1053 * @param key - [in] MASTER key shared with Trust Center
1054 *
1055 * @return none
1056 */
1057 void ZDSecMgrMasterKeyLoad( uint16 nwkAddr, uint8* extAddr, uint8* key )
1058 {
1059 AddrMgrEntry_t addr;
1060 uint8* loaded;
1061
1062
1063 // check if Trust Center address is configured and correct
1064 // check if MASTER key has already been sent
1065
1066 // add address data
1067 addr.user = ADDRMGR_USER_SECURITY;
1068 addr.nwkAddr = nwkAddr;
1069 AddrMgrExtAddrSet( addr.extAddr, extAddr );
1070
1071 if ( AddrMgrEntryUpdate( &addr ) == TRUE )
1072 {
1073 if ( ZDSecMgrMasterKeyLookup( addr.index, &loaded ) != ZSuccess )
1074 {
1075 ZDSecMgrMasterKeyStore( addr.index, key );
1076 }
1077 }
1078 }
1079 #endif // defined ( ZDSECMGR_COMMERCIAL )
1080
1081 #if defined ( ZDSECMGR_COMMERCIAL )
1082 /******************************************************************************
1083 * @fn ZDSecMgrAppKeyGet
1084 *
1085 * @brief get an APP key - option APP(MASTER or LINK) key
1086 *
1087 * @param initNwkAddr - [in] NWK address of initiator device
1088 * @param initExtAddr - [in] EXT address of initiator device
1089 * @param partNwkAddr - [in] NWK address of partner device
1090 * @param partExtAddr - [in] EXT address of partner device
1091 * @param key - [out] APP(MASTER or LINK) key
1092 * @param keyType - [out] APP(MASTER or LINK) key type
1093 *
1094 * @return pointer to MASTER key
1095 */
1096 ZStatus_t ZDSecMgrAppKeyGet( uint16 initNwkAddr,
1097 uint8* initExtAddr,
1098 uint16 partNwkAddr,
1099 uint8* partExtAddr,
1100 uint8** key,
1101 uint8* keyType )
1102 {
1103 //---------------------------------------------------------------------------
1104 // note:
1105 // should use a robust mechanism to generate keys, for example
1106 // combine EXT addresses and call a hash function
1107 //---------------------------------------------------------------------------
1108 osal_memset( *key, 0, SEC_KEY_LEN );
1109
1110 *keyType = KEY_TYPE_APP_LINK;
1111 //or KEY_TYPE_APP_MASTER;
1112
1113 return ZSuccess;
1114 }
1115 #endif // defined ( ZDSECMGR_COMMERCIAL )
1116
1117 #if defined ( ZDSECMGR_COMMERCIAL )
1118 /******************************************************************************
1119 * @fn ZDSecMgrAppKeyReq
1120 *
1121 * @brief Process request for APP key between two devices.
1122 *
1123 * @param device - [in] ZDO_RequestKeyInd_t, request info
1124 *
1125 * @return none
1126 */
1127 void ZDSecMgrAppKeyReq( ZDO_RequestKeyInd_t* ind )
1128 {
1129 APSME_TransportKeyReq_t req;
1130 uint8 initExtAddr[Z_EXTADDR_LEN];
1131 uint16 partNwkAddr;
1132 uint8 key[SEC_KEY_LEN];
1133
1134
1135 // validate initiator and partner
1136 if ( ( APSME_LookupNwkAddr( ind->partExtAddr, &partNwkAddr ) == TRUE ) &&
1137 ( APSME_LookupExtAddr( ind->srcAddr, initExtAddr ) == TRUE ) )
1138 {
1139 // point the key to some memory
1140 req.key = key;
1141
1142 // get an APP key - option APP (MASTER or LINK) key
1143 if ( ZDSecMgrAppKeyGet( ind->srcAddr,
1144 initExtAddr,
1145 partNwkAddr,
1146 ind->partExtAddr,
1147 &req.key,
1148 &req.keyType ) == ZSuccess )
1149 {
1150 // always secure
1151 req.secure = TRUE;
1152
1153 // send key to initiator device
1154 req.dstAddr = ind->srcAddr;
1155 req.extAddr = ind->partExtAddr;
1156 req.initiator = TRUE;
1157 APSME_TransportKeyReq( &req );
1158
1159 // send key to partner device
1160 req.dstAddr = partNwkAddr;
1161 req.extAddr = initExtAddr;
1162 req.initiator = FALSE;
1163 APSME_TransportKeyReq( &req );
1164 }
1165 }
1166 }
1167 #endif // defined ( ZDSECMGR_COMMERCIAL )
1168
1169 #if defined ( ZDSECMGR_COMMERCIAL )
1170 /******************************************************************************
1171 * @fn ZDSecMgrEstablishKey
1172 *
1173 * @brief Start SKKE with device joining network.
1174 *
1175 * @param device - [in] ZDSecMgrDevice_t, device info
1176 *
1177 * @return ZStatus_t
1178 */
1179 ZStatus_t ZDSecMgrEstablishKey( ZDSecMgrDevice_t* device )
1180 {
1181 ZStatus_t status;
11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -