]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/mifarehost.c
Check keys in hf mf nested and hf mf chk (#414)
[proxmark3-svn] / client / mifarehost.c
index 8a840d4701a8ec852cf653c8c60349823accb492..a02019a316cbc52f6cbbe4cad8cea733c409f8f8 100644 (file)
@@ -228,17 +228,46 @@ int mfCheckKeys (uint8_t blockNo, uint8_t keyType, bool clear_trace, uint8_t key
 \r
        *key = -1;\r
 \r
-       UsbCommand c = {CMD_MIFARE_CHKKEYS, {((blockNo & 0xff) | ((keyType&0xff)<<8)), clear_trace, keycnt}};\r
+       UsbCommand c = {CMD_MIFARE_CHKKEYS, {((blockNo & 0xff) | ((keyType & 0xff) << 8)), clear_trace, keycnt}}; \r
        memcpy(c.d.asBytes, keyBlock, 6 * keycnt);\r
        SendCommand(&c);\r
 \r
        UsbCommand resp;\r
-       if (!WaitForResponseTimeout(CMD_ACK,&resp,3000)) return 1;\r
+       if (!WaitForResponseTimeout(CMD_ACK,&resp,3000)) return 1; \r
        if ((resp.arg[0] & 0xff) != 0x01) return 2;\r
        *key = bytes_to_num(resp.d.asBytes, 6);\r
        return 0;\r
 }\r
 \r
+int mfCheckKeysSec(uint8_t sectorCnt, uint8_t keyType, uint8_t timeout14a, bool clear_trace, uint8_t keycnt, uint8_t * keyBlock, sector_t * e_sector){\r
+\r
+       uint8_t keyPtr = 0;\r
+\r
+       if (e_sector == NULL)\r
+               return -1;\r
+\r
+       UsbCommand c = {CMD_MIFARE_CHKKEYS, {((sectorCnt & 0xff) | ((keyType & 0xff) << 8)), (clear_trace | 0x02)|((timeout14a & 0xff) << 8), keycnt}}; \r
+       memcpy(c.d.asBytes, keyBlock, 6 * keycnt);\r
+       SendCommand(&c);\r
+\r
+       UsbCommand resp;\r
+       if (!WaitForResponseTimeoutW(CMD_ACK, &resp, MAX(3000, 1000 + 13 * sectorCnt * keycnt * (keyType == 2 ? 2 : 1)), false)) return 1; // timeout: 13 ms / fail auth\r
+       if ((resp.arg[0] & 0xff) != 0x01) return 2;\r
+       \r
+       bool foundAKey = false;\r
+       for(int sec = 0; sec < sectorCnt; sec++){\r
+               for(int keyAB = 0; keyAB < 2; keyAB++){\r
+                       keyPtr = *(resp.d.asBytes + keyAB * 40 + sec);\r
+                       if (keyPtr){\r
+                               e_sector[sec].foundKey[keyAB] = true;\r
+                               e_sector[sec].Key[keyAB] = bytes_to_num(keyBlock + (keyPtr - 1) * 6, 6);\r
+                               foundAKey = true;\r
+                       }\r
+               }\r
+       }\r
+       return foundAKey ? 0 : 3;\r
+}\r
+\r
 // Compare 16 Bits out of cryptostate\r
 int Compare16Bits(const void * a, const void * b) {\r
        if ((*(uint64_t*)b & 0x00ff000000ff0000) == (*(uint64_t*)a & 0x00ff000000ff0000)) return 0;\r
@@ -519,20 +548,20 @@ int mfCIdentify()
        UsbCommand resp;\r
        WaitForResponse(CMD_ACK,&resp);\r
 \r
-       iso14a_card_select_t card;\r
-       memcpy(&card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));\r
+       // iso14a_card_select_t card;\r
+       // memcpy(&card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));\r
 \r
-       uint64_t select_status = resp.arg[0];           // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision\r
+       // uint64_t select_status = resp.arg[0];                // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision\r
 \r
-       if(select_status != 0) {\r
-               uint8_t rats[] = { 0xE0, 0x80 }; // FSDI=8 (FSD=256), CID=0\r
-               c.arg[0] = ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT;\r
-               c.arg[1] = 2;\r
-               c.arg[2] = 0;\r
-               memcpy(c.d.asBytes, rats, 2);\r
-               SendCommand(&c);\r
-               WaitForResponse(CMD_ACK,&resp);\r
-       }\r
+       // if(select_status != 0) {\r
+               // uint8_t rats[] = { 0xE0, 0x80 }; // FSDI=8 (FSD=256), CID=0\r
+               // c.arg[0] = ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT;\r
+               // c.arg[1] = 2;\r
+               // c.arg[2] = 0;\r
+               // memcpy(c.d.asBytes, rats, 2);\r
+               // SendCommand(&c);\r
+               // WaitForResponse(CMD_ACK,&resp);\r
+       // }\r
 \r
        c.cmd = CMD_MIFARE_CIDENT;\r
        c.arg[0] = 0;\r
Impressum, Datenschutz