⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 security.c

📁 ZIGBEE 2006协议栈 BAT测试代码 RADIO PULSE MG2455
💻 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 + -