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

📄 mifare.c

📁 以上几个手持机的初始化程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			memcpy(tmpbuff+4, &gstWorkCardInfomation.lCardNo, 4);
			if(findBlackList(tmpbuff)==ST_OK)
			{
				i = SetBlackListFlag(lSerialNo, 0x04);
				if(i==ST_OK)
					return ERR_POS_BLCARD;
				else
					return i;
			}
			guDate.l_word = RTC_read_date();
			guTime.l_word = RTC_read_time();
			sprintf(gcASCDateTime, "%04d%02d%02d%02d%02d%02d", guDate.fields.year, guDate.fields.month, guDate.fields.day, guTime.fields.hour, guTime.fields.minute, guTime.fields.second);
//			getBCDDateTime(gcASCDateTime);
			memcpy(gcNowTime, ASC2BCD(gcASCDateTime,14), 7);
			for(i=0;i<3;i++)
				gcHexNowTime[i] = (gcNowTime[i] >> 4) * 10 + (gcNowTime[i] & 0x0f);
			i = CompareDate(gcNowTime, (unsigned char*)gstWorkCardInfomation.cLimitDate);

			if (i == 2)
				return ERR_POS_OUTOFLIMIT;

			gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
			gcBlock = gcSector * 4;
			if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
			memset(gcMifBuffer, 0, 16);
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
			gcBlock++;
			memset(gcMifBuffer + 4, 0xff ,4);
			gcMifBuffer[12] = gcSector;
			gcMifBuffer[13] = 0xff - gcMifBuffer[12];
			gcMifBuffer[14] = gcMifBuffer[12];
			gcMifBuffer[15] = gcMifBuffer[13];
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
			gcBlock++;
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
			gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
			gcBlock = gcSector * 4;
			if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
			if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
			gcMifBuffer[0] = 0x01;
			gcMifBuffer[3] = 0x02;
			gcMifBuffer[15] = 0;
			for(i=0;i<15;i++)
				gcMifBuffer[15] ^= gcMifBuffer[i];
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
			gcBlock++;
			for(i=0;i<16;i++)
				gcMifBuffer[i] = 0xff - gcMifBuffer[i];
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
			for(i = 0;i<9;i++)
			{
				gcSector = i / 3;
				gcBlock = i % 3;
				gcSector = gstWorkCardInfomation.stCardStruct.cHistorySector[gcSector];
				gcBlock += gcSector * 4;
				if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
				memset(gcMifBuffer, 0, 16);
				if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
			}
			if(!WriteSaleCardFlag(0x02, cNewCardType))
				return ERR_POS_MODIFYSTARTFLAG;
			gcChargeType = CHARGETYPE_SALE;
			if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;
			gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_PUBLISH;
			GetCardInformation(lSerialNo, SECTOR_PUBLISH);
		}
		else
			return ERR_POS_NOCARD;
	}
	return ST_OK;
}

//退卡
unsigned char RecycleCard(unsigned long lSerialNo)
{
	unsigned char i, tmpbuff[20];
	unsigned long llSerialNo;	
		
	if(gcAuthenMode !=2) return ERR_POS_DEVICENOTAUTH;
	SPT_set(16);
	for(i = 10;i;)
	{
		if (!SPT_read())
		{
			SPT_set(16);
			i --;
		}
		if(CardTypeARequest(PICC_REQIDL,gcATQ) == MI_OK)
			break;
	}	
	if(i!=0)
	{
		CardTypeAAnticollLevel1((unsigned char*)&llSerialNo);
		CardTypeASelectLevel1((unsigned char*)&llSerialNo, gcATS);
		if ((llSerialNo != glSerialNo)||(gcGetKeyFinished != 4))
		{
			GetCardKey(llSerialNo);			
		}
		if (gstWorkCardInfomation.cGetInfoFinished != SECTOR_ALL)
			if (GetCardInformation(llSerialNo, SECTOR_ALL)!=1)
				return ERR_POS_GETCARDINFO;
//		gstWorkCardInfomation.cGetInfoFinished = 0;			
		if (lSerialNo != llSerialNo)
			return ERR_POS_NOTSAMECARD;
		if(gstWorkCardInfomation.cCardType == CARD_NEW_CARD)
			return ERR_POS_NOTCUMSCARD;
		if(gstWorkCardInfomation.cBlackListFlag == 0x04)
			return ERR_POS_BLCARD;
		if(gstWorkCardInfomation.cUsageFlag != 2)
			return ERR_POS_CARDNOTSTART;
		memcpy(tmpbuff, gstWorkCardInfomation.cCityCode, 2);
		memcpy(tmpbuff+2, gstWorkCardInfomation.cTradeCode, 2);
		memcpy(tmpbuff+4, &gstWorkCardInfomation.lCardNo, 4);
		if(findBlackList(tmpbuff)==ST_OK)
		{
			i = SetBlackListFlag(lSerialNo, 0x04);
			if(i==ST_OK)
				return ERR_POS_BLCARD;
			else
				return i;
		}
		guDate.l_word = RTC_read_date();
		guTime.l_word = RTC_read_time();
		sprintf(gcASCDateTime, "%04d%02d%02d%02d%02d%02d", guDate.fields.year, guDate.fields.month, guDate.fields.day, guTime.fields.hour, guTime.fields.minute, guTime.fields.second);
//		getBCDDateTime(gcASCDateTime);
		memcpy(gcNowTime, ASC2BCD(gcASCDateTime,14), 7);
		for(i=0;i<3;i++)
			gcHexNowTime[i] = (gcNowTime[i] >> 4) * 10 + (gcNowTime[i] & 0x0f);
		i = CompareDate(gcNowTime, (unsigned char*)gstWorkCardInfomation.cLimitDate);

		if (i == 2)
			return ERR_POS_OUTOFLIMIT;
			
		gcSector = gstWorkCardInfomation.stCardStruct.cDirSector;
		gcBlock = gcSector * 4+1;
		if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
		if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
		gcMifBuffer[7] = 0xff;
		gcMifBuffer[8] = 0xff;
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		
		gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
		gcBlock = gcSector * 4;
		if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
		if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
		gcMifBuffer[0x0c] = 01;				
		gcMifBuffer[0x0d] = CARD_NEW_CARD;		
		gcMifBuffer[15] = 0;
		for(i=0;i<15;i++)
                    gcMifBuffer[15] ^= gcMifBuffer[i];
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		gcBlock++;
		if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
                memset(gcMifBuffer+8, 0, 8);
		gcMifBuffer[15] = 0;
		for(i=0;i<15;i++)
                    gcMifBuffer[15] ^= gcMifBuffer[i];
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		
		gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
		gcBlock = gcSector * 4;
		if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
		memset(gcMifBuffer, 0, 16);
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		gcBlock++;
		memset(gcMifBuffer + 4, 0xff ,4);
		gcMifBuffer[12] = gcSector;
		gcMifBuffer[13] = 0xff - gcMifBuffer[12];
		gcMifBuffer[14] = gcMifBuffer[12];
		gcMifBuffer[15] = gcMifBuffer[13];
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		gcBlock++;
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;				
		glChargeMoney = gstWorkCardInfomation.lMoney;
		gcChargeType = CHARGETYPE_RETURN;
		if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;

		gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
		gcBlock = gcSector * 4;
		if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
		if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
		if(gstWorkCardInfomation.cCardType >= 0xA0)
			memset(gcMifBuffer, 0, 16);
		gcMifBuffer[0] = 0x01;
		gcMifBuffer[3] = 0x02;
		gcMifBuffer[15] = 0;
		for(i=0;i<15;i++)
			gcMifBuffer[15] ^= gcMifBuffer[i];
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		gcBlock++;
		for(i=0;i<16;i++)
			gcMifBuffer[i] = ~gcMifBuffer[i];
		if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		for(i = 0;i<9;i++)
		{
			gcSector = i / 3;
			gcBlock = i % 3;
			gcSector = gstWorkCardInfomation.stCardStruct.cHistorySector[gcSector];
			gcBlock += gcSector * 4;
			if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
			memset(gcMifBuffer, 0, 16);
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
		}
		gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_ALL;
		GetCardInformation(lSerialNo, SECTOR_ALL);
	}
	else
		return ERR_POS_NOCARD;
	return ST_OK;
}

