]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
split hid demod/awid demod to respective files
authormarshmellow42 <marshmellowrf@gmail.com>
Wed, 22 Mar 2017 19:49:01 +0000 (15:49 -0400)
committermarshmellow42 <marshmellowrf@gmail.com>
Wed, 22 Mar 2017 19:49:01 +0000 (15:49 -0400)
NOTE: see changelog.md for cli changes

CHANGELOG.md
client/cmddata.c
client/cmddata.h
client/cmdlfawid.c
client/cmdlfhid.c
client/cmdlfhid.h

index d1ca8348e6b84649d456b3871de20bbdb7caee8d..189e72d4fea97cf092392f2f755b828e54b647d5 100644 (file)
@@ -45,6 +45,10 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
 - Added option c to 'hf list' (mark CRC bytes) (piwi)
 
 ### Changed
 - Added option c to 'hf list' (mark CRC bytes) (piwi)
 
 ### Changed
+- `data fskawiddemod` has been moved to `lf awid demod` (reads from graphbuffer)
+- `lf awid fskdemod` has been renamed to `lf awid read` (reads from antenna)
+- `data fskhiddemod` has been moved to `lf hid demod` (reads from graphbuffer)
+- `lf hid demod` has been renamed to `lf hid read` (reads from antenna)
 - all em410x demod and print functions moved to cmdlfem4x.c
 - `data askem410xdemod` has been moved to `lf em 410xdemod` (reads from graphbuffer)
 - `lf em 410xdemod` has been renamed to `lf em 410xread` (reads from antenna)
 - all em410x demod and print functions moved to cmdlfem4x.c
 - `data askem410xdemod` has been moved to `lf em 410xdemod` (reads from graphbuffer)
 - `lf em 410xdemod` has been renamed to `lf em 410xread` (reads from antenna)
index f6aed3838345b6b1f598ccbd8b7e3ca75502c0e0..de85b2809aa9a4ed3a8e5c8db93b2a4d1f29a3d2 100644 (file)
@@ -894,94 +894,6 @@ int CmdFSKrawdemod(const char *Cmd)
        return FSKrawDemod(Cmd, true);
 }
 
        return FSKrawDemod(Cmd, true);
 }
 
-//move to cmdlfhid.c
-//by marshmellow (based on existing demod + holiman's refactor)
-//HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded)
-//print full HID Prox ID and some bit format details if found
-int CmdFSKdemodHID(const char *Cmd)
-{
-       //raw fsk demod no manchester decoding no start bit finding just get binary from wave
-       uint32_t hi2=0, hi=0, lo=0;
-
-       uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
-       size_t BitLen = getFromGraphBuf(BitStream);
-       if (BitLen==0) return 0;
-       //get binary from fsk wave
-       int idx = HIDdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo);
-       if (idx<0){
-               if (g_debugMode){
-                       if (idx==-1){
-                               PrintAndLog("DEBUG: Just Noise Detected");
-                       } else if (idx == -2) {
-                               PrintAndLog("DEBUG: Error demoding fsk");
-                       } else if (idx == -3) {
-                               PrintAndLog("DEBUG: Preamble not found");
-                       } else if (idx == -4) {
-                               PrintAndLog("DEBUG: Error in Manchester data, SIZE: %d", BitLen);
-                       } else {
-                               PrintAndLog("DEBUG: Error demoding fsk %d", idx);
-                       }   
-               }
-               return 0;
-       }
-       if (hi2==0 && hi==0 && lo==0) {
-               if (g_debugMode) PrintAndLog("DEBUG: Error - no values found");
-               return 0;
-       }
-       if (hi2 != 0){ //extra large HID tags
-               PrintAndLog("HID Prox TAG ID: %x%08x%08x (%d)",
-                        (unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
-       }
-       else {  //standard HID tags <38 bits
-               uint8_t fmtLen = 0;
-               uint32_t fc = 0;
-               uint32_t cardnum = 0;
-               if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
-                       uint32_t lo2=0;
-                       lo2=(((hi & 31) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
-                       uint8_t idx3 = 1;
-                       while(lo2>1){ //find last bit set to 1 (format len bit)
-                               lo2=lo2>>1;
-                               idx3++;
-                       }
-                       fmtLen =idx3+19;
-                       fc =0;
-                       cardnum=0;
-                       if(fmtLen==26){
-                               cardnum = (lo>>1)&0xFFFF;
-                               fc = (lo>>17)&0xFF;
-                       }
-                       if(fmtLen==34){
-                               cardnum = (lo>>1)&0xFFFF;
-                               fc= ((hi&1)<<15)|(lo>>17);
-                       }
-                       if(fmtLen==35){
-                               cardnum = (lo>>1)&0xFFFFF;
-                               fc = ((hi&1)<<11)|(lo>>21);
-                       }
-               }
-               else { //if bit 38 is not set then 37 bit format is used
-                       fmtLen = 37;
-                       fc = 0;
-                       cardnum = 0;
-                       if(fmtLen == 37){
-                               cardnum = (lo>>1)&0x7FFFF;
-                               fc = ((hi&0xF)<<12)|(lo>>20);
-                       }
-               }
-               PrintAndLog("HID Prox TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
-                       (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF,
-                       (unsigned int) fmtLen, (unsigned int) fc, (unsigned int) cardnum);
-       }
-       setDemodBuf(BitStream,BitLen,idx);
-       if (g_debugMode){ 
-               PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen);
-               printDemodBuff();
-       }
-       return 1;
-}
-
-
 //by marshmellow
 //Paradox Prox demod - FSK RF/50 with preamble of 00001111 (then manchester encoded)
 //print full Paradox Prox ID and some bit format details if found
 //by marshmellow
 //Paradox Prox demod - FSK RF/50 with preamble of 00001111 (then manchester encoded)
 //print full Paradox Prox ID and some bit format details if found
@@ -1119,103 +1031,6 @@ int CmdFSKdemodIO(const char *Cmd)
        return 1;
 }
 
        return 1;
 }
 
-//by marshmellow
-//AWID Prox demod - FSK RF/50 with preamble of 00000001  (always a 96 bit data stream)
-//print full AWID Prox ID and some bit format details if found
-int CmdFSKdemodAWID(const char *Cmd)
-{
-       uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
-       size_t size = getFromGraphBuf(BitStream);
-       if (size==0) return 0;
-
-       //get binary from fsk wave
-       int idx = AWIDdemodFSK(BitStream, &size);
-       if (idx<=0){
-               if (g_debugMode){
-                       if (idx == -1)
-                               PrintAndLog("DEBUG: Error - not enough samples");
-                       else if (idx == -2)
-                               PrintAndLog("DEBUG: Error - only noise found");
-                       else if (idx == -3)
-                               PrintAndLog("DEBUG: Error - problem during FSK demod");
-                       else if (idx == -4)
-                               PrintAndLog("DEBUG: Error - AWID preamble not found");
-                       else if (idx == -5)
-                               PrintAndLog("DEBUG: Error - Size not correct: %d", size);
-                       else
-                               PrintAndLog("DEBUG: Error %d",idx);
-               }
-               return 0;
-       }
-
-       // Index map
-       // 0            10            20            30              40            50              60
-       // |            |             |             |               |             |               |
-       // 01234567 890 1 234 5 678 9 012 3 456 7 890 1 234 5 678 9 012 3 456 7 890 1 234 5 678 9 012 3 - to 96
-       // -----------------------------------------------------------------------------
-       // 00000001 000 1 110 1 101 1 011 1 101 1 010 0 000 1 000 1 010 0 001 0 110 1 100 0 000 1 000 1
-       // premable bbb o bbb o bbw o fff o fff o ffc o ccc o ccc o ccc o ccc o ccc o wxx o xxx o xxx o - to 96
-       //          |---26 bit---|    |-----117----||-------------142-------------|
-       // b = format bit len, o = odd parity of last 3 bits
-       // f = facility code, c = card number
-       // w = wiegand parity
-       // (26 bit format shown)
-       //get raw ID before removing parities
-       uint32_t rawLo = bytebits_to_byte(BitStream+idx+64,32);
-       uint32_t rawHi = bytebits_to_byte(BitStream+idx+32,32);
-       uint32_t rawHi2 = bytebits_to_byte(BitStream+idx,32);
-       setDemodBuf(BitStream,96,idx);
-
-       size = removeParity(BitStream, idx+8, 4, 1, 88);
-       if (size != 66){
-               if (g_debugMode) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format");
-               return 0;
-       }
-       // ok valid card found!
-
-       // Index map
-       // 0           10         20        30          40        50        60
-       // |           |          |         |           |         |         |
-       // 01234567 8 90123456 7890123456789012 3 456789012345678901234567890123456
-       // -----------------------------------------------------------------------------
-       // 00011010 1 01110101 0000000010001110 1 000000000000000000000000000000000
-       // bbbbbbbb w ffffffff cccccccccccccccc w xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-       // |26 bit|   |-117--| |-----142------|
-       // b = format bit len, o = odd parity of last 3 bits
-       // f = facility code, c = card number
-       // w = wiegand parity
-       // (26 bit format shown)
-
-       uint32_t fc = 0;
-       uint32_t cardnum = 0;
-       uint32_t code1 = 0;
-       uint32_t code2 = 0;
-       uint8_t fmtLen = bytebits_to_byte(BitStream,8);
-       if (fmtLen==26){
-               fc = bytebits_to_byte(BitStream+9, 8);
-               cardnum = bytebits_to_byte(BitStream+17, 16);
-               code1 = bytebits_to_byte(BitStream+8,fmtLen);
-               PrintAndLog("AWID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi2, rawHi, rawLo);
-       } else {
-               cardnum = bytebits_to_byte(BitStream+8+(fmtLen-17), 16);
-               if (fmtLen>32){
-                       code1 = bytebits_to_byte(BitStream+8,fmtLen-32);
-                       code2 = bytebits_to_byte(BitStream+8+(fmtLen-32),32);
-                       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo);
-               } else{
-                       code1 = bytebits_to_byte(BitStream+8,fmtLen);
-                       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo);
-               }
-       }
-       if (g_debugMode){
-               PrintAndLog("DEBUG: idx: %d, Len: %d Printing Demod Buffer:", idx, 96);
-               printDemodBuff();
-       }
-       //todo - convert hi2, hi, lo to demodbuffer for future sim/clone commands
-       return 1;
-}
-
 //by marshmellow
 //Pyramid Prox demod - FSK RF/50 with preamble of 0000000000000001  (always a 128 bit data stream)
 //print full Farpointe Data/Pyramid Prox ID and some bit format details if found
 //by marshmellow
 //Pyramid Prox demod - FSK RF/50 with preamble of 0000000000000001  (always a 128 bit data stream)
 //print full Farpointe Data/Pyramid Prox ID and some bit format details if found
@@ -2278,9 +2093,7 @@ static command_t CommandTable[] =
        {"dec",             CmdDec,             1, "Decimate samples"},
        {"detectclock",     CmdDetectClockRate, 1, "[modulation] Detect clock rate of wave in GraphBuffer (options: 'a','f','n','p' for ask, fsk, nrz, psk respectively)"},
        {"fdxbdemod",       CmdFDXBdemodBI    , 1, "Demodulate a FDX-B ISO11784/85 Biphase tag from GraphBuffer"},
        {"dec",             CmdDec,             1, "Decimate samples"},
        {"detectclock",     CmdDetectClockRate, 1, "[modulation] Detect clock rate of wave in GraphBuffer (options: 'a','f','n','p' for ask, fsk, nrz, psk respectively)"},
        {"fdxbdemod",       CmdFDXBdemodBI    , 1, "Demodulate a FDX-B ISO11784/85 Biphase tag from GraphBuffer"},
-       {"fskawiddemod",    CmdFSKdemodAWID,    1, "Demodulate an AWID FSK tag from GraphBuffer"},
        //{"fskfcdetect",   CmdFSKfcDetect,     1, "Try to detect the Field Clock of an FSK wave"},
        //{"fskfcdetect",   CmdFSKfcDetect,     1, "Try to detect the Field Clock of an FSK wave"},
-       {"fskhiddemod",     CmdFSKdemodHID,     1, "Demodulate a HID FSK tag from GraphBuffer"},
        {"fskiodemod",      CmdFSKdemodIO,      1, "Demodulate an IO Prox FSK tag from GraphBuffer"},
        {"fskpyramiddemod", CmdFSKdemodPyramid, 1, "Demodulate a Pyramid FSK tag from GraphBuffer"},
        {"fskparadoxdemod", CmdFSKdemodParadox, 1, "Demodulate a Paradox FSK tag from GraphBuffer"},
        {"fskiodemod",      CmdFSKdemodIO,      1, "Demodulate an IO Prox FSK tag from GraphBuffer"},
        {"fskpyramiddemod", CmdFSKdemodPyramid, 1, "Demodulate a Pyramid FSK tag from GraphBuffer"},
        {"fskparadoxdemod", CmdFSKdemodParadox, 1, "Demodulate a Paradox FSK tag from GraphBuffer"},
