📄 cardlib.c
字号:
包括4字节税控卡正常发票总累计金额+4字节税控卡退票总累计金额+1字节状态字+4字节申报数据签字MAC1
+128字节电子签名
status 状态字
------------------------------------------------------------------------------------------------*/
uchar TSAM_declare_duty(uchar *declare,uchar *len,uchar *sign,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xc0;
apdu_comm.command[1]=0xf4;
apdu_comm.command[2]=0;
apdu_comm.command[3]=0;
apdu_comm.lc=0x47;
apdu_comm.in_data=declare;
apdu_comm.le=0x8e;
apdu_resp.out_data=sign;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(0,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
*len=apdu_resp.out_len;
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
/*-------------------------------------------------------------
功能:
更新税控卡内监控管理数据
输入:
controls 长度为29字节的监控管理数据
包括1字节数据加密密钥标识符+24字节税控数据密文+4字节MAC2
status 状态字指针
输出:
0 成功
1 操作完成,返回状态字不对
0xd3 接收数据超时出错
0xd6 奇偶校验出错
0xd9 通信出错
0xc2 该卡是另类CPU卡
status 状态字
--------------------------------------------------------------*/
uchar TSAM_update_controls(uchar *controls,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xc0;
apdu_comm.command[1]=0xf6;
apdu_comm.command[2]=0;
apdu_comm.command[3]=0;
apdu_comm.lc=0x1d;
apdu_comm.in_data=controls;
apdu_comm.le=0;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(0,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
/*-------------------------------------------------------------
功能:
税控卡录入发票号
输入:
input 长度为22字节的发票录入数据
包括10字节发票代码+4字节单卷发票起始号+4字节单卷发票终止号+4字节MAC
status 状态字指针
输出:
0 成功
1 操作完成,返回状态字不对
0xd3 接收数据超时出错
0xd6 奇偶校验出错
0xd9 通信出错
0xc2 该卡是另类CPU卡
status 状态字
--------------------------------------------------------------*/
uchar TSAM_input_invoice_nb(uchar *input,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xc0;
apdu_comm.command[1]=0xf7;
apdu_comm.command[2]=0;
apdu_comm.command[3]=0;
apdu_comm.lc=0x16;
apdu_comm.in_data=input;
apdu_comm.le=0;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(0,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
/*-------------------------------------------------------------
功能:
检验税控机使用口令,并得到新的使用口令
输入:
pin 长度为8字节使用口令
len 新使用口令的长度指针
new_pin 长度为8字节新使用口令指针
status 状态字指针
输出:
0 成功
1 操作完成,返回状态字不对
0xd3 接收数据超时出错
0xd6 奇偶校验出错
0xd9 通信出错
0xc2 该卡是另类CPU卡
len 新使用口令的长度
new_pin 长度为8字节新使用口令
status 状态字
--------------------------------------------------------------*/
uchar TSAM_verify_fiscal_pin(uchar *pin,uchar *len,uchar *new_pin,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xc0;
apdu_comm.command[1]=0xf9;
apdu_comm.command[2]=0;
apdu_comm.command[3]=0;
apdu_comm.lc=0x08;
apdu_comm.in_data=pin;
apdu_comm.le=0x08;
apdu_resp.out_data=new_pin;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(0,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
*len=apdu_resp.out_len;
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
/*-------------------------------------------------------------
功能:
对税控收款机日交易记录或其他数据签名
输入:
sign_type 签名类型
0 为日记录签名
1 为其他数据签名
sign_data 待签名数据
len 要获取的签名数据长度指针
signed_data 要获取的签名数据指针
status 状态字指针
输出:
0 成功
1 操作完成,返回状态字不对
0xd3 接收数据超时出错
0xd6 奇偶校验出错
0xd9 通信出错
0xc2 该卡是另类CPU卡
len 获取的签名数据长度
signed_data 获取的签名数据
status 状态字
--------------------------------------------------------------*/
uchar TSAM_daily_collect_sign(uchar sign_type,uchar *sign_data,uchar *len,uchar *signed_data,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xc0;
apdu_comm.command[1]=0xfb;
apdu_comm.command[2]=0;
if(sign_type==0)
{
apdu_comm.command[3]=0;
apdu_comm.lc=0x41;
}
else
{
apdu_comm.command[3]=0x01;
apdu_comm.lc=0x81;
}
apdu_comm.in_data=sign_data;
apdu_comm.le=0x81;
apdu_resp.out_data=signed_data;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(0,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
*len=apdu_resp.out_len;
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
//用户卡专用
/*-------------------------------------------------------------
功能:
用户卡对税控卡随机数、税控卡编号、税控卡MAC1进行签字,得到签字MAC2
输入:
sign 长度为16字节签字数据
包括4字节随机数+8字节税控卡编号+4字节MAC1
len MAC2的数据长度指针
mac2 长度为4字节MAC2的数据指针
status 状态字指针
输出:
0 成功
1 操作完成,返回状态字不对
0xd3 接收数据超时出错
0xd6 奇偶校验出错
0xd9 通信出错
0xc2 该卡是另类CPU卡
len MAC2的数据长度
mac2 长度为4字节MAC2数据
status 状态字
--------------------------------------------------------------*/
uchar TID_register_sign(uchar *sign,uchar *len,uchar *mac2,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xc0;
apdu_comm.command[1]=0xe4;
apdu_comm.command[2]=0;
apdu_comm.command[3]=0;
apdu_comm.lc=0x10;
apdu_comm.in_data=sign;
apdu_comm.le=0x04;
apdu_resp.out_data=mac2;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(1,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
*len=apdu_resp.out_len;
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
/*-------------------------------------------------------------
功能:
把同一纳税人的多台税控机的申报数据采集到用户卡中,每台税控机对应一条记录
输入:
collect 长度为219字节获取了签字的申报数据
包括4字节税控卡编号+4字节起始日期+4字节截止日期+4正常发票张数+2字节退票张数+2字节废票张数
+6字节税种税目索引号+24字节正常发票分类累计金额+24字节退票分类累计金额
+4字节税控卡正常发票总累计金额+4字节税控卡退票总累计金额+1字节状态字+申报数据签字MAC1
+128字节电子签名
status 状态字指针
输出:
0 成功
1 操作完成,返回状态字不对
0xd3 接收数据超时出错
0xd6 奇偶校验出错
0xd9 通信出错
0xc2 该卡是另类CPU卡
status 状态字
--------------------------------------------------------------*/
uchar TID_data_collect(uchar *collect,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xc0;
apdu_comm.command[1]=0xe6;
apdu_comm.command[2]=0;
apdu_comm.command[3]=0;
apdu_comm.lc=0xdc;
apdu_comm.in_data=collect;
apdu_comm.le=0;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(1,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
/*-------------------------------------------------------------
功能:
分发用户卡中的发票号,该命令执行一次分发一卷发票号
输入:
len 分发的发票数据的长度指针
distribute 分发的发票数据指针
status 状态字指针
输出:
0 成功
1 操作完成,返回状态字不对
0xd3 接收数据超时出错
0xd6 奇偶校验出错
0xd9 通信出错
0xc2 该卡是另类CPU卡
len 分发的发票数据的长度
distribute 长度为22字节分发的发票数据
包括10字节发票代码+4字节单卷发票起始号+4字节单卷发票终止号+4字节MAC
status 状态字
--------------------------------------------------------------*/
uchar TID_distribute_invoice_nb(uchar *len,uchar *distribute,uint *status)
{
uchar i,rn;
apdu_resp.status = 0;
apdu_comm.command[0]=0xC0;
apdu_comm.command[1]=0xE9;
apdu_comm.command[2]=0;
apdu_comm.command[3]=0;
apdu_comm.lc=0;
apdu_comm.le=0x16;
apdu_resp.out_data=distribute;
for(i=0;i<3;i++)
{
rn=smart_card_apdu(1,&apdu_comm,&apdu_resp);
*status=apdu_resp.status;
if(rn==0)
{
*len=apdu_resp.out_len;
if ( apdu_resp.status == 0x9000 ) return 0;
else return 1;
}
else
{
if(rn==0xc2) return rn;
}
}
return rn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -