📄 dec5502_mac.c
字号:
/****************************************************************/
/* 文件名: DEC5502_MAC.c */
/* 功能: 定义实现MAC算法函数 */
/* 设计者: 陈湘和 */
/* 设计日期: 10/22/2004 */
/*--------------------------------------------------------------*/
/* 说明: */
/* 如果线路保护密钥为8字节,那么调用MAC8_Algorithm */
/* 函数进行MAC码计算;否则线路保护密钥为16字节,应调 */
/* 用MAC16_Algorithm函数进行计算 */
/****************************************************************/
#include <stdio.h>
#include <csl.h>
#include "DEC5502_DES.h"
/****************************************************************/
/* 函数名: MAC8_Algorithm() */
/* 功能: 计算线路保护文件中需要的MAC码(8字节线路保护密钥)*/
/* 参数: */
/* InitVal--指向存放MAC计算时的初始值的数组指针 */
/* Input----指向存放命令报文数组的指针 */
/* DataLen--命令报文的字节长度 */
/* Key------指向存放线路保护密钥数组的指针 */
/* Output---指向存放MAC码数组的指针 */
/*--------------------------------------------------------------*/
/* 说明: */
/* DataBlock---用来暂存所分得的数据块 */
/* FinalBlock--用来保存最后一个数据块,该块可能由 */
/* 部分输入数据、0x80、0x00组成 */
/* DesBlock----用来暂存用DES加密后的数据块 */
/****************************************************************/
extern void MAC8_Algorithm(Uint16 *InitVal, Uint16 *Input, Uint16 DataLen, Uint16 *Key, Uint16 *Output)
{
Uint16 i,j,Row,Col;
Uint16 DataBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 FinalBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 DesBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 *DesPtr;
Uint16 *BlockPtr;
Row = DataLen/8; // 将输入的数据块分成以8字节为单位的数据块
Col = DataLen%8; // 根据Col值来决定最后一个数据块的组成
DesPtr = InitVal; // 首先让该指针指向初始值
if(Row >= 1) // 如果数据块数大于1,否则不用进行如下处理
{
for(i=0; i<Row; i++)
{
for(j=0; j<8; j++)
{
/* 实现初始值与第一个分得数据块的异或操作 */
DataBlock[j] = (*DesPtr++)^(*Input++);
}
/* 调用DES算法,对异或后的数据块进行DES加密 */
Des8(DataBlock,Key,DesBlock,EN0,1);
/* 调整数据指针,让它指向加密后的DES数据块 */
DesPtr = DesBlock;
}
}
if(Col==0) // 如果输入的的数据块是8字节整数倍
{
FinalBlock[0] = 0x80;
for(i=1; i<8; i++)
{
FinalBlock[i] = 0x00;
}
}
else
{
for(i=0; i<Col; i++)
{
FinalBlock[i] = *Input++;
}
FinalBlock[Col] = 0x80; // 在后面添0x80
for(i=Col+1; i<8; i++)
{
FinalBlock[i] = 0x00; // 如果数据加上0X80后还不足8字节,在其后添0x00
}
}
BlockPtr = FinalBlock;
for(i=0; i<8; i++) // 将最后的数据块与前几次的DES运算作异或操作
{
DataBlock[i] = (*DesPtr++)^(*BlockPtr++);
}
/* 调用DES算法,作最后一次DES加密 */
Des8(DataBlock,Key,DesBlock,EN0,1);
/* 取DesBlock的左4个字节作为MAC码 */
for(i=0; i<4; i++)
{
*Output++ = DesBlock[i];
}
}
/****************************************************************/
/* 函数名: MAC16_Algorithm() */
/* 功能: 计算线路保护文件需要的MAC码(16字节线路保护密钥) */
/* 参数: */
/* InitVal--指向存放MAC计算时的初始值的数组指针 */
/* Input----指向存放命令报文数组的指针 */
/* DataLen--命令报文的字节长度 */
/* Key------指向存放16字节线路保护密钥数组的指针 */
/* Output---指向存放MAC码数组的指针 */
/*--------------------------------------------------------------*/
/* 说明: */
/* LeftKey-----用来保存16字节密钥的左半部分 */
/* RightKey----用来保存16字节密钥的右半部分 */
/* DataBlock---用来暂存所分得的数据块 */
/* FinalBlock--用来保存最后一个数据块,该块可能由 */
/* 部分输入数据、0x80、0x00组成 */
/* DesBlock----用来暂存用DES加密后的数据块 */
/****************************************************************/
extern void MAC16_Algorithm(Uint16 *InitVal, Uint16 *Input, Uint16 DataLen, Uint16 *Key, Uint16 *Output)
{
Uint16 i,j,Row,Col;
Uint16 LeftKey[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 RightKey[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 DataBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 FinalBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 DesBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Uint16 *DesPtr;
Uint16 *BlockPtr;
Uint16 *TempPtr;
TempPtr = Key;
for(i=0; i<8; i++) // 获取16字节密钥的左半部分
{
LeftKey[i] = *TempPtr++;
}
for(i=0; i<8; i++) // 获取16字节密钥的右半部分
{
RightKey[i] = *TempPtr++;
}
Row = DataLen/8; // 将输入的数据块分成以8字节为单位的数据块
Col = DataLen%8; // 根据Col值来决定最后一个数据块的组成
DesPtr = InitVal; // 首先让该指针指向初始值
if(Row >= 1) // 如果数据块数大于1,否则不用进行如下处理
{
for(i=0; i<Row; i++)
{
for(j=0; j<8; j++)
{
/* 实现初始值与第一个分得数据块的异或操作 */
DataBlock[j] = (*DesPtr++)^(*Input++);
}
/* 调用DES算法,对异或后的数据块进行DES加密 */
Des8(DataBlock,LeftKey,DesBlock,EN0,1);
/* 调整数据指针,让它指向加密后的DES数据块 */
DesPtr = DesBlock;
}
}
if(Col==0) // 如果输入的的数据块是8字节整数倍
{
FinalBlock[0] = 0x80;
for(i=1; i<8; i++)
{
FinalBlock[i] = 0x00;
}
}
else
{
for(i=0; i<Col; i++)
{
FinalBlock[i] = *Input++;
}
FinalBlock[Col] = 0x80; // 在后面添0x80
for(i=Col+1; i<8; i++)
{
FinalBlock[i] = 0x00; // 如果数据加上0X80后还不足8字节,在其后添0x00
}
}
BlockPtr = FinalBlock;
for(i=0; i<8; i++) // 将最后的数据块与前几次的DES运算作异或操作
{
DataBlock[i] = (*DesPtr++)^(*BlockPtr++);
}
/* 调用DES算法,用16字节密钥的左半部分作DES加密运算 */
Des8(DataBlock,LeftKey,DesBlock,EN0,1);
/* 调用DES算法,用16字节密钥的右半部分作DES解密运算 */
Des8(DesBlock,RightKey,DataBlock,DE1,1);
/* 调用DES算法,用16字节密钥的左半部分作DES加密运算 */
Des8(DataBlock,LeftKey,DesBlock,EN0,1);
/* 取DesBlock的左4个字节作为MAC码 */
for(i=0; i<4; i++)
{
*Output++ = DesBlock[i];
}
}
/******************************************************************************/
/* No more */
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -