From 046237500be4a9a685b15bd01ccdce3d63e2bd4b Mon Sep 17 00:00:00 2001 From: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> Date: Sun, 3 Dec 2023 10:28:32 +0300 Subject: [PATCH] Proper block data for Mifare Plus All blocks are NOT data blocks Some are now config/management keys/sector keys/... Signed-off-by: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com> --- client/src/cmdhflist.c | 134 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhflist.c b/client/src/cmdhflist.c index bf67a2b0b..aacbb4085 100644 --- a/client/src/cmdhflist.c +++ b/client/src/cmdhflist.c @@ -1331,8 +1331,57 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { case MFP_AUTHENTICATEFIRST_VARIANT: if (data_size > 1) { // key : uint16_t uKeyNum = 0x4000 + sectorNum * 2 + (keyB ? 1 : 0); - uint16_t uKeyNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "FIRST AUTH (Keynr 0x%04X: %c sector %d)", uKeyNum, uKeyNum & 0x0001 ? 'B' : 'A', (uKeyNum - 0x4000) / 2); + uint16_t uKeyNum = MemLeToUint2byte(data); + switch (uKeyNum & 0xf000){ + const char* stringdata; + default: + stringdata = "FIRST AUTH (Keynr 0x%04X: Key not identified)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x4000: + stringdata = "FIRST AUTH (Keynr 0x%04X: %c sector %d)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum, uKeyNum & 0x0001 ? 'B' : 'A', (uKeyNum - 0x4000) / 2); + break; + case 0xA000: // There are virtual card encryption and MACing keys, but this is NOT their place! + stringdata = "FIRST AUTH(Keynr 0x%04X: Proximity Check Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x9000: + switch (uKeyNum & 0xf){ + case 0x0: + stringdata = "FIRST AUTH (Keynr 0x%04X: Card Master Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x1: + stringdata = "FIRST AUTH (Keynr 0x%04X: Card Configuration Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x2: + stringdata = "FIRST AUTH(Keynr 0x%04X: SL2 Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x3: + stringdata = "FIRST AUTH(Keynr 0x%04X: SL3 Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x4: + stringdata = "FIRST AUTH(Keynr 0x%04X: SL1 Additional Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x6: + stringdata = "FIRST AUTH(Keynr 0x%04X: SL3 Sector Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + case 0x7: + stringdata = "FIRST AUTH(Keynr 0x%04X: SL1SL3Mix Sector Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + default: + stringdata = "FIRST AUTH(Keynr 0x%04X: Management Key not identified)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uKeyNum); + break; + } + } } else { snprintf(exp, size, "FIRST AUTH") ; } @@ -1341,7 +1390,7 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { case MFP_WRITEPERSO: if (data_size > 1) { uint16_t uKeyNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "WRITE PERSO (Keynr 0x%04X)", uKeyNum); + snprintf(exp, size, "WRITE PERSO (Addr 0x%04X)", uKeyNum); } else { snprintf(exp, size, "WRITE PERSO"); } @@ -1381,8 +1430,83 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { const char *responseMaced = mfpGetResponseMacedForCode(opcode) ; if (data_size > 1) { - uint16_t uBlockNum = MemLeToUint2byte(data) ; - snprintf(exp, size, "WRITE %s(%u) %s", encrypted, uBlockNum, responseMaced); + uint16_t uBlockNum = MemLeToUint2byte(data); + switch (uBlockNum & 0xF000){ + const char* stringdata; + default: + stringdata = "WRITE %s(%u) %s"; + snprintf(exp, size, stringdata, encrypted, uBlockNum, responseMaced); + break; + case 0x4000: + stringdata = "WRITE (Keynr 0x%04X: %c sector %d)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum, uBlockNum & 0x0001 ? 'B' : 'A', (uBlockNum - 0x4000) / 2); + break; + case 0xA000: // There are virtual card encryption and MACing keys, but this is NOT their place! + stringdata = "WRITE(Keynr 0x%04X: Proximity Check Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0xB000: + case 0x9000: + if ((uBlockNum & 0x2000) == 0x2000){ + switch (uBlockNum & 0xf){ + default: + stringdata = "WRITE(Config %04X: Unidentified)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x0: + stringdata = "WRITE(Config %04X: Config)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x1: + stringdata = "WRITE(Config %04X: Virtual Card Installation ID)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x2: + stringdata = "WRITE(Config %04X: ATS)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x3: + stringdata = "WRITE(Config %04X: Field configuration)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + } + } else { + switch (uBlockNum & 0xf){ + default: + stringdata = "WRITE(Keynr 0x%04X: Management Key not identified)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x0: + stringdata = "WRITE(Keynr 0x%04X: Card Master Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x1: + stringdata = "WRITE(Keynr 0x%04X: Card Configuration Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x2: + stringdata = "WRITE(Keynr 0x%04X: SL2 Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x3: + stringdata = "WRITE(Keynr 0x%04X: SL3 Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x4: + stringdata = "WRITE(Keynr 0x%04X: SL1 Additional Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x6: + stringdata = "WRITE(Keynr 0x%04X: SL3 Sector Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + case 0x7: + stringdata = "WRITE(Keynr 0x%04X: SL1SL3Mix Sector Switch Key)"; + snprintf(exp, strlen(stringdata)+1, stringdata, uBlockNum); + break; + } + } + } } else { snprintf(exp, size, "WRITE %s %s ?", encrypted, responseMaced); }