您的位置:首页 > 其它

CPU卡程序设计实例(二十三)卡和ESAM之间内部认证

2017-04-29 22:39 260 查看
1、标识符宏定义

//CPU卡密钥标识

#define CardInfoDownKey 0x81 //

#define CardInfoUpKey 0x82 //

#define CardInsideVerifyKEY 0x83 //

#define CardInfoUpdateKEY 0x84 //

#define CardKEYUpdateKey 0x85 //

#define CardVolumeUpdateKey 0x86 //

//ESAM密钥标识

#define EsamKEYVerify 0x00 //

#define EsamInfoDownKey 0x01 //

#define EsamInfoUpKey 0x02 //

#define EsamInsideVerifyKEY 0x03 //

#define EsamInfoUpdateKEY 0x04 //

#define EsamKEYUpdateKey 0x05 //

#define EsamVolumeUpdateKey 0x06 //

//cTxAndRxStatus CPU卡接收数据正确标志

#define ReceINSRightBIT BIT0

2、卡和ESAM内部认证

/*******************************************

函数名称: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((ErrorRWBIT+ErrorRandBIT)&CardError) goto CardAndEsamInsideVerifyEnd;

//随机数存放在数组中

memcpy(&cReceCardRand1[0],pcReceCardData1,8);

delay_ms2M(5);

//卡83H内部认证

pcReceCardData1=CardInsideVerify(cReceCardRand1,CardInsideVerifyKEY);

if(ErrorRWBIT&CardError) goto CardAndEsamInsideVerifyEnd;

//内部认证获得的加密值,作为D1

memcpy(&cReceCardData1[0],pcReceCardData1,8);

//对ESAM操作

CardWorkFlag=~CardORESAM&CardWorkFlag;

//ESAM用03密钥将应用序列号生成过程密钥

GetProcessKey(cApplySerialNumber,EsamInsideVerifyKEY);

if(ErrorRWBIT&CardError) goto CardAndEsamInsideVerifyEnd;

//用过程密钥对随机数进行内部认证,生成D2

pcReceCardData2=EsamInsideVerify(cReceCardRand1,EsamKEYVerify);

if(ErrorRWBIT&CardError) goto CardAndEsamInsideVerifyEnd;

memcpy(&cReceCardData2[0],pcReceCardData2,8);

//比较D1,D2,相等则认证成功

ctemp=memcmp(&cReceCardData2[0],&cReceCardData1[0],8);

if(ctemp!=0)

{

CardError=ErrorPasswBIT|CardError;

}

CardAndEsamInsideVerifyEnd:

_NOP();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息