/*******************************************
函数名称:CardAndEsamInterVali
函数功能:卡和ESAM内部认证
输入参数:cApplySerialNumber[8],卡应用序列号
输出参数:
描述:卡与esam模块之间的内部认证过程:
从卡取随机数--卡对随机数作内部认证,得到D1--ESAM用应用序列号
产生过程密钥--ESAM用过程密钥对随机数内部认证,得到D2--比较D1与D2
--相等则认证成功
*******************************************/
void CardAndEsamInsideVerify(unsigned char cApplySerialNumber[8])
{
unsigned char *pcReceCardData1,*pcReceCardData2;
unsigned char cReceCardData1[8]={0},cReceCardData2[8]={0};
unsigned char cReceCardRand1[8]={0};
unsigned char ctemp;
pcReceCardData1=Get_RandNum(); //取8字节随机数
if((ErrorReadWriteBIT+ErrorRandBIT)&iErrorRWrCard) goto CardAndEsamInsideVerifyEnd;
//随机数存放在数组中
memcpy(&cReceCardRand1[0],pcReceCardData1,8);
delay_ms2M(5);
//卡83H内部认证
pcReceCardData1=CardInsideVerify(cReceCardRand1,CardInsideVerifyKEY);
if(ErrorReadWriteBIT&iErrorRWrCard) goto CardAndEsamInsideVerifyEnd;
//内部认证获得的加密值,作为D1
memcpy(&cReceCardData1[0],pcReceCardData1,8);
//对ESAM操作
icflag1=~ICSAM&icflag1;
//ESAM用03密钥将应用序列号生成过程密钥
GetProcessKey(cApplySerialNumber,EsamInsideVerifyKEY);
if(ErrorReadWriteBIT&iErrorRWrCard) goto CardAndEsamInsideVerifyEnd;
//用过程密钥对随机数进行内部认证,生成D2
pcReceCardData2=EsamInsideVerify(cReceCardRand1,EsamKEYVerify);
if(ErrorReadWriteBIT&iErrorRWrCard) goto CardAndEsamInsideVerifyEnd;
memcpy(&cReceCardData2[0],pcReceCardData2,8);
//比较D1,D2,相等则认证成功
ctemp=memcmp(&cReceCardData2[0],&cReceCardData1[0],8);
if(ctemp!=0)
{
iErrorRWrCard=ErrorPasswBIT|iErrorRWrCard;
}
CardAndEsamInsideVerifyEnd:
_NOP();
}