-
- if (BUTTON_PRESS()) break;
-
- // Send act_all
- ReaderTransmitIClass(act_all, 1);
- // Card present?
- if(ReaderReceiveIClass(resp)) {
- ReaderTransmitIClass(identify, 1);
- if(ReaderReceiveIClass(resp) == 10) {
- // Select card
- memcpy(&select[1],resp,8);
- ReaderTransmitIClass(select, sizeof(select));
-
- if(ReaderReceiveIClass(resp) == 10) {
- Dbprintf(" Selected CSN: %02x %02x %02x %02x %02x %02x %02x %02x",
- resp[0], resp[1], resp[2],
- resp[3], resp[4], resp[5],
- resp[6], resp[7]);
+
+ if (!selectIclassTag(card_data, &eof_time)) continue;
+
+ start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER;
+ if (!sendCmdGetResponseWithRetries(readcheck_cc, sizeof(readcheck_cc), resp, sizeof(resp), 8, 3, start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time)) continue;
+
+ // replay captured auth (cc must not have been updated)
+ memcpy(check+5, MAC, 4);
+
+ start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER;
+ if (!sendCmdGetResponseWithRetries(check, sizeof(check), resp, sizeof(resp), 4, 5, start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time)) {
+ Dbprintf("Error: Authentication Fail!");
+ continue;
+ }
+
+ //first get configuration block (block 1)
+ crc = block_crc_LUT[1];
+ read[1] = 1;
+ read[2] = crc >> 8;
+ read[3] = crc & 0xff;
+
+ start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER;
+ if (!sendCmdGetResponseWithRetries(read, sizeof(read), resp, sizeof(resp), 10, 10, start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time)) {
+ start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER;
+ Dbprintf("Dump config (block 1) failed");
+ continue;
+ }
+
+ mem = resp[5];
+ memory.k16 = (mem & 0x80);
+ memory.book = (mem & 0x20);
+ memory.k2 = (mem & 0x8);
+ memory.lockauth = (mem & 0x2);
+ memory.keyaccess = (mem & 0x1);
+
+ cardsize = memory.k16 ? 255 : 32;
+ WDT_HIT();
+ //Set card_data to all zeroes, we'll fill it with data
+ memset(card_data, 0x0, USB_CMD_DATA_SIZE);
+ uint8_t failedRead = 0;
+ uint32_t stored_data_length = 0;
+ //then loop around remaining blocks
+ for (int block = 0; block < cardsize; block++) {
+ read[1] = block;
+ crc = block_crc_LUT[block];
+ read[2] = crc >> 8;
+ read[3] = crc & 0xff;
+
+ start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER;
+ if (sendCmdGetResponseWithRetries(read, sizeof(read), resp, sizeof(resp), 10, 10, start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time)) {
+ Dbprintf(" %02x: %02x %02x %02x %02x %02x %02x %02x %02x",
+ block, resp[0], resp[1], resp[2],
+ resp[3], resp[4], resp[5],
+ resp[6], resp[7]);
+
+ //Fill up the buffer
+ memcpy(card_data+stored_data_length, resp, 8);
+ stored_data_length += 8;
+ if (stored_data_length +8 > USB_CMD_DATA_SIZE) {
+ //Time to send this off and start afresh
+ cmd_send(CMD_ACK,
+ stored_data_length,//data length
+ failedRead,//Failed blocks?
+ 0,//Not used ATM
+ card_data, stored_data_length);
+ //reset
+ stored_data_length = 0;
+ failedRead = 0;