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

📄 sim.c

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -