void MifareCIdent(){\r
#define GEN_1A 1\r
#define GEN_1B 2\r
+ #define GEN_2 4\r
// variables\r
uint8_t isGen = 0;\r
- uint8_t receivedAnswer[1] = {0x00};\r
- uint8_t receivedAnswerPar[1] = {0x00};\r
-\r
+ uint8_t rec[1] = {0x00};\r
+ uint8_t recpar[1] = {0x00};\r
+ \r
+ // Generation 1 test\r
ReaderTransmitBitsPar(wupC1, 7, NULL, NULL);\r
- if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
- goto OUT;\r
- }\r
- isGen |= GEN_1B;\r
+ if(!ReaderReceive(rec, recpar) || (rec[0] != 0x0a)) {\r
+ goto TEST2;\r
+ };\r
+ isGen = GEN_1B;\r
\r
ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
- if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+ if(!ReaderReceive(rec, recpar) || (rec[0] != 0x0a)) {\r
goto OUT;\r
- } \r
+ }; \r
isGen = GEN_1A;\r
+ goto OUT;\r
\r
-OUT: \r
+TEST2:;\r
+/*\r
+ // Generation 2 test\r
+ struct Crypto1State mpcs = {0, 0};\r
+ struct Crypto1State *pcs = &mpcs;\r
+\r
+ // halt previous.\r
+ mifare_classic_halt(NULL, 0);\r
+ \r
+ //select\r
+ if (!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {\r
+ goto OUT;\r
+ };\r
+ \r
+ // MIFARE_CLASSIC_WRITEBLOCK 0xA0\r
+ // ACK 0x0a\r
+ uint16_t len = mifare_sendcmd_short(pcs, 1, 0xA0, 0, rec, recpar, NULL);\r
+ if ((len != 1) || (rec[0] != 0x0A)) { \r
+ isGen = GEN_2; \r
+ };\r
+ */\r
+OUT:;\r
// removed the if, since some magic tags misbehavies and send an answer to it.\r
mifare_classic_halt(NULL, 0);\r
cmd_send(CMD_ACK,isGen, 0, 0, 0, 0);\r
// try to see if card responses to "chinese magic backdoor" commands.
uint8_t isGeneration = 0;
-
clearCommandBuffer();
c.cmd = CMD_MIFARE_CIDENT;
c.arg[0] = 0;
c.arg[1] = 0;
c.arg[2] = 0;
SendCommand(&c);
- if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) {
+ if (WaitForResponseTimeout(CMD_ACK, &resp, 1500))
isGeneration = resp.arg[0] & 0xff;
- }
- if ( isGeneration )
- PrintAndLog("Answers to magic commands (GEN %s): YES", ((isGeneration & 0x2 )==2)?"1B":"1A");
+
+ switch( isGeneration ){
+ case 1: PrintAndLog("Answers to magic commands (GEN 1a): YES"); break;
+ case 2: PrintAndLog("Answers to magic commands (GEN 1b): YES"); break;
+ //case 4: PrintAndLog("Answers to magic commands (GEN 2): YES"); break;
+ default: PrintAndLog("Answers to magic commands: NO"); break;
+ }
// disconnect
SendCommand(&cDisconnect);
}
int testLen = (GraphTraceLen < 1000) ? GraphTraceLen : 1000;
if (graphJustNoise(GraphBuffer, testLen)) {
- PrintAndLog("no tag not found");
+ PrintAndLog("no tag found");
return -1;
}
return demodEM4x05resp(word);
switch (chipType) {
case 9: PrintAndLog("\n Chip Type: %u | EM4305", chipType); break;
+ case 8: PrintAndLog("\n Chip Type: %u | EM4205", chipType); break;
case 4: PrintAndLog(" Chip Type: %u | Unknown", chipType); break;
case 2: PrintAndLog(" Chip Type: %u | EM4469", chipType); break;
//add more here when known