]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/mifarecmd.c
CHG: CHange the definition of MAX_GRAPH_TRACE_LEN to match eachother.
[proxmark3-svn] / armsrc / mifarecmd.c
index 7fa3f525decc2960d933447563e5eea2e8a61e6e..c097cfd5f4a816f4ceef7c121f84d4de875bd71b 100644 (file)
@@ -771,7 +771,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
        uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};\r
 \r
        uint32_t auth1_time, auth2_time;\r
-       static uint16_t delta_time;\r
+       static uint16_t delta_time = 0;\r
 \r
        LED_A_ON();\r
        LED_C_OFF();\r
@@ -822,12 +822,8 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
                                rtr--;\r
                                continue;\r
                        };\r
+                       auth2_time = (delta_time) ? auth1_time + delta_time : 0;\r
 \r
-                       if (delta_time) {\r
-                               auth2_time = auth1_time + delta_time;\r
-                       } else {\r
-                               auth2_time = 0;\r
-                       }\r
                        if(mifare_classic_authex(pcs, cuid, blockNo, keyType, ui64Key, AUTH_NESTED, &nt2, &auth2_time)) {\r
                                if (MF_DBGLEVEL >= 1)   Dbprintf("Nested: Auth2 error");\r
                                rtr--;\r
@@ -836,7 +832,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 \r
                        nttmp = prng_successor(nt1, 100);                               //NXP Mifare is typical around 840,but for some unlicensed/compatible mifare card this can be 160\r
                        for (i = 101; i < 1200; i++) {\r
-                               nttmp = prng_successor(nttmp, 1);\r
+                               nttmp = prng_successor_one(nttmp);\r
                                if (nttmp == nt2) break;\r
                        }\r
 \r
@@ -896,6 +892,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
 \r
                        // nested authentication\r
                        auth2_time = auth1_time + delta_time;\r
+\r
                        len = mifare_sendcmd_short(pcs, AUTH_NESTED, 0x60 + (targetKeyType & 0x01), targetBlockNo, receivedAnswer, par, &auth2_time);\r
                        if (len != 4) {\r
                                if (MF_DBGLEVEL >= 1)   Dbprintf("Nested: Auth2 error len=%d", len);\r
@@ -906,14 +903,18 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
                        if (MF_DBGLEVEL >= 3) Dbprintf("Nonce#%d: Testing nt1=%08x nt2enc=%08x nt2par=%02x", i+1, nt1, nt2, par[0]);\r
                        \r
                        // Parity validity check\r
-                       for (j = 0; j < 4; j++) {\r
-                               par_array[j] = (oddparity8(receivedAnswer[j]) != ((par[0] >> (7-j)) & 0x01));\r
-                       }\r
+//                     for (j = 0; j < 4; j++) {\r
+//                             par_array[j] = (oddparity8(receivedAnswer[j]) != ((par[0] >> (7-j)) & 0x01));\r
+//                     }\r
+                       par_array[0] = (oddparity8(receivedAnswer[0]) != ((par[0] >> (7-0)) & 0x01));\r
+                       par_array[1] = (oddparity8(receivedAnswer[1]) != ((par[0] >> (7-1)) & 0x01));\r
+                       par_array[2] = (oddparity8(receivedAnswer[2]) != ((par[0] >> (7-2)) & 0x01));\r
+                       par_array[3] = (oddparity8(receivedAnswer[3]) != ((par[0] >> (7-3)) & 0x01));\r
                        \r
                        ncount = 0;\r
                        nttest = prng_successor(nt1, dmin - 1);\r
                        for (j = dmin; j < dmax + 1; j++) {\r
-                               nttest = prng_successor(nttest, 1);\r
+                               nttest = prng_successor_one(nttest);\r
                                ks1 = nt2 ^ nttest;\r
 \r
                                if (valid_nonce(nttest, nt2, ks1, par_array)){\r
@@ -942,7 +943,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
        //  ----------------------------- crypto1 destroy\r
        crypto1_destroy(pcs);\r
        \r
-       byte_t buf[4 + 4 * 4];\r
+       byte_t buf[4 + 4 * 4] = {0};\r
        memcpy(buf, &cuid, 4);\r
        memcpy(buf+4, &target_nt[0], 4);\r
        memcpy(buf+8, &target_ks[0], 4);\r
@@ -986,9 +987,9 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
        int OLD_MF_DBGLEVEL = MF_DBGLEVEL;      \r
        MF_DBGLEVEL = MF_DBG_NONE;\r
        \r
+       LEDsoff();\r
        LED_A_ON();\r
-       LED_B_OFF();\r
-       LED_C_OFF();\r
+       \r
        iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
 \r
        if (clearTrace) \r
@@ -997,8 +998,6 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
        set_tracing(TRUE);\r
 \r
        for (i = 0; i < keyCount; ++i) {\r
-               if (mifare_classic_halt(pcs, cuid))\r
-                       if (MF_DBGLEVEL >= 1)   Dbprintf("ChkKeys: Halt error");\r
 \r
                if (!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {\r
                        if (OLD_MF_DBGLEVEL >= 1)       Dbprintf("ChkKeys: Can't select card");\r
@@ -1006,19 +1005,23 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
                }\r
 \r
                ui64Key = bytes_to_num(datain + i * 6, 6);\r
-               if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST))\r
+               if (mifare_classic_auth(pcs, cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) {\r
+                       if (mifare_classic_halt(pcs, cuid))\r
+                               if (MF_DBGLEVEL >= 1)   Dbprintf("ChkKeys: Halt error");\r
                        continue;\r
+               }\r
                \r
                isOK = 1;\r
                break;\r
        }\r
-       crypto1_destroy(pcs);\r
        \r
        LED_B_ON();\r
     cmd_send(CMD_ACK,isOK,0,0,datain + i * 6,6);\r
+\r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
        set_tracing(FALSE);\r
+       crypto1_destroy(pcs);\r
        \r
        // restore debug level\r
        MF_DBGLEVEL = OLD_MF_DBGLEVEL;  \r
@@ -1169,15 +1172,15 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
        uint8_t workFlags = arg0;\r
        uint8_t blockNo = arg1;\r
        \r
-       Dbprintf("ICE :: CSetBlocks Flags %02x", workFlags);\r
-       \r
        // variables\r
+       bool isOK = false; //assume we will get an error\r
+       uint8_t errormsg = 0x00;\r
        uint8_t uid[10] = {0x00};\r
        uint8_t data[18] = {0x00};\r
        uint32_t cuid = 0;\r
        \r
-       uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];\r
-       uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];\r
+       uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};\r
+       uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00};\r
 \r
        if (workFlags & MAGIC_INIT) {\r
                LED_A_ON();\r
@@ -1187,65 +1190,83 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
                set_tracing(TRUE);\r
        }\r
 \r
-       // read UID and return to client\r
-       if (workFlags & MAGIC_UID) {\r
-               if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {\r
-                       if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("Can't select card");\r
-                       OnErrorMagic(MAGIC_UID);\r
+       //loop doesn't loop just breaks out if error\r
+       while (true) {\r
+               // read UID and return to client with write\r
+               if (workFlags & MAGIC_UID) {\r
+                       if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {\r
+                               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("Can't select card");\r
+                               errormsg = MAGIC_UID;\r
+                               // break;\r
+                       }\r
+                       \r
+                       if ( mifare_classic_halt_ex(NULL) ) break;\r
                }\r
-       }\r
        \r
-       // wipe tag, fill it with zeros\r
-       if (workFlags & MAGIC_WIPE){\r
-               ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
-               if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
-                       if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wupC1 error");\r
-                       OnErrorMagic(MAGIC_WIPE);\r
-               }\r
+               // wipe tag, fill it with zeros\r
+               if (workFlags & MAGIC_WIPE){\r
+                       ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
+                       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+                               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wupC1 error");\r
+                               errormsg = MAGIC_WIPE;\r
+                               break;\r
+                       }\r
 \r
-               ReaderTransmit(wipeC, sizeof(wipeC), NULL);\r
-               if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
-                       if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wipeC error");\r
-                       OnErrorMagic(MAGIC_WIPE);\r
-               }\r
-       }       \r
+                       ReaderTransmit(wipeC, sizeof(wipeC), NULL);\r
+                       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+                               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wipeC error");\r
+                               errormsg = MAGIC_WIPE;\r
+                               break;\r
+                       }\r
 \r
-       // write block\r
-       if (workFlags & MAGIC_WUPC) {\r
-               ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
-               if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
-                       if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wupC1 error");\r
-                       OnErrorMagic(MAGIC_WUPC);\r
-               }\r
+                       if ( mifare_classic_halt_ex(NULL) ) break;\r
+               }       \r
 \r
-               ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
-               if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
-                       if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wupC2 error");\r
-                       OnErrorMagic(MAGIC_WUPC);\r
+               // write block\r
+               if (workFlags & MAGIC_WUPC) {\r
+                       ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
+                       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+                               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wupC1 error");\r
+                               errormsg = MAGIC_WUPC;\r
+                               break;\r
+                       }\r
+\r
+                       ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
+                       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+                               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("wupC2 error");\r
+                               errormsg = MAGIC_WUPC;\r
+                               break;\r
+                       }\r
                }\r
-       }\r
 \r
-       if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) {\r
-               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("write block send command error");\r
-               OnErrorMagic(4);\r
-       }\r
-       \r
-       memcpy(data, datain, 16);\r
-       AppendCrc14443a(data, 16);\r
+               if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) {\r
+                       if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("write block send command error");\r
+                       errormsg = 4;\r
+                       break;\r
+               }\r
        \r
-       ReaderTransmit(data, sizeof(data), NULL);\r
-       if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) {\r
-               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("write block send data error");\r
-               OnErrorMagic(0);\r
-       }       \r
+               memcpy(data, datain, 16);\r
+               AppendCrc14443a(data, 16);\r
        \r
-       if (workFlags & MAGIC_OFF) \r
-               mifare_classic_halt_ex(NULL);\r
+               ReaderTransmit(data, sizeof(data), NULL);\r
+               if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) {\r
+                       if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("write block send data error");\r
+                       errormsg = 0;\r
+                       break;\r
+               }       \r
        \r
-       LED_B_ON();\r
-       // check if uid is cuid?\r
-       cmd_send(CMD_ACK,1,0,0,uid,sizeof(uid));\r
-       LED_B_OFF();\r
+               if (workFlags & MAGIC_OFF) \r
+                       if ( mifare_classic_halt_ex(NULL) ) break;\r
+               \r
+               isOK = true;\r
+               break;\r
+\r
+       } // end while  \r
+\r
+       if (isOK )\r
+               cmd_send(CMD_ACK,1,0,0,uid,sizeof(uid));\r
+       else\r
+               OnErrorMagic(errormsg);\r
 \r
        if (workFlags & MAGIC_OFF)\r
                OnSuccessMagic();\r
@@ -1255,11 +1276,13 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
     \r
        uint8_t workFlags = arg0;\r
        uint8_t blockNo = arg1;\r
-\r
+       uint8_t errormsg = 0x00;\r
+       bool isOK = false; //assume we will get an error\r
+       \r
        // variables\r
        uint8_t data[MAX_MIFARE_FRAME_SIZE];\r
-       uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];\r
-       uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];\r
+       uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};\r
+       uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00};\r
        \r
        memset(data, 0x00, sizeof(data));\r
        \r
@@ -1271,42 +1294,52 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
                set_tracing(TRUE);\r
        }\r
 \r
-       if (workFlags & MAGIC_WUPC) {\r
-               ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
-               if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
-                       if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");\r
-                       OnErrorMagic(MAGIC_WUPC);\r
-               }\r
+       //loop doesn't loop just breaks out if error or done\r
+       while (true) {\r
+               if (workFlags & MAGIC_WUPC) {\r
+                       ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
+                       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+                               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");\r
+                               errormsg = MAGIC_WUPC;\r
+                               break;\r
+                       }\r
 \r
-               ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
-               if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
-                       if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");\r
-                       OnErrorMagic(MAGIC_WUPC);\r
+                       ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
+                       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+                               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");\r
+                               errormsg = MAGIC_WUPC;\r
+                               break;\r
+                       }\r
                }\r
-       }\r
 \r
-       // read block           \r
-       if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) {\r
-               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error");\r
-               OnErrorMagic(0);\r
+               // read block           \r
+               if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) {\r
+                       if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error");\r
+                       errormsg = 0;\r
+                       break;\r
+               }\r
+               \r
+               memcpy(data, receivedAnswer, sizeof(data));\r
+               \r
+               // send HALT\r
+               if (workFlags & MAGIC_HALT) {\r
+                       mifare_classic_halt_ex(NULL);\r
+                       break;\r
+               }\r
+               isOK = true;\r
+               break;\r
        }\r
-       \r
-       memcpy(data, receivedAnswer, sizeof(data));\r
-       \r
-       // send HALT\r
-       if (workFlags & MAGIC_HALT) \r
-               mifare_classic_halt_ex(NULL);\r
-       \r
-       LED_B_ON();\r
-       \r
        // if MAGIC_DATAIN, the data stays on device side.\r
-       if (workFlags & MAGIC_DATAIN)\r
-               memcpy(datain, data, sizeof(data));\r
-       else\r
-               cmd_send(CMD_ACK,1,0,0,data,sizeof(data));\r
+       if (workFlags & MAGIC_DATAIN) {\r
+               if (isOK)\r
+                       memcpy(datain, data, sizeof(data));\r
+       } else {\r
+               if (isOK) \r
+                       cmd_send(CMD_ACK,1,0,0,data,sizeof(data));      \r
+               else \r
+                       OnErrorMagic(errormsg); \r
+       }\r
        \r
-       LED_B_OFF();\r
-\r
        if (workFlags & MAGIC_OFF)\r
                OnSuccessMagic();\r
 }\r
Impressum, Datenschutz