mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-22 22:23:38 -07:00
arm side multisector hf mf chk
works
This commit is contained in:
parent
dbb7155ba0
commit
93dc631353
3 changed files with 44 additions and 20 deletions
|
@ -962,6 +962,7 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
uint8_t blockNo = arg0 & 0xff;
|
uint8_t blockNo = arg0 & 0xff;
|
||||||
uint8_t keyType = (arg0 >> 8) & 0xff;
|
uint8_t keyType = (arg0 >> 8) & 0xff;
|
||||||
bool clearTrace = arg1 & 0x01;
|
bool clearTrace = arg1 & 0x01;
|
||||||
|
bool multisectorCheck = arg1 & 0x02;
|
||||||
uint8_t keyCount = arg2;
|
uint8_t keyCount = arg2;
|
||||||
|
|
||||||
// clear debug level
|
// clear debug level
|
||||||
|
@ -976,15 +977,31 @@ void MifareChkKeys(uint16_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
if (clearTrace) clear_trace();
|
if (clearTrace) clear_trace();
|
||||||
set_tracing(true);
|
set_tracing(true);
|
||||||
|
|
||||||
int res = MifareChkBlockKeys(datain, keyCount, blockNo, keyType, OLD_MF_DBGLEVEL);
|
if (multisectorCheck) {
|
||||||
|
Dbprintf("multisector");
|
||||||
|
TKeyIndex keyIndex = {0};
|
||||||
|
uint8_t sectorCnt = blockNo;
|
||||||
|
int res = MifareMultisectorChk(datain, keyCount, sectorCnt, keyType, OLD_MF_DBGLEVEL, &keyIndex);
|
||||||
|
Dbprintf("[0][0]=%d [0][13]=%d [0][15]=%d ", keyIndex[0][0], keyIndex[0][13], keyIndex[0][15]);
|
||||||
|
|
||||||
LED_B_ON();
|
LED_B_ON();
|
||||||
if (res > 0) {
|
if (res > 0) {
|
||||||
cmd_send(CMD_ACK, 1, 0, 0, datain + (res - 1) * 6, 6);
|
cmd_send(CMD_ACK, 1, 0, 0, keyIndex, 80);
|
||||||
|
} else {
|
||||||
|
cmd_send(CMD_ACK, 0, 0, 0, NULL, 0);
|
||||||
|
}
|
||||||
|
LED_B_OFF();
|
||||||
} else {
|
} else {
|
||||||
cmd_send(CMD_ACK, 0, 0, 0, NULL, 0);
|
int res = MifareChkBlockKeys(datain, keyCount, blockNo, keyType, OLD_MF_DBGLEVEL);
|
||||||
|
|
||||||
|
LED_B_ON();
|
||||||
|
if (res > 0) {
|
||||||
|
cmd_send(CMD_ACK, 1, 0, 0, datain + (res - 1) * 6, 6);
|
||||||
|
} else {
|
||||||
|
cmd_send(CMD_ACK, 0, 0, 0, NULL, 0);
|
||||||
|
}
|
||||||
|
LED_B_OFF();
|
||||||
}
|
}
|
||||||
LED_B_OFF();
|
|
||||||
|
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
LEDsoff();
|
LEDsoff();
|
||||||
|
|
|
@ -772,7 +772,6 @@ int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData){
|
||||||
// one key check
|
// one key check
|
||||||
int MifareChkBlockKey(uint8_t *uid, uint32_t *cuid, uint8_t *cascade_levels, uint64_t ui64Key, uint8_t blockNo, uint8_t keyType, uint8_t debugLevel) {
|
int MifareChkBlockKey(uint8_t *uid, uint32_t *cuid, uint8_t *cascade_levels, uint64_t ui64Key, uint8_t blockNo, uint8_t keyType, uint8_t debugLevel) {
|
||||||
|
|
||||||
uint32_t timeout = 0;
|
|
||||||
struct Crypto1State mpcs = {0, 0};
|
struct Crypto1State mpcs = {0, 0};
|
||||||
struct Crypto1State *pcs;
|
struct Crypto1State *pcs;
|
||||||
pcs = &mpcs;
|
pcs = &mpcs;
|
||||||
|
@ -792,19 +791,17 @@ int MifareChkBlockKey(uint8_t *uid, uint32_t *cuid, uint8_t *cascade_levels, uin
|
||||||
}
|
}
|
||||||
} else { // no need for anticollision. We can directly select the card
|
} else { // no need for anticollision. We can directly select the card
|
||||||
if(!iso14443a_select_card(uid, NULL, NULL, false, *cascade_levels, true)) {
|
if(!iso14443a_select_card(uid, NULL, NULL, false, *cascade_levels, true)) {
|
||||||
if (debugLevel >= 1) Dbprintf("ChkKeys: Can't select card (UID) %d", *cascade_levels);
|
if (debugLevel >= 1) Dbprintf("ChkKeys: Can't select card (UID) lvl=%d", *cascade_levels);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mifare_classic_auth(pcs, *cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) {
|
if(mifare_classic_auth(pcs, *cuid, blockNo, keyType, ui64Key, AUTH_FIRST)) {
|
||||||
uint8_t dummy_answer = 0;
|
SpinDelayUs(AUTHENTICATION_TIMEOUT);
|
||||||
ReaderTransmit(&dummy_answer, 1, NULL);
|
|
||||||
timeout = GetCountSspClk() + AUTHENTICATION_TIMEOUT;
|
|
||||||
|
|
||||||
// wait for the card to become ready again
|
|
||||||
while(GetCountSspClk() < timeout);
|
|
||||||
return 2;
|
return 2;
|
||||||
|
} else {
|
||||||
|
// it needs after success authentication
|
||||||
|
mifare_classic_halt(pcs, *cuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -832,10 +829,12 @@ int MifareChkBlockKeys(uint8_t *keys, uint8_t keyCount, uint8_t blockNo, uint8_t
|
||||||
// can't select
|
// can't select
|
||||||
if (res == 1) {
|
if (res == 1) {
|
||||||
retryCount++;
|
retryCount++;
|
||||||
if (retryCount > 10) {
|
if (retryCount >= 5) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
--i; // try same key once again
|
--i; // try the same key once again
|
||||||
|
SpinDelay(50);
|
||||||
|
// Dbprintf("ChkKeys: block=%d key=%d. Try the same key once again...", blockNo, keyType);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -852,11 +851,15 @@ int MifareChkBlockKeys(uint8_t *keys, uint8_t keyCount, uint8_t blockNo, uint8_t
|
||||||
}
|
}
|
||||||
|
|
||||||
// multisector multikey check
|
// multisector multikey check
|
||||||
int MifareMultisectorChk(uint8_t *keys, uint8_t keyCount, uint8_t SectorCount, uint8_t keyType, uint8_t debugLevel, uint8_t (*keyIndex)[2][40]) {
|
int MifareMultisectorChk(uint8_t *keys, uint8_t keyCount, uint8_t SectorCount, uint8_t keyType, uint8_t debugLevel, TKeyIndex *keyIndex) {
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
|
// 3.2 ms/auth
|
||||||
|
int clk = GetCountSspClk();
|
||||||
|
|
||||||
for(int sc = 0; sc < SectorCount; sc++){
|
for(int sc = 0; sc < SectorCount; sc++){
|
||||||
for(int key = keyType & 0x01; key < 2; keyType==2?(key++):(key = 2)) {
|
for(int key = keyType & 0x01; key < 2; keyType==2?(key++):(key = 2)) {
|
||||||
|
WDT_HIT();
|
||||||
res = MifareChkBlockKeys(keys, keyCount, FirstBlockOfSector(sc), key, debugLevel);
|
res = MifareChkBlockKeys(keys, keyCount, FirstBlockOfSector(sc), key, debugLevel);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return res;
|
return res;
|
||||||
|
@ -867,6 +870,9 @@ int MifareMultisectorChk(uint8_t *keys, uint8_t keyCount, uint8_t SectorCount, u
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Dbprintf("%d %d", GetCountSspClk() - clk, (GetCountSspClk() - clk)/(SectorCount*keyCount*2));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,8 +103,9 @@ int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum);
|
||||||
int emlCheckValBl(int blockNum);
|
int emlCheckValBl(int blockNum);
|
||||||
|
|
||||||
// mifare check keys
|
// mifare check keys
|
||||||
|
typedef uint8_t TKeyIndex[2][40];
|
||||||
int MifareChkBlockKey(uint8_t *uid, uint32_t *cuid, uint8_t *cascade_levels, uint64_t ui64Key, uint8_t blockNo, uint8_t keyType, uint8_t debugLevel);
|
int MifareChkBlockKey(uint8_t *uid, uint32_t *cuid, uint8_t *cascade_levels, uint64_t ui64Key, uint8_t blockNo, uint8_t keyType, uint8_t debugLevel);
|
||||||
int MifareChkBlockKeys(uint8_t *keys, uint8_t keyCount, uint8_t blockNo, uint8_t keyType, uint8_t debugLevel);
|
int MifareChkBlockKeys(uint8_t *keys, uint8_t keyCount, uint8_t blockNo, uint8_t keyType, uint8_t debugLevel);
|
||||||
int MifareMultisectorChk(uint8_t *keys, uint8_t keyCount, uint8_t SectorCount, uint8_t keyType, uint8_t debugLevel, uint8_t (*keyIndex)[2][40]);
|
int MifareMultisectorChk(uint8_t *keys, uint8_t keyCount, uint8_t SectorCount, uint8_t keyType, uint8_t debugLevel, TKeyIndex *keyIndex);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue