]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhf15.c
added CmdHF15CmdReadmulti using Adrian's second patch from issue 20
[proxmark3-svn] / client / cmdhf15.c
index 031075092a9af418bb98948b149a670d42d8c38d..298e47e28b9973426878b455c1795fb46c5d7def 100644 (file)
@@ -1,6 +1,8 @@
 //-----------------------------------------------------------------------------
 // Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
 // Modified 2010 by <adrian -at- atrox.at>
+// Modified 2010, 2011 by <adrian -at- atrox.at>
+// Modified 2012 by <vsza at vsza.hu>
 //
 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
 // at your option, any later version. See the LICENSE.txt file for the text of
@@ -578,6 +580,7 @@ int prepareHF15Cmd(char **cmd, UsbCommand *c, uint8_t iso15cmd[], int iso15cmdle
                        reqlen+=iso15cmdlen;               
                   break;
                case '*':
+                       // we scan for the UID ourself
                        req[reqlen++]|= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | 
                       ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS;
                   memcpy(&req[reqlen],&iso15cmd[0],iso15cmdlen);
@@ -705,14 +708,99 @@ int CmdHF15CmdSysinfo(const char *Cmd) {
                        PrintAndLog("CRC failed");
                }
        } else {
-               PrintAndLog("no answer");
+               PrintAndLog("timeout: no answer");
        }
        
        return 0;
 }
 
 
+/**
+ * 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] <uid|s|*> <start#> <count#>");
+               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; i<r->arg[0]-2; i++) {
+                                       sprintf(output+strlen(output),"%02hX ",recv[i]);                                        
+                               }                                       
+                               strcat(output,"   ");
+                               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 {
+                               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
+ * Reads a single Block
+ */
 int CmdHF15CmdRead(const char *Cmd) {
        UsbCommand *r;  
        uint8_t *recv;
@@ -786,6 +874,10 @@ int CmdHF15CmdRead(const char *Cmd) {
 }
 
 
+/**
+ * Commandline handling: HF15 CMD WRITE
+ * Writes a single Block - might run into timeout, even when successful
+ */
 int CmdHF15CmdWrite(const char *Cmd) {
        UsbCommand *r;  
        uint8_t *recv;
@@ -861,7 +953,7 @@ int CmdHF15CmdWrite(const char *Cmd) {
                        PrintAndLog("CRC failed");
                }
        } else {
-               PrintAndLog("no answer");
+               PrintAndLog("timeout: no answer - data may be written anyway");
        }
        
        return 0;
@@ -878,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"},
Impressum, Datenschutz