+ case 'T':
+ decodeTLV = true;
+ break;
+ default:
+ PrintAndLog("Unknown parameter '%c'", param_getchar_indx(cmd, 1, cmdp));
+ return 1;
+ }
+
+ if (isxdigit(c)) {
+ // len = data + PCB(1b) + CRC(2b)
+ switch(param_gethex_to_eol(cmd, cmdp, data, sizeof(data) - 1 - 2, &datalen)) {
+ case 1:
+ PrintAndLog("Invalid HEX value.");
+ return 1;
+ case 2:
+ PrintAndLog("APDU too large.");
+ return 1;
+ case 3:
+ PrintAndLog("Hex must have even number of digits.");
+ return 1;
+ }
+
+ // we get all the hex to end of line with spaces
+ break;
+ }
+
+ cmdp++;
+ }
+
+ PrintAndLog(">>>>[%s%s%s] %s", activateField ? "sel ": "", leaveSignalON ? "keep ": "", decodeTLV ? "TLV": "", sprint_hex(data, datalen));
+
+ int res = ExchangeAPDU14a(data, datalen, activateField, leaveSignalON, data, USB_CMD_DATA_SIZE, &datalen);
+
+ if (res)
+ return res;
+
+ PrintAndLog("<<<< %s", sprint_hex(data, datalen));
+
+ PrintAndLog("APDU response: %02x %02x - %s", data[datalen - 2], data[datalen - 1], GetAPDUCodeDescription(data[datalen - 2], data[datalen - 1]));
+
+ // TLV decoder
+ if (decodeTLV && datalen > 4) {
+ TLVPrintFromBuffer(data, datalen - 2);
+ }
+
+ return 0;
+}
+
+int CmdHF14ACmdRaw(const char *cmd) {
+ UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}};
+ bool reply=1;
+ bool crc = false;
+ bool power = false;
+ bool active = false;
+ bool active_select = false;
+ bool no_rats = false;
+ uint16_t numbits = 0;
+ bool bTimeout = false;
+ uint32_t timeout = 0;
+ bool topazmode = false;
+ char buf[5]="";
+ int i = 0;
+ uint8_t data[USB_CMD_DATA_SIZE];
+ uint16_t datalen = 0;
+ uint32_t temp;
+
+ if (strlen(cmd)<2) {
+ PrintAndLog("Usage: hf 14a raw [-r] [-c] [-p] [-f] [-b] [-t] <number of bits> <0A 0B 0C ... hex>");
+ PrintAndLog(" -r do not read response");
+ PrintAndLog(" -c calculate and append CRC");
+ PrintAndLog(" -p leave the signal field ON after receive");
+ PrintAndLog(" -a active signal field ON without select");
+ PrintAndLog(" -s active signal field ON with select");
+ PrintAndLog(" -b number of bits to send. Useful for send partial byte");
+ PrintAndLog(" -t timeout in ms");
+ PrintAndLog(" -T use Topaz protocol to send command");
+ PrintAndLog(" -3 ISO14443-3 select only (skip RATS)");
+ return 0;
+ }
+
+
+ // strip
+ while (*cmd==' ' || *cmd=='\t') cmd++;
+
+ while (cmd[i]!='\0') {
+ if (cmd[i]==' ' || cmd[i]=='\t') { i++; continue; }
+ if (cmd[i]=='-') {
+ switch (cmd[i+1]) {
+ case 'r':
+ reply = false;
+ break;
+ case 'c':
+ crc = true;
+ break;
+ case 'p':
+ power = true;
+ break;
+ case 'a':
+ active = true;
+ break;
+ case 's':
+ active_select = true;
+ break;
+ case 'b':