]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge branch 'master' into 14a_rework3
authorOleg Moiseenko <olegmsn@gmail.com>
Thu, 2 Nov 2017 12:14:55 +0000 (14:14 +0200)
committerGitHub <noreply@github.com>
Thu, 2 Nov 2017 12:14:55 +0000 (14:14 +0200)
CHANGELOG.md
armsrc/iso14443a.c
client/cmdhf14a.c
client/mifarehost.c
client/mifarehost.h
common/crapto1/crapto1.c

index 044538c4679274e6b6c0b011eb313c8bfb3cab70..60caf41324995c4a653a070abd49153c45336b4a 100644 (file)
@@ -13,6 +13,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
 - `hf mf nested` Check keys after they have found (Merlok)
 - `hf mf chk` Move main cycle to arm (Merlok)
 - Changed proxmark command line parameter `flush` to `-f` or `-flush` (Merlok)
+- Changed `hf 14a reader` to just reqest-anticilission-select sequence (Merlok)
 
 ### Fixed
 - Changed start sequence in Qt mode (fix: short commands hangs main Qt thread) (Merlok)
@@ -32,6 +33,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
 - Added to proxmark command line parameters `w` - wait 20s for serial port (Merlok)
 - Added to proxmark command line parameters `c` and `l` - execute command and lua script from command line (Merlok)
 - Added to proxmark ability to execute commands from stdin (pipe) (Merlok)
+- Added `hf 14a info` and moved there functionality from `hf 14a reader` (Merlok)
+- Added to `hf 14a info` detection of weak prng from Iceman1001 fork (Merlok)
 
 ## [3.0.1][2017-06-08]
 
index c39b8a20b61a07facd721db67c41711d72153f68..5a27e06b6193b73737b17a9ae40f2ec1e224c9ec 100644 (file)
@@ -1821,7 +1821,7 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
        }
 
        // PICC compilant with iso14443a-4 ---> (SAK & 0x20 != 0)
-       if( (sak & 0x20) == 0) return 2; 
+       if( (sak & 0x20) == 0) return 2; 
 
        if (!no_rats) {
                // Request for answer to select
index 86cfea2fbc1a1bf3a549f41f851715f5f4e7034c..1ae63adae791f0948502e63ba3ab993d6f6fca78 100644 (file)
@@ -220,8 +220,10 @@ int CmdHF14AInfo(const char *Cmd)
        PrintAndLog("ATQA : %02x %02x", card.atqa[1], card.atqa[0]);
        PrintAndLog(" SAK : %02x [%d]", card.sak, resp.arg[0]);
 
+       bool isMifareClassic = true;
        switch (card.sak) {
                case 0x00: 
+                       isMifareClassic = false;
 
                        //***************************************test****************
                        // disconnect
@@ -456,6 +458,19 @@ int CmdHF14AInfo(const char *Cmd)
        // try to see if card responses to "chinese magic backdoor" commands.
        mfCIdentify();
        
+       if (isMifareClassic) {          
+               switch(DetectClassicPrng()) {
+               case 0:
+                       PrintAndLog("Prng detection: HARDEND (hardnested)");            
+                       break;
+               case 1:
+                       PrintAndLog("Prng detection: WEAK");
+                       break;
+               default:
+                       PrintAndLog("Prng detection error.");           
+               }
+       }
+       
        return select_status;
 }
 
index fe1a8edbab7b15b360285cf2d2713ad39881ccad..67277b5904aa3c0f58cf1974808944a869d9cf79 100644 (file)
@@ -903,3 +903,72 @@ int tryDecryptWord(uint32_t nt, uint32_t ar_enc, uint32_t at_enc, uint8_t *data,
        return 0;\r
 }\r
 \r
+/** validate_prng_nonce\r
+ * Determine if nonce is deterministic. ie: Suspectable to Darkside attack.\r
+ * returns\r
+ *   true = weak prng\r
+ *   false = hardend prng\r
+ */\r
+bool validate_prng_nonce(uint32_t nonce) {\r
+       uint16_t *dist = 0;\r
+       uint16_t x, i;\r
+\r
+       dist = malloc(2 << 16);\r
+       if(!dist)\r
+               return -1;\r
+\r
+       // init prng table:\r
+       for (x = i = 1; i; ++i) {\r
+               dist[(x & 0xff) << 8 | x >> 8] = i;\r
+               x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;\r
+       }\r
+       \r
+       uint32_t res = (65535 - dist[nonce >> 16] + dist[nonce & 0xffff]) % 65535;\r
+       \r
+       free(dist);     \r
+       return (res == 16);\r
+}\r
+\r
+/* Detect Tag Prng, \r
+* function performs a partial AUTH,  where it tries to authenticate against block0, key A, but only collects tag nonce.\r
+* the tag nonce is check to see if it has a predictable PRNG.\r
+* @returns \r
+*      TRUE if tag uses WEAK prng (ie Now the NACK bug also needs to be present for Darkside attack)\r
+*   FALSE is tag uses HARDEND prng (ie hardnested attack possible, with known key)\r
+*/\r
+int DetectClassicPrng(void){\r
+\r
+       UsbCommand resp, respA; \r
+       uint8_t cmd[] = {0x60, 0x00}; // MIFARE_AUTH_KEYA\r
+       uint32_t flags = ISO14A_CONNECT | ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_RATS;\r
+       \r
+       UsbCommand c = {CMD_READER_ISO_14443a, {flags, sizeof(cmd), 0}};\r
+       memcpy(c.d.asBytes, cmd, sizeof(cmd));\r
+\r
+       clearCommandBuffer();\r
+       SendCommand(&c);\r
+       if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) {\r
+        PrintAndLog("PRNG UID: Reply timeout.");\r
+               return -1;\r
+       }\r
+       \r
+       // if select tag failed.\r
+       if (resp.arg[0] == 0) {\r
+               PrintAndLog("PRNG error: selecting tag failed, can't detect prng.");\r
+               return -1;\r
+       }\r
+       \r
+       if (!WaitForResponseTimeout(CMD_ACK, &respA, 5000)) {\r
+        PrintAndLog("PRNG data: Reply timeout.");\r
+               return -1;\r
+       }\r
+\r
+       // check respA\r
+       if (respA.arg[0] != 4) {\r
+               PrintAndLog("PRNG data error: Wrong length: %d", respA.arg[0]);\r
+               return -1;\r
+       }\r
+\r
+       uint32_t nonce = bytes_to_num(respA.d.asBytes, respA.arg[0]);\r
+       return validate_prng_nonce(nonce);\r
+}\r
index 118d55cca5f6a4d07cc8b65e2d1eefcf72f2ecb9..031dac1b6393c74d28ce6bcfef28ada56f249a01 100644 (file)
@@ -60,5 +60,6 @@ extern int saveTraceCard(void);
 extern int tryDecryptWord(uint32_t nt, uint32_t ar_enc, uint32_t at_enc, uint8_t *data, int len);\r
 \r
 extern int mfCIdentify();\r
+extern int DetectClassicPrng(void);\r
 \r
 #endif\r
index 9398a1f34938638886f846d2956402da7dc5f291..1edfca1b9bb535d56a1c450e202f394114424629 100644 (file)
@@ -426,7 +426,6 @@ int nonce_distance(uint32_t from, uint32_t to)
        return (65535 + dist[to >> 16] - dist[from >> 16]) % 65535;
 }
 
-
 static uint32_t fastfwd[2][8] = {
        { 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB},
        { 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980}};
Impressum, Datenschutz