Add Viking demod,
authormarshmellow42 <marshmellowrf@gmail.com>
Tue, 10 Nov 2015 04:09:26 +0000 (23:09 -0500)
committermarshmellow42 <marshmellowrf@gmail.com>
Tue, 10 Nov 2015 04:09:26 +0000 (23:09 -0500)
fix compiler warning for int vs uint8_t for em410x sim clock variable

CHANGELOG.md
client/cmddata.c
client/cmddata.h
client/cmdlf.c
client/cmdlfem4x.c
common/lfdemod.c
common/lfdemod.h

index 163bc42ae73d25759b256898bf431f2300eb954f..a3a0799ecf37928618e879cc5525069d606baabf 100644 (file)
@@ -5,6 +5,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
 ## [unreleased][unreleased]
 
 ### Added
+- Added viking demod to `lf search` (marshmellow)
+- `data askvikingdemod` demod viking id tag from graphbuffer (marshmellow)
 - `lf t55xx resetread` added reset then read command - should allow determining start
 of stream transmissions (marshmellow)
 - `lf t55xx wakeup` added wake with password (AOR) to allow lf search or standard lf read after (iceman, marshmellow)
@@ -24,6 +26,7 @@ of stream transmissions (marshmellow)
 - Added option c to 'hf list' (mark CRC bytes) (piwi)
 
 ### Changed
+- Adjusted lf em410x em410xsim to accept a clock argument
 - Adjusted lf t55xx dump to allow overriding the safety check and warning text (marshmellow)
 - Adjusted lf t55xx write input variables (marshmellow)
 - Adjusted lf t55xx read with password safety check and warning text and adjusted the input variables (marshmellow & iceman)
index 9fa29dd16826de4d9a6f5476f212f92197b935c8..663faf808e23ef490f1cbddb92502712cf11c100 100644 (file)
@@ -637,6 +637,32 @@ int CmdG_Prox_II_Demod(const char *Cmd)
        return 1;
 }
 
+//by marshmellow
+//see ASKDemod for what args are accepted
+int CmdVikingDemod(const char *Cmd)
+{
+       if (!ASKDemod(Cmd, false, false, 1)) {
+               if (g_debugMode) PrintAndLog("ASKDemod failed");
+               return 0;
+       }
+       size_t size = DemodBufferLen;
+       //call lfdemod.c demod for gProxII
+       int ans = VikingDemod_AM(DemodBuffer, &size);
+       if (ans < 0) {
+               if (g_debugMode) PrintAndLog("Error Viking_Demod");
+               return 0;
+       }
+       //got a good demod
+       uint32_t raw1 = bytebits_to_byte(DemodBuffer+ans, 32);
+       uint32_t raw2 = bytebits_to_byte(DemodBuffer+ans+32, 32);
+       uint32_t cardid = bytebits_to_byte(DemodBuffer+ans+24, 32);
+       uint8_t checksum = bytebits_to_byte(DemodBuffer+ans+32+24, 8);
+       PrintAndLog("Viking Tag Found: Card ID %08X, Checksum: %02X", cardid, checksum);
+       PrintAndLog("Raw: %08X%08X", raw1,raw2);
+       setDemodBuf(DemodBuffer+ans, 64, 0);
+       return 1;
+}
+
 //by marshmellow - see ASKDemod
 int Cmdaskrawdemod(const char *Cmd)
 {
@@ -2345,6 +2371,7 @@ static command_t CommandTable[] =
        {"askedgedetect",   CmdAskEdgeDetect,   1, "[threshold] Adjust Graph for manual ask demod using the length of sample differences to detect the edge of a wave (use 20-45, def:25)"},
        {"askem410xdemod",  CmdAskEM410xDemod,  1, "[clock] [invert<0|1>] [maxErr] -- Demodulate an EM410x tag from GraphBuffer (args optional)"},
        {"askgproxiidemod", CmdG_Prox_II_Demod, 1, "Demodulate a G Prox II tag from GraphBuffer"},
+       {"askvikingdemod",  CmdVikingDemod,     1, "Demodulate a Viking tag from GraphBuffer"},
        {"autocorr",        CmdAutoCorr,        1, "[window length] [g] -- Autocorrelation over window - g to save back to GraphBuffer (overwrite)"},
        {"biphaserawdecode",CmdBiphaseDecodeRaw,1, "[offset] [invert<0|1>] [maxErr] -- Biphase decode bin stream in DemodBuffer (offset = 0|1 bits to shift the decode start)"},
        {"bin2hex",         Cmdbin2hex,         1, "bin2hex <digits>     -- Converts binary to hexadecimal"},
index fcc51a6bee079068127950e46a2fde9dd9edf3bf..c3303c54c25ce0c269e22523b7953fd5a1308ea2 100644 (file)
@@ -17,6 +17,7 @@ int CmdData(const char *Cmd);
 void printDemodBuff(void);
 void setDemodBuf(uint8_t *buff, size_t size, size_t startIdx);
 int CmdAskEM410xDemod(const char *Cmd);
+int CmdVikingDemod(const char *Cmd);
 int CmdG_Prox_II_Demod(const char *Cmd);
 int Cmdaskrawdemod(const char *Cmd);
 int Cmdaskmandemod(const char *Cmd);
index 6b8a31b24831f3f2aacd889ed23220f314c1b504..616d932a25251aa46cf2fc3bee614b4702bb7675 100644 (file)
@@ -1155,6 +1155,12 @@ int CmdLFfind(const char *Cmd)
                return 1;
        }       
 
