From: marshmellow42 <marshmellowrf@gmail.com>
Date: Mon, 27 Mar 2017 22:04:20 +0000 (-0400)
Subject: split lf paradox/nexwatch into own files
X-Git-Tag: v3.0.0~27^2~1
X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/5bce72d5e3b5921ac7d8f08eeaa406fd2a53d4b0?ds=sidebyside

split lf paradox/nexwatch into own files

see changelog.md for cli changes!
---

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<size; idx++)
-			DemodBuffer[idx] ^= 1;
-	} 
-
-	CmdPrintDemodBuff("x");
-	return 1;
-}
-
 // by marshmellow
 // takes 3 arguments - clock, invert, maxErr as integers
 // attempts to demodulate nrz only
@@ -1626,7 +1538,6 @@ 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)"},
 	//{"fskfcdetect",   CmdFSKfcDetect,     1, "Try to detect the Field Clock of an FSK wave"},
-	{"fskparadoxdemod", CmdFSKdemodParadox, 1, "Demodulate a Paradox FSK tag from GraphBuffer"},
 	{"getbitstream",    CmdGetBitStream,    1, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"},
 	{"grid",            CmdGrid,            1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
 	{"hexsamples",      CmdHexsamples,      0, "<bytes> [<offset>] -- 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] <offset> [l] <length> -- 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] ... <options> -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, "<filename> -- 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 <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#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<size; idx++)
+			DemodBuffer[idx] ^= 1;
+	} 
+
+	CmdPrintDemodBuff("x");
+	return 1;
+}
+
+//by marshmellow
+//see ASKDemod for what args are accepted
+int CmdNexWatchRead(const char *Cmd) {
+	// read lf silently
+	CmdLFRead("s");
+	// get samples silently
+	getSamples("10000",false);
+	// demod and output viking ID	
+	return CmdPSKNexWatch(Cmd);
+}
+
+static command_t CommandTable[] = {
+	{"help",  CmdHelp,          1, "This help"},
+	{"demod", CmdPSKNexWatch,   1, "Demodulate a NexWatch tag (nexkey, quadrakey) from the GraphBuffer"},
+	{"read",  CmdNexWatchRead,  0, "Attempt to Read and Extract tag data from the antenna"},
+	{NULL, NULL, 0, NULL}
+};
+
+int CmdLFNexWatch(const char *Cmd) {
+	CmdsParse(CommandTable, Cmd);
+	return 0;
+}
+
+int CmdHelp(const char *Cmd) {
+	CmdsHelp(CommandTable);
+	return 0;
+}
diff --git a/client/cmdlfnexwatch.h b/client/cmdlfnexwatch.h
new file mode 100644
index 00000000..9d259352
--- /dev/null
+++ b/client/cmdlfnexwatch.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 Honeywell NexWatch tag commands
+//-----------------------------------------------------------------------------
+#ifndef CMDLFNEXWATCH_H__
+#define CMDLFNEXWATCH_H__
+extern int CmdLFNexWatch(const char *Cmd);
+extern int CmdFSKdemodParadox(const char *Cmd);
+extern int CmdParadoxRead(const char *Cmd);
+#endif
diff --git a/client/cmdlfparadox.c b/client/cmdlfparadox.c
new file mode 100644
index 00000000..5225820b
--- /dev/null
+++ b/client/cmdlfparadox.c
@@ -0,0 +1,97 @@
+//-----------------------------------------------------------------------------
+//
+// 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
+//-----------------------------------------------------------------------------
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#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