From: marshmellow42 <marshmellowrf@gmail.com>
Date: Tue, 9 Jun 2015 03:14:11 +0000 (-0400)
Subject: reveng RunModel - add endian switches
X-Git-Tag: v3.0.0~76^2~14
X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/7a23fca13a06266f169b7d739ef907d9ba9aebcb?ds=sidebyside

reveng RunModel - add endian switches
---

diff --git a/client/cmdcrc.c b/client/cmdcrc.c
index f93ab99d..3e68afb9 100644
--- a/client/cmdcrc.c
+++ b/client/cmdcrc.c
@@ -295,7 +295,13 @@ int CmdrevengTest(const char *Cmd){
 }
 
 //-c || -v
-int RunModel(char *inModel, char *inHexStr, bool reverse, char *result){
+//inModel = valid model name string - CRC-8
+//inHexStr = input hex string to calculate crc on
+//reverse = reverse calc option if true
+//endian = {0 = calc default endian input and output, b = big endian input and output, B = big endian output, r = right justified
+//          l = little endian input and output, L = little endian output only, t = left justified}
+//result = calculated crc hex string
+int RunModel(char *inModel, char *inHexStr, bool reverse, char endian, char *result){
 	/* default values */
 	static model_t model = {
 		PZERO,		// no CRC polynomial, user must specify
@@ -331,6 +337,34 @@ int RunModel(char *inModel, char *inHexStr, bool reverse, char *result){
 	width = plen(model.spoly);
 	rflags |= R_HAVEP | R_HAVEI | R_HAVERI | R_HAVERO | R_HAVEX;
 	
+	//set flags
+	switch (endian) {
+		case 'b': /* b  big-endian (RefIn = false, RefOut = false ) */
+			model.flags &= ~P_REFIN;
+			rflags |= R_HAVERI;
+			/* fall through: */
+		case 'B': /* B  big-endian output (RefOut = false) */
+			model.flags &= ~P_REFOUT;
+			rflags |= R_HAVERO;
+			mnovel(&model);
+			/* fall through: */
+		case 'r': /* r  right-justified */
+			model.flags |= P_RTJUST;
+			break;
+		case 'l': /* l  little-endian input and output */
+			model.flags |= P_REFIN;
+			rflags |= R_HAVERI;
+			/* fall through: */
+		case 'L': /* L  little-endian output */
+			model.flags |= P_REFOUT;
+			rflags |= R_HAVERO;
+			mnovel(&model);
+			/* fall through: */
+		case 't': /* t  left-justified */
+			model.flags &= ~P_RTJUST;
+			break;
+	}
+
 	mcanon(&model);
 
 	if (reverse) {
@@ -402,15 +436,16 @@ int CmdrevengTestC(const char *Cmd){
 	char inHexStr[30] = {0x00};
 	char result[30];
 	int dataLen;
-
+	char endian = 0;
 	dataLen = param_getstr(Cmd, cmdp++, inModel);
 	if (dataLen < 4) return 0;
 	dataLen = param_getstr(Cmd, cmdp++, inHexStr);
 	if (dataLen < 4) return 0;
-	bool reverse = (param_get8(Cmd, cmdp)) ? true : false;
+	bool reverse = (param_get8(Cmd, cmdp++)) ? true : false;
+	endian = param_getchar(Cmd, cmdp++); 
 
 	//PrintAndLog("mod: %s, hex: %s, rev %d", inModel, inHexStr, reverse);
-	int ans = RunModel(inModel, inHexStr, reverse, result);
+	int ans = RunModel(inModel, inHexStr, reverse, endian, result);
 	if (!ans) return 0;
 	
 	PrintAndLog("Result: %s",result);
diff --git a/client/cmdcrc.h b/client/cmdcrc.h
index 53aa935e..5b324020 100644
--- a/client/cmdcrc.h
+++ b/client/cmdcrc.h
@@ -15,5 +15,5 @@ int CmdCrc(const char *Cmd);
 int CmdrevengTest(const char *Cmd);
 int CmdrevengTestC(const char *Cmd);
 int GetModels(char *Models[], int *count, uint32_t *width);
-int RunModel(char *inModel, char *inHexStr, bool reverse, char *result);
+int RunModel(char *inModel, char *inHexStr, bool reverse, char endian, char *result);
 #endif