+       ans=CmdVikingDemod("");
+       if (ans>0) {
+               PrintAndLog("\nValid Viking ID Found!");
+               return 1;
+       }       
+
        ans=CmdPSKNexWatch("");
        if (ans>0) {
                PrintAndLog("\nValid NexWatch ID Found!");
index 559618bc1114145db28ff4a61337bd7738d80388..7ff8037b5763d3ce6c1aeec2cf4e7fdf1bcebc59 100644 (file)
@@ -79,13 +79,13 @@ int CmdEM410xSim(const char *Cmd)
                return 0;
        }
        /* clock is 64 in EM410x tags */
-       int clock = 64;
+       uint8_t clock = 64;
 
        if (param_gethex(Cmd, 0, uid, 10)) {
                PrintAndLog("UID must include 10 HEX symbols");
                return 0;
        }
-       param_getdec(Cmd,1,&clock);
+       param_getdec(Cmd,1, &clock);
 
        PrintAndLog("Starting simulating UID %02X%02X%02X%02X%02X  clock: %d", uid[0],uid[1],uid[2],uid[3],uid[4],clock);
        PrintAndLog("Press pm3-button to about simulation");
@@ -601,7 +601,7 @@ static command_t CommandTable[] =
        {"help", CmdHelp, 1, "This help"},
        {"em410xdemod", CmdEMdemodASK, 0, "[findone] -- Extract ID from EM410x tag (option 0 for continuous loop, 1 for only 1 tag)"},  
        {"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag in GraphBuffer"},
-       {"em410xsim", CmdEM410xSim, 0, "<UID> -- Simulate EM410x tag"},
+       {"em410xsim", CmdEM410xSim, 0, "<UID> [clock rate] -- Simulate EM410x tag"},
        {"em410xwatch", CmdEM410xWatch, 0, "['h'] -- Watches for EM410x 125/134 kHz tags (option 'h' for 134)"},
        {"em410xspoof", CmdEM410xWatchnSpoof, 0, "['h'] --- Watches for EM410x 125/134 kHz tags, and replays them. (option 'h' for 134)" },
        {"em410xwrite", CmdEM410xWrite, 0, "<UID> <'0' T5555> <'1' T55x7> [clock rate] -- Write EM410x UID to T5555(Q5) or T55x7 tag, optionally setting clock rate"},
index f5a0310e5521f13ff84a76530aab4891365da256..5d19c89734f052e5929b257c796d045eb6e5d909 100644 (file)
@@ -597,6 +597,23 @@ int IOdemodFSK(uint8_t *dest, size_t size)
                return (int) startIdx;
        }
        return -5;
+} 
+
+// by marshmellow
+// find viking preamble 0xF200 in already demoded data
+int VikingDemod_AM(uint8_t *dest, size_t *size) {
+       if (justNoise(dest, *size)) return -1;
+       //make sure buffer has data
+       if (*size < 64*2) return -2;
+
+       size_t startIdx = 0;
+       uint8_t preamble[] = {1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
+       if (errChk == 0) return -4; //preamble not found
+
+       if (*size != 64) return -5;
+       //return start position
+       return (int) startIdx;
 }
 
 // by marshmellow
index e1a51856e59cf25258425cefafd7bf1633cce78e..cc4fa27a3b07a12fcc5e6911a13ea41de8832c96 100644 (file)
@@ -50,5 +50,6 @@ int IOdemodFSK(uint8_t *dest, size_t size);
 int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert);
 int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo);
 int PyramiddemodFSK(uint8_t *dest, size_t *size);
+int VikingDemod_AM(uint8_t *dest, size_t *size);
 
 #endif
Impressum, Datenschutz