From eb891c385e5b580dfafbe3f1ffbae41054adbdd9 Mon Sep 17 00:00:00 2001
From: iceman1001 <iceman@iuse.se>
Date: Sun, 6 Mar 2016 07:56:44 +0100
Subject: [PATCH] ADD; added Marshmellow42 's fixes for indala and stuff. CHG:
 updated the CHANGELOG.md

---
 CHANGELOG.md     | 10 +++++++++-
 README.md        |  3 ++-
 client/Makefile  | 11 +++++------
 client/cmddata.c | 49 ++++++++++++++++++++++++------------------------
 client/cmddata.h |  6 ++++++
 client/cmdlf.h   | 39 +++++++++++++++++++-------------------
 client/util.h    |  5 ++---
 7 files changed, 68 insertions(+), 55 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index b365dcf0..1539360e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,7 +20,15 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
   - Started to add Peter Fillmore's  EMV fork into Iceman fork. ref: https://github.com/peterfillmore/proxmark3  (peter fillmore,  iceman)
   - Added Travis-CI automatic build integration with GitHub fork. (iceman)
   - Updated the Reveng 1.30 sourcecode to 1.31 from Reveng projecthomepage (iceman)
-
+  
+  - Added possibility to write direct to a Legic Prime Tag (MIM256/1024) without using values from the 'BigBuffer' -> 'hf legic writeRaw <addr> <value>' (icsom)
+  - Added possibility to decrease DCF values at address 0x05 & 0x06 on a Legic Prime Tag 
+		DCF-value will be pulled from the BigBuffer (address 0x05 & 0x06) so you have to 
+		load the data into the BigBuffer before with 'hf legic load <path/to/legic.dump>' & then
+		write the DCF-Values (both at once) with 'hf legic write 0x05 0x02'  (icsom)
+  - Added script `legic.lua` for display and edit Data of Legic-Prime Tags (icsom)
+  - Added the experimental HITAG_S support (spenneb)
+  
 ### Added
 - Added a LF ASK Sequence Terminator detection option to the standard ask demod - and applied it to `lf search u`, `lf t55xx detect`, and `data rawdemod am s` (marshmellow)
 - `lf awid bruteforce <facilitycode>` - Simple bruteforce attack against a AWID reader.
diff --git a/README.md b/README.md
index 4e6920c9..2c02d0ef 100644
--- a/README.md
+++ b/README.md
@@ -57,7 +57,8 @@ Among the stuff is
 	* A Bruteforce for AWID 26, starting w a facilitycode then trying all 0xFFFF cardnumbers via simulation. To be used against a AWID Reader.
 	* A Bruteforce for HID,  starting w a facilitycode then trying all 0xFFFF cardnumbers via simulation. To be used against a HID Reader.
 	* Blaposts Crapto1 v3.3
-	
+					  
+    * icsom's  legic script and legic enhancements
 	
 Give me a hint, and I'll see if I can't merge in the stuff you have. 
 
diff --git a/client/Makefile b/client/Makefile
index 3345aa8b..135227e0 100644
--- a/client/Makefile
+++ b/client/Makefile
@@ -110,11 +110,14 @@ CMDSRCS = 	nonce2key/crapto1.c\
 			cmdlfem4x.c \
 			cmdlfhitag.c \
 			cmdlfti.c \
-			cmdlfviking.c\
 			cmdparser.c \
 			cmdmain.c \
 			cmdlft55xx.c \
 			cmdlfpcf7931.c\
+			cmdlfviking.c\
+			cmdlfpresco.c\
+			cmdlfpyramid.c\
+			cmdlfguard.c\
 			pm3_binlib.c\
 			scripting.c\
 			cmdscript.c\
@@ -133,11 +136,7 @@ CMDSRCS = 	nonce2key/crapto1.c\
 			tea.c\
 			prng.c\
 			radixsort.c\
-			bucketsort.c\
-			cmdlfpresco.c\
-			cmdlfpyramid.c\
-			cmdlfguard.c
-
+			bucketsort.c
 ZLIBSRCS = deflate.c adler32.c trees.c zutil.c inflate.c inffast.c inftrees.c
 ZLIB_FLAGS = -DZ_SOLO -DZ_PREFIX -DNO_GZIP -DZLIB_PM3_TUNED 
 #-DDEBUG -Dverbose=1
diff --git a/client/cmddata.c b/client/cmddata.c
index 967fa28f..902a6363 100644
--- a/client/cmddata.c
+++ b/client/cmddata.c
@@ -8,23 +8,22 @@
 // Data and Graph commands
 //-----------------------------------------------------------------------------
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include "proxmark3.h"
-#include "data.h"
-#include "ui.h"
-#include "graph.h"
-#include "cmdparser.h"
+#include <stdio.h>    // also included in util.h
+#include <string.h>   // also included in util.h
+#include <limits.h>   // for CmdNorm INT_MIN && INT_MAX
+#include "data.h"     // also included in util.h
+#include "cmddata.h"
 #include "util.h"
 #include "cmdmain.h"
-#include "cmddata.h"
-#include "lfdemod.h"
-#include "usb_cmd.h"
-#include "crc.h"
-#include "crc16.h"
-#include "loclass/cipherutils.h"
+#include "proxmark3.h"
+#include "ui.h"       // for show graph controls
+#include "graph.h"    // for graph data
+#include "cmdparser.h"// already included in cmdmain.h
+#include "usb_cmd.h"  // already included in cmdmain.h and proxmark3.h
+#include "lfdemod.h"  // for demod code
+#include "crc.h"      // for pyramid checksum maxim
+#include "crc16.h"    // for FDXB demod checksum
+#include "loclass/cipherutils.h" // for decimating samples in getsamples
 
 uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
 uint8_t g_debugMode=0;
@@ -1265,7 +1264,7 @@ int CmdFSKdemodAWID(const char *Cmd)
 	//get binary from fsk wave
 	int idx = AWIDdemodFSK(BitStream, &size);
 	if (idx<=0){
-		if (g_debugMode==1){
+		if (g_debugMode){
 			if (idx == -1)
 				PrintAndLog("DEBUG: Error - not enough samples");
 			else if (idx == -2)
@@ -1303,7 +1302,7 @@ int CmdFSKdemodAWID(const char *Cmd)
 
 	size = removeParity(BitStream, idx+8, 4, 1, 88);
 	if (size != 66){
-		if (g_debugMode==1) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format");
+		if (g_debugMode) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format");
 		return 0;
 	}
 	// ok valid card found!
@@ -1363,7 +1362,7 @@ int CmdFSKdemodPyramid(const char *Cmd)
 	//get binary from fsk wave
 	int idx = PyramiddemodFSK(BitStream, &size);
 	if (idx < 0){
-		if (g_debugMode==1){
+		if (g_debugMode){
 			if (idx == -5)
 				PrintAndLog("DEBUG: Error - not enough samples");
 			else if (idx == -1)
@@ -1419,7 +1418,7 @@ int CmdFSKdemodPyramid(const char *Cmd)
 
 	size = removeParity(BitStream, idx+8, 8, 1, 120);
 	if (size != 105){
-		if (g_debugMode==1) 
+		if (g_debugMode) 
 			PrintAndLog("DEBUG: Error at parity check - tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3);
 		return 0;
 	}
@@ -1637,21 +1636,21 @@ int CmdIndalaDecode(const char *Cmd)
 	}
 
 	if (!ans){
-		if (g_debugMode==1) 
+		if (g_debugMode) 
 			PrintAndLog("Error1: %d",ans);
 		return 0;
 	}
 	uint8_t invert=0;
 	size_t size = DemodBufferLen;
-	size_t startIdx = indala26decode(DemodBuffer, &size, &invert);
-	if (startIdx < 1 || size > 224) {
-		if (g_debugMode==1)
+	int startIdx = indala26decode(DemodBuffer, &size, &invert);
+	if (startIdx < 0 || size > 224) {
+		if (g_debugMode)
 			PrintAndLog("Error2: %d",ans);
 		return -1;
 	}
-	setDemodBuf(DemodBuffer, size, startIdx);
+	setDemodBuf(DemodBuffer, size, (size_t)startIdx);
 	if (invert)
-		if (g_debugMode==1)
+		if (g_debugMode)
 			PrintAndLog("Had to invert bits");
 
 	PrintAndLog("BitLen: %d",DemodBufferLen);
diff --git a/client/cmddata.h b/client/cmddata.h
index 20bdbd2b..9b9f2da9 100644
--- a/client/cmddata.h
+++ b/client/cmddata.h
@@ -11,6 +11,12 @@
 #ifndef CMDDATA_H__
 #define CMDDATA_H__
 
+#include <stdlib.h>  //size_t
+#include <stdint.h>  //uint_32+
+#include <stdbool.h> //bool
+
+#include "cmdparser.h" // for command_t
+
 command_t * CmdDataCommands();
 
 int CmdData(const char *Cmd);
diff --git a/client/cmdlf.h b/client/cmdlf.h
index 21c79b42..1bb94162 100644
--- a/client/cmdlf.h
+++ b/client/cmdlf.h
@@ -15,26 +15,27 @@
 #include <string.h>
 #include <limits.h>
 #include "proxmark3.h"
-#include "data.h"
-#include "graph.h"
-#include "ui.h"
-#include "cmdparser.h"
-#include "cmdmain.h"
-#include "cmddata.h"
-#include "util.h"
-#include "cmdlfhid.h"
-#include "cmdlfawid.h"
-#include "cmdlfti.h"
-#include "cmdlfem4x.h"
-#include "cmdlfhitag.h"
-#include "cmdlft55xx.h"
-#include "cmdlfpcf7931.h"
-#include "cmdlfio.h"
 #include "lfdemod.h"
-#include "cmdlfviking.h"
-#include "cmdlfpresco.h"
-#include "cmdlfpyramid.h"
-#include "cmdlfguard.h"
+			
+#include "util.h"        // for parsing cli command utils
+#include "ui.h"          // for show graph controls
+#include "graph.h"       // for graph data
+#include "cmdparser.h"   // for getting cli commands included in cmdmain.h
+#include "cmdmain.h"     // for sending cmds to device
+#include "data.h"        // for GetFromBigBuf
+#include "cmddata.h"     // for `lf search`
+#include "cmdlfawid.h"   // for awid menu
+#include "cmdlfem4x.h"   // for em4x menu
+#include "cmdlfhid.h"    // for hid menu
+#include "cmdlfhitag.h"  // for hitag menu
+#include "cmdlfio.h"     // for ioprox menu
+#include "cmdlft55xx.h"  // for t55xx menu
+#include "cmdlfti.h"     // for ti menu
+#include "cmdlfpresco.h" // for presco menu
+#include "cmdlfpcf7931.h"// for pcf7931 menu
+#include "cmdlfpyramid.h"// for pyramid menu
+#include "cmdlfviking.h" // for viking menu
+#include "cmdlfguard.h"  // for GuardAll menu
 
 int CmdLF(const char *Cmd);
 
diff --git a/client/util.h b/client/util.h
index 9c16ba5b..990a8444 100644
--- a/client/util.h
+++ b/client/util.h
@@ -9,13 +9,12 @@
 //-----------------------------------------------------------------------------
 
 #include <stdio.h>
-#include <stdint.h>
-#include <stdio.h>
+#include <stdint.h>  //included in data.h
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <time.h>
-#include "data.h"
+#include "data.h"  //for FILE_PATH_SIZE
 
 #ifndef ROTR
 # define ROTR(x,n) (((uintmax_t)(x) >> (n)) | ((uintmax_t)(x) << ((sizeof(x) * 8) - (n))))
-- 
2.39.5