+ LED_C_OFF();\r
+\r
+ clear_trace();\r
+ set_tracing(TRUE);\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+ \r
+ for (int i = 0; i < iterations; i++) {\r
+ \r
+ WDT_HIT();\r
+\r
+ // Test if the action was cancelled\r
+ if(BUTTON_PRESS()) break;\r
+ \r
+ // if(mifare_classic_halt(pcs, cuid)) {\r
+ // if (MF_DBGLEVEL >= 1) Dbprintf("Halt error");\r
+ //}\r
+\r
+ if(!iso14443a_select_card(uid, NULL, NULL)) {\r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");\r
+ continue;\r
+ };\r
+\r
+ // Transmit MIFARE_CLASSIC_AUTH.\r
+ ReaderTransmit(mf_auth, sizeof(mf_auth), NULL);\r
+\r
+ // Receive the (4 Byte) "random" nonce\r
+ if (!ReaderReceive(response, responsePar)) {\r
+ if (MF_DBGLEVEL >= 1) Dbprintf("Couldn't receive tag nonce");\r
+ continue;\r
+ } \r
+ \r
+ nonces[i*4] = bytes_to_num(response, 4);\r
+ }\r
+ \r
+ int packLen = iterations * 4;\r
+ int packSize = 0;\r
+ int packNum = 0;\r
+ while (packLen > 0) {\r
+ packSize = MIN(USB_CMD_DATA_SIZE, packLen);\r
+ LED_B_ON();\r
+ cmd_send(CMD_ACK, 77, 0, packSize, nonces - packLen, packSize);\r
+ LED_B_OFF();\r
+\r
+ packLen -= packSize;\r
+ packNum++;\r
+ }\r
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+ LEDsoff();\r
+}\r
+\r
+//\r
+// DESFIRE\r
+//\r
+\r
+void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain){\r
+\r
+ byte_t dataout[11] = {0x00};\r
+ uint8_t uid[10] = {0x00};\r
+ uint32_t cuid = 0x00;\r
+ \r
+ clear_trace();\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+\r
+ int len = iso14443a_select_card(uid, NULL, &cuid);\r
+ if(!len) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");\r
+ OnError(1);\r
+ return;\r
+ };\r
+\r
+ if(mifare_desfire_des_auth1(cuid, dataout)){\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Authentication part1: Fail.");\r
+ OnError(4);\r
+ return;\r
+ }\r
+\r
+ if (MF_DBGLEVEL >= MF_DBG_EXTENDED) DbpString("AUTH 1 FINISHED");\r
+ cmd_send(CMD_ACK,1,cuid,0,dataout, sizeof(dataout));\r
+}\r
+\r
+void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain){\r
+\r
+ uint32_t cuid = arg0;\r
+ uint8_t key[16] = {0x00};\r
+ byte_t dataout[12] = {0x00};\r
+ byte_t isOK = 0;\r
+ \r
+ memcpy(key, datain, 16);\r
+ \r
+ isOK = mifare_desfire_des_auth2(cuid, key, dataout);\r
+ \r
+ if( isOK) {\r
+ if (MF_DBGLEVEL >= MF_DBG_EXTENDED) Dbprintf("Authentication part2: Failed"); \r
+ OnError(4);\r
+ return;\r
+ }\r
+\r
+ if (MF_DBGLEVEL >= MF_DBG_EXTENDED) DbpString("AUTH 2 FINISHED");\r