www.pudn.com > vod2007.rar > Mac.cpp


// MAC.cpp: implementation of the CMAC class. 
// 
////////////////////////////////////////////////////////////////////// 
 
//#include "stdafx.h" 
#include "MAC.h" 
#include "des1.h" 
#include  
// ------------ CMAC::GetMac() --------------- 
// 功能: 计算PBOC(IC卡)规范所定义的MAC 
// 参数: 
//		[in]      key: 密钥(8字节/16字节, 由nKeyLen标识) 
//		[in]  nKeyLen: 密钥长度标识, 1-单长密钥 2-双长密钥 
//		[in]    input: 待计算的数据块(长度任意,不需补齐) 
//      [in]     nLen: 数据块的长度 
//      [in]   random: 随机数(4字节) 
//      [in]  bRandom: 随机数使用标志, TRUE-使用随机数, FALSE-不使用随机数 
//      [out]     MAC: MAC计算结果(4字节) 
// 返值:  
//       
// 说明: 一般交易命令和通用命令中的MAC计算, 初值为8个'0x00',此时 
//       应输入bRandom为FALSE, random为NULL. PBOC规范第二部分应用 
//       维护功能的交易, MAC计算的初值为4字节随机数后缀以4个'0x00', 
//       这种情况下,应输入bRandom为TRUE, random中应填入随机数 
void GetMac1(unsigned char key[], int nKeyLen, unsigned char input[], int nLen, unsigned char random[], int bRandom, unsigned char MAC[]) 
{ 
	int nBlock,i,j; 
	unsigned char temp[8]; 
	unsigned char *buf; 
 
	if (nKeyLen <1 || nKeyLen > 2) 
		return; 
 
	/* 初始化MAC计算初值 ==> temp*/ 
	memset(temp, 0, sizeof(temp)); 
	if ( 1 == bRandom ) 
	{ 
		memcpy(temp, random, 8 * sizeof(unsigned char)); 
	} 
	else 
	{ 
		if (random != NULL) 
			return; 
	} 
 
	/* 格式化输入值: 填 "80 00 00 ...", 凑8字节长度 ==> buf*/ 
	nBlock = nLen/8 + 1;	/* 总块数*/ 
	buf = (unsigned char *)malloc(nBlock*8); 
	memset(buf, 0, nBlock*8*sizeof(unsigned char)); 
	memcpy(buf, input, nLen*sizeof(unsigned char)); 
	buf[nLen] = 0x80; 
 
	for (i=0; i temp*/ 
		for(j=0; j<8; j++) 
		{ 
			temp[j] ^= buf[i*8+j]; 
		} 
 
		/* temp ==> DES ==> temp*/ 
		Encrypt(temp, key, temp); 
	} 
 
	free(buf); 
 
	if (nKeyLen == 2) 
	{ 
		Decrypt(temp, &key[8], temp); 
		Encrypt(temp, key, temp); 
	} 
 
	/* temp 左四位 ==> MAC*/ 
	memcpy(MAC, temp, 4 * sizeof(unsigned char)); 
}