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

📄 cardlib.c

📁 cpu卡驱动源程序,根据需要可自行修改 cpu卡驱动源程序,根据需要可自行修改
💻 C
📖 第 1 页 / 共 3 页
字号:
		包括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 + -