FIX: hf mf sim - authentication works again.

CHG: `lf em`- renamed.
CHG: removed functionality in whereami.c, not needed.
This commit is contained in:
iceman1001 2017-02-25 23:00:20 +01:00
commit d32691f1da
4 changed files with 34 additions and 29 deletions

View file

@ -1,4 +1,4 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Merlok - June 2011, 2012 // Merlok - June 2011, 2012
// Gerhard de Koning Gans - May 2008 // Gerhard de Koning Gans - May 2008
// Hagen Fritsch - June 2010 // Hagen Fritsch - June 2010
@ -2791,34 +2791,37 @@ void Mifare1ksim(uint8_t flags, uint8_t exitAfterNReads, uint8_t arg2, uint8_t *
} }
} }
/* crypto1_word(pcs, nr , 1);
// Interactive mode flag, means we need to send ACK uint32_t cardRr = ar ^ crypto1_word(pcs, 0, 0);
crypto1_word(pcs, ar , 1); //test if auth OK
cardRr = nr ^ crypto1_word(pcs, 0, 0);
test if auth OK
if (cardRr != prng_successor(nonce, 64)){ if (cardRr != prng_successor(nonce, 64)){
if (MF_DBGLEVEL >= 4) Dbprintf("AUTH FAILED for sector %d with key %c. cardRr=%08x, succ=%08x", if (MF_DBGLEVEL >= 3)
cardAUTHSC, cardAUTHKEY == 0 ? 'A' : 'B', Dbprintf("AUTH FAILED for sector %d with key %c. [nr=%08x cardRr=%08x] [nt=%08x succ=%08x]"
cardRr, prng_successor(nonce, 64)); , cardAUTHSC
Shouldn't we respond anything here? , (cardAUTHKEY == 0) ? 'A' : 'B'
Right now, we don't nack or anything, which causes the , nr
reader to do a WUPA after a while. /Martin , cardRr
-- which is the correct response. /piwi , nonce // nt
, prng_successor(nonce, 64)
);
// Shouldn't we respond anything here?
// Right now, we don't nack or anything, which causes the
// reader to do a WUPA after a while. /Martin
// -- which is the correct response. /piwi
cardSTATE_TO_IDLE(); cardSTATE_TO_IDLE();
LogTrace(Uart.output, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE); LogTrace(Uart.output, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
break; break;
} }
*/
ans = prng_successor(nonce, 96) ^ crypto1_word(pcs, 0, 0); ans = prng_successor(nonce, 96) ^ crypto1_word(pcs, 0, 0);
num_to_bytes(ans, 4, rAUTH_AT); num_to_bytes(ans, 4, rAUTH_AT);
EmSendCmd(rAUTH_AT, sizeof(rAUTH_AT)); EmSendCmd(rAUTH_AT, sizeof(rAUTH_AT));
LED_C_ON(); LED_C_ON();
if (MF_DBGLEVEL >= 4) { if (MF_DBGLEVEL >= 1) {
Dbprintf("AUTH COMPLETED for sector %d with key %c. time=%d", Dbprintf("AUTH COMPLETED for sector %d with key %c. time=%d",
cardAUTHSC, cardAUTHSC,
cardAUTHKEY == 0 ? 'A' : 'B', cardAUTHKEY == 0 ? 'A' : 'B',
@ -2842,24 +2845,26 @@ void Mifare1ksim(uint8_t flags, uint8_t exitAfterNReads, uint8_t arg2, uint8_t *
receivedCmd[0] == MIFARE_AUTH_KEYB) ) { receivedCmd[0] == MIFARE_AUTH_KEYB) ) {
authTimer = GetTickCount(); authTimer = GetTickCount();
cardAUTHSC = receivedCmd[1] / 4; // received block num cardAUTHSC = receivedCmd[1] / 4; // received block -> sector
cardAUTHKEY = receivedCmd[0] - 0x60; // & 1 cardAUTHKEY = receivedCmd[0] & 0x1;
crypto1_destroy(pcs); crypto1_destroy(pcs);
// load key into crypto
crypto1_create(pcs, emlGetKey(cardAUTHSC, cardAUTHKEY)); crypto1_create(pcs, emlGetKey(cardAUTHSC, cardAUTHKEY));
if (!encrypted_data) { if (!encrypted_data) {
// first authentication // first authentication
crypto1_word(pcs, cuid ^ nonce, 0);// Update crypto state // Update crypto state init (UID ^ NONCE)
num_to_bytes(nonce, 4, rAUTH_AT); // Send nonce crypto1_word(pcs, cuid ^ nonce, 0);
num_to_bytes(nonce, 4, rAUTH_AT);
if (MF_DBGLEVEL >= 4) Dbprintf("Reader authenticating for block %d (0x%02x) with key %d",receivedCmd[1] ,receivedCmd[1],cardAUTHKEY ); }
} else { } else {
// nested authentication // nested authentication
ans = nonce ^ crypto1_word(pcs, cuid ^ nonce, 0); ans = nonce ^ crypto1_word(pcs, cuid ^ nonce, 0);
num_to_bytes(ans, 4, rAUTH_AT); num_to_bytes(ans, 4, rAUTH_AT);
if (MF_DBGLEVEL >= 4) Dbprintf("Reader doing nested authentication for block %d (0x%02x) with key %d",receivedCmd[1] ,receivedCmd[1],cardAUTHKEY ); if (MF_DBGLEVEL >= 3) Dbprintf("Reader doing nested authentication for block %d (0x%02x) with key %c", receivedCmd[1], receivedCmd[1], cardAUTHKEY == 0 ? 'A' : 'B');
} }
EmSendCmd(rAUTH_AT, sizeof(rAUTH_AT)); EmSendCmd(rAUTH_AT, sizeof(rAUTH_AT));

View file

@ -157,7 +157,7 @@ int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockN
// some statistic // some statistic
if (!ntptr && (MF_DBGLEVEL >= 3)) if (!ntptr && (MF_DBGLEVEL >= 3))
Dbprintf("auth uid: %08x nt: %08x", uid, nt); Dbprintf("auth uid: %08x | nr: %08x | nt: %08x", uid, nr, nt);
// save Nt // save Nt
if (ntptr) if (ntptr)

View file

@ -1226,13 +1226,12 @@ int CmdLFfind(const char *Cmd) {
return 0; return 0;
} }
static command_t CommandTable[] = static command_t CommandTable[] = {
{
{"help", CmdHelp, 1, "This help"}, {"help", CmdHelp, 1, "This help"},
{"animal", CmdLFFdx, 1, "{ Animal RFIDs... }"}, {"animal", CmdLFFdx, 1, "{ Animal RFIDs... }"},
{"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"}, {"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"},
{"cotag", CmdLFCOTAG, 1, "{ COTAG RFIDs... }"}, {"cotag", CmdLFCOTAG, 1, "{ COTAG RFIDs... }"},
{"em4x", CmdLFEM4X, 1, "{ EM4X RFIDs... }"}, {"em", CmdLFEM4X, 1, "{ EM4X RFIDs... }"},
{"guard", CmdLFGuard, 1, "{ Guardall RFIDs... }"}, {"guard", CmdLFGuard, 1, "{ Guardall RFIDs... }"},
{"hid", CmdLFHID, 1, "{ HID RFIDs... }"}, {"hid", CmdLFHID, 1, "{ HID RFIDs... }"},
{"hitag", CmdLFHitag, 1, "{ HITAG RFIDs... }"}, {"hitag", CmdLFHitag, 1, "{ HITAG RFIDs... }"},

View file

@ -135,6 +135,7 @@ int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length)
return WAI_PREFIX(getModulePath_)(NULL, out, capacity, dirname_length); return WAI_PREFIX(getModulePath_)(NULL, out, capacity, dirname_length);
} }
/*
WAI_NOINLINE WAI_NOINLINE
WAI_FUNCSPEC WAI_FUNCSPEC
int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length)
@ -146,8 +147,7 @@ int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length)
#pragma warning(push) #pragma warning(push)
#pragma warning(disable: 4054) #pragma warning(disable: 4054)
#endif #endif
// if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)WAI_RETURN_ADDRESS(), &module)) if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)WAI_RETURN_ADDRESS(), &module))
module = GetModuleHandle("proxmark3.exe");
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(pop) #pragma warning(pop)
#endif #endif
@ -157,6 +157,7 @@ int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length)
return length; return length;
} }
*/
#elif defined(__linux__) #elif defined(__linux__)