const productName uidmapping[] = {
+ { 0xE001000000000000LL, 16, "Motorola" },
+ { 0xE002000000000000LL, 16, "ST Microelectronics" },
+ { 0xE003000000000000LL, 16, "Hitachi" },
+ { 0xE004000000000000LL, 16, "Philips" },
+ { 0xE004010000000000LL, 24, "Philips; IC SL2 ICS20" },
+ { 0xE005000000000000LL, 16, "Infineon" },
+ { 0xE005400000000000LL, 24, "Infineon; 56x32bit" },
+ { 0xE006000000000000LL, 16, "Cylinc" },
{ 0xE007000000000000LL, 16, "Texas Instrument; " },
{ 0xE007000000000000LL, 20, "Texas Instrument; Tag-it HF-I Plus Inlay; 64x32bit" },
{ 0xE007100000000000LL, 20, "Texas Instrument; Tag-it HF-I Plus Chip; 64x32bit" },
{ 0xE007C00000000000LL, 23, "Texas Instrument; Tag-it HF-I Standard; 8x32bit" },
{ 0xE007C40000000000LL, 23, "Texas Instrument; Tag-it HF-I Pro; 8x23bit; password" },
- { 0xE005000000000000LL, 16, "Infineon" },
- { 0xE005400000000000LL, 24, "Infineon; 56x32bit" },
- { 0xE004000000000000LL, 16, "Philips" },
- { 0xE002000000000000LL, 16, "STMicroelectronics" },
+ { 0xE008000000000000LL, 16, "Fujitsu" },
+ { 0xE009000000000000LL, 16, "Matsushita" },
+ { 0xE00A000000000000LL, 16, "NEC" },
+ { 0xE00B000000000000LL, 16, "Oki Electric" },
+ { 0xE00C000000000000LL, 16, "Toshiba" },
+ { 0xE00D000000000000LL, 16, "Mitsubishi" },
+ { 0xE00E000000000000LL, 16, "Samsung" },
+ { 0xE00F000000000000LL, 16, "Hyundai" },
+ { 0xE010000000000000LL, 16, "LG-Semiconductors" },
+ { 0xE012000000000000LL, 16, "HID Corporation" },
{ 0xE016000000000000LL, 16, "EM-Marin SA (Skidata)" },
{ 0xE016040000000000LL, 24, "EM-Marin SA (Skidata Keycard-eco); no memory" },
{ 0xE016100000000000LL, 24, "EM-Marin SA (Skidata); EM4135; 36x64bit start page 13" },
};
-// fast method to just read the UID of an tag (collission detection not supported)
-// *buf shouls be large enough to fit the 64bit uid
+// fast method to just read the UID of a tag (collission detection not supported)
+// *buf should be large enough to fit the 64bit uid
// returns 1 if suceeded
int getUID(uint8_t *buf)
{
int i=0;
uint8_t data[100];
unsigned int datalen=0, temp;
+ char *hexout;
if (strlen(cmd)<3) {
if (r!=NULL) {
recv = r->d.asBytes;
PrintAndLog("received %i octets",r->arg[0]);
- // TODO: output
+ hexout = (char *)malloc(r->arg[0] * 3 + 1);
+ if (hexout != NULL) {
+ for (int i = 0; i < r->arg[0]; i++) { // data in hex
+ sprintf(&hexout[i * 3], "%02hX ", recv[i]);
+ }
+ PrintAndLog("%s", hexout);
+ free(hexout);
+ }
} else {
PrintAndLog("timeout while waiting for reply.");
}
while (**cmd==' ' || **cmd=='\t') (*cmd)++;
if (strstr(*cmd,"-2")==*cmd) {
- c->arg[1]=0; // quse 1of256
+ c->arg[1]=0; // use 1of256
(*cmd)+=2;
}
+/**
+ * Commandline handling: HF15 CMD SYSINFO
+ * get system information from tag/VICC
+ */
+int CmdHF15CmdSysinfo(const char *Cmd) {
+ UsbCommand *r;
+ uint8_t *recv;
+ UsbCommand c = {CMD_ISO_15693_COMMAND, {0, 1, 1}}; // len,speed,recv?
+ uint8_t *req=c.d.asBytes;
+ int reqlen=0;
+ char cmdbuf[100];
+ char *cmd=cmdbuf;
+ char output[2048]="";
+ int i;
+
+ strncpy(cmd,Cmd,99);
+
+ // usage:
+ if (strlen(cmd)<1) {
+ PrintAndLog("Usage: hf 15 cmd sysinfo [options] <uid|s|*>");
+ PrintAndLog(" options:");
+ PrintAndLog(" -2 use slower '1 out of 256' mode");
+ PrintAndLog(" uid (either): ");
+ PrintAndLog(" <8B hex> full UID eg E011223344556677");
+ PrintAndLog(" s selected tag");
+ PrintAndLog(" u unaddressed mode");
+ PrintAndLog(" * scan for tag");
+ PrintAndLog(" start#: page number to start 0-255");
+ PrintAndLog(" count#: number of pages");
+ return 0;
+ }
+
+ prepareHF15Cmd(&cmd, &c,(uint8_t[]){ISO15_CMD_SYSINFO},1);
+ reqlen=c.arg[0];
+
+ reqlen=AddCrc(req,reqlen);
+ c.arg[0]=reqlen;
+
+ SendCommand(&c);
+
+ r=WaitForResponseTimeout(CMD_ACK,1000);
+
+ if (r!=NULL && r->arg[0]>2) {
+ recv = r->d.asBytes;
+ if (ISO15_CRC_CHECK==Crc(recv,r->arg[0])) {
+ if (!(recv[0] & ISO15_RES_ERROR)) {
+ *output=0; // reset outputstring
+ for ( i=1; i<r->arg[0]-2; i++) {
+ sprintf(output+strlen(output),"%02hX ",recv[i]);
+ }
+ strcat(output,"\n\r");
+ strcat(output,"UID = ");
+ strcat(output,sprintUID(NULL,recv+2));
+ strcat(output,"\n\r");
+ strcat(output,getTagInfo(recv+2)); //ABC
+ strcat(output,"\n\r");
+ i=10;
+ if (recv[1] & 0x01)
+ sprintf(output+strlen(output),"DSFID supported, set to %02hX\n\r",recv[i++]);
+ else
+ strcat(output,"DSFID not supported\n\r");
+ if (recv[1] & 0x02)
+ sprintf(output+strlen(output),"AFI supported, set to %03hX\n\r",recv[i++]);
+ else
+ strcat(output,"AFI not supported\n\r");
+ if (recv[1] & 0x04) {
+ strcat(output,"Tag provides info on memory layout (vendor dependent)\n\r");
+ sprintf(output+strlen(output)," %i (or %i) bytes/page x %i pages \n\r",
+ (recv[i+1]&0x1F)+1, (recv[i+1]&0x1F), recv[i]+1);
+ i+=2;
+ } else
+ strcat(output,"Tag does not provide information on memory layout\n\r");
+ if (recv[1] & 0x08) sprintf(output+strlen(output),"IC reference given: %02hX\n\r",recv[i++]);
+ else strcat(output,"IC reference not given\n\r");
+
+
+ PrintAndLog("%s",output);
+ } else {
+ PrintAndLog("Tag returned Error %i: %s",recv[0],TagErrorStr(recv[0]));
+ }
+ } else {
+ PrintAndLog("CRC failed");
+ }
+ } else {
+ PrintAndLog("no answer");
+ }
+
+ return 0;
+}
+
+
+
int CmdHF15CmdRead(const char *Cmd) {
UsbCommand *r;
uint8_t *recv;
sprintf(output+strlen(output),"%02hX ",recv[i]);
}
strcat(output," ");
- for ( int i=2; i<r->arg[0]-2; i++) {
- sprintf(output+strlen(output),"%c",recv[i]>31 || recv[i]<127?recv[i]:'.');
+ for ( int i=1; i<r->arg[0]-2; i++) {
+ sprintf(output+strlen(output),"%c",recv[i]>31 && recv[i]<127?recv[i]:'.');
}
PrintAndLog("%s",output);
} else {
/*
{"readmulti",CmdHF15CmdReadmulti, 0, "Reads multiple Blocks"},
*/
+ {"sysinfo", CmdHF15CmdSysinfo, 0, "Get Card Information"},
{"raw", CmdHF15CmdRaw, 0, "Send raw hex data to tag"},
{"debug", CmdHF15CmdDebug, 0, "Turn debugging on/off"},
{NULL, NULL, 0, NULL}