From 7853775ee27f4d94b2dd8d45e2de6a14d54cc043 Mon Sep 17 00:00:00 2001 From: "dn337t@gmail.com" Date: Tue, 29 May 2012 12:31:29 +0000 Subject: [PATCH] added CmdHF15CmdReadmulti using Adrian's second patch from issue 20 --- client/cmdhf15.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/client/cmdhf15.c b/client/cmdhf15.c index 708bacdd..298e47e2 100644 --- a/client/cmdhf15.c +++ b/client/cmdhf15.c @@ -715,6 +715,87 @@ int CmdHF15CmdSysinfo(const char *Cmd) { } +/** + * Commandline handling: HF15 CMD READMULTI + * Read multiple blocks at once (not all tags support this) + */ +int CmdHF15CmdReadmulti(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, pagenum,pagecount; + char cmdbuf[100]; + char *cmd=cmdbuf; + char output[2048]=""; + + strncpy(cmd,Cmd,99); + + // usage: + if (strlen(cmd)<3) { + PrintAndLog("Usage: hf 15 cmd readmulti [options] "); + 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_READMULTI},1); + reqlen=c.arg[0]; + + pagenum=strtol(cmd,NULL,0); + + // skip to next space + while (*cmd!=' ' && *cmd!='\t') cmd++; + // skip over the space + while (*cmd==' ' || *cmd=='\t') cmd++; + + pagecount=strtol(cmd,NULL,0); + if (pagecount>0) pagecount--; // 0 means 1 page, 1 means 2 pages, ... + + req[reqlen++]=(uint8_t)pagenum; + req[reqlen++]=(uint8_t)pagecount; + + 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 ( int i=1; iarg[0]-2; i++) { + sprintf(output+strlen(output),"%02hX ",recv[i]); + } + strcat(output," "); + for ( int i=1; iarg[0]-2; i++) { + sprintf(output+strlen(output),"%c",recv[i]>31 && recv[i]<127?recv[i]:'.'); + } + 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; +} + /** * Commandline handling: HF15 CMD READ @@ -889,9 +970,7 @@ static command_t CommandTable15Cmd[] = */ {"read", CmdHF15CmdRead, 0, "Read a block"}, {"write", CmdHF15CmdWrite, 0, "Write a block"}, -/* {"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"}, -- 2.39.2