📄 calmac.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 + -