注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
tiankai001的个人空间 https://home.eeworld.com.cn/space-uid-139222.html [收藏] [复制] [分享] [RSS]
日志

CPU卡设计实例及程序设计(十七)卡和ESAM内部认证

已有 473 次阅读2017-2-27 22:18 |个人分类:CPU卡开发设计程序实例| 程序设计, CPU卡

/*******************************************
函数名称: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();
}
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章