📄 card_trans.c
字号:
//send_char(which_rec);
memcpy(&buf[8], data_buf, len);
//send_str(len,data_buf);
if(which_card==0)
i=sam_iso(buf);
else
i=id_iso(buf);
if(i)
switch(which_card)
{
case SAM_CARD:
return(SAM_COMM_FAIL);
case USER_CARD:
return(USR_COMM_FAIL);
case CHK_CARD:
return(CHK_COMM_FAIL);
}
if(((which_card==USER_CARD)||(which_card==CHK_CARD))&&((buf[3]==0x6a)&&(buf[4]==0x83)))
{
return FILE_OVER;
}
else if((buf[3]!=0x90)||(buf[4]!=0x00))
{
// send_str(2,&buf[3]);
switch(which_card)
{
case SAM_CARD:
return(SAM_WRITE_FAIL);
case USER_CARD:
return(USR_WRITE_FAIL);
case CHK_CARD:
return(CHK_WRITE_FAIL);
}
}
return 0;
}
/*-------------------------------------------------------------------------
说明:从CPU卡取响应数据,可以是税控卡或用户卡
参数:
which_card:==0,税控卡;==1,用户卡
len:欲读出的数据长度(字节数)
content:如果函数调用成功,则为返回的响应数据
返回值:
==0,成功;否则失败。
作者:
---------------------------------------------------------------------------*/
uchar GetResponse(uchar which_card, uchar len, uchar *content)
{
uchar xdata cmd[200];
uchar xdata rlt;
delayms(10);//延时
strcpy(cmd,"DB00C00000");
rlt=pack_cmd(cmd,"",0,len); //lyj
//send_str(12,cmd);
if(rlt)
return(rlt);
if(which_card==SAM_CARD)
rlt=sam_iso(cmd);
else
rlt=id_iso(cmd);
if(rlt)
{
if(which_card==SAM_CARD)
return(SAM_COMM_FAIL);
else
return(USR_COMM_FAIL);
}
//send_str(len,cmd);
if(cmd[1]!=len || get_data(cmd))return(1); //lyj
memcpy(content,cmd,len);
return 0;
}
/*-------------------------------------------------------------------
说 明:从 SAM 卡取随机数 做内部认证
参 数:ret_buf (out) 内部认证后返回的信息
返 值:0 正确执行 其他 失败
---------------------------------------------------------------------*/
uchar internal_auth(uchar xdata * ret_buf)
{
uchar xdata sam_buf[20];
uchar xdata RetVal;
sam_buf[0]=0x60;
sam_buf[1]=15;
sam_buf[2]=ISO_WRITE;
sam_buf[3]=0x00;
sam_buf[4]=0x88;
sam_buf[5]=0x00;
sam_buf[6]=0x01; //密钥标识(根据调试效果所得)
sam_buf[7]=0x08;
memcpy(sam_buf+8,ret_buf,8);
sam_buf[16]=0x00;
if(sam_iso(sam_buf))
return (SAM_COMM_FAIL);
/*if(sam_buf[3]!=0x61||sam_buf[4]!=0x08||sam_buf[1]!=0)
return (SAM_AUTH_FAIL);
//从 SAM 卡取得响应
RetVal=GetResponse(SAM_CARD,8,ret_buf);//04.11 09改
if(RetVal!=0)
return RetVal;
*/
RetVal=get_data(sam_buf);
if(RetVal)return(RetVal);
memcpy(ret_buf,sam_buf,8);
return 0;
}
/*-------------------------------------------------------------------
说 明:把传入的数据送入稽查卡做外部认证
参 数:buf (in) 外部认证信息字符串
返 值:0 正确执行 其他 失败
---------------------------------------------------------------------*/
uchar external_auth(uchar xdata *buf,uchar kid)
{
uchar xdata sendbuf[50];
kid=0x01;//根据调试效果暂定[天喻卡0x01,明华为0x02];(03-07-19)
sendbuf[0]=0x60;
sendbuf[1]=14;
sendbuf[2]=ISO_WRITE;
sendbuf[3]=0x00 ; // CLA
sendbuf[4]=0x82; // INS
sendbuf[5]=0x00; // P1
sendbuf[6]=kid;//P2
sendbuf[7]=0x08;
memcpy(&sendbuf[8], buf, 8);
if(id_iso(sendbuf))
return (CHK_COMM_FAIL);
if((sendbuf[3]!=0x90)||(sendbuf[4]!=0))
return (CHK_AUTH_FAIL);
return 0;
}
//=================2 基本命令组合功能==============================//
/*===========================================================
功能:进入某个卡的应用目录
入口:
card_type:
SAM_CARD ---税控卡
USER_CARD---用户卡
CHK_CARD---税控管理卡
出口:
返回值:
==0:成功;
==其他,失败
全局变量:
编制人: 日期:2003-07-04
===========================================================*/
uchar enter_application_direct(uchar card_type)
{
uchar xdata buf[50];
if(card_type==SAM_CARD)
{
if(atr_sam(buf)) return (SAM_RESET_FAIL);
if(SelFile_id(SAM_CARD,0x3F00)) return (SAM_OPERATE_FAIL);
if(SelFile_id(SAM_CARD,0x2F02)) return (SAM_OPERATE_FAIL);
}
else
{
if(atr_cupcard(buf)) return (CPU_RESET_FAIL);
if(SelFile_id(card_type,0x3F00)) return (CPU_OPERATE_FAIL);
if(SelFile_id(card_type,0x2F02)) return (CPU_OPERATE_FAIL);
}
return 0;
}
//=================3 税控专用命令==============================//
/*===========================================================
功能:税控管理专用命令的基本通讯函数
入口:
which_card: SAM_CARD ---税控卡
USER_CARD ---用户卡
mode: 0--读,1--写
ins: 命令字
lc: 要写入的数据长度
*data_in:要写入的数据缓冲区指针
le: 要读取的数据长度
*data_out:读取的数据缓冲区指针
出口:*data_out:读取的数据缓冲区指针
返回值:
==0:成功;
==其他,失败
全局变量:
编制人: 日期:2003-07-04
===========================================================*/
/*uchar test_read_file(uchar t1,uchar t2)
{
uchar xdata buf[300], len, error;
uchar actual_len,sw1, sw2;
len=3;
len+=5;
buf[0]=COMMAND_HEAD;
buf[1]=len;
buf[2]=0;
buf[3]=0x0;
buf[4]=0xa4;
buf[5]=0;
buf[6]=0;
buf[7]=2;
buf[8]=t1;
buf[9]=t2;
error = sam_iso(buf);
if(error)
{
return (SAM_COMM_FAIL);
}
actual_len=buf[1];
sw1=buf[actual_len+3];
sw2=buf[actual_len+4];
send_str(actual_len+5,buf);
if((sw1==0x90)&&(sw2==0x00))return 0;
else return 1;
}
*/
//=================================================================
uchar card_oprate_FS(uchar which_card, uchar mode,
uchar ins, uchar lc, uchar *data_in, uchar le, uchar *data_out)
{
uchar xdata buf[300], len, error;
uchar actual_len,sw1, sw2;
//uchar i;
//参数合法性检查
//iso_mode可以通过le的值来判定
len=0;
if(lc!=0) len=lc+1;
if(le!=0) len+=1;
len+=5;
buf[0]=COMMAND_HEAD;
buf[1]=len;
buf[2]=mode;
buf[3]=0xC0;
buf[4]=ins;
buf[5]=0;
buf[6]=0;
if(lc!=0)
{
buf[7]=lc;
//send_str(29,data_in);
memcpy(&buf[8], data_in, lc);
if(le!=0)
buf[8+lc]=le;
}
else//此时必有le不等于0
buf[7]=le;
//send_str(len+2,buf);
if(which_card==SAM_CARD)
{
error = sam_iso(buf);
}
else if(which_card==USER_CARD)
{
//send_str(0xdc+5,buf);
error = id_iso(buf);
}
if(error)
{
if(which_card==SAM_CARD)
return (SAM_COMM_FAIL);
else if(which_card==USER_CARD)
return (USR_COMM_FAIL);
}
actual_len=buf[1];
sw1=buf[actual_len+3];
sw2=buf[actual_len+4];
//send_str(actual_len+5,buf);
if((sw1==0x90)&&(sw2==0x00))
{
if(actual_len!=0)
memcpy(data_out, &buf[3], actual_len);
}
else if(sw1==0x61)
{
error=GetResponse(SAM_CARD, sw2, data_out);
if(error) return (error);
}
else
{
if(which_card==SAM_CARD)
return (SAM_OPERATE_FAIL);
else
return (CPU_OPERATE_FAIL);
}
return 0;
/*if(SelFile_id(SAM_CARD,0x2F02))return (SAM_OPERATE_FAIL);//读出日交易记录
if(SelFile_id(SAM_CARD,0xEF03))return (SAM_OPERATE_FAIL);
delayms(10);//延时
strcpy(buf,"DB00B20104");
error=pack_cmd(buf,"",0,83); //lyj
//send_str(12,cmd);
if(error)
return(error);
if(which_card==SAM_CARD)
error=sam_iso(buf);
else
error=id_iso(buf);
//send_str(7,cmd);
if(error)
{
if(which_card==SAM_CARD)
return(SAM_COMM_FAIL);
else
return(USR_COMM_FAIL);
}
if(get_data(buf))return(1); //lyj
send_str(83,buf);
return 1;
*/
}
/*============================================================
功能:生成报税数据(操作对象:税控卡)
参数:
data_in: 生成报税数据的的源数据
data_out: 如果调用成功,则为税控卡返回的报税数据
参数数据格式:
data_in:(70 bytes);
申报数据起始日期 4 bytes
申报数据截止日期 4 bytes
正常发票张数 4 bytes
退票张数 2 bytes
废票张数 2 bytes
税种税目索引号 6 bytes(注意:这6个字节绝对不能错!)
正常发票分类累计金额 24 bytes
退票分类累计金额 24 bytes
data_out: (141 bytes);
税控卡正常发票总累计金额 4 bytes
税控卡退票总累计金额 4 bytes
状态字 1 bytes
申报数据签字MAC1 4 bytes
电子签名 128 bytes
返回值:
==0:成功; ==其他,失败
全局变量:
编制人: 日期:2003-07-05
============================================================*/
uchar declare_duty(uchar *data_in, uchar *data_out)
{
uchar error;
error=card_oprate_FS(SAM_CARD, ISO_WRITE, 0xF4, 0x47, data_in, 0x8E, data_out);
if(error!=0) return (error);
return 0;
}
/*============================================================
功能:向用户卡汇总申报数据
参数:
data_in: 生成MAC2的源数据(12 bytes)
MAC2: 如果调用成功,则为(4 bytes)
返回值:
==0:成功; ==其他,失败
全局变量:
编制人: 日期:2003-07-05
============================================================*/
uchar data_collect(uchar *data_in)
{
uchar error, *data_out;
error=enter_application_direct(USER_CARD);
if(error) return error;
error=card_oprate_FS(USER_CARD, ISO_WRITE, 0xE6, 0xDC, data_in, 0, data_out);
if(error) return (error);
return 0;
}
/*===========================================================
功能:更新监控管理数据
参数:
data_in: 从用户卡上读出更新的监控管理数据密文
参数数据格式:
data_in:(29 bytes in all):
数据加密密钥标识符(1 bytes)+税控数据密文(24 bytes)+MAC2(4 bytes)
返回值:
==0:成功;
==其他,失败
全局变量:
编制人:宁 能 日期:2003-07-04
===========================================================*/
uchar update_controls(uchar *data_in)
{
uchar error, *data_out;
if(SelFile_id(SAM_CARD,0x2F02)){return (SAM_OPERATE_FAIL);}
error=SelFile_id(SAM_CARD,0xEF01);
if(error) return (SAM_COMM_FAIL);
error=card_oprate_FS(SAM_CARD, ISO_WRITE, 0xF6, 0x1D, data_in, 0, data_out);
if(error) return (error);
return 0;
}
/*===========================================================
功能:将数据写入税控管理卡
入口:rec_sn--记录号
len--需要写入的记录的长度(最大为233);
data_in: 需要写入的记录数据
返回值:
==0:成功;
==其他,失败
全局变量:
编制人: 日期:2003-07-07
===========================================================*/
uchar write_audit_card(uchar rec_sn, uchar len, uchar *data_in)//,uchar chk_type)
{
uchar xdata buf[233+1], error, i;
static uchar rec_num;
//uchar tmp_type;
if(len>233) len=233;
memcpy(buf, data_in, len);
if(len<233)
for(i=len;i<233;i++)
buf[i]=0;
// error=enter_application_direct(CHK_CARD);
// if(error) return error;
error=SelFile_id(CHK_CARD,0x2F02);
if(error) return (CHK_COMM_FAIL);
error=SelFile_id(CHK_CARD,0xEF03);
if(error) return (CHK_COMM_FAIL);
//2005.8.9
if(rec_sn==1) //此卡的第一次写
{
error=get_audit_fileindex(&rec_sn);
if(error) return (error);
rec_num=rec_sn;
}
else {rec_sn=rec_num;}
rec_num++;
error=WriteRec(CHK_CARD, rec_sn, 233, buf);//00,dc
if(error) return (error);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -