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();
}
//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();
}
相关文章推荐
- CPU卡设计实例及程序设计(三十)ESAM过程密钥内部认证
- CPU卡程序设计实例(二十六)卡和ESAM之间外部认证
- CPU卡程序设计实例(二十五)ESAM过程密钥内部认证
- CPU卡程序设计实例(二十二)CPU卡内部认证
- CPU卡设计实例及程序设计(二十八)ESAM外部认证
- CPU卡程序设计实例(八)ESAM模块卡上、下电
- CPU卡程序设计实例(十三)终端向ESAM发送数据
- CPU卡程序设计实例(十二)ESAM模块字节接收函数
- CPU卡程序设计实例(二十)8字节随机数读取
- CPU卡程序设计实例(十六)文件选择
- CPU卡程序设计实例(二十四)生成过程密钥
- CPU卡程序设计实例(十一)CPU卡字节数据接收
- CPU卡程序设计实例(四)CPU卡处理流程
- CPU卡程序设计实例(三)命令格式
- CPU卡程序设计实例(一)电路
- CPU卡程序设计实例(二十一)4字节随机数读取
- CPU卡程序设计实例(六)ETU配置
- CPU卡程序设计实例(十八)命令体函数
- CPU卡程序设计实例(十四)终端向CPU卡发送数据
- CPU卡程序设计实例(十九)取响应数据命令