From bc1b560add75eb876de3609f8517656ad36930e6 Mon Sep 17 00:00:00 2001 From: nffq Date: Sat, 28 Mar 2026 05:12:13 +0900 Subject: [PATCH] Allow debug prints when `isNested == AUTH_NESTED` and `ntencptr == NULL` --- armsrc/mifareutil.c | 50 ++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index b8eb7feb3..37c3d1e69 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -212,35 +212,24 @@ int mifare_classic_authex_cmd(struct Crypto1State *pcs, uint32_t uid, uint8_t bl } // Save the tag nonce (nt) - uint32_t nt = bytes_to_num(receivedAnswer, 4); - if (ntencptr) { - *ntencptr = nt; - } - - if (ntencparptr) { - *ntencparptr = receivedAnswerPar[0]; - } - - // ----------------------------- crypto1 create - if (isNested) { - crypto1_deinit(pcs); - } + uint32_t nt = bytes_to_num(receivedAnswer, 4), + ntenc = nt; // Init cipher with key crypto1_init(pcs, ui64Key); if (isNested == AUTH_NESTED) { - // decrypt nt with help of new key - nt = crypto1_word(pcs, nt ^ uid, 1) ^ nt; + // decrypt ntenc with help of new key + nt = crypto1_word(pcs, ntenc ^ uid, 1) ^ ntenc; } else { // Load (plain) uid^nt into the cipher crypto1_word(pcs, nt ^ uid, 0); } // some statistic -// if (!ntptr && (g_dbglevel >= DBG_EXTENDED)) - uint32_t nr32 = nr[0] << 24 | nr[1] << 16 | nr[2] << 8 | nr[3]; if (g_dbglevel >= DBG_EXTENDED) { + uint32_t nr32 = nr[0] << 24 | nr[1] << 16 | nr[2] << 8 | nr[3]; + if (isNested == AUTH_FIRST) { Dbprintf("auth cmd: %02x %02x | uid: %08x | nr: %08x %s| nt: %08x %s %5i| par: %i%i%i%i %s", cmd, blockNo, uid, @@ -253,9 +242,7 @@ int mifare_classic_authex_cmd(struct Crypto1State *pcs, uint32_t uid, uint8_t bl (receivedAnswerPar[0] >> 4) & 1, validate_parity_nonce(nt, receivedAnswerPar[0], nt) ? "ok " : "bad"); } else { - - if (ntencptr) { - Dbprintf("auth nested cmd: %02x %02x | uid: %08x | nr: %08x %s| nt: %08x %s %5i| par: %i%i%i%i %s| ntenc: %08x %s| parerr: %i%i%i%i", + Dbprintf("auth nested cmd: %02x %02x | uid: %08x | nr: %08x %s| nt: %08x %s %5i| par: %i%i%i%i %s| ntenc: %08x %s| parerr: %i%i%i%i", cmd, blockNo, uid, nr32, validate_prng_nonce(nr32) ? "@" : " ", nt, validate_prng_nonce(nt) ? "@idx" : " idx", @@ -264,20 +251,27 @@ int mifare_classic_authex_cmd(struct Crypto1State *pcs, uint32_t uid, uint8_t bl (receivedAnswerPar[0] >> 6) & 1, (receivedAnswerPar[0] >> 5) & 1, (receivedAnswerPar[0] >> 4) & 1, - validate_parity_nonce(*ntencptr, receivedAnswerPar[0], nt) ? "ok " : "bad", - *ntencptr, validate_prng_nonce(*ntencptr) ? "@" : " ", - ((receivedAnswerPar[0] >> 7) & 1) ^ oddparity8((*ntencptr >> 24) & 0xFF), - ((receivedAnswerPar[0] >> 6) & 1) ^ oddparity8((*ntencptr >> 16) & 0xFF), - ((receivedAnswerPar[0] >> 5) & 1) ^ oddparity8((*ntencptr >> 8) & 0xFF), - ((receivedAnswerPar[0] >> 4) & 1) ^ oddparity8((*ntencptr >> 0) & 0xFF) - ); - } + validate_parity_nonce(ntenc, receivedAnswerPar[0], nt) ? "ok " : "bad", + ntenc, validate_prng_nonce(ntenc) ? "@" : " ", + ((receivedAnswerPar[0] >> 7) & 1) ^ oddparity8((ntenc >> 24) & 0xFF), + ((receivedAnswerPar[0] >> 6) & 1) ^ oddparity8((ntenc >> 16) & 0xFF), + ((receivedAnswerPar[0] >> 5) & 1) ^ oddparity8((ntenc >> 8) & 0xFF), + ((receivedAnswerPar[0] >> 4) & 1) ^ oddparity8((ntenc >> 0) & 0xFF)); } } + // save Nt if (ntptr) { *ntptr = nt; } + // save encrypted Nt + if (ntencptr) { + *ntencptr = ntenc; + } + // save encrypted Nt parity + if (ntencparptr) { + *ntencparptr = receivedAnswerPar[0]; + } // Generate (encrypted) nr+parity by loading it into the cipher (Nr) uint32_t pos;