]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
FIX: finally I took the effort to finish the "hf mf c*" commands on device side...
authoriceman1001 <iceman@iuse.se>
Mon, 15 Feb 2016 21:04:24 +0000 (22:04 +0100)
committericeman1001 <iceman@iuse.se>
Mon, 15 Feb 2016 21:04:24 +0000 (22:04 +0100)
armsrc/mifarecmd.c

index 7fa3f525decc2960d933447563e5eea2e8a61e6e..4c1fe1b64eba66d2a99bf05d7fa8dbfee1116a9c 100644 (file)
@@ -1169,15 +1169,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 +1187,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 +1273,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 +1291,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