📄 sim.c
字号:
if(card==1)ErrorHint("读用户卡文件数据出错!",statecode);
else ErrorHint("读管理卡文件数据出错!",statecode);
}
}
void AppBlockHint(uchar card,uchar state)
{
uchar str[30];
uint k;
memset(str,0,sizeof(str));
switch(card)
{
case 0: strcpy(str,"税控");
case 1: strcpy(str,"用户");
default:strcpy(str,"管理");
}
if(state!=0)
{
k=0x9303;
strcpy(&str[4],"卡应用被永久锁定!");
}
else
{
strcpy(&str[4],"卡认证方法(PIN)锁定!");
k=0x6983;
}
ErrorHint(str,k);
}
void VerifyFiscalPin()
{//效验税控机使用口令,执行成功后得到新的使用口令
uchar i,flg,k,dat[10];
uint statecode;
I2cRead(MacState,1,&k);
if(k==3)
statecode=OriginalPwd; //锁机时使用税控卡注册时得到的使用口令进行校验
else
statecode=FiscalPwd;
I2cRead(statecode,8,dat);
//----------------------------------
TxdBuf[0]=0xC0;
TxdBuf[1]=0xF9; //VerifyFiscalPin
TxdBuf[2]=0x00;
TxdBuf[3]=0x00;
TxdBuf[4]=0x08;
for(i=0;i<8;i++)
TxdBuf[5+i] = dat[i];
TxdBuf[13]=0x08;
statecode=SimCmd(14,0); //向税控卡发送
if(statecode != 0x6108)
{
if(statecode == 0x6983)
{
dat[0]=3;
I2cWrite(MacState,1,dat);
AppBlockHint(0,0);
}
else
ErrorHint("使用口令效验出错!",statecode);
}
statecode=GetResponse(8,0);
if(statecode != 0x9000)
{
ErrorHint("返回使用口令出错!",statecode);
}
for(i=0;i<8;i++)
dat[i] = RxdBuf[i];
//.......................................................
ReadBinary(0x82,102,1,0); //读取税控卡使用口令标志
flg=RxdBuf[0];
if(flg) //根据使用口令标志确定是否保存新的口令
I2cWrite(FiscalPwd,8,dat);
if(k==3)
{
dat[0]=4;
I2cWrite(MacState,1,dat);
}
//.......................................................
}
void GetChallenge(uchar le,uchar *dat,uchar card)
{//得到一个用于相关过程的随机数,le=4 or 8
uint statecode;
uchar i;
if(le!=4)le=8;
TxdBuf[0]=0x00;
TxdBuf[1]=0x84;
TxdBuf[2]=0x00;
TxdBuf[3]=0x00;
TxdBuf[4]=le;
statecode=SimCmd(5,card);
if(statecode != 0x9000)
{
ErrorHint("取随机数出错!",statecode);
}
for(i=0;i<le;i++)
dat[i]=RxdBuf[i];
}
uint ReadRecord(uchar m,uchar xp1,uchar xp2,uchar le,uchar card)
{
uint statecode;
TxdBuf[0]=0x00;
TxdBuf[1]=0xB2; //ReadRecord
TxdBuf[2]=xp1; //记录号
TxdBuf[3]=xp2; //低3位是100,若高5位不是00000就表示短文件标识符,否则表示当前文件
TxdBuf[4]=le;
statecode=SimCmd(5,card);
if(statecode == 0x9000)return 1;
if(statecode == 0x6A83 && m==0)return statecode;
if(card==0)ErrorHint("读税控卡记录文件出错!",statecode);
if(card==1)ErrorHint("读用户卡记录文件出错!",statecode);
else ErrorHint("读管理卡记录文件出错!",statecode);
}
void UpdateRecord(uchar xp1,uchar lc,uchar *dat,uchar card)
{//本函数无线路加密和保护
uint statecode;
uchar i;
TxdBuf[0]=0x00;
TxdBuf[1]=0xDC;
TxdBuf[2]=xp1;
TxdBuf[3]=0x04;
TxdBuf[4]=lc;
for(i=0;i<lc;i++)
TxdBuf[5+i]=dat[i];
statecode=SimCmd(lc+5,card); //向税控卡发送
if(statecode != 0x9000)
{
if(card==0)ErrorHint("更新税控卡记录文件出错!",statecode);
if(card==1)ErrorHint("更新用户卡记录文件出错!",statecode);
else ErrorHint("更新管理卡记录文件出错!",statecode);
}
}
/*
//MAC 如何取得????
void AppendRecord(uchar cla,uchar xp2,uchar lc,uchar *dat,uchar card)
{//用于对变长记录文件和循环文件追加记录,
//lc是否加4应该在调用本程序前赋值确定
uint statecode;
uchar i;
TxdBuf[0]=cla;
TxdBuf[1]=0xE2;
TxdBuf[2]=0x00;
TxdBuf[3]=xp2;
// if(cla==0x04)lc+=4;
TxdBuf[4]=lc;
for(i=0;i<lc;i++)
TxdBuf[5+i]=dat[i];
statecode=SimCmd(lc+5,card); //向税控卡发送
if(statecode != 0x9000)
{
ErrorHint("追加记录出错!",statecode);
}
}
//MAC 如何取得????
void UpdateBinary(uchar cla,uchar xp1,uchar xp2,uchar lc,uchar *dat,uchar card)
{//lc是否加4应该在调用本程序前赋值确定
uint statecode;
uchar i;
TxdBuf[0]=cla;
TxdBuf[1]=0xD6;
TxdBuf[2]=xp1;
TxdBuf[3]=xp2;
// if(cla==0x04)lc+=4;
TxdBuf[4]=lc;
for(i=0;i<lc;i++)
TxdBuf[5+i]=dat[i];
statecode=SimCmd(lc+5,card); //向税控卡发送
if(statecode != 0x9000)
{
ErrorHint("更新二进制文件出错!",statecode);
}
}
*/
void ReadBinary(uchar xp1,uchar xp2,uchar le,uchar card)
{
uint statecode;
TxdBuf[0]=0x00;
TxdBuf[1]=0xB0;
TxdBuf[2]=xp1;
TxdBuf[3]=xp2;
TxdBuf[4]=le;
statecode=SimCmd(5,card);
if(statecode != 0x9000)
{
if(card==0)ErrorHint("读税控卡二进制文件出错!",statecode);
if(card==1)ErrorHint("读用户卡二进制文件出错!",statecode);
else ErrorHint("读管理卡二进制文件出错!",statecode);
}
}
void ExternalAuthentication(uchar xp2,uchar *dat,uchar card)
{
uint statecode;
uchar i;
TxdBuf[0]=0x00;
TxdBuf[1]=0x82;
TxdBuf[2]=0x00;
TxdBuf[3]=xp2;
TxdBuf[4]=0x08;
for(i=0;i<8;i++)
TxdBuf[5+i]=dat[i];
statecode=SimCmd(13,card);
if(statecode != 0x9000)
{
ErrorHint("外部认证出错!",statecode);
}
}
void InternalAtuhntication(uchar xp2,uchar *dat,uchar card)
{
uint statecode;
uchar i;
TxdBuf[0]=0x00;
TxdBuf[1]=0x88;
TxdBuf[2]=0x00;
TxdBuf[3]=xp2;
TxdBuf[4]=0x08;
for(i=0;i<8;i++)
TxdBuf[5+i]=dat[i];
i=13;
statecode=SimCmd(i,card); //向税控卡发送
if(statecode != 0x6108)
{
ErrorHint("内部认证出错1!",statecode);
}
statecode=GetResponse(8,card);
if(statecode != 0x9000)
{
ErrorHint("内部认证出错2!",statecode);
}
for(i=0;i<8;i++)
dat[i]=RxdBuf[i];
}
/*
//MAC 如何取得????
void ApplictionBlock(uchar xp2,uchar *mac,uchar card)
{
uint statecode;
uchar i;
TxdBuf[0]=0x84;
TxdBuf[1]=0x18;
TxdBuf[2]=0x00;
TxdBuf[3]=xp2;
TxdBuf[4]=0x04;
for(i=0;i<4;i++)
TxdBuf[5+i]=mac[i];
statecode=SimCmd(9,card);
if(statecode != 0x9000)
{
ErrorHint("应用锁定出错!",statecode);
return;
}
}
//MAC 如何取得????
void ApplictionUnblock(uchar *mac,uchar card)
{
uint statecode;
uchar i;
TxdBuf[0]=0x84;
TxdBuf[1]=0x18;
TxdBuf[2]=0x00;
TxdBuf[3]=0x00;
TxdBuf[4]=0x04;
for(i=0;i<4;i++)
TxdBuf[5+i]=mac[i];
statecode=SimCmd(9,card);
if(statecode != 0x9000)
{
ErrorHint("解除应用锁定出错!",statecode);
}
}
//MAC 如何取得????
void CardBlock(uchar *mac,uchar card)
{
uint statecode;
uchar i;
TxdBuf[0]=0x84;
TxdBuf[1]=0x16;
TxdBuf[2]=0x00;
TxdBuf[3]=0x00;
TxdBuf[4]=0x04;
for(i=0;i<4;i++)
TxdBuf[5+i]=mac[i];
statecode=SimCmd(9,card);
if(statecode != 0x9000)
{
ErrorHint("SIM卡锁定出错!",statecode);
}
}
void PinUnblock(uchar xp1,uchar *dat)
{//由发卡方解锁PIN
uchar i;
uint statecode;
TxdBuf[0]=0x84;
TxdBuf[1]=0x24;
TxdBuf[2]=xp1;
TxdBuf[3]=0x01;
TxdBuf[4]=0x0C;
for(i=0;i<0x0C;i++)
TxdBuf[5+i]=dat[i];
statecode=SimCmd(17,0);
if(statecode != 0x6181)
{
ErrorHint("PIN解锁出错!",statecode);
return;
}
}
*/
void DailyCollectSign(uchar xp2,uchar *dat,uchar *str)
{
uchar i,lc,k=0;
uint statecode;
if(xp2==0)
lc=0x41;
else
lc=0x81;
RxdBuf[0]=0xEF;
RxdBuf[1]=0x03;
SelectFile(0x00,0x00,0x02,RxdBuf,0);
VerifyFiscalPin();
TxdBuf[0]=0xC0;
TxdBuf[1]=0xFB;
TxdBuf[2]=0x00;
TxdBuf[3]=xp2;
TxdBuf[4]=lc;
lc--;
for(i=0;i<lc;i++)
{
TxdBuf[5+i]=dat[i];
k ^= dat[i];
}
lc++;
TxdBuf[lc+4]=k;
TxdBuf[lc+5]=0x81;
// UartTxd(72,TxdBuf);
statecode=SimCmd(lc+6,0);
if(statecode != 0x6181)
{
if(statecode==0x9303)AppBlockHint(0,1);
ErrorHint("日交易累计记录签名出错!",statecode);
}
statecode=GetResponse(0x81,0);
if(statecode != 0x9000)
{
ErrorHint("获取签名出错!",statecode);
}
for(i=0;i<128;i++)str[i]=RxdBuf[i];
}
//00 20 00 02 08 31 32 33 34 35 36 37 38
void VerifyPin(uchar xp2,uchar lc,uchar *dat,uchar card)
{//效验命令数据域(用户卡?)的PIN的正确性
uchar i;
uint statecode;
TxdBuf[0]=0x00;
TxdBuf[1]=0x20; //Verify
TxdBuf[2]=0x00;
TxdBuf[3]=xp2; //PIN标识,00:银行标准PIN(只能为数字),01:用户卡使用口令,其它保留
TxdBuf[4]=lc;
for(i=0;i<lc;i++)
TxdBuf[5+i]=dat[i];
statecode=SimCmd(5+lc,card);
if(statecode != 0x9000)
{
if(statecode==0x6983)AppBlockHint(card,0);
ErrorHint("PIN效验出错!",statecode);
}
}
uchar ManagementIdentify()
{
uchar dat[16],k,i,m;
gyt4 *xp,*tp;
// ulong pin;
SimRstCold(2);
RxdBuf[0]=0x2F;
RxdBuf[1]=0x02;
SelectFile(0x00,0x00,0x02,RxdBuf,2);
ReadBinary(0x82,0,17,2);
if(RxdBuf[0]!=2)
{
LcdDisplay(16,0,"没有检测到管理卡!",1);
Hint(32,0,"请检查卡的类型是否正确!",1);
return 0xFF;
}
ReadDate();
xp=InvoDate;
tp=&RxdBuf[13];
if(xp->dat>tp->dat)
{
LcdDisplay(16,0,"应用有效日期已过!",1);
return 0xFF;
}
ReadBinary(0x81,0,10,2);
k=RxdBuf[8];
m=RxdBuf[9];
if(m!=0xFF)
{//非最高级别核查,需要做外部认证
I2cRead(TaxpayerNo,8,dat);
for(i=0;i<8;i++)
if(RxdBuf[i]!=dat[i])
{//纳税人编号不一致
LcdDisplay(16,0,"非本机管理卡!",1);
return 0xFF;
}
if(!FiscalIdentify(1))
{
LcdDisplay(16,0,"非本机税控卡!",1);
return 0xFF;
}
memset(dat,0,sizeof(dat));
GetChallenge(8,dat,2);
InternalAtuhntication(1,dat,0);
ExternalAuthentication(1,dat,2);
}
if(m==0xFF && k==3)//修改时钟时需要做PIN效验
{//输入PIN码效验
// LcdDisplay(0,0,"请输入认证密码",3);
// LcdDisplay(16,0,"PIN:",0);
// while(1)
// {
// temp[0]=0;
// memset(dat,0,sizeof(dat));
// if(SimType==SimTianYu)
// i=GetBcd(16,32,dat,8,temp); //天喻
// else
//// if(SimType==SimWoQi)
// i=GetBcd(16,32,dat,16,temp); //渥奇
// if(i==K_TC)return 0xFF;
// if(i==K_HJ)break;
// }
// if(SimType==SimTianYu)
// VerifyPin(0,4,dat,1); //天喻
// else
//// if(SimType==SimWoQi)
// VerifyPin(1,8,dat,1); //渥奇,PIN标识符可以在后台设置
}
RxdBuf[0]=0xEF;
RxdBuf[1]=0x03;
SelectFile(0x00,0x00,0x02,RxdBuf,2);
return k;
}
uchar UserIdentify(uchar x)
{//用户卡识别,补发的用户卡如何处理?
uchar i,dat[10],k,j;
uint statecode;
SimRstCold(1);
RxdBuf[0]=0x2F;
RxdBuf[1]=0x02;
SelectFile(0x00,0x00,0x02,RxdBuf,1);
ReadBinary(0x82,0,10,1); //读取纳税人编码
for(i=0;i<8;i++)dat[i]=RxdBuf[i+2];
if(RxdBuf[0]!=1)
{
LcdDisplay(16,0,"没有检测到用户卡!",1);
Hint(32,0,"请检查卡的类型是否正确!",1);
return 0;
}
if(x==0)
{
SimRstCold(0);
RxdBuf[0]=0x2F;
RxdBuf[1]=0x02;
SelectFile(0x00,0x00,0x02,RxdBuf,0);
ReadBinary(0x82,0,10,0); //读取税控卡编号
for(i=0;i<8;i++)dat[i]=RxdBuf[i+2];
j=1;k=0;
while(1)
{
statecode=ReadRecord(0,j,0x0C,37,1); //读取用户卡的税控卡编号
if(statecode==0x6A83)
{
LcdDisplay(16,0,"未找到对应信息!",1);
Hint(32,0,"非本机用户卡!",1);
return 0;
}
for(i=0;i<8;i++)
if(RxdBuf[i] != dat[i])
{
k=1;break;
}
if(k==0)return 1;
else {j++;k=0;}
}
}
else
{
I2cRead(TaxpayerNo,8,RxdBuf);
for(i=0;i<8;i++) //比较纳税人编码
if(RxdBuf[i] != dat[i])
{
LcdDisplay(16,0,"纳税人编码不一致!",1);
LcdDisplay(32,0,"非本机用户卡!",1);
return 0;
}
}
return 1;
}
uchar FiscalIdentify(uchar x)
{
uchar i,dat[10];
I2cRead(MachineNo,8,dat);
SimRstCold(0);
RxdBuf[0]=0x2F;
RxdBuf[1]=0x02;
SelectFile(0x00,0x00,0x02,RxdBuf,0);
ReadBinary(0x82,0,18,0); //读取机器编号
if(RxdBuf[0]!=0)
{
LcdDisplay(16,0,"没有检测到税控卡!",3);
Hint(32,0,"请检查卡的类型是否正确!",1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -