#include "crapto1.h"\r
#include "mifareutil.h"\r
\r
+int MF_DBGLEVEL = MF_DBG_ALL;\r
+\r
uint8_t* mifare_get_bigbufptr(void) {\r
return (((uint8_t *)BigBuf) + 3560); // was 3560 - tied to other size changes\r
}\r
\r
int mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer)\r
+{\r
+ return mifare_sendcmd_shortex(pcs, crypted, cmd, data, answer, NULL);\r
+}\r
+\r
+int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint32_t * parptr)\r
{\r
uint8_t dcmd[4], ecmd[4];\r
uint32_t pos, par, res;\r
ReaderTransmit(dcmd, sizeof(dcmd));\r
}\r
\r
- int len = ReaderReceive(answer);\r
+ int len = ReaderReceivePar(answer, &par);\r
+ \r
+ if (parptr) *parptr = par;\r
\r
if (crypted == CRYPT_ALL) {\r
if (len == 1) {\r
}\r
\r
int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint64_t isNested) \r
+{\r
+ return mifare_classic_authex(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL);\r
+}\r
+\r
+int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint64_t isNested, uint32_t * ntptr) \r
{\r
// variables\r
int len; \r
\r
// Transmit MIFARE_CLASSIC_AUTH\r
len = mifare_sendcmd_short(pcs, isNested, 0x60 + (keyType & 0x01), blockNo, receivedAnswer);\r
-// Dbprintf("rand nonce len: %x", len); \r
+ if (MF_DBGLEVEL >= 4) Dbprintf("rand nonce len: %x", len); \r
if (len != 4) return 1;\r
\r
ar[0] = 0x55;\r
}\r
\r
// some statistic\r
- Dbprintf("auth uid: %08x nt: %08x", uid, nt); \r
+ if (!ntptr && (MF_DBGLEVEL >= 3))\r
+ Dbprintf("auth uid: %08x nt: %08x", uid, nt); \r
+ \r
+ // save Nt\r
+ if (ntptr)\r
+ *ntptr = nt;\r
\r
par = 0;\r
// Generate (encrypted) nr+parity by loading it into the cipher (Nr)\r
len = ReaderReceive(receivedAnswer);\r
if (!len)\r
{\r
- Dbprintf("Authentication failed. Card timeout.");\r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Authentication failed. Card timeout.");\r
return 2;\r
}\r
\r
ntpp = prng_successor(nt, 32) ^ crypto1_word(pcs, 0,0);\r
\r
if (ntpp != bytes_to_num(tmp4, 4)) {\r
- Dbprintf("Authentication failed. Error card response.");\r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Authentication failed. Error card response.");\r
return 3;\r
}\r
\r
// command MIFARE_CLASSIC_READBLOCK\r
len = mifare_sendcmd_short(pcs, 1, 0x30, blockNo, receivedAnswer);\r
if (len == 1) {\r
- Dbprintf("Cmd Error: %02x", receivedAnswer[0]); \r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); \r
return 1;\r
}\r
if (len != 18) {\r
- Dbprintf("Cmd Error: card timeout. len: %x", len); \r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Cmd Error: card timeout. len: %x", len); \r
return 2;\r
}\r
\r
memcpy(bt, receivedAnswer + 16, 2);\r
AppendCrc14443a(receivedAnswer, 16);\r
if (bt[0] != receivedAnswer[16] || bt[1] != receivedAnswer[17]) {\r
- Dbprintf("Cmd CRC response error."); \r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Cmd CRC response error."); \r
return 3;\r
}\r
\r
len = mifare_sendcmd_short(pcs, 1, 0xA0, blockNo, receivedAnswer);\r
\r
if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK\r
- Dbprintf("Cmd Error: %02x", receivedAnswer[0]); \r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); \r
return 1;\r
}\r
\r
res |= (crypto1_bit(pcs, 0, 0) ^ BIT(receivedAnswer[0], i)) << i;\r
\r
if ((len != 1) || (res != 0x0A)) {\r
- Dbprintf("Cmd send data2 Error: %02x", res); \r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Cmd send data2 Error: %02x", res); \r
return 2;\r
}\r
\r
\r
len = mifare_sendcmd_short(pcs, 1, 0x50, 0x00, receivedAnswer);\r
if (len != 0) {\r
- Dbprintf("halt error. response len: %x", len); \r
+ if (MF_DBGLEVEL >= 1) Dbprintf("halt error. response len: %x", len); \r
return 1;\r
}\r
\r
return 0;\r
}\r
+\r