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

📄 dec5502_mac.c

📁 DSP开发可以用来看外设情况的程序
💻 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 + -