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

📄 calmac.txt

📁 计算MAC的c源代码。其中stDES为DES/TDES加解密调用
💻 TXT
字号:

/*
STATUS getMAC(IN unsigned char *pData,
			IN unsigned char dataLength,
			IN unsigned char *pKey,
			IN unsigned char keyLen,
			OUT unsigned char *pMAC)
MAC计算方法
	
** 
** parameters:
** IN	unsigned char *pData
** 			-- 产生MAC的数据体指针
** IN	unsgined char dataLength
** 			-- 数据体的长度
** IN 	unsigned char pKey
** 			--密钥的数值
** IN	unsigned char keyLen
**			--密钥长度
** IN 	unsigned char bFlag
**			--COM_MAC =4 用于指令传输,初始值为随机数
**			--PBOC_MAC=8用于PBOC指令中计算MAC,初始值为0
** OUT 	unsinged char *pMAC
** 			-- 输出的MAC,4字节

** Detail:
*/
unsigned char getMAC(IN unsigned char *pData,
			IN unsigned char dataLength,
			IN unsigned char *pKey,
			IN unsigned char keyLen,
			IN unsigned char bFlag,
			OUT unsigned char *pMAC)
{
	unsigned char macData[8];
	unsigned char i;
	unsigned char *pDecryptKey;

	//准备初始化数据,如果是指令中计算MAC,则要求初始值为xxxx0000
	//如果是PBOC中计算MAC,则要求初始值为全0
	memorySet(gRand + 8 - bFlag, 0, bFlag);
	
	//开始计MAC
	while(dataLength >= 8)
	{
		memMv(macData, pData, 8);
		for(i = 0; i < 8; i++)
		{
			gRand[i] = macData[i] ^ gRand[i];
		}
		//用密钥的前半部来进行加密操作
		stDES(gRand, pKey,8, gRand, ENCRYPT);
		dataLength -= 8;
		pData += 8;
	}

	//处理最后一个Dn
	memMv(macData, pData, dataLength);
	macData[dataLength] = 0x80;
	dataLength = 8 - dataLength - 1;
	memorySet(macData + 8 - dataLength, 0, dataLength);

	for(i = 0; i < 8; i++)
	{
		gRand[i] = macData[i] ^ gRand[i];
	}
	//用密钥的前半部来进行加密操作,
	stDES(gRand, pKey,8, gRand,ENCRYPT);

	//如果key为16位
	if(keyLen == LONG_KEY_LENGTH)
	{
		pDecryptKey = pKey + 8;
		stDES(gRand, pDecryptKey,8, gRand, DECRYPT );
		stDES(gRand, pKey,8,  gRand,ENCRYPT);
	}

	memMv(pMAC, gRand, 4);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -