]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhf15.c
Enhanced hf mf chk , add default key,support dic file and so on.
[proxmark3-svn] / client / cmdhf15.c
index 0b8680c0667aff55f572ac9e0ae5089709976795..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
@@ -445,6 +447,7 @@ int CmdHF15CmdRaw (const char *cmd) {
        int i=0;
        uint8_t data[100];
        unsigned int datalen=0, temp;
+       char *hexout;
 
        
        if (strlen(cmd)<3) {
@@ -514,7 +517,14 @@ int CmdHF15CmdRaw (const char *cmd) {
                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.");
                }
@@ -570,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);
@@ -697,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;
@@ -778,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;
@@ -853,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;
@@ -870,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