📄 mifare.c
字号:
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 + -