From 5bce72d5e3b5921ac7d8f08eeaa406fd2a53d4b0 Mon Sep 17 00:00:00 2001 From: marshmellow42 Date: Mon, 27 Mar 2017 18:04:20 -0400 Subject: [PATCH] split lf paradox/nexwatch into own files see changelog.md for cli changes! --- CHANGELOG.md | 4 ++ client/Makefile | 2 + client/cmddata.c | 90 --------------------------------------- client/cmddata.h | 2 - client/cmdlf.c | 4 ++ client/cmdlfnexwatch.c | 91 +++++++++++++++++++++++++++++++++++++++ client/cmdlfnexwatch.h | 14 ++++++ client/cmdlfparadox.c | 97 ++++++++++++++++++++++++++++++++++++++++++ client/cmdlfparadox.h | 14 ++++++ 9 files changed, 226 insertions(+), 92 deletions(-) create mode 100644 client/cmdlfnexwatch.c create mode 100644 client/cmdlfnexwatch.h create mode 100644 client/cmdlfparadox.c create mode 100644 client/cmdlfparadox.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 7994c987..19c6f6c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] ### Added +- Added lf nexwatch read - reads a nexwatch tag from the antenna +- Added lf paradox read - reads a paradox tag from the antenna - Added lf fdx sim (iceman) - Added lf fdx clone - clones an fdx-b animal tag to t55x7 or q5 (iceman) - Added lf fdx read - reads a fdx-b tag from the antenna (iceman) @@ -50,6 +52,8 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added option c to 'hf list' (mark CRC bytes) (piwi) ### Changed +- `data psknexwatchdemod` has been moved to `lf nexwatch demod` (reads from graphbuffer) +- `data fskparadoxdemod` has been moved to `lf paradox demod` (reads from graphbuffer) - `data fdxdemod` has been moved to `lf fdx demod` (reads from graphbuffer) - `data askgproxiidemod has been moved to `lf gproxii demod` (reads from graphbuffer) - `lf indalaclone` has been moved to `lf indala clone` diff --git a/client/Makefile b/client/Makefile index d5bfb086..c8b7a213 100644 --- a/client/Makefile +++ b/client/Makefile @@ -99,6 +99,8 @@ CMDSRCS = crapto1/crapto1.c\ cmdlfhitag.c \ cmdlfio.c \ cmdlfindala.c \ + cmdlfnexwatch.c \ + cmdlfparadox.c \ cmdlfpcf7931.c\ cmdlfpresco.c\ cmdlfpyramid.c\ diff --git a/client/cmddata.c b/client/cmddata.c index 2444fb32..ef1229c2 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -801,55 +801,6 @@ int CmdFSKrawdemod(const char *Cmd) return FSKrawDemod(Cmd, true); } -//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 -int CmdFSKdemodParadox(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 = ParadoxdemodFSK(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"); - } else { - PrintAndLog("DEBUG: Error demoding fsk %d", idx); - } - } - return 0; - } - if (hi2==0 && hi==0 && lo==0){ - if (g_debugMode) PrintAndLog("DEBUG: Error - no value found"); - return 0; - } - uint32_t fc = ((hi & 0x3)<<6) | (lo>>26); - uint32_t cardnum = (lo>>10)&0xFFFF; - 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); - - PrintAndLog("Paradox TAG ID: %x%08x - FC: %d - Card: %d - Checksum: %02x - RAW: %08x%08x%08x", - hi>>10, (hi & 0x3)<<26 | (lo>>10), fc, cardnum, (lo>>2) & 0xFF, rawHi2, rawHi, rawLo); - setDemodBuf(BitStream,BitLen,idx); - if (g_debugMode){ - PrintAndLog("DEBUG: idx: %d, len: %d, Printing Demod Buffer:", idx, BitLen); - printDemodBuff(); - } - return 1; -} - //by marshmellow //attempt to psk1 demod graph buffer int PSKDemod(const char *Cmd, bool verbose) @@ -898,45 +849,6 @@ int PSKDemod(const char *Cmd, bool verbose) return 1; } -int CmdPSKNexWatch(const char *Cmd) -{ - if (!PSKDemod("", false)) return 0; - uint8_t preamble[28] = {0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - size_t startIdx = 0, size = DemodBufferLen; - bool invert = false; - if (!preambleSearch(DemodBuffer, preamble, sizeof(preamble), &size, &startIdx)){ - // if didn't find preamble try again inverting - if (!PSKDemod("1", false)) return 0; - size = DemodBufferLen; - if (!preambleSearch(DemodBuffer, preamble, sizeof(preamble), &size, &startIdx)) return 0; - invert = true; - } - if (size != 128) return 0; - setDemodBuf(DemodBuffer, size, startIdx+4); - startIdx = 8+32; //4 = extra i added, 8 = preamble, 32 = reserved bits (always 0) - //get ID - uint32_t ID = 0; - for (uint8_t wordIdx=0; wordIdx<4; wordIdx++){ - for (uint8_t idx=0; idx<8; idx++){ - ID = (ID << 1) | DemodBuffer[startIdx+wordIdx+(idx*4)]; - } - } - //parity check (TBD) - - //checksum check (TBD) - - //output - PrintAndLog("NexWatch ID: %d", ID); - if (invert){ - PrintAndLog("Had to Invert - probably NexKey"); - for (uint8_t idx=0; idx=1 values to 1 and <1 to 0"}, {"grid", CmdGrid, 1, " -- overlay grid on graph window, use zero value to turn off either"}, {"hexsamples", CmdHexsamples, 0, " [] -- Dump big buffer as hex bytes"}, @@ -1641,7 +1552,6 @@ static command_t CommandTable[] = {"norm", CmdNorm, 1, "Normalize max/min to +/-128"}, {"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"}, {"printdemodbuffer",CmdPrintDemodBuff, 1, "[x] [o] [l] -- print the data in the DemodBuffer - 'x' for hex output"}, - {"psknexwatchdemod",CmdPSKNexWatch, 1, "Demodulate a NexWatch tag (nexkey, quadrakey) (PSK1) from GraphBuffer"}, {"rawdemod", CmdRawDemod, 1, "[modulation] ... -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"}, {"samples", CmdSamples, 0, "[512 - 40000] -- Get raw samples for graph window (GraphBuffer)"}, {"save", CmdSave, 1, " -- Save trace (from graph window)"}, diff --git a/client/cmddata.h b/client/cmddata.h index 86d905b1..60233012 100644 --- a/client/cmddata.h +++ b/client/cmddata.h @@ -32,8 +32,6 @@ int CmdBitsamples(const char *Cmd); int CmdBuffClear(const char *Cmd); int CmdDec(const char *Cmd); int CmdDetectClockRate(const char *Cmd); -int CmdFDXBdemodBI(const char *Cmd); -int CmdFSKdemodParadox(const char *Cmd); int CmdFSKrawdemod(const char *Cmd); int CmdPSK1rawDemod(const char *Cmd); int CmdPSK2rawDemod(const char *Cmd); diff --git a/client/cmdlf.c b/client/cmdlf.c index d8e78be1..341f1fe4 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -38,6 +38,8 @@ #include "cmdlfindala.h" // for indala menu #include "cmdlfgproxii.h"// for gproxii menu #include "cmdlffdx.h" // for fdx-b menu +#include "cmdlfparadox.h"// for paradox menu +#include "cmdlfnexwatch.h"//for nexwatch menu bool g_lf_threshold_set = false; static int CmdHelp(const char *Cmd); @@ -1051,6 +1053,8 @@ static command_t CommandTable[] = {"hitag", CmdLFHitag, 1, "{ Hitag CHIPs... }"}, {"io", CmdLFIO, 1, "{ ioProx RFIDs... }"}, {"indala", CmdLFINDALA, 1, "{ Indala RFIDs... }"}, + {"nexwatch", CmdLFNexWatch, 1, "{ NexWatch RFIDs... }"}, + {"paradox", CmdLFParadox, 1, "{ Paradox RFIDs... }"}, {"presco", CmdLFPresco, 1, "{ Presco RFIDs... }"}, {"pcf7931", CmdLFPCF7931, 1, "{ PCF7931 CHIPs... }"}, {"pyramid", CmdLFPyramid, 1, "{ Farpointe/Pyramid RFIDs... }"}, diff --git a/client/cmdlfnexwatch.c b/client/cmdlfnexwatch.c new file mode 100644 index 00000000..030c61c7 --- /dev/null +++ b/client/cmdlfnexwatch.c @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +// +// 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 +// the license. +//----------------------------------------------------------------------------- +// Low frequency Honeywell NexWatch tag commands +// PSK1 RF/16, RF/2, 128 bits long +//----------------------------------------------------------------------------- +#include +#include +#include +#include +#include "cmdlfnexwatch.h" +#include "proxmark3.h" +#include "ui.h" +#include "util.h" +#include "graph.h" +#include "cmdparser.h" +#include "cmddata.h" +#include "cmdlf.h" +#include "lfdemod.h" + +static int CmdHelp(const char *Cmd); + +int CmdPSKNexWatch(const char *Cmd) +{ + if (!PSKDemod("", false)) return 0; + uint8_t preamble[28] = {0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + size_t startIdx = 0, size = DemodBufferLen; + bool invert = false; + if (!preambleSearch(DemodBuffer, preamble, sizeof(preamble), &size, &startIdx)){ + // if didn't find preamble try again inverting + if (!PSKDemod("1", false)) return 0; + size = DemodBufferLen; + if (!preambleSearch(DemodBuffer, preamble, sizeof(preamble), &size, &startIdx)) return 0; + invert = true; + } + if (size != 128) return 0; + setDemodBuf(DemodBuffer, size, startIdx+4); + startIdx = 8+32; //4 = extra i added, 8 = preamble, 32 = reserved bits (always 0) + //get ID + uint32_t ID = 0; + for (uint8_t wordIdx=0; wordIdx<4; wordIdx++){ + for (uint8_t idx=0; idx<8; idx++){ + ID = (ID << 1) | DemodBuffer[startIdx+wordIdx+(idx*4)]; + } + } + //parity check (TBD) + + //checksum check (TBD) + + //output + PrintAndLog("NexWatch ID: %d", ID); + if (invert){ + PrintAndLog("Had to Invert - probably NexKey"); + for (uint8_t idx=0; idx +#include +#include +#include "cmdlfparadox.h" +#include "proxmark3.h" +#include "ui.h" +#include "util.h" +#include "graph.h" +#include "cmdparser.h" +#include "cmddata.h" +#include "cmdlf.h" +#include "lfdemod.h" +static int CmdHelp(const char *Cmd); + +//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 +int CmdFSKdemodParadox(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 = ParadoxdemodFSK(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"); + } else { + PrintAndLog("DEBUG: Error demoding fsk %d", idx); + } + } + return 0; + } + if (hi2==0 && hi==0 && lo==0){ + if (g_debugMode) PrintAndLog("DEBUG: Error - no value found"); + return 0; + } + uint32_t fc = ((hi & 0x3)<<6) | (lo>>26); + uint32_t cardnum = (lo>>10)&0xFFFF; + 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); + + PrintAndLog("Paradox TAG ID: %x%08x - FC: %d - Card: %d - Checksum: %02x - RAW: %08x%08x%08x", + hi>>10, (hi & 0x3)<<26 | (lo>>10), fc, cardnum, (lo>>2) & 0xFF, rawHi2, rawHi, rawLo); + setDemodBuf(BitStream,BitLen,idx); + if (g_debugMode){ + PrintAndLog("DEBUG: idx: %d, len: %d, Printing Demod Buffer:", idx, BitLen); + printDemodBuff(); + } + return 1; +} +//by marshmellow +//see ASKDemod for what args are accepted +int CmdParadoxRead(const char *Cmd) { + // read lf silently + CmdLFRead("s"); + // get samples silently + getSamples("10000",false); + // demod and output viking ID + return CmdFSKdemodParadox(Cmd); +} + +static command_t CommandTable[] = { + {"help", CmdHelp, 1, "This help"}, + {"demod", CmdFSKdemodParadox, 1, "Demodulate a Paradox FSK tag from the GraphBuffer"}, + {"read", CmdParadoxRead, 0, "Attempt to read and Extract tag data from the antenna"}, + {NULL, NULL, 0, NULL} +}; + +int CmdLFParadox(const char *Cmd) { + CmdsParse(CommandTable, Cmd); + return 0; +} + +int CmdHelp(const char *Cmd) { + CmdsHelp(CommandTable); + return 0; +} diff --git a/client/cmdlfparadox.h b/client/cmdlfparadox.h new file mode 100644 index 00000000..997787f2 --- /dev/null +++ b/client/cmdlfparadox.h @@ -0,0 +1,14 @@ +//----------------------------------------------------------------------------- +// +// 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 +// the license. +//----------------------------------------------------------------------------- +// Low frequency Paradox tag commands +//----------------------------------------------------------------------------- +#ifndef CMDLFPARADOX_H__ +#define CMDLFPARADOX_H__ +extern int CmdLFParadox(const char *Cmd); +extern int CmdFSKdemodParadox(const char *Cmd); +extern int CmdParadoxRead(const char *Cmd); +#endif