index e68eb6dbeff20998c90d55bc60700c7ee54f9a83..3d803d4217dc36279cb40f6a75bff668c106f2f9 100644 (file)
@@ -36,7 +36,6 @@ int CmdDec(const char *Cmd);
 int CmdDetectClockRate(const char *Cmd);
 int CmdFDXBdemodBI(const char *Cmd);
 int CmdFSKdemodAWID(const char *Cmd);
 int CmdDetectClockRate(const char *Cmd);
 int CmdFDXBdemodBI(const char *Cmd);
 int CmdFSKdemodAWID(const char *Cmd);
-int CmdFSKdemodHID(const char *Cmd);
 int CmdFSKdemodIO(const char *Cmd);
 int CmdFSKdemodParadox(const char *Cmd);
 int CmdFSKdemodPyramid(const char *Cmd);
 int CmdFSKdemodIO(const char *Cmd);
 int CmdFSKdemodParadox(const char *Cmd);
 int CmdFSKdemodPyramid(const char *Cmd);
index 8843e9e0cf6de146e8e605bebfee01fa3766113a..060ecb682e395be8d3aa38982bf9b7c0d1b9b2ef 100644 (file)
 #include "ui.h"         // PrintAndLog
 #include "cmdparser.h"  // CmdsParse, CmdsHelp
 #include "cmdlfawid.h"  // AWID function declarations
 #include "ui.h"         // PrintAndLog
 #include "cmdparser.h"  // CmdsParse, CmdsHelp
 #include "cmdlfawid.h"  // AWID function declarations
-#include "lfdemod.h"    // parityTest
+#include "lfdemod.h"    // parityTest +
 #include "util.h"       // weigandparity
 #include "protocols.h"  // for T55xx config register definitions
 #include "util.h"       // weigandparity
 #include "protocols.h"  // for T55xx config register definitions
+#include "cmddata.h"    // for printDemod and demodbuffer commands
+#include "graph.h"      // for getFromGraphBuff cmds
 #include "cmdmain.h"
 
 static int CmdHelp(const char *Cmd);
 
 #include "cmdmain.h"
 
 static int CmdHelp(const char *Cmd);
 
-int usage_lf_awid_fskdemod(void) {
+int usage_lf_awid_read(void) {
        PrintAndLog("Enables AWID26 compatible reader mode printing details of scanned AWID26 tags.");
        PrintAndLog("By default, values are printed and logged until the button is pressed or another USB command is issued.");
        PrintAndLog("If the ['1'] option is provided, reader mode is exited after reading a single AWID26 card.");
        PrintAndLog("");
        PrintAndLog("Enables AWID26 compatible reader mode printing details of scanned AWID26 tags.");
        PrintAndLog("By default, values are printed and logged until the button is pressed or another USB command is issued.");
        PrintAndLog("If the ['1'] option is provided, reader mode is exited after reading a single AWID26 card.");
        PrintAndLog("");
-       PrintAndLog("Usage:  lf awid fskdemod ['1']");
+       PrintAndLog("Usage:  lf awid read ['1']");
        PrintAndLog("Options : ");
        PrintAndLog("  1 : (optional) stop after reading a single card");
        PrintAndLog("");
        PrintAndLog("Options : ");
        PrintAndLog("  1 : (optional) stop after reading a single card");
        PrintAndLog("");
-       PrintAndLog("Samples : lf awid fskdemod");
-       PrintAndLog("        : lf awid fskdemod 1");
+       PrintAndLog("Samples : lf awid read");
+       PrintAndLog("        : lf awid read 1");
        return 0;
 }
 
        return 0;
 }
 
@@ -66,9 +68,9 @@ int usage_lf_awid_clone(void) {
        return 0;
 }
 
        return 0;
 }
 
-int CmdAWIDDemodFSK(const char *Cmd) {
+int CmdAWIDReadFSK(const char *Cmd) {
        int findone=0;
        int findone=0;
-       if (Cmd[0] == 'h' || Cmd[0] == 'H') return usage_lf_awid_fskdemod();
+       if (Cmd[0] == 'h' || Cmd[0] == 'H') return usage_lf_awid_read();
        if (Cmd[0] == '1') findone = 1;
 
        UsbCommand c = {CMD_AWID_DEMOD_FSK, {findone, 0, 0}};
        if (Cmd[0] == '1') findone = 1;
 
        UsbCommand c = {CMD_AWID_DEMOD_FSK, {findone, 0, 0}};
@@ -76,6 +78,102 @@ int CmdAWIDDemodFSK(const char *Cmd) {
        SendCommand(&c);
        return 0;   
 }
        SendCommand(&c);
        return 0;   
 }
+//by marshmellow
+//AWID Prox demod - FSK RF/50 with preamble of 00000001  (always a 96 bit data stream)
+//print full AWID Prox ID and some bit format details if found
+int CmdFSKdemodAWID(const char *Cmd)
+{
+       uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+       size_t size = getFromGraphBuf(BitStream);
+       if (size==0) return 0;
+
+       //get binary from fsk wave
+       int idx = AWIDdemodFSK(BitStream, &size);
+       if (idx<=0){
+               if (g_debugMode){
+                       if (idx == -1)
+                               PrintAndLog("DEBUG: Error - not enough samples");
+                       else if (idx == -2)
+                               PrintAndLog("DEBUG: Error - only noise found");
+                       else if (idx == -3)
+                               PrintAndLog("DEBUG: Error - problem during FSK demod");
+                       else if (idx == -4)
+                               PrintAndLog("DEBUG: Error - AWID preamble not found");
+                       else if (idx == -5)
+                               PrintAndLog("DEBUG: Error - Size not correct: %d", size);
+                       else
+                               PrintAndLog("DEBUG: Error %d",idx);
+               }
+               return 0;
+       }
+
+       // Index map
+       // 0            10            20            30              40            50              60
+       // |            |             |             |               |             |               |
+       // 01234567 890 1 234 5 678 9 012 3 456 7 890 1 234 5 678 9 012 3 456 7 890 1 234 5 678 9 012 3 - to 96
+       // -----------------------------------------------------------------------------
+       // 00000001 000 1 110 1 101 1 011 1 101 1 010 0 000 1 000 1 010 0 001 0 110 1 100 0 000 1 000 1
+       // premable bbb o bbb o bbw o fff o fff o ffc o ccc o ccc o ccc o ccc o ccc o wxx o xxx o xxx o - to 96
+       //          |---26 bit---|    |-----117----||-------------142-------------|
+       // b = format bit len, o = odd parity of last 3 bits
+       // f = facility code, c = card number
+       // w = wiegand parity
+       // (26 bit format shown)
+       //get raw ID before removing parities
+       uint32_t rawLo = bytebits_to_byte(BitStream+idx+64,32);
+       uint32_t rawHi = bytebits_to_byte(BitStream+idx+32,32);
+       uint32_t rawHi2 = bytebits_to_byte(BitStream+idx,32);
+       setDemodBuf(BitStream,96,idx);
+
+       size = removeParity(BitStream, idx+8, 4, 1, 88);
+       if (size != 66){
+               if (g_debugMode) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format");
+               return 0;
+       }
+       // ok valid card found!
+
+       // Index map
+       // 0           10         20        30          40        50        60
+       // |           |          |         |           |         |         |
+       // 01234567 8 90123456 7890123456789012 3 456789012345678901234567890123456
+       // -----------------------------------------------------------------------------
+       // 00011010 1 01110101 0000000010001110 1 000000000000000000000000000000000
+       // bbbbbbbb w ffffffff cccccccccccccccc w xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+       // |26 bit|   |-117--| |-----142------|
+       // b = format bit len, o = odd parity of last 3 bits
+       // f = facility code, c = card number
+       // w = wiegand parity
+       // (26 bit format shown)
+
+       uint32_t fc = 0;
+       uint32_t cardnum = 0;
+       uint32_t code1 = 0;
+       uint32_t code2 = 0;
+       uint8_t fmtLen = bytebits_to_byte(BitStream,8);
+       if (fmtLen==26){
+               fc = bytebits_to_byte(BitStream+9, 8);
+               cardnum = bytebits_to_byte(BitStream+17, 16);
+               code1 = bytebits_to_byte(BitStream+8,fmtLen);
+               PrintAndLog("AWID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi2, rawHi, rawLo);
+       } else {
+               cardnum = bytebits_to_byte(BitStream+8+(fmtLen-17), 16);
+               if (fmtLen>32){
+                       code1 = bytebits_to_byte(BitStream+8,fmtLen-32);
+                       code2 = bytebits_to_byte(BitStream+8+(fmtLen-32),32);
+                       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo);
+               } else{
+                       code1 = bytebits_to_byte(BitStream+8,fmtLen);
+                       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo);
+               }
+       }
+       if (g_debugMode){
+               PrintAndLog("DEBUG: idx: %d, Len: %d Printing Demod Buffer:", idx, 96);
+               printDemodBuff();
+       }
+       //todo - convert hi2, hi, lo to demodbuffer for future sim/clone commands
+       return 1;
+}
 
 //refactored by marshmellow
 int getAWIDBits(uint32_t fc, uint32_t cn, uint8_t      *AWIDBits) {
 
 //refactored by marshmellow
 int getAWIDBits(uint32_t fc, uint32_t cn, uint8_t      *AWIDBits) {
@@ -191,7 +289,8 @@ int CmdAWIDClone(const char *Cmd) {
 
 static command_t CommandTable[] = {
        {"help",      CmdHelp,         1, "This help"},
 
 static command_t CommandTable[] = {
        {"help",      CmdHelp,         1, "This help"},
-       {"fskdemod",  CmdAWIDDemodFSK, 0, "['1'] Realtime AWID FSK demodulator (option '1' for one tag only)"},
+       {"demod",     CmdFSKdemodAWID, 1, "Demodulate an AWID FSK tag from the GraphBuffer"},
+       {"read",      CmdAWIDReadFSK,  0, "['1'] Realtime AWID FSK read from the antenna (option '1' for one tag only)"},
        {"sim",       CmdAWIDSim,      0, "<Facility-Code> <Card Number> -- AWID tag simulator"},
        {"clone",     CmdAWIDClone,    0, "<Facility-Code> <Card Number> <Q5> -- Clone AWID to T55x7 (tag must be in range of antenna)"},
        {NULL, NULL, 0, NULL}
        {"sim",       CmdAWIDSim,      0, "<Facility-Code> <Card Number> -- AWID tag simulator"},
        {"clone",     CmdAWIDClone,    0, "<Facility-Code> <Card Number> <Q5> -- Clone AWID to T55x7 (tag must be in range of antenna)"},
        {NULL, NULL, 0, NULL}
index 4e103f1ad468e5555916330603c8758566f78fbf..892f70a903fa8e921a4a0f2368ca9597c74a78ae 100644 (file)
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
-#include "cmdlfhid.h"
+//#include "cmdlfhid.h"
+#include "cmddata.h"  //for g_debugMode, demodbuff cmds
+#include "lfdemod.h" // for HIDdemodFSK
 
 static int CmdHelp(const char *Cmd);
 
 static int CmdHelp(const char *Cmd);
-/*
-int CmdHIDDemod(const char *Cmd)
+
+//by marshmellow (based on existing demod + holiman's refactor)
+//HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded)
+//print full HID Prox ID and some bit format details if found
+int CmdFSKdemodHID(const char *Cmd)
 {
 {
-  if (GraphTraceLen < 4800) {
-    PrintAndLog("too short; need at least 4800 samples");
+  //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+  uint32_t hi2=0, hi=0, lo=0;
+
+  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+  size_t BitLen = getFromGraphBuf(BitStream);
+  if (BitLen==0) return 0;
+  //get binary from fsk wave
+  int idx = HIDdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo);
+  if (idx<0){
+    if (g_debugMode){
+      if (idx==-1){
+        PrintAndLog("DEBUG: Just Noise Detected");
+      } else if (idx == -2) {
+        PrintAndLog("DEBUG: Error demoding fsk");
+      } else if (idx == -3) {
+        PrintAndLog("DEBUG: Preamble not found");
+      } else if (idx == -4) {
+        PrintAndLog("DEBUG: Error in Manchester data, SIZE: %d", BitLen);
+      } else {
+        PrintAndLog("DEBUG: Error demoding fsk %d", idx);
+      }   
+    }
     return 0;
   }
     return 0;
   }
-
-  GraphTraceLen = 4800;
-  for (int i = 0; i < GraphTraceLen; ++i) {
-    if (GraphBuffer[i] < 0) {
-      GraphBuffer[i] = 0;
-    } else {
-      GraphBuffer[i] = 1;
+  if (hi2==0 && hi==0 && lo==0) {
+    if (g_debugMode) PrintAndLog("DEBUG: Error - no values found");
+    return 0;
+  }
+  if (hi2 != 0){ //extra large HID tags
+    PrintAndLog("HID Prox TAG ID: %x%08x%08x (%d)",
+       (unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
+  }
+  else {  //standard HID tags <38 bits
+    uint8_t fmtLen = 0;
+    uint32_t fc = 0;
+    uint32_t cardnum = 0;
+    if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
+      uint32_t lo2=0;
+      lo2=(((hi & 31) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
+      uint8_t idx3 = 1;
+      while(lo2>1){ //find last bit set to 1 (format len bit)
+        lo2=lo2>>1;
+        idx3++;
+      }
+      fmtLen =idx3+19;
+      fc =0;
+      cardnum=0;
+      if(fmtLen==26){
+        cardnum = (lo>>1)&0xFFFF;
+        fc = (lo>>17)&0xFF;
+      }
+      if(fmtLen==34){
+        cardnum = (lo>>1)&0xFFFF;
+        fc= ((hi&1)<<15)|(lo>>17);
+      }
+      if(fmtLen==35){
+        cardnum = (lo>>1)&0xFFFFF;
+        fc = ((hi&1)<<11)|(lo>>21);
+      }
+    }
+    else { //if bit 38 is not set then 37 bit format is used
+      fmtLen = 37;
+      fc = 0;
+      cardnum = 0;
+      if(fmtLen == 37){
+        cardnum = (lo>>1)&0x7FFFF;
+        fc = ((hi&0xF)<<12)|(lo>>20);
+      }
     }
     }
+    PrintAndLog("HID Prox TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
+      (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF,
+      (unsigned int) fmtLen, (unsigned int) fc, (unsigned int) cardnum);
   }
   }
-  RepaintGraphWindow();
-  return 0;
+  setDemodBuf(BitStream,BitLen,idx);
+  if (g_debugMode){ 
+    PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen);
+    printDemodBuff();
+  }
+  return 1;
 }
 }
-*/
-int CmdHIDDemodFSK(const char *Cmd)
+
+int CmdHIDReadFSK(const char *Cmd)
 {
   int findone=0;
        if(Cmd[0]=='1') findone=1;
 {
   int findone=0;
        if(Cmd[0]=='1') findone=1;
@@ -106,8 +175,8 @@ int CmdHIDClone(const char *Cmd)
 static command_t CommandTable[] = 
 {
   {"help",      CmdHelp,        1, "This help"},
 static command_t CommandTable[] = 
 {
   {"help",      CmdHelp,        1, "This help"},
-  //{"demod",     CmdHIDDemod,    1, "Demodulate HID Prox Card II (not optimal)"},
-  {"fskdemod",  CmdHIDDemodFSK, 0, "['1'] Realtime HID FSK demodulator (option '1' for one tag only)"},
+  {"demod",     CmdFSKdemodHID, 1, "Demodulate HID Prox from GraphBuffer"},
+  {"read",      CmdHIDReadFSK,  0, "['1'] Realtime HID FSK Read from antenna (option '1' for one tag only)"},
   {"sim",       CmdHIDSim,      0, "<ID> -- HID tag simulator"},
   {"clone",     CmdHIDClone,    0, "<ID> ['l'] -- Clone HID to T55x7 (tag must be in antenna)(option 'l' for 84bit ID)"},
   {NULL, NULL, 0, NULL}
   {"sim",       CmdHIDSim,      0, "<ID> -- HID tag simulator"},
   {"clone",     CmdHIDClone,    0, "<ID> ['l'] -- Clone HID to T55x7 (tag must be in antenna)(option 'l' for 84bit ID)"},
   {NULL, NULL, 0, NULL}
index 7021492b862da411abd99ca9112667999307fc6c..b03f70418510fad9f850d821b56721c9f4357e6e 100644 (file)
@@ -12,8 +12,8 @@
 #define CMDLFHID_H__
 
 int CmdLFHID(const char *Cmd);
 #define CMDLFHID_H__
 
 int CmdLFHID(const char *Cmd);
-//int CmdHIDDemod(const char *Cmd);
-int CmdHIDDemodFSK(const char *Cmd);
+int CmdFSKdemodHID(const char *Cmd);
+int CmdHIDReadDemod(const char *Cmd);
 int CmdHIDSim(const char *Cmd);
 int CmdHIDClone(const char *Cmd);
 
 int CmdHIDSim(const char *Cmd);
 int CmdHIDClone(const char *Cmd);
 
Impressum, Datenschutz