]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
ADD: 'lf visa2000' commands. (SIM/CLONE/READ) almost finished.
authoriceman1001 <iceman@iuse.se>
Wed, 14 Dec 2016 22:23:16 +0000 (23:23 +0100)
committericeman1001 <iceman@iuse.se>
Wed, 14 Dec 2016 22:23:16 +0000 (23:23 +0100)
CHG: 'lf xxxxx'  reduced number of samples from 30000 -> 20000 in "lf xxxxxx read" commands.
CHG: 'data samples'  - didn't honor the silent parameter. It now output less for the 'lf xxxxxx read' commands.

client/Makefile
client/cmddata.c
client/cmdlf.c
client/cmdlf.h
client/cmdlfguard.c
client/cmdlfio.c
client/cmdlfjablotron.c
client/cmdlfnedap.c
client/cmdlfpresco.c
client/cmdlfpyramid.c
client/cmdlfviking.c

index 68a8b1889031c084267bb72e18abdeab93c82074..3b5f34f533411e7048325bbd05911c3a9030942f 100644 (file)
@@ -140,6 +140,7 @@ CMDSRCS =   mifarehost.c \
                        cmdlfguard.c \
                        cmdlfnedap.c \
                        cmdlfjablotron.c \
+                       cmdlfvisa2000.c \
                        pm3_binlib.c \
                        scripting.c \
                        cmdscript.c \
index f59b7342b3d9b90b9422b40c92858753ef08f7f5..08ff7aa8d9156dbec3594ed2fc45387e33e2bb8b 100644 (file)
@@ -1288,42 +1288,46 @@ int CmdFSKdemodParadox(const char *Cmd)
 //print ioprox ID and some format details
 int CmdFSKdemodIO(const char *Cmd)
 {
-       int idx=0;
+       int retval = 0;
+       int idx = 0;
+       char crcStr[20];
+       memset(crcStr, 0x00, sizeof(crcStr) );
+
        //something in graphbuffer?
        if (GraphTraceLen < 65) {
                if (g_debugMode)PrintAndLog("DEBUG: not enough samples in GraphBuffer");
-               return 0;
+               return retval;
        }
        uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
-       size_t BitLen = getFromGraphBuf(BitStream);
-       if (BitLen==0) return 0;
+       size_t bitlen = getFromGraphBuf(BitStream);
+       if (bitlen == 0) return retval;
 
        //get binary from fsk wave
-       idx = IOdemodFSK(BitStream,BitLen);
+       idx = IOdemodFSK(BitStream, bitlen);
        if (idx<0){
                if (g_debugMode){
                        if (idx==-1){
-                               PrintAndLog("DEBUG: Just Noise Detected");     
+                               PrintAndLog("DEBUG: IO Prox - Just Noise Detected");     
                        } else if (idx == -2) {
-                               PrintAndLog("DEBUG: not enough samples");
+                               PrintAndLog("DEBUG: IO Prox - not enough samples");
                        } else if (idx == -3) {
-                               PrintAndLog("DEBUG: error during fskdemod");        
+                               PrintAndLog("DEBUG: IO Prox - error during fskdemod");        
                        } else if (idx == -4) {
-                               PrintAndLog("DEBUG: Preamble not found");
+                               PrintAndLog("DEBUG: IO Prox - Preamble not found");
                        } else if (idx == -5) {
-                               PrintAndLog("DEBUG: Separator bits not found");
+                               PrintAndLog("DEBUG: IO Prox - Separator bits not found");
                        } else {
-                               PrintAndLog("DEBUG: Error demoding fsk %d", idx);
+                               PrintAndLog("DEBUG: IO Prox - Error demoding fsk %d", idx);
                        }
                }
-               return 0;
+               return retval;
        }
        if (idx==0){
                if (g_debugMode){
-                       PrintAndLog("DEBUG: IO Prox Data not found - FSK Bits: %d",BitLen);
-                       if (BitLen > 92) PrintAndLog("%s", sprint_bin_break(BitStream,92,16));
+                       PrintAndLog("DEBUG: IO Prox - Data not found - FSK Bits: %d", bitlen);
+                       if (bitlen > 92) PrintAndLog("%s", sprint_bin_break(BitStream,92,16));
                } 
-               return 0;
+               return retval;
        }
                //Index map
                //0           10          20          30          40          50          60
@@ -1334,10 +1338,11 @@ int CmdFSKdemodIO(const char *Cmd)
                //
                //XSF(version)facility:codeone+codetwo (raw)
                //Handle the data
-       if (idx+64>BitLen) {
-               if (g_debugMode) PrintAndLog("not enough bits found - bitlen: %d",BitLen);
-               return 0;
+       if (idx + 64 > bitlen) {
+               if (g_debugMode) PrintAndLog("DEBUG: IO Prox - not enough bits found - bitlen: %d", bitlen);
+               return retval;
        }
+       
        if (g_debugMode) {
                PrintAndLog("%d%d%d%d%d%d%d%d %d", BitStream[idx], BitStream[idx+1], BitStream[idx+2], BitStream[idx+3], BitStream[idx+4], BitStream[idx+5], BitStream[idx+6], BitStream[idx+7], BitStream[idx+8]);
                PrintAndLog("%d%d%d%d%d%d%d%d %d", BitStream[idx+9], BitStream[idx+10], BitStream[idx+11],BitStream[idx+12],BitStream[idx+13],BitStream[idx+14],BitStream[idx+15],BitStream[idx+16],BitStream[idx+17]);
@@ -1356,21 +1361,29 @@ int CmdFSKdemodIO(const char *Cmd)
        uint8_t crc = bytebits_to_byte(BitStream+idx+54,8);
        uint16_t calccrc = 0;
 
-       for (uint8_t i=1; i<6; ++i){
-               calccrc += bytebits_to_byte(BitStream+idx+9*i,8);
+       for (uint8_t i = 1; i < 6; ++i){
+               calccrc += bytebits_to_byte(BitStream + idx + 9 * i ,8);
        }
        calccrc &= 0xff;
        calccrc = 0xff - calccrc;
 
-       char *crcStr = (crc == calccrc) ? "crc ok": "!crc";
+       if  (crc == calccrc) {
+               snprintf(crcStr, 3, "ok");
+               retval = 1;
+       } else {
+               if (g_debugMode) PrintAndLog("DEBUG: IO Prox - crc failed");
+                       
+               snprintf(crcStr, 20, "failed 0x%02X != 0x%02X", crc, calccrc);
+               retval = 0;
+       }
 
-       PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]",version,facilitycode,number,code,code2, crc, crcStr);
+       PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [crc %s]",version,facilitycode,number,code,code2, crcStr);
        setDemodBuf(BitStream,64,idx);
        if (g_debugMode){
-               PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx,64);
+               PrintAndLog("DEBUG: IO Prox - idx: %d, Len: %d, Printing demod buffer:", idx, 64);
                printDemodBuff();
-       }
-       return 1;
+       }       
+       return retval;
 }
 
 //by marshmellow
@@ -1704,8 +1717,7 @@ int CmdFDXBdemodBI(const char *Cmd){
        PrintAndLog("reserved Code: %u", reservedCode);
        PrintAndLog("Animal Tag:    %s", animalBit ? "True" : "False");
        PrintAndLog("CRC:           0x%04X - [%04X] - %s", crc16, calcCrc, (calcCrc == crc16) ? "Passed" : "Failed");
-       PrintAndLog("Extended:      0x%X\n", extended);
-       
+       PrintAndLog("Extended:      0x%X\n", extended); 
        return 1;
 }
 
@@ -1771,8 +1783,7 @@ int CmdIndalaDecode(const char *Cmd)
        }
 
        if (!ans){
-               if (g_debugMode) 
-                       PrintAndLog("Error1: %d",ans);
+               if (g_debugMode) PrintAndLog("DEBUG: Indala - Can't demod signal: %d",ans);
                return 0;
        }
 
@@ -1780,33 +1791,31 @@ int CmdIndalaDecode(const char *Cmd)
        size_t size = DemodBufferLen;
        int startIdx = indala26decode(DemodBuffer, &size, &invert);
        if (startIdx < 0 || size > 224) {
-               if (g_debugMode)
-                       PrintAndLog("Error2: %d",ans);
+               if (g_debugMode) PrintAndLog("DEBUG: Indala - Wrong size, expected [64|224] got: %d", size);
                return -1;
        }
        setDemodBuf(DemodBuffer, size, (size_t)startIdx);
        if (invert)
-               if (g_debugMode)
-                       PrintAndLog("Had to invert bits");
+               if (g_debugMode) PrintAndLog("DEBUG: Indala - Had to invert bits");
 
        PrintAndLog("BitLen: %d",DemodBufferLen);
        //convert UID to HEX
        uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
-       uid1=bytebits_to_byte(DemodBuffer,32);
-       uid2=bytebits_to_byte(DemodBuffer+32,32);
+       uid1 = bytebits_to_byte(DemodBuffer,32);
+       uid2 = bytebits_to_byte(DemodBuffer+32,32);
        if (DemodBufferLen==64){
                PrintAndLog("Indala UID=%s (%x%08x)",  sprint_bin_break(DemodBuffer,DemodBufferLen,16), uid1, uid2);
        } else {
-               uid3=bytebits_to_byte(DemodBuffer+64,32);
-               uid4=bytebits_to_byte(DemodBuffer+96,32);
-               uid5=bytebits_to_byte(DemodBuffer+128,32);
-               uid6=bytebits_to_byte(DemodBuffer+160,32);
-               uid7=bytebits_to_byte(DemodBuffer+192,32);
+               uid3 = bytebits_to_byte(DemodBuffer+64,32);
+               uid4 = bytebits_to_byte(DemodBuffer+96,32);
+               uid5 = bytebits_to_byte(DemodBuffer+128,32);
+               uid6 = bytebits_to_byte(DemodBuffer+160,32);
+               uid7 = bytebits_to_byte(DemodBuffer+192,32);
                PrintAndLog("Indala UID=%s (%x%08x%08x%08x%08x%08x%08x)", 
                     sprint_bin_break(DemodBuffer,DemodBufferLen,16), uid1, uid2, uid3, uid4, uid5, uid6, uid7);
        }
        if (g_debugMode){
-               PrintAndLog("DEBUG: printing demodbuffer:");
+               PrintAndLog("DEBUG: Indala - printing demodbuffer:");
                printDemodBuff();
        }
        return 1;
@@ -2091,9 +2100,9 @@ int getSamples(const char *Cmd, bool silent)
        if ( n == 0 || n > sizeof(got))
                n = sizeof(got);
 
-       PrintAndLog("Reading %d bytes from device memory\n", n);
+       if (!silent) PrintAndLog("Reading %d bytes from device memory\n", n);
        GetFromBigBuf(got,n,0);
-       PrintAndLog("Data fetched");
+       if (!silent) PrintAndLog("Data fetched");
        UsbCommand response;
        if ( !WaitForResponseTimeout(CMD_ACK, &response, 10000) ) {
         PrintAndLog("timeout while waiting for reply.");
@@ -2105,12 +2114,12 @@ int getSamples(const char *Cmd, bool silent)
        //Old devices without this feature would send 0 at arg[0]
        if (response.arg[0] > 0) {
                sample_config *sc = (sample_config *) response.d.asBytes;
-               PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample, sc->decimation);
+               if (!silent) PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample, sc->decimation);
                bits_per_sample = sc->bits_per_sample;
        }
        
        if (bits_per_sample < 8) {
-               PrintAndLog("Unpacking...");
+               if (!silent) PrintAndLog("Unpacking...");
                BitstreamOut bout = { got, bits_per_sample * n,  0};
                int j =0;
                for (j = 0; j * bits_per_sample < n * 8 && j < n; j++) {
@@ -2118,7 +2127,7 @@ int getSamples(const char *Cmd, bool silent)
                        GraphBuffer[j] = ((int) sample )- 128;
                }
                GraphTraceLen = j;
-               PrintAndLog("Unpacked %d samples" , j );
+               if (!silent) PrintAndLog("Unpacked %d samples" , j );
        } else {
                for (int j = 0; j < n; j++) {
                        GraphBuffer[j] = ((int)got[j]) - 128;
index d64a15c5adc2312aedbbd97cf2b37dd384735df6..63e8a2b5012dbde937055476ae2e1de23301036f 100644 (file)
@@ -249,8 +249,9 @@ int CmdFlexdemod(const char *Cmd)
   
 int CmdIndalaDemod(const char *Cmd)
 {
+       // PSK1, Bitrate 32, 
+       
        // Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID
-
        int state = -1;
        int count = 0;
        int i, j;
@@ -1012,7 +1013,7 @@ int CmdLFfind(const char *Cmd) {
 
        if (!offline && (cmdp != '1')){
                CmdLFRead("s");
-               getSamples("30000",false);
+               getSamples("30000", TRUE);
        } else if (GraphTraceLen < 1000) {
                PrintAndLog("Data in Graphbuffer was too small.");
                return 0;
@@ -1028,8 +1029,6 @@ int CmdLFfind(const char *Cmd) {
        PrintAndLog("False Positives ARE possible\n");  
        PrintAndLog("\nChecking for known tags:\n");
 
-
-               
        ans=CmdFSKdemodIO("");
        if (ans>0) {
                PrintAndLog("\nValid IO Prox ID Found!");
@@ -1100,6 +1099,11 @@ int CmdLFfind(const char *Cmd) {
                PrintAndLog("\nValid NEDAP ID Found!");
                return 1;
        }
+       ans=CmdVisa2kDemod("");
+       if (ans>0) {
+               PrintAndLog("\nValid Visa2000 ID Found!");
+               return 1;
+       }
        // TIdemod?
        
 
@@ -1172,6 +1176,7 @@ static command_t CommandTable[] =
        {"guard",       CmdLFGuard,         1, "{ Guardall RFIDs... }"},
        {"hid",         CmdLFHID,           1, "{ HID RFIDs... }"},
        {"hitag",       CmdLFHitag,         1, "{ HITAG RFIDs... }"},
+//     {"indala",              CmdLFIndala,            1, "{ Indala RFIDs... }"},
        {"io",                  CmdLFIO,                        1, "{ IOPROX RFIDs... }"},
        {"jablotron",   CmdLFJablotron,         1, "{ JABLOTRON RFIDs... }"},
        {"nedap",               CmdLFNedap,                     1, "{ NEDAP RFIDs... }"},
@@ -1181,6 +1186,7 @@ static command_t CommandTable[] =
        {"ti",          CmdLFTI,            1, "{ TI RFIDs... }"},
        {"t55xx",       CmdLFT55XX,         1, "{ T55xx RFIDs... }"},
        {"viking",      CmdLFViking,        1, "{ Viking RFIDs... }"},
+       {"visa2000",    CmdLFVisa2k,        1, "{ Visa2000 RFIDs... }"},
        {"config",      CmdLFSetConfig,     0, "Set config for LF sampling, bit/sample, decimation, frequency"},
        {"cmdread",     CmdLFCommandRead,   0, "<off period> <'0' period> <'1' period> <command> ['h' 134] \n\t\t-- Modulate LF reader field to send command before read (all periods in microseconds)"},
        {"flexdemod",   CmdFlexdemod,       1, "Demodulate samples for FlexPass"},
index 9b9c495f992ef0b979128be0c6340ff645d6d4b6..bb77ed1780f776efa343b3db5ac09ee36ac3e9c0 100644 (file)
@@ -38,6 +38,7 @@
 #include "cmdlfguard.h"                // for GuardAll menu
 #include "cmdlfnedap.h"                // for NEDAP menu
 #include "cmdlfjablotron.h"    // for JABLOTRON menu
+#include "cmdlfvisa2000.h"  // for VISA2000 menu
 
 int CmdLF(const char *Cmd);
 
index a6bc5e87f85bd22e235bb347a5339574e9d14c3d..43492678ccb233b19e74f742267d663c24c5efa9 100644 (file)
@@ -122,7 +122,7 @@ int GetGuardBits(uint32_t fc, uint32_t cn, uint8_t *guardBits) {
 
 int CmdGuardRead(const char *Cmd) {
        CmdLFRead("s");
-       getSamples("30000",false);
+       getSamples("20000", TRUE);
        return CmdG_Prox_II_Demod("");
 }
 
index 826a26b2f443c0650cfea6027ca3e99c152d99c1..20530d171d94e3c60651d7186d0eba5ef0a11ed0 100644 (file)
@@ -38,7 +38,7 @@ int usage_lf_io_clone(void) {
        PrintAndLog("Enables cloning of IOProx card with specified facility-code and card number onto T55x7.");
        PrintAndLog("The T55x7 must be on the antenna when issuing this command.  T55x7 blocks are calculated and printed in the process.");
        PrintAndLog("");
-       PrintAndLog("Usage:  lf awid clone [h] <version> <facility-code> <card-number> [Q5]");
+       PrintAndLog("Usage:  lf io clone [h] <version> <facility-code> <card-number> [Q5]");
        PrintAndLog("Options :");
        PrintAndLog("                h :  This help");  
        PrintAndLog("        <version> :  8bit version");
index bd99fede512f47aebd5f866826fdedf12525ebab..eff0124dd993cc6f56ef93ecfdfdef1835d68c2a 100644 (file)
@@ -130,7 +130,7 @@ int CmdJablotronDemod(const char *Cmd) {
 
 int CmdJablotronRead(const char *Cmd) {
        CmdLFRead("s");
-       getSamples("30000",false);
+       getSamples("20000", TRUE);
        return CmdJablotronDemod(Cmd);
 }
 
index 0c56c8e2a6bea7add08b1f1203552c9855a850af..1b745a11d365ab1c4d8164dd1a3f9b5ce1405c46 100644 (file)
@@ -202,7 +202,7 @@ lf t55xx wr b 4 d 4c0003ff
 
 int CmdLFNedapRead(const char *Cmd) {
        CmdLFRead("s");
-       getSamples("30000",false);
+       getSamples("20000", TRUE);
        return CmdLFNedapDemod("");
 }
 /*
index 829e2e6f5bbc91ae152cf294a079dac66a4b9c1c..3bf5e1be68c54831e8a837bf5267680883a0747d 100644 (file)
@@ -153,7 +153,7 @@ int CmdPrescoRead(const char *Cmd) {
        // read lf silently
        CmdLFRead("s");
        // get samples silently
-       getSamples("30000",false);
+       getSamples("20000", TRUE);
        // demod and output Presco ID   
        return CmdPrescoDemod(Cmd);
 }
index cf8b2b44cb4077c408aa32b73c290e1cef7eb293..f1097121a2090373af8fe45b77a6a3bc3bb518b0 100644 (file)
@@ -74,7 +74,7 @@ int GetPyramidBits(uint32_t fc, uint32_t cn, uint8_t *pyramidBits) {
 
 int CmdPyramidRead(const char *Cmd) {
        CmdLFRead("s");
-       getSamples("30000",false);
+       getSamples("20000", TRUE);
        return CmdFSKdemodPyramid("");
 }
 
index 039e4ae6015a3bdd7a99a4a63df69d614f777d7a..4ea3542280267cb74cceb5a6067c86b63564c7cd 100644 (file)
@@ -60,7 +60,7 @@ int CmdVikingRead(const char *Cmd) {
        // read lf silently
        CmdLFRead("s");
        // get samples silently
-       getSamples("30000",false);
+       getSamples("20000", TRUE);
        // demod and output viking ID   
        return CmdVikingDemod(Cmd);
 }
Impressum, Datenschutz