X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/838c15a6433b1cf1726aede99fa8dcdc7862473a..13fc2e9c71175842dda4dedd878a92e07d519010:/client/mifarehost.c diff --git a/client/mifarehost.c b/client/mifarehost.c index 916fba8f..3e8362c5 100644 --- a/client/mifarehost.c +++ b/client/mifarehost.c @@ -66,10 +66,8 @@ typedef // wrapper function for multi-threaded lfsr_recovery32 void* nested_worker_thread(void *arg) { - clock_t t1 = clock(); struct Crypto1State *p1; StateList_t *statelist = arg; - statelist->head.slhead = lfsr_recovery32(statelist->ks1, statelist->nt ^ statelist->uid); for (p1 = statelist->head.slhead; *(uint64_t *)p1 != 0; p1++); @@ -77,10 +75,6 @@ void* nested_worker_thread(void *arg) statelist->len = p1 - statelist->head.slhead; statelist->tail.sltail = --p1; qsort(statelist->head.slhead, statelist->len, sizeof(uint64_t), Compare16Bits); - - - t1 = clock() - t1; - printf("lfsr_recovery32 takes %.0f ticks \n", (float)t1); return statelist->head.slhead; } @@ -192,7 +186,6 @@ int mfnested(uint8_t blockNo, uint8_t keyType, uint8_t * key, uint8_t trgBlockNo // uint32_t max_keys = keycnt > (USB_CMD_DATA_SIZE/6) ? (USB_CMD_DATA_SIZE/6) : keycnt; uint8_t keyBlock[USB_CMD_DATA_SIZE] = {0x00}; - clock_t t1 = clock(); for (i = 0; i < numOfCandidates; ++i){ crypto1_get_lfsr(statelists[0].head.slhead + i, &key64); num_to_bytes(key64, 6, keyBlock + i * 6); @@ -203,9 +196,6 @@ int mfnested(uint8_t blockNo, uint8_t keyType, uint8_t * key, uint8_t trgBlockNo free(statelists[1].head.slhead); num_to_bytes(key64, 6, resultKey); - t1 = clock() - t1; - printf("Check candidates takes %.0f ticks \n", (float)t1); - PrintAndLog("UID: %08x target block:%3u key type: %c -- Found key [%012"llx"]", uid, (uint16_t)resp.arg[2] & 0xff, @@ -228,14 +218,13 @@ out: } int mfCheckKeys (uint8_t blockNo, uint8_t keyType, bool clear_trace, uint8_t keycnt, uint8_t * keyBlock, uint64_t * key){ - *key = 0; UsbCommand c = {CMD_MIFARE_CHKKEYS, { (blockNo | (keyType<<8)), clear_trace, keycnt}}; memcpy(c.d.asBytes, keyBlock, 6 * keycnt); clearCommandBuffer(); SendCommand(&c); UsbCommand resp; - if (!WaitForResponseTimeout(CMD_ACK,&resp, 3000)) return 1; + if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) return 1; if ((resp.arg[0] & 0xff) != 0x01) return 2; *key = bytes_to_num(resp.d.asBytes, 6); return 0; @@ -260,14 +249,12 @@ int mfEmlSetMem(uint8_t *data, int blockNum, int blocksCount) { int mfEmlSetMem_xt(uint8_t *data, int blockNum, int blocksCount, int blockBtWidth) { UsbCommand c = {CMD_MIFARE_EML_MEMSET, {blockNum, blocksCount, blockBtWidth}}; memcpy(c.d.asBytes, data, blocksCount * blockBtWidth); - clearCommandBuffer(); SendCommand(&c); return 0; } // "MAGIC" CARD - int mfCSetUID(uint8_t *uid, uint8_t *atqa, uint8_t *sak, uint8_t *oldUID, uint8_t wipecard) { uint8_t params = MAGIC_SINGLE; @@ -340,6 +327,7 @@ int mfCGetBlock(uint8_t blockNo, uint8_t *data, uint8_t params) { } // SNIFFER +// [iceman] so many global variables.... // constants static uint8_t trailerAccessBytes[4] = {0x08, 0x77, 0x8F, 0x00}; @@ -353,7 +341,6 @@ static uint8_t traceCurBlock = 0; static uint8_t traceCurKey = 0; struct Crypto1State *traceCrypto1 = NULL; - struct Crypto1State *revstate = NULL; uint64_t key = 0; @@ -486,7 +473,8 @@ void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *data, int len, bool i int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) { uint8_t data[64]; - + memset(data, 0x00, sizeof(data)); + if (traceState == TRACE_ERROR) return 1; if (len > 64) { @@ -512,7 +500,7 @@ int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) { } // AUTHENTICATION - if ((len == 4) && ((data[0] == 0x60) || (data[0] == 0x61))) { + if ((len == 4) && ((data[0] == MIFARE_AUTH_KEYA) || (data[0] == MIFARE_AUTH_KEYB))) { traceState = TRACE_AUTH1; traceCurBlock = data[1]; traceCurKey = data[0] == 60 ? 1:0; @@ -520,21 +508,21 @@ int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) { } // READ - if ((len ==4) && ((data[0] == 0x30))) { + if ((len ==4) && ((data[0] == ISO14443A_CMD_READBLOCK))) { traceState = TRACE_READ_DATA; traceCurBlock = data[1]; return 0; } // WRITE - if ((len ==4) && ((data[0] == 0xA0))) { + if ((len ==4) && ((data[0] == ISO14443A_CMD_WRITEBLOCK))) { traceState = TRACE_WRITE_OK; traceCurBlock = data[1]; return 0; } // HALT - if ((len ==4) && ((data[0] == 0x50) && (data[1] == 0x00))) { + if ((len ==4) && ((data[0] == ISO14443A_CMD_HALT) && (data[1] == 0x00))) { traceState = TRACE_ERROR; // do not decrypt the next commands return 0; }