//生成控制卡
unsigned char NewControlCard(unsigned long lSerialNo, unsigned char cNewCardType, unsigned char *cControlBuf)
{
	unsigned char  i, k;
	unsigned long llSerialNo;	

	if(gcAuthenMode !=2) return ERR_POS_DEVICENOTAUTH;
	SPT_set(16);
	for(i = 10;i;)
	{
		if (!SPT_read())
		{
			SPT_set(16);
			i --;
		}
		if(CardTypeARequest(PICC_REQIDL,gcATQ) == MI_OK)
			break;
	}
	if(i!=0)
	{
		CardTypeAAnticollLevel1((unsigned char*)&llSerialNo);
		CardTypeASelectLevel1((unsigned char*)&llSerialNo, gcATS);
		if ((llSerialNo != glSerialNo)||(gcGetKeyFinished != 4))
		{
			GetCardKey(llSerialNo);			
		}
		if (gstWorkCardInfomation.cGetInfoFinished != SECTOR_ALL)
			if (GetCardInformation(llSerialNo, SECTOR_ALL)!=1)
				return ERR_POS_GETCARDINFO;
//			gstWorkCardInfomation.cGetInfoFinished = 0;			
		if (lSerialNo != llSerialNo)
			return ERR_POS_NOTSAMECARD;

		if(gstWorkCardInfomation.cCardType != CARD_NEW_CARD)
			return ERR_POS_NOTCUMSCARD;
//			guDate.l_word = RTC_read_date();
//			guTime.l_word = RTC_read_time();
//			sprintf(gcASCDateTime, "%04d%02d%02d%02d%02d%02d", guDate.fields.year, guDate.fields.month, guDate.fields.day, guTime.fields.hour, guTime.fields.minute, guTime.fields.second);
		getBCDDateTime(gcASCDateTime);
		memcpy(gcNowTime, ASC2BCD(gcASCDateTime,14), 7);
		for(i=0;i<3;i++)
			gcHexNowTime[i] = (gcNowTime[i] >> 4) * 10 + (gcNowTime[i] & 0x0f);
		i = CompareDate(gcNowTime, (unsigned char*)gstWorkCardInfomation.cLimitDate);

		if (i == 2)
			return ERR_POS_OUTOFLIMIT;

		gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
		gcBlock = gcSector*4;
		if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
		for(k=0;k<3;k++)
			if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
		if(k==3) return ERR_MIF_READ;
		gcMifBuffer[0x0d] = cNewCardType;
		gcMifBuffer[15] = 0;
		for(i=0;i<15;i++)
			gcMifBuffer[15]^=gcMifBuffer[i];
		for(k=0;k<3;k++)
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
		if(k==3) return ERR_MIF_WRITE;

		gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
		gcBlock = gcSector*4;
		if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
		for(k=0;k<3;k++)
			if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
		if(k==3) return ERR_MIF_READ;
		memcpy(gcMifBuffer, cControlBuf, 8);
		for(k=0;k<3;k++)
			if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
		if(k==3) return ERR_MIF_WRITE;
		for(i=0;i<16;i++)
			gcMifBuffer[i]= 0xff - gcMifBuffer[i];
		for(k=0;k<3;k++)
			if(CardMFCWrite16Bytes(gcBlock+1, gcMifBuffer)==MI_OK) break;
		if(k==3) return ERR_MIF_WRITE;
		gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_PUBLIC;
		GetCardInformation(lSerialNo, SECTOR_PUBLIC);
	}
	else
		return ERR_POS_NOCARD;
	return ST_OK;
}

unsigned char BuildWhiteCard(struct sttInitCardParm stInitCardParm)
{
	unsigned long lNewCardMoney;
	unsigned char i, j, buf[100], outbuf[100];
	unsigned char CardFormat[36][16];
	unsigned long llSerialNo;
	
/*	clr_scr();
	move_cursor(0,0);
	set_console_english();
	puts("BuildWhiteCard");
	getch();
	set_console_chinese();
*/	SPT_set(16);
	for(i = 10;i;)
	{
		if (!SPT_read())
		{
			SPT_set(16);
			i --;
		}
		if(CardTypeARequest(PICC_REQIDL,gcATQ) == MI_OK)
			break;
	}	
	if(i!=0)
	{
		CardTypeAAnticollLevel1((unsigned char*)&llSerialNo);
		CardTypeASelectLevel1((unsigned char*)&llSerialNo, gcATS);
		if (stInitCardParm.lSerialNo != llSerialNo)
			return ERR_POS_NOTSAMECARD;
		
		//memcpy(gstWorkCardKey.cKeyB[0], gcDefaultKeyB, 6);
		memcpy(gstWorkCardKey.cKeyB[0], stInitCardParm.cKey00B, 6);		
		memcpy(gstWorkCardKey.cKeyB[1], stInitCardParm.cKey01B,6);
		memcpy(gstWorkCardKey.cKeyB[2], stInitCardParm.cKey02B,6);
		memcpy(gstWorkCardKey.cKeyB[3], stInitCardParm.cKey03B,6);
		memcpy(gstWorkCardKey.cKeyB[4], stInitCardParm.cKey03B,6);
		memcpy(gstWorkCardKey.cKeyB[5], stInitCardParm.cKey03B,6);
		memcpy(gstWorkCardKey.cKeyB[6], stInitCardParm.cKey02B,6);
		memcpy(gstWorkCardKey.cKeyB[7], stInitCardParm.cKey07B,6);
		memcpy(gstWorkCardKey.cKeyB[8], stInitCardParm.cKey07B,6);

/*		clr_scr();
		move_cursor(0,0);
		set_console_english();
		for(i=0;i<9;i++)
		{
			clr_scr();
			Dispbcd(0,0, gstWorkCardKey.cKeyB[i], 6);
		}
		set_console_chinese();
*/
/*		AuthenCard(&llSerialNo, 1, MIF_WRITE);
		CardMFCRead16Bytes(4, gcMifBuffer);
		memcpy(gcMifBuffer+8, stInitCardParm.cMAC, 4);
		CardMFCWrite16Bytes(4, gcMifBuffer);
		OverTurnString(gstWorkCardKey.cKeyA[1], &llSerialNo, 4);
		gstWorkCardKey.cKeyA[1][4] = gstWorkCardKey.cKeyA[1][0];
		gstWorkCardKey.cKeyA[1][5] = gstWorkCardKey.cKeyA[1][1];
		AuthenCard(&llSerialNo, 1, MIF_READ);
		CardMFCRead16Bytes(4, gcMifBuffer);
		clr_scr();
		move_cursor(0,0);
		set_console_english();
		Dispbcd(0,0, gcMifBuffer, 16);
		set_console_chinese();
*/
		for(i=0;i<9;i++)
		{
//			clr_scr();
//			move_cursor(0,0);
//			set_console_english();
//			DispInt(0,0, i);
//			set_console_chinese();
			memcpy(gstWorkCardKey.cKeyA[i], gcDefaultKeyAf, 6);
			if(!AuthenCard(&llSerialNo, i, MIF_READ))
			{
				if(!AuthenCard(&llSerialNo, i, MIF_WRITE))
					return ERR_MIF_AUTEN;
			}
/*			for(j=0;j<4;j++)
			{
				CardMFCRead16Bytes(j+i*4, gcMifBuffer);
				clr_scr();
				move_cursor(0,0);
				set_console_english();
				printf("%d

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -