mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
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>
This commit is contained in:
parent
ce99e86997
commit
046237500b
1 changed files with 129 additions and 5 deletions
|
@ -1331,8 +1331,57 @@ void annotateMfPlus(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) {
|
||||||
case MFP_AUTHENTICATEFIRST_VARIANT:
|
case MFP_AUTHENTICATEFIRST_VARIANT:
|
||||||
if (data_size > 1) {
|
if (data_size > 1) {
|
||||||
// key : uint16_t uKeyNum = 0x4000 + sectorNum * 2 + (keyB ? 1 : 0);
|
// key : uint16_t uKeyNum = 0x4000 + sectorNum * 2 + (keyB ? 1 : 0);
|
||||||
uint16_t uKeyNum = MemLeToUint2byte(data) ;
|
uint16_t uKeyNum = MemLeToUint2byte(data);
|
||||||
snprintf(exp, size, "FIRST AUTH (Keynr 0x%04X: %c sector %d)", uKeyNum, uKeyNum & 0x0001 ? 'B' : 'A', (uKeyNum - 0x4000) / 2);
|
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 {
|
} else {
|
||||||
snprintf(exp, size, "FIRST AUTH") ;
|
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:
|
case MFP_WRITEPERSO:
|
||||||
if (data_size > 1) {
|
if (data_size > 1) {
|
||||||
uint16_t uKeyNum = MemLeToUint2byte(data) ;
|
uint16_t uKeyNum = MemLeToUint2byte(data) ;
|
||||||
snprintf(exp, size, "WRITE PERSO (Keynr 0x%04X)", uKeyNum);
|
snprintf(exp, size, "WRITE PERSO (Addr 0x%04X)", uKeyNum);
|
||||||
} else {
|
} else {
|
||||||
snprintf(exp, size, "WRITE PERSO");
|
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) ;
|
const char *responseMaced = mfpGetResponseMacedForCode(opcode) ;
|
||||||
|
|
||||||
if (data_size > 1) {
|
if (data_size > 1) {
|
||||||
uint16_t uBlockNum = MemLeToUint2byte(data) ;
|
uint16_t uBlockNum = MemLeToUint2byte(data);
|
||||||
snprintf(exp, size, "WRITE %s(%u) %s", encrypted, uBlockNum, responseMaced);
|
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 {
|
} else {
|
||||||
snprintf(exp, size, "WRITE %s %s ?", encrypted, responseMaced);
|
snprintf(exp, size, "WRITE %s %s ?", encrypted, responseMaced);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue