]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/mifarecmd.c
FIX: a shot at fixing the "_" underscore problem in fileutils.c. This one uses _ifde...
[proxmark3-svn] / armsrc / mifarecmd.c
index 519ea2b052e0b709889f3623edb5014033e7d5f5..fc480a38dc3289acbd892327d4b73a7405431b1e 100644 (file)
@@ -20,7 +20,7 @@
 #include "../common/crc.h"\r
 \r
 //-----------------------------------------------------------------------------\r
-// Select, Authenticaate, Read an MIFARE tag. \r
+// Select, Authenticate, Read a MIFARE tag. \r
 // read block\r
 //-----------------------------------------------------------------------------\r
 void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)\r
@@ -267,25 +267,25 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 \r
 void MifareUReadCard(uint8_t arg0, int arg1, uint8_t *datain)\r
 {\r
-  // params\r
-        uint8_t sectorNo = arg0;\r
-        int Pages=arg1;\r
+       // params\r
+       uint8_t sectorNo = arg0;\r
+       int Pages=arg1;\r
        int count_Pages=0;\r
-        // variables\r
-        byte_t isOK = 0;\r
-        byte_t dataoutbuf[44 * 4];\r
-        uint8_t uid[10];\r
-        uint32_t cuid;\r
+       // variables\r
+       byte_t isOK = 0;\r
+       byte_t dataoutbuf[176];\r
+       uint8_t uid[10];\r
+       uint32_t cuid;\r
 \r
-        // clear trace\r
-        iso14a_clear_trace();\r
+       // clear trace\r
+       iso14a_clear_trace();\r
 \r
-               iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+       iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
 \r
-        LED_A_ON();\r
-        LED_B_OFF();\r
-        LED_C_OFF();\r
-        Dbprintf("Pages %d",Pages);\r
+       LED_A_ON();\r
+       LED_B_OFF();\r
+       LED_C_OFF();\r
+       Dbprintf("Pages %d",Pages);\r
         while (true) {\r
                 if(!iso14443a_select_card(uid, NULL, &cuid)) {\r
                 if (MF_DBGLEVEL >= 1)   Dbprintf("Can't select card");\r
@@ -307,8 +307,8 @@ void MifareUReadCard(uint8_t arg0, int arg1, uint8_t *datain)
                 isOK = 1;\r
                 break;\r
         }\r
-        Dbprintf("Pages read %d",count_Pages);\r
-        if (MF_DBGLEVEL >= 2) DbpString("READ CARD FINISHED");\r
+       Dbprintf("Pages read %d",count_Pages);\r
+       if (MF_DBGLEVEL >= 2) DbpString("READ CARD FINISHED");\r
 \r
         LED_B_ON();\r
        if (Pages==16) cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,64);\r
@@ -316,9 +316,9 @@ void MifareUReadCard(uint8_t arg0, int arg1, uint8_t *datain)
        if (Pages==44 && count_Pages>16) cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,176);\r
         LED_B_OFF();\r
 \r
-        // Thats it...\r
-        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
-        LEDsoff();\r
+       // Thats it...\r
+       FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+       LEDsoff();\r
 \r
 }\r
 \r
@@ -601,7 +601,7 @@ void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
                        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 = 141; i < 1200; i++) {\r
                                nttmp = prng_successor(nttmp, 1);\r
-                               if (nttmp == nt2) {break;}\r
+                               if (nttmp == nt2) break;\r
                        }\r
 \r
                        if (i != 1200) {\r
@@ -792,7 +792,6 @@ void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
     cmd_send(CMD_ACK,isOK,0,0,datain + i * 6,6);\r
        LED_B_OFF();\r
 \r
-  // Thats it...\r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
 \r
@@ -938,32 +937,26 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        \r
        // variables\r
        byte_t isOK = 0;\r
-       uint8_t uid[10];\r
-       uint8_t d_block[18];\r
+       uint8_t uid[10] = {0x00};\r
+       uint8_t d_block[18] = {0x00};\r
        uint32_t cuid;\r
        \r
-       memset(uid, 0x00, 10);\r
        uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();\r
        uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;\r
        \r
+       // reset FPGA and LED\r
        if (workFlags & 0x08) {\r
-               // clear trace\r
-               iso14a_clear_trace();\r
-               iso14a_set_tracing(TRUE);\r
-\r
-               iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
-\r
                LED_A_ON();\r
                LED_B_OFF();\r
                LED_C_OFF();\r
-       \r
-               SpinDelay(300);\r
-               FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
-               SpinDelay(100);\r
-               FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD);\r
+               \r
+               iso14a_clear_trace();\r
+               iso14a_set_tracing(TRUE);\r
+               iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
        }\r
 \r
        while (true) {\r
+\r
                // get UID from chip\r
                if (workFlags & 0x01) {\r
                        if(!iso14443a_select_card(uid, NULL, &cuid)) {\r
@@ -1042,7 +1035,6 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        LED_B_OFF();\r
 \r
        if ((workFlags & 0x10) || (!isOK)) {\r
-               // Thats it...\r
                FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
                LEDsoff();\r
        }\r
@@ -1065,28 +1057,20 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        \r
        // variables\r
        byte_t isOK = 0;\r
-       uint8_t data[18];\r
+       uint8_t data[18] = {0x00};\r
        uint32_t cuid = 0;\r
        \r
-       memset(data, 0x00, 18);\r
        uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();\r
        uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;\r
        \r
        if (workFlags & 0x08) {\r
-               // clear trace\r
-               iso14a_clear_trace();\r
-               iso14a_set_tracing(TRUE);\r
-\r
-               iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
-\r
                LED_A_ON();\r
                LED_B_OFF();\r
                LED_C_OFF();\r
-       \r
-               SpinDelay(300);\r
-               FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
-               SpinDelay(100);\r
-               FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD);\r
+\r
+               iso14a_clear_trace();\r
+               iso14a_set_tracing(TRUE);\r
+               iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
        }\r
 \r
        while (true) {\r
@@ -1127,9 +1111,112 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
        LED_B_OFF();\r
 \r
        if ((workFlags & 0x10) || (!isOK)) {\r
-               // Thats it...\r
                FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
                LEDsoff();\r
        }\r
 }\r
 \r
+void MifareCIdent(){\r
+  \r
+       // card commands\r
+       uint8_t wupC1[]       = { 0x40 }; \r
+       uint8_t wupC2[]       = { 0x43 }; \r
+       \r
+       // variables\r
+       byte_t isOK = 1;\r
+       \r
+       uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();\r
+       uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;\r
+\r
+       ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
+       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+               isOK = 0;\r
+       };\r
+\r
+       ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
+       if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+               isOK = 0;\r
+       };\r
+\r
+       if (mifare_classic_halt(NULL, 0)) {\r
+               isOK = 0;\r
+       };\r
+\r
+       cmd_send(CMD_ACK,isOK,0,0,0,0);\r
+}\r
+\r
+                       //\r
+// DESFIRE\r
+//\r
+\r
+void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain){\r
+       // variables\r
+       byte_t isOK = 0;\r
+       byte_t dataoutbuf[16];\r
+       uint8_t uid[10];\r
+       uint32_t cuid;\r
+    \r
+       // clear trace\r
+       iso14a_clear_trace();\r
+       iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+    \r
+       LED_A_ON();\r
+       LED_B_OFF();\r
+       LED_C_OFF();\r
+       \r
+\r
+       if(!iso14443a_select_card(uid, NULL, &cuid)) {\r
+          if (MF_DBGLEVEL >= 1)        Dbprintf("Can't select card, something went wrong before auth");\r
+       };\r
+\r
+       if(mifare_desfire_des_auth1(cuid, dataoutbuf)){\r
+         if (MF_DBGLEVEL >= 1) Dbprintf("Authentication part1: Fail.");    \r
+       }\r
+\r
+       isOK=1;\r
+       if (MF_DBGLEVEL >= 2)   DbpString("AUTH 1 FINISHED");\r
+    \r
+       LED_B_ON();\r
+        cmd_send(CMD_ACK,isOK,cuid,0,dataoutbuf,11);\r
+       LED_B_OFF();\r
+         \r
+       // Thats it...\r
+       //FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+       LEDsoff();\r
+}\r
+\r
+void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain){\r
+       // params\r
+       uint32_t cuid = arg0;\r
+       uint8_t key[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};\r
+       // variables\r
+       byte_t isOK = 0;\r
+       byte_t dataoutbuf[16];\r
+    \r
+       memcpy(key, datain, 16);\r
+       // clear trace\r
+       //iso14a_clear_trace();\r
+       //iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+    \r
+       LED_A_ON();\r
+       LED_B_OFF();\r
+       LED_C_OFF();\r
+\r
+//     Dbprintf("Sending %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",\r
+//              key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],\r
+//              key[9],key[10],key[11],key[12],key[13],key[14],key[15]);\r
+       \r
+       if(mifare_desfire_des_auth2(cuid, key, dataoutbuf)){\r
+           if (MF_DBGLEVEL >= 1) Dbprintf("Authentication part2: Fail...");    \r
+       }\r
+       isOK=1;\r
+       if (MF_DBGLEVEL >= 2)   DbpString("AUTH 2 FINISHED");\r
+    \r
+       LED_B_ON();\r
+        cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,12);\r
+       LED_B_OFF();\r
+    \r
+    // Thats it...\r
+       FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+       LEDsoff();\r
+}
\ No newline at end of file
Impressum, Datenschutz