X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/c71f4da9bc3d8207e8308e3212345eb578e1a08f..b1013281d38ef0184fc29ae421ab98e7c8a6b3bf:/client/cmdlf.c

diff --git a/client/cmdlf.c b/client/cmdlf.c
index 0ab24dba..2c33dba9 100644
--- a/client/cmdlf.c
+++ b/client/cmdlf.c
@@ -12,14 +12,14 @@ static int CmdHelp(const char *Cmd);
 
 int usage_lf_cmdread(void) {
 	PrintAndLog("Usage: lf cmdread d <delay period> z <zero period> o <one period> c <cmdbytes> [H]");
-	PrintAndLog("Options:        ");
+	PrintAndLog("Options:");
 	PrintAndLog("       h             This help");
 	PrintAndLog("       L             Low frequency (125 KHz)");
 	PrintAndLog("       H             High frequency (134 KHz)");
-	PrintAndLog("       d <delay>     delay OFF period, (dec)");
-	PrintAndLog("       z <zero>      time period ZERO, (dec)");
-	PrintAndLog("       o <one>       time period ONE, (dec)");
-	PrintAndLog("       c <cmd>       Command bytes");
+	PrintAndLog("       d <delay>     delay OFF period, (decimal)");
+	PrintAndLog("       z <zero>      time period ZERO, (decimal)");
+	PrintAndLog("       o <one>       time period ONE, (decimal)");
+	PrintAndLog("       c <cmd>       Command bytes  (in ones and zeros)");
 	PrintAndLog("       ************* All periods in microseconds (ms)");
 	PrintAndLog("Examples:");
 	PrintAndLog("      lf cmdread d 80 z 100 o 200 c 11000");
@@ -28,7 +28,7 @@ int usage_lf_cmdread(void) {
 }
 int usage_lf_read(void){
 	PrintAndLog("Usage: lf read [h] [s]");
-	PrintAndLog("Options:        ");
+	PrintAndLog("Options:");
 	PrintAndLog("       h            This help");
 	PrintAndLog("       s            silent run no printout");
 	PrintAndLog("This function takes no arguments. ");
@@ -37,15 +37,15 @@ int usage_lf_read(void){
 }
 int usage_lf_snoop(void) {
 	PrintAndLog("Usage: lf snoop");
-	PrintAndLog("Options:        ");
+	PrintAndLog("Options:");
 	PrintAndLog("       h            This help");
 	PrintAndLog("This function takes no arguments. ");
 	PrintAndLog("Use 'lf config' to set parameters.");
 	return 0;
 }
 int usage_lf_config(void) {
-	PrintAndLog("Usage: lf config [H|<divisor>] [b <bps>] [d <decim>] [a 0|1]");
-	PrintAndLog("Options:        ");
+	PrintAndLog("Usage: lf config [h] [H|<divisor>] [b <bps>] [d <decim>] [a 0|1]");
+	PrintAndLog("Options:");
 	PrintAndLog("       h             This help");
 	PrintAndLog("       L             Low frequency (125 KHz)");
 	PrintAndLog("       H             High frequency (134 KHz)");
@@ -68,7 +68,7 @@ int usage_lf_config(void) {
 }
 int usage_lf_simfsk(void) {
 	PrintAndLog("Usage: lf simfsk [c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>]");
-	PrintAndLog("Options:        ");
+	PrintAndLog("Options:");
 	PrintAndLog("       h              This help");
 	PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
 	PrintAndLog("       i              invert data");
@@ -81,7 +81,7 @@ int usage_lf_simfsk(void) {
 }
 int usage_lf_simask(void) {
 	PrintAndLog("Usage: lf simask [c <clock>] [i] [b|m|r] [s] [d <raw hex to sim>]");
-	PrintAndLog("Options:        ");
+	PrintAndLog("Options:");
 	PrintAndLog("       h              This help");
 	PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
 	PrintAndLog("       i              invert data");
@@ -94,7 +94,7 @@ int usage_lf_simask(void) {
 }
 int usage_lf_simpsk(void) {
 	PrintAndLog("Usage: lf simpsk [1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>]");
-	PrintAndLog("Options:        ");
+	PrintAndLog("Options:");
 	PrintAndLog("       h              This help");
 	PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
 	PrintAndLog("       i              invert data");
@@ -106,35 +106,37 @@ int usage_lf_simpsk(void) {
 	return 0;
 }
 int usage_lf_find(void){
-    PrintAndLog("Usage:  lf search <0|1> [u]");
-    PrintAndLog("     <use data from Graphbuffer> , if not set, try reading data from tag.");
-    PrintAndLog("     [Search for Unknown tags] , if not set, reads only known tags.");
+    PrintAndLog("Usage:  lf search [h] <0|1> [u]");
     PrintAndLog("");
-    PrintAndLog("    sample: lf search     = try reading data from tag & search for known tags");
-    PrintAndLog("          : lf search 1   = use data from GraphBuffer & search for known tags");
-    PrintAndLog("          : lf search u   = try reading data from tag & search for known and unknown tags");
-    PrintAndLog("          : lf search 1 u = use data from GraphBuffer & search for known and unknown tags");
+	PrintAndLog("Options:");
+	PrintAndLog("       h             This help");
+	PrintAndLog("       <0|1>         Use data from Graphbuffer, if not set, try reading data from tag.");
+    PrintAndLog("       u             Search for Unknown tags, if not set, reads only known tags.");
+	PrintAndLog("Examples:");
+    PrintAndLog("      lf search     = try reading data from tag & search for known tags");
+    PrintAndLog("      lf search 1   = use data from GraphBuffer & search for known tags");
+    PrintAndLog("      lf search u   = try reading data from tag & search for known and unknown tags");
+    PrintAndLog("      lf search 1 u = use data from GraphBuffer & search for known and unknown tags");
 	return 0;
 }
 
 
 /* send a LF command before reading */
-int CmdLFCommandRead(const char *Cmd)
-{
-	static char dummy[3] = {0x20,0x00,0x00};
-	UsbCommand c = {CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K};
-	bool errors = FALSE;
+int CmdLFCommandRead(const char *Cmd) {
 
+	bool errors = FALSE;
+	bool useHighFreq = FALSE;
+	uint16_t one = 0, zero = 0;
   	uint8_t cmdp = 0;
 	int strLength = 0;
-
+	UsbCommand c = {CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K, {0,0,0}};
+	
 	while(param_getchar(Cmd, cmdp) != 0x00) {
-		switch(param_getchar(Cmd, cmdp))
-		{
+		switch(param_getchar(Cmd, cmdp)) {
 		case 'h':
 			return usage_lf_cmdread();
 		case 'H':
-			dummy[1]='h';
+			useHighFreq = TRUE;
 			cmdp++;
 			break;
 		case 'L':
@@ -149,11 +151,11 @@ int CmdLFCommandRead(const char *Cmd)
 			cmdp+=2;
 			break;
 		case 'z':
-			c.arg[1] = param_get32ex(Cmd, cmdp+1, 0, 10);
+			zero = param_get32ex(Cmd, cmdp+1, 0, 10) & 0xFFFF;
 			cmdp+=2;
 			break;
 		case 'o':
-			c.arg[2] = param_get32ex(Cmd, cmdp+1, 0, 10);
+			one = param_get32ex(Cmd, cmdp+1, 0, 10) & 0xFFFF;
 			cmdp+=2;
 			break;
 		default:
@@ -164,13 +166,16 @@ int CmdLFCommandRead(const char *Cmd)
 		if(errors) break;
 	}
 	// No args
-	if (cmdp == 0) errors = 1;
+	if (cmdp == 0) errors = TRUE;
 
 	//Validations
 	if (errors) return usage_lf_cmdread();
 	
-	// in case they specified 'H'
-	strcpy((char *)&c.d.asBytes + strLength, dummy);
+	// zero and one lengths
+	c.arg[1] = zero << 16 | one;
+	
+	// add frequency 125 or 134
+	c.arg[2] = useHighFreq;
 
 	clearCommandBuffer();
 	SendCommand(&c);
@@ -637,115 +642,113 @@ int CmdLFSim(const char *Cmd)
 	return 0;
 }
 
-// by marshmellow - sim ask data given clock, fcHigh, fcLow, invert 
+// by marshmellow - sim fsk data given clock, fcHigh, fcLow, invert 
 // - allow pull data from DemodBuffer
 int CmdLFfskSim(const char *Cmd)
 {
 	//might be able to autodetect FCs and clock from Graphbuffer if using demod buffer
 	// otherwise will need FChigh, FClow, Clock, and bitstream
-  uint8_t fcHigh=0, fcLow=0, clk=0;
-  uint8_t invert=0;
-  bool errors = FALSE;
-  char hexData[32] = {0x00}; // store entered hex data
-  uint8_t data[255] = {0x00}; 
-  int dataLen = 0;
-  uint8_t cmdp = 0;
-  while(param_getchar(Cmd, cmdp) != 0x00)
-  {
-    switch(param_getchar(Cmd, cmdp))
-    {
-    case 'h':
-      return usage_lf_simfsk();
-    case 'i':
-      invert = 1;
-      cmdp++;
-      break;
-    case 'c':
-      errors |= param_getdec(Cmd,cmdp+1,&clk);
-      cmdp+=2;
-      break;
-    case 'H':
-      errors |= param_getdec(Cmd,cmdp+1,&fcHigh);
-      cmdp+=2;
-      break;
-    case 'L':
-      errors |= param_getdec(Cmd,cmdp+1,&fcLow);
-      cmdp+=2;
-      break;
-    //case 's':
-    //  separator=1;
-    //  cmdp++;
-    //  break;
-    case 'd':
-      dataLen = param_getstr(Cmd, cmdp+1, hexData);
-      if (dataLen==0) {
-        errors=TRUE; 
-      } else {
-        dataLen = hextobinarray((char *)data, hexData);
-      }   
-      if (dataLen==0) errors=TRUE; 
-      if (errors) PrintAndLog ("Error getting hex data");
-      cmdp+=2;
-      break;
-    default:
-      PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
-      errors = TRUE;
-      break;
-    }
-    if(errors) break;
-  }
-  if(cmdp == 0 && DemodBufferLen == 0)
-  {
-    errors = TRUE;// No args
-  }
-
-  //Validations
-  if(errors)
-  {
-    return usage_lf_simfsk();
-  }
+	uint8_t fcHigh = 0, fcLow = 0, clk = 0;
+	uint8_t invert = 0;
+	bool errors = FALSE;
+	char hexData[32] = {0x00}; // store entered hex data
+	uint8_t data[255] = {0x00}; 
+	int dataLen = 0;
+	uint8_t cmdp = 0;
+	
+	while(param_getchar(Cmd, cmdp) != 0x00)
+	{
+		switch(param_getchar(Cmd, cmdp))
+		{
+			case 'h':
+				return usage_lf_simfsk();
+			case 'i':
+				invert = 1;
+				cmdp++;
+				break;
+			case 'c':
+				errors |= param_getdec(Cmd, cmdp+1, &clk);
+				cmdp += 2;
+				break;
+			case 'H':
+				errors |= param_getdec(Cmd, cmdp+1, &fcHigh);
+				cmdp += 2;
+				break;
+			case 'L':
+				errors |= param_getdec(Cmd, cmdp+1, &fcLow);
+				cmdp += 2;
+				break;
+			//case 's':
+			//  separator = 1;
+			//  cmdp++;
+			//  break;
+			case 'd':
+				dataLen = param_getstr(Cmd, cmdp+1, hexData);
+				if (dataLen == 0)
+					errors = TRUE; 
+				else
+					dataLen = hextobinarray((char *)data, hexData);
+				   
+				if (dataLen == 0) errors = TRUE; 
+				if (errors) PrintAndLog ("Error getting hex data");
+				cmdp+=2;
+				break;
+			default:
+				PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
+				errors = TRUE;
+				break;
+		}
+		if(errors) break;
+	}
+	
+	// No args
+	if(cmdp == 0 && DemodBufferLen == 0)
+		errors = TRUE;
 
-  if (dataLen == 0){ //using DemodBuffer 
-    if (clk==0 || fcHigh==0 || fcLow==0){ //manual settings must set them all
-      uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0);
-      if (ans==0){
-        if (!fcHigh) fcHigh=10;
-        if (!fcLow) fcLow=8;
-        if (!clk) clk=50;
-      }
-    }
-  } else {
-    setDemodBuf(data, dataLen, 0);
-  }
+	//Validations
+	if(errors) return usage_lf_simfsk();
+
+	if (dataLen == 0){ //using DemodBuffer 
+		if (clk == 0 || fcHigh == 0 || fcLow == 0){ //manual settings must set them all
+			uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0);
+			if (ans==0){
+				if (!fcHigh) fcHigh = 10;
+				if (!fcLow) fcLow = 8;
+				if (!clk) clk = 50;
+			}
+		}
+	} else {
+		setDemodBuf(data, dataLen, 0);
+	}
 
 	//default if not found
-  if (clk == 0) clk = 50;
-  if (fcHigh == 0) fcHigh = 10;
-  if (fcLow == 0) fcLow = 8;
+	if (clk == 0) clk = 50;
+	if (fcHigh == 0) fcHigh = 10;
+	if (fcLow == 0) fcLow = 8;
 
-  uint16_t arg1, arg2;
-  arg1 = fcHigh << 8 | fcLow;
-  arg2 = invert << 8 | clk;
-  size_t size = DemodBufferLen;
-  if (size > USB_CMD_DATA_SIZE) {
-    PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", size, USB_CMD_DATA_SIZE);
-    size = USB_CMD_DATA_SIZE;
-  } 
-  UsbCommand c = {CMD_FSK_SIM_TAG, {arg1, arg2, size}};
+	uint16_t arg1, arg2;
+	arg1 = fcHigh << 8 | fcLow;
+	arg2 = invert << 8 | clk;
+	size_t size = DemodBufferLen;
+	if (size > USB_CMD_DATA_SIZE) {
+		PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", size, USB_CMD_DATA_SIZE);
+		size = USB_CMD_DATA_SIZE;
+	} 
+	UsbCommand c = {CMD_FSK_SIM_TAG, {arg1, arg2, size}};
 
-  memcpy(c.d.asBytes, DemodBuffer, size);
+	memcpy(c.d.asBytes, DemodBuffer, size);
 	clearCommandBuffer();
-  SendCommand(&c);
-  return 0;
+	SendCommand(&c);
+	return 0;
 }
 
 // by marshmellow - sim ask data given clock, invert, manchester or raw, separator 
 // - allow pull data from DemodBuffer
 int CmdLFaskSim(const char *Cmd)
 {
-	//autodetect clock from Graphbuffer if using demod buffer
+	// autodetect clock from Graphbuffer if using demod buffer
 	// needs clock, invert, manchester/raw as m or r, separator as s, and bitstream
-	uint8_t encoding = 1, separator = 0, clk=0, invert=0;
+	uint8_t encoding = 1, separator = 0, clk = 0, invert = 0;
 	bool errors = FALSE;
 	char hexData[32] = {0x00}; 
 	uint8_t data[255]= {0x00}; // store entered hex data
@@ -760,35 +763,35 @@ int CmdLFaskSim(const char *Cmd)
 				cmdp++;
 				break;
 			case 'c':
-				errors |= param_getdec(Cmd,cmdp+1,&clk);
-				cmdp+=2;
+				errors |= param_getdec(Cmd, cmdp+1, &clk);
+				cmdp += 2;
 				break;
 			case 'b':
-				encoding=2; //biphase
+				encoding = 2; //biphase
 				cmdp++;
 				break;
 			case 'm':
-				encoding=1;
+				encoding = 1; //manchester
 				cmdp++;
 				break;
 			case 'r':
-				encoding=0;
+				encoding = 0; //raw
 				cmdp++;
 				break;
 			case 's':
-				separator=1;
+				separator = 1;
 				cmdp++;
 				break;
 			case 'd':
 				dataLen = param_getstr(Cmd, cmdp+1, hexData);
-				if (dataLen==0)
+				if (dataLen == 0)
 					errors = TRUE; 
 				else
 					dataLen = hextobinarray((char *)data, hexData);
 				
-				if (dataLen==0) errors = TRUE; 
+				if (dataLen == 0) errors = TRUE; 
 				if (errors) PrintAndLog ("Error getting hex data, datalen: %d", dataLen);
-				cmdp+=2;
+				cmdp += 2;
 				break;
 			default:
 				PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
@@ -797,9 +800,10 @@ int CmdLFaskSim(const char *Cmd)
 		}
 		if(errors) break;
 	}
-  
+
+	// No args
 	if(cmdp == 0 && DemodBufferLen == 0)
-		errors = TRUE;// No args
+		errors = TRUE;
 
 	//Validations
 	if(errors) return usage_lf_simask();
@@ -1050,75 +1054,69 @@ int CmdLFfind(const char *Cmd) {
 
 	ans=CmdFSKdemodIO("");
 	if (ans>0) {
-	PrintAndLog("\nValid IO Prox ID Found!");
-	return 1;
+		PrintAndLog("\nValid IO Prox ID Found!");
+		return 1;
 	}
-
 	ans=CmdFSKdemodPyramid("");
 	if (ans>0) {
-	PrintAndLog("\nValid Pyramid ID Found!");
-	return 1;
+		PrintAndLog("\nValid Pyramid ID Found!");
+		return 1;
 	}
-
 	ans=CmdFSKdemodParadox("");
 	if (ans>0) {
-	PrintAndLog("\nValid Paradox ID Found!");
-	return 1;
+		PrintAndLog("\nValid Paradox ID Found!");
+		return 1;
 	}
-
 	ans=CmdFSKdemodAWID("");
 	if (ans>0) {
-	PrintAndLog("\nValid AWID ID Found!");
-	return 1;
+		PrintAndLog("\nValid AWID ID Found!");
+		return 1;
 	}
-
 	ans=CmdFSKdemodHID("");
 	if (ans>0) {
-	PrintAndLog("\nValid HID Prox ID Found!");
-	return 1;
+		PrintAndLog("\nValid HID Prox ID Found!");
+		return 1;
 	}
-
 	ans=CmdAskEM410xDemod("");
 	if (ans>0) {
-	PrintAndLog("\nValid EM410x ID Found!");
-	return 1;
+		PrintAndLog("\nValid EM410x ID Found!");
+		return 1;
 	}
-
 	ans=CmdG_Prox_II_Demod("");
 	if (ans>0) {
-	PrintAndLog("\nValid Guardall G-Prox II ID Found!");
-	return 1;
+		PrintAndLog("\nValid Guardall G-Prox II ID Found!");
+		return 1;
 	}
-
 	ans=CmdFDXBdemodBI("");
 	if (ans>0) {
 		PrintAndLog("\nValid FDX-B ID Found!");
 		return 1;
 	}
-
 	ans=EM4x50Read("", false);
 	if (ans>0) {
 		PrintAndLog("\nValid EM4x50 ID Found!");
 		return 1;
 	}	
-
 	ans=CmdVikingDemod("");
 	if (ans>0) {
 		PrintAndLog("\nValid Viking ID Found!");
 		return 1;
 	}	
-
 	ans=CmdIndalaDecode("");
 	if (ans>0) {
 		PrintAndLog("\nValid Indala ID Found!");
 		return 1;
 	}
-
 	ans=CmdPSKNexWatch("");
 	if (ans>0) {
 		PrintAndLog("\nValid NexWatch ID Found!");
 		return 1;
 	}
+	ans=CmdJablotronDemod("");
+	if (ans>0) {
+		PrintAndLog("\nValid Jablotron ID Found!");
+		return 1;
+	}
 	ans=CmdLFNedapDemod("");
 	if (ans>0) {
 		PrintAndLog("\nValid NEDAP ID Found!");
@@ -1197,6 +1195,7 @@ static command_t CommandTable[] =
 	{"hid",         CmdLFHID,           1, "{ HID RFIDs... }"},
 	{"hitag",       CmdLFHitag,         1, "{ HITAG RFIDs... }"},
 	{"io",			CmdLFIO,			1, "{ IOPROX RFIDs... }"},
+	{"jablotron",	CmdLFJablotron,		1, "{ JABLOTRON RFIDs... }"},
 	{"nedap",		CmdLFNedap,			1, "{ NEDAP RFIDs... }"},
 	{"pcf7931",     CmdLFPCF7931,       1, "{ PCF7931 RFIDs... }"},
 	{"presco",      CmdLFPresco,        1, "{ Presco RFIDs... }"},