⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 card_trans.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
  //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 + -