+void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){\r
+ \r
+ uint8_t workFlags = arg0;\r
+ uint8_t blockNo = arg1;\r
+\r
+ // variables\r
+ uint8_t data[MAX_MIFARE_FRAME_SIZE];\r
+ uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];\r
+ uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];\r
+ \r
+ memset(data, 0x00, sizeof(data));\r
+ \r
+ if (workFlags & MAGIC_INIT) {\r
+ LED_A_ON();\r
+ LED_B_OFF();\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); \r
+ clear_trace();\r
+ set_tracing(TRUE);\r
+ }\r
+\r
+ if (workFlags & MAGIC_WUPC) {\r
+ ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
+ if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");\r
+ OnErrorMagic(MAGIC_WUPC);\r
+ }\r
+\r
+ ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
+ if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");\r
+ OnErrorMagic(MAGIC_WUPC);\r
+ }\r
+ }\r
+\r
+ // read block \r
+ if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error");\r
+ OnErrorMagic(0);\r
+ }\r
+ \r
+ memcpy(data, receivedAnswer, sizeof(data));\r
+ \r
+ // send HALT\r
+ if (workFlags & MAGIC_HALT) \r
+ mifare_classic_halt_ex(NULL);\r
+ \r
+ LED_B_ON();\r
+ \r
+ // if MAGIC_DATAIN, the data stays on device side.\r
+ if (workFlags & MAGIC_DATAIN)\r
+ memcpy(datain, data, sizeof(data));\r
+ else\r
+ cmd_send(CMD_ACK,1,0,0,data,sizeof(data));\r
+ \r
+ LED_B_OFF();\r
+\r
+ if (workFlags & MAGIC_OFF)\r
+ OnSuccessMagic();\r
+}\r
+\r
+void MifareCIdent(){\r
+ \r
+ // variables\r
+ bool isOK = true; \r
+ uint8_t receivedAnswer[1];\r
+ uint8_t receivedAnswerPar[1];\r
+\r
+ ReaderTransmitBitsPar(wupC1,7,0, NULL);\r
+ if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+ isOK = false;\r
+ }\r
+\r
+ ReaderTransmit(wupC2, sizeof(wupC2), NULL);\r
+ if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {\r
+ isOK = false;\r
+ }\r
+\r
+ // removed the if, since some magic tags misbehavies and send an answer to it.\r
+ mifare_classic_halt(NULL, 0);\r
+ cmd_send(CMD_ACK,isOK,0,0,0,0);\r
+}\r
+\r
+void OnSuccessMagic(){\r
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+ LEDsoff();\r
+ set_tracing(FALSE); \r
+}\r
+void OnErrorMagic(uint8_t reason){\r
+ // ACK, ISOK, reason,0,0,0\r
+ cmd_send(CMD_ACK,0,reason,0,0,0);\r
+ OnSuccessMagic();\r
+}\r
+\r
+void MifareCollectNonces(uint32_t arg0, uint32_t arg1){\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
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+ clear_trace();\r
+\r
+ int len = iso14443a_select_card(uid, NULL, &cuid, true, 0);\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
+\r
+ cmd_send(CMD_ACK, isOK, 0, 0, dataout, sizeof(dataout));\r
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+ LEDsoff();\r
+}
\ No newline at end of file