+ int len = iso14443a_select_card(NULL, NULL, NULL);\r
+ if (!len) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card (RC:%d)",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, sizeof(pwd));\r
+ uint8_t pack[4] = {0,0,0,0};\r
+\r
+ if (!mifare_ul_ev1_auth(pwd, pack)){\r
+ OnError(1);\r
+ return; \r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < blocks; i++){\r
+ if ((i*4) + 4 > CARD_MEMORY_SIZE) {\r
+ Dbprintf("Data exceeds buffer!!");\r
+ break;\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, sizeof(pwd));\r
+ uint8_t pack[4] = {0,0,0,0};\r
+\r
+ if (!mifare_ul_ev1_auth(pwd, pack)){\r
+ OnError(1);\r
+ return; \r
+ }\r
+ }\r
+ \r
+ for (int i = 0; i < blocks; i++){\r
+ if ((i*4) + 4 > CARD_MEMORY_SIZE) {\r
+ Dbprintf("Data exceeds buffer!!");\r
+ break;\r
+ }\r
+ \r
+ len = mifare_ultra_readblock(blockNo + i, dataout + 4 * i);\r
+ \r
+ if (len) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Read block %d error",i);\r
+ // if no blocks read - error out\r
+ if (i==0){\r
+ OnError(2);\r
+ return;\r
+ } else {\r
+ //stop at last successful read block and return what we got\r
+ break;\r
+ }\r
+ } else {\r
+ countblocks++;\r
+ }\r
+ }\r
+\r
+ len = mifare_ultra_halt();\r
+ if (len) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Halt error");\r
+ OnError(3);\r
+ return;\r
+ }\r
+\r
+ if (MF_DBGLEVEL >= MF_DBG_EXTENDED) Dbprintf("Blocks read %d", countblocks);\r
+\r
+ countblocks *= 4;\r
+ cmd_send(CMD_ACK, 1, countblocks, countblocks, 0, 0);\r