+ LED_A_ON(); LED_B_OFF(); LED_C_OFF();\r
+\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+\r
+ clear_trace();\r
+ set_tracing(true);\r
+\r
+ if(!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");\r
+ OnError(0);\r
+ return;\r
+ };\r
+ \r
+ if(!mifare_ultra_auth(keybytes)){\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Authentication failed");\r
+ OnError(1);\r
+ return;\r
+ }\r
+\r
+ if (turnOffField) {\r
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+ LEDsoff();\r
+ }\r
+ cmd_send(CMD_ACK,1,0,0,0,0);\r
+}\r
+\r
+// Arg0 = BlockNo,\r
+// Arg1 = UsePwd bool\r
+// datain = PWD bytes,\r
+void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain)\r
+{\r
+ uint8_t blockNo = arg0;\r
+ byte_t dataout[16] = {0x00};\r
+ bool useKey = (arg1 == 1); //UL_C\r
+ bool usePwd = (arg1 == 2); //UL_EV1/NTAG\r
+\r
+ LEDsoff();\r
+ LED_A_ON();\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+\r
+ clear_trace();\r
+ set_tracing(true);\r
+\r
+ int len = iso14443a_select_card(NULL, NULL, NULL, true, 0);\r
+ if(!len) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card (RC:%02X)",len);\r
+ OnError(1);\r
+ return;\r
+ }\r
+\r
+ // UL-C authentication\r
+ if ( useKey ) {\r
+ uint8_t key[16] = {0x00};\r
+ memcpy(key, datain, sizeof(key) );\r
+\r
+ if ( !mifare_ultra_auth(key) ) {\r
+ OnError(1);\r
+ return;\r
+ }\r
+ }\r
+\r
+ // UL-EV1 / NTAG authentication\r
+ if ( usePwd ) {\r
+ uint8_t pwd[4] = {0x00};\r
+ memcpy(pwd, datain, 4);\r
+ uint8_t pack[4] = {0,0,0,0};\r
+ if (!mifare_ul_ev1_auth(pwd, pack)) {\r
+ OnError(1);\r
+ return;\r
+ }\r
+ } \r
+\r
+ if( mifare_ultra_readblock(blockNo, dataout) ) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Read block error");\r
+ OnError(2);\r
+ return;\r
+ }\r
+\r
+ if( mifare_ultra_halt() ) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Halt error");\r
+ OnError(3);\r
+ return;\r
+ }\r
+\r
+ cmd_send(CMD_ACK,1,0,0,dataout,16);\r
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
+ LEDsoff();\r