📄 security.c
字号:
/*******************************************************************************
- Chip : MG24500/55
- Author : RadioPulse Inc, 2007.
- Date : 2007-07-02
- Version : VER 1.0
*******************************************************************************/
#include "INCLUDE_TOP.h"
extern UINT8 INT_AES;
void ZHAL_SEC_KEY_SET(UINT8 KeyNum, UINT8 *pKey)
{
UINT8 _EA;
_EA = EA;
EA = 0;
if(KeyNum) memcpy(&xKEY1(0), pKey, 16);
else memcpy(&xKEY0(0), pKey, 16);
EA = _EA;
}
void ZHAL_SEC_TXNONCE_KEY_SEQ_SET(UINT8 KeySeq)
{
xTXNONCE(0) = KeySeq;
}
void ZHAL_SEC_RXNONCE_KEY_SEQ_SET(UINT8 KeySeq)
{
xRXNONCE(0) = KeySeq;
}
UINT8 ZHAL_SEC_TXNONCE_KEY_SEQ_GET()
{
return xTXNONCE(0);
}
UINT8 ZHAL_SEC_RXNONCE_KEY_SEQ_GET()
{
return xRXNONCE(0);
}
void ZHAL_SEC_TXNONCE_FRAME_CNT_SET(UINT32 FrameCnt)
{
xTXNONCE(1) = (UINT8)FrameCnt; FrameCnt >>= 8;
xTXNONCE(2) = (UINT8)FrameCnt; FrameCnt >>= 8;
xTXNONCE(3) = (UINT8)FrameCnt; FrameCnt >>= 8;
xTXNONCE(4) = (UINT8)FrameCnt;
}
void ZHAL_SEC_RXNONCE_FRAME_CNT_SET(UINT32 FrameCnt)
{
xRXNONCE(1) = (UINT8)FrameCnt; FrameCnt >>= 8;
xRXNONCE(2) = (UINT8)FrameCnt; FrameCnt >>= 8;
xRXNONCE(3) = (UINT8)FrameCnt; FrameCnt >>= 8;
xRXNONCE(4) = (UINT8)FrameCnt;
}
UINT32 ZHAL_SEC_TXNONCE_FRAME_CNT_GET()
{
UINT32 FrameCnt_Read;
FrameCnt_Read = xTXNONCE(4);
FrameCnt_Read <<= 8; FrameCnt_Read |= xTXNONCE(3);
FrameCnt_Read <<= 8; FrameCnt_Read |= xTXNONCE(2);
FrameCnt_Read <<= 8; FrameCnt_Read |= xTXNONCE(1);
return FrameCnt_Read;
}
UINT32 ZHAL_SEC_RXNONCE_FRAME_CNT_GET()
{
UINT32 FrameCnt_Read;
FrameCnt_Read = xRXNONCE(4);
FrameCnt_Read <<= 8; FrameCnt_Read |= xRXNONCE(3);
FrameCnt_Read <<= 8; FrameCnt_Read |= xRXNONCE(2);
FrameCnt_Read <<= 8; FrameCnt_Read |= xRXNONCE(1);
return FrameCnt_Read;
}
void ZHAL_SEC_TXNONCE_EXT_ADDR_SET(UINT8 *pIEEE)
{
memcpy(&xTXNONCE(5), pIEEE, 8);
}
void ZHAL_SEC_RXNONCE_EXT_ADDR_SET(UINT8 *pIEEE)
{
memcpy(&xRXNONCE(5), pIEEE, 8);
}
void ZHAL_SEC_TXKEY_CHOICE(UINT8 KeyNum)
{
if(KeyNum) xMACSEC |= 0x40;
else xMACSEC &= 0xBF;
}
void ZHAL_SEC_RXKEY_CHOICE(UINT8 KeyNum)
{
if(KeyNum) xMACSEC |= 0x20;
else xMACSEC &= 0xDF;
}
void ZHAL_SEC_SECM_SET(UINT8 M)
{
UINT8 _EA;
_EA = EA;
EA = 0;
xMACSEC &= 0xE3;
xMACSEC |= (M & 0x07) << 2;
EA = _EA;
}
//-- Mode
// 1 : CBC-MAC
// 2 : CTR
// 3 : CCM
void ZHAL_SEC_MODE_SET(UINT8 Mode)
{
UINT8 _EA;
_EA = EA;
EA = 0;
xMACSEC &= 0xFC;
xMACSEC |= (Mode & 0x03);
EA = _EA;
}
void ZHAL_SEC_L_SET(UINT8 Tx_nRX, UINT8 L)
{
UINT8 _EA;
_EA = EA;
EA = 0;
if(Tx_nRX) xTXAL = L & 0x7F;
else xRXAL = L & 0x7F;
EA = _EA;
}
// Exampel : PlainText ---> (encrypt) ---> CipherText
// KEY [0~15] : 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
// PlainText [0~15] : F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
// CipherText[0~15] : 27 25 9B 7F 8F F3 50 85 94 77 F7 7D C9 71 E6 74
// KeyNum : 0=KEY0, 1=KEY1
// pPlainText : pointer to plaintext to encrypt
// pCipherText : pointer to encrypted ciphertext
void ZHAL_SEC_SAES(UINT8 KeyNum, UINT8 *pPlainText, UINT8 *pCipherText)
{
memcpy(&xSAESBUF(0), pPlainText, 16);
if(KeyNum) xMACSEC |= 0x80; // bit[7]=1
else xMACSEC &= 0x7F; // bit[7]=0
INT_AES = 0;
AESIE = 1;
xMACSAES = 0x01;
while(!INT_AES);
INT_AES = 0;
AESIE = 0;
memcpy(pCipherText, &xSAESBUF(0), 16);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -