]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/mifareutil.c
Bugfixes for LF FDX
[proxmark3-svn] / armsrc / mifareutil.c
index 38ca934aa01687b542744965981e6eae886a6a1a..ab04aee45917a1ec9497e339284e06176f124266 100644 (file)
@@ -21,7 +21,7 @@
 #include "iso14443crc.h"\r
 #include "iso14443a.h"\r
 #include "crapto1/crapto1.h"\r
-#include "polarssl/des.h"\r
+#include "mbedtls/des.h"\r
 \r
 int MF_DBGLEVEL = MF_DBG_ALL;\r
 \r
@@ -296,7 +296,7 @@ int mifare_ultra_auth(uint8_t *keybytes){
 \r
        /// 3des2k\r
 \r
-       des3_context ctx = { 0x00 };\r
+       mbedtls_des3_context ctx = { {0} };\r
        uint8_t random_a[8] = {1,1,1,1,1,1,1,1};\r
        uint8_t random_b[8] = {0x00};\r
        uint8_t enc_random_b[8] = {0x00};\r
@@ -321,9 +321,9 @@ int mifare_ultra_auth(uint8_t *keybytes){
 \r
        // decrypt nonce.\r
        // tdes_2key_dec(random_b, enc_random_b, sizeof(random_b), key, IV );\r
-       des3_set2key_dec(&ctx, key);\r
-       des3_crypt_cbc(&ctx     // des3_context\r
-               , DES_DECRYPT           // int mode\r
+       mbedtls_des3_set2key_dec(&ctx, key);\r
+       mbedtls_des3_crypt_cbc(&ctx     // des3_context\r
+               , MBEDTLS_DES_DECRYPT           // int mode\r
                , sizeof(random_b)      // length\r
                , IV                    // iv[8]\r
                , enc_random_b          // input\r
@@ -350,9 +350,9 @@ int mifare_ultra_auth(uint8_t *keybytes){
 \r
        // encrypt    out, in, length, key, iv\r
        //tdes_2key_enc(rnd_ab, rnd_ab, sizeof(rnd_ab), key, enc_random_b);\r
-       des3_set2key_enc(&ctx, key);\r
-       des3_crypt_cbc(&ctx     // des3_context\r
-               , DES_ENCRYPT           // int mode\r
+       mbedtls_des3_set2key_enc(&ctx, key);\r
+       mbedtls_des3_crypt_cbc(&ctx     // des3_context\r
+               , MBEDTLS_DES_ENCRYPT           // int mode\r
                , sizeof(rnd_ab)        // length\r
                , enc_random_b          // iv[8]\r
                , rnd_ab                        // input\r
@@ -372,9 +372,9 @@ int mifare_ultra_auth(uint8_t *keybytes){
 \r
        // decrypt    out, in, length, key, iv \r
        // tdes_2key_dec(resp_random_a, enc_resp, 8, key, enc_random_b);\r
-       des3_set2key_dec(&ctx, key);\r
-       des3_crypt_cbc(&ctx     // des3_context\r
-               , DES_DECRYPT           // int mode\r
+       mbedtls_des3_set2key_dec(&ctx, key);\r
+       mbedtls_des3_crypt_cbc(&ctx     // des3_context\r
+               , MBEDTLS_DES_DECRYPT           // int mode\r
                , 8                                     // length\r
                , enc_random_b          // iv[8]\r
                , enc_resp                      // input\r
@@ -405,31 +405,48 @@ int mifare_ultra_auth(uint8_t *keybytes){
        return 1;\r
 }\r
 \r
+\r
+#define MFU_MAX_RETRIES 5\r
 int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData)\r
 {\r
        uint16_t len;\r
        uint8_t bt[2];\r
        uint8_t receivedAnswer[MAX_FRAME_SIZE];\r
        uint8_t receivedAnswerPar[MAX_PARITY_SIZE];\r
-       \r
+       uint8_t retries;\r
+       int result = 0;\r
 \r
-       len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);\r
-       if (len == 1) {\r
-               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]);\r
-               return 1;\r
-       }\r
-       if (len != 18) {\r
-               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: card timeout. len: %x", len);\r
-               return 2;\r
+       for (retries = 0; retries < MFU_MAX_RETRIES; retries++) {\r
+               len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);\r
+               if (len == 1) {\r
+                       if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]);\r
+                       result = 1;\r
+                       continue;\r
+               }\r
+               if (len != 18) {\r
+                       if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: card timeout. len: %x", len);\r
+                       result = 2;\r
+                       continue;\r
+               }\r
+\r
+               memcpy(bt, receivedAnswer + 16, 2);\r
+               AppendCrc14443a(receivedAnswer, 16);\r
+               if (bt[0] != receivedAnswer[16] || bt[1] != receivedAnswer[17]) {\r
+                       if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd CRC response error.");\r
+                       result = 3;\r
+                       continue;\r
+               }\r
+\r
+               // No errors encountered; don't retry\r
+               result = 0;\r
+               break;\r
        }\r
-    \r
-       memcpy(bt, receivedAnswer + 16, 2);\r
-       AppendCrc14443a(receivedAnswer, 16);\r
-       if (bt[0] != receivedAnswer[16] || bt[1] != receivedAnswer[17]) {\r
-               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd CRC response error.");\r
-               return 3;\r
+\r
+       if (result != 0) {\r
+               Dbprintf("Cmd Error: too many retries; read failed");\r
+               return result;\r
        }\r
-       \r
+\r
        memcpy(blockData, receivedAnswer, 14);\r
        return 0;\r
 }\r
Impressum, Datenschutz