+
+ return HF14BCmdRaw(reply, &crc, power, data, &datalen, true);
+}
+
+
+void print_atqb_resp(uint8_t *data){
+ PrintAndLog (" UID: %s", sprint_hex(data+1,4));
+ PrintAndLog (" App Data: %s", sprint_hex(data+5,4));
+ PrintAndLog (" Protocol: %s", sprint_hex(data+9,3));
+ uint8_t BitRate = data[9];
+ if (!BitRate)
+ PrintAndLog (" Bit Rate: 106 kbit/s only PICC <-> PCD");
+ if (BitRate & 0x10)
+ PrintAndLog (" Bit Rate: 212 kbit/s PICC -> PCD supported");
+ if (BitRate & 0x20)
+ PrintAndLog (" Bit Rate: 424 kbit/s PICC -> PCD supported");
+ if (BitRate & 0x40)
+ PrintAndLog (" Bit Rate: 847 kbit/s PICC -> PCD supported");
+ if (BitRate & 0x01)
+ PrintAndLog (" Bit Rate: 212 kbit/s PICC <- PCD supported");
+ if (BitRate & 0x02)
+ PrintAndLog (" Bit Rate: 424 kbit/s PICC <- PCD supported");
+ if (BitRate & 0x04)
+ PrintAndLog (" Bit Rate: 847 kbit/s PICC <- PCD supported");
+ if (BitRate & 0x80)
+ PrintAndLog (" Same bit rate <-> required");
+
+ uint16_t maxFrame = data[10]>>4;
+ if (maxFrame < 5)
+ maxFrame = 8*maxFrame + 16;
+ else if (maxFrame == 5)
+ maxFrame = 64;
+ else if (maxFrame == 6)
+ maxFrame = 96;
+ else if (maxFrame == 7)
+ maxFrame = 128;
+ else if (maxFrame == 8)
+ maxFrame = 256;
+ else
+ maxFrame = 257;
+
+ PrintAndLog ("Max Frame Size: %d%s",maxFrame, (maxFrame == 257) ? "+ RFU" : "");
+
+ uint8_t protocolT = data[10] & 0xF;
+ PrintAndLog (" Protocol Type: Protocol is %scompliant with ISO/IEC 14443-4",(protocolT) ? "" : "not " );
+ PrintAndLog ("Frame Wait Int: %d", data[11]>>4);
+ PrintAndLog (" App Data Code: Application is %s",(data[11]&4) ? "Standard" : "Proprietary");
+ PrintAndLog (" Frame Options: NAD is %ssupported",(data[11]&2) ? "" : "not ");
+ PrintAndLog (" Frame Options: CID is %ssupported",(data[11]&1) ? "" : "not ");
+
+ return;
+}
+
+int HF14BStdRead(uint8_t *data, uint8_t *datalen){
+ bool crc = true;
+ *datalen = 3;
+ //std read cmd
+ data[0] = 0x05;
+ data[1] = 0x00;
+ data[2] = 0x08;
+ //data[3] = 0x39;
+ //data[4] = 0x73;
+
+ int ans = HF14BCmdRaw(true, &crc, false, data, datalen, false);
+
+ if (!ans) return 0;
+ if (data[0] != 0x50 || *datalen < 14 || !crc) return 0;
+
+ PrintAndLog ("\n14443-3b tag found:");
+ print_atqb_resp(data);
+
+ return 1;
+}
+
+int HF14B_ST_Read(uint8_t *data, uint8_t *datalen){
+ bool crc = true;
+ *datalen = 2;
+ //std read cmd
+ data[0] = 0x06;
+ data[1] = 0x00;
+ int ans = HF14BCmdRaw(true, &crc, true, data, datalen, false);
+
+ if (!ans) return 0;
+ if (*datalen < 3 || !crc) return 0;
+
+ uint8_t chipID = data[0];
+ data[0] = 0x0E;
+ data[1] = chipID;
+ *datalen = 2;
+ ans = HF14BCmdRaw(true, &crc, true, data, datalen, false);
+
+ if (!ans) return 0;
+ if (*datalen < 3 || !crc) return 0;
+
+ data[0] = 0x0B;
+ *datalen = 1;
+ ans = HF14BCmdRaw(true, &crc, false, data, datalen, false);
+
+ if (!ans) return 0;
+ if (*datalen < 10 || !crc) return 0;
+
+ PrintAndLog ("14443-3b ST tag found");
+ //uid = first 8 bytes in data
+ PrintAndLog ("UID: %s", sprint_hex(data,8));
+ return 1;
+
+}
+
+int CmdHF14BReader(const char *Cmd)