X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/111c6934d4e5c58883d08210399afe8eaeccc5c3..1c59e80aba9067335bef60222c6ebbd98fba8c44:/client/cmdhflegic.c?ds=inline

diff --git a/client/cmdhflegic.c b/client/cmdhflegic.c
index 31d59005..b52034dc 100644
--- a/client/cmdhflegic.c
+++ b/client/cmdhflegic.c
@@ -404,13 +404,15 @@ int CmdLegicRFRead(const char *Cmd) {
 	PrintAndLog("Current IV: 0x%02x", IV);
 	
 	// get some  prng bytes from 
-	uint8_t temp[12];
+	uint8_t temp[32];
 	legic_prng_init(IV);
-	for ( uint8_t j = 0; j < sizeof(temp); ++j)
-		temp[j] = legic_prng_get_bits(8);
-
-	PrintAndLog("PRNG: %s", sprint_hex(temp, sizeof(temp)));
-	
+	for ( uint8_t j = 0; j < sizeof(temp); ++j) {
+		temp[j] = legic_prng_get_bit(1);
+		legic_prng_forward(1);
+		//PrintAndLog("PRNG: %s", sprint_hex(temp, sizeof(temp)));
+	}
+	PrintAndLog("PRNG: %s", sprint_bin(temp, sizeof(temp)));
+		
 	UsbCommand c = {CMD_READER_LEGIC_RF, {offset, len, IV}};
 	clearCommandBuffer();
 	SendCommand(&c);
@@ -418,11 +420,14 @@ int CmdLegicRFRead(const char *Cmd) {
 	if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) {
 		uint8_t isOK = resp.arg[0] & 0xFF;
 		uint16_t len = resp.arg[1] & 0x3FF;
-		if ( isOK ) {
-			PrintAndLog("use 'hf legic decode' or");
-			PrintAndLog("'data hexsamples %d' to view results", len);	
-			
-		}
+		 if ( isOK ) {
+			PrintAndLog("use 'hf legic decode'");
+		 }
+			uint8_t *data = resp.d.asBytes;
+			PrintAndLog("\nData        |");
+			PrintAndLog("-----------------------------");
+			PrintAndLog(" %s|\n", sprint_hex(data, len));
+		// }
 	} else {
 		PrintAndLog("command execution time out");
 		return 1;
@@ -685,6 +690,37 @@ int CmdLegicRfFill(const char *Cmd) {
     return 0;
  }
 
+void static calc4(uint8_t *cmd, uint8_t len){
+	crc_t crc;
+ 	//crc_init_ref(&crc, 4, 0x19 >> 1, 0x5, 0, TRUE, TRUE);
+	crc_init(&crc, 4, 0x19 >> 1, 0x5, 0);
+
+	crc_clear(&crc);
+	crc_update(&crc, 1, 1); /* CMD_READ */
+	crc_update(&crc, cmd[0], 8);
+	crc_update(&crc, cmd[1], 8);
+	printf("crc4 %X\n", reflect(crc_finish(&crc), 4) ) ;
+
+	crc_clear(&crc);
+	crc_update(&crc, 1, 1); /* CMD_READ */
+	crc_update(&crc, cmd[0], 8);
+	crc_update(&crc, cmd[1], 8);
+	printf("crc4 %X\n",  crc_finish(&crc), 4 ) ;
+
+	printf("---- old ---\n");
+	crc_update2(&crc, 1, 1); /* CMD_READ */
+	crc_update2(&crc, cmd[0], 8);
+	crc_update2(&crc, cmd[1], 8);
+	printf("crc4 %X \n", reflect(crc_finish(&crc), 4) ) ;
+
+	
+	crc_clear(&crc);
+	crc_update2(&crc, 1, 1); /* CMD_READ */
+	crc_update2(&crc, cmd[0], 8);
+	crc_update2(&crc, cmd[1], 8);
+	printf("crc4 %X\n",  crc_finish(&crc), 4 ) ;
+}	
+ 
 int CmdLegicCalcCrc8(const char *Cmd){
 
 	uint8_t *data = NULL;
@@ -760,10 +796,13 @@ int CmdLegicCalcCrc8(const char *Cmd){
 	
 	switch (type){
 		case 16:
-			PrintAndLog("LEGIC CRC16: %X", CRC16Legic(data, len, uidcrc));
+			PrintAndLog("Legic crc16: %X", CRC16Legic(data, len, uidcrc));
+			break;
+		case 4:
+			calc4(data, 0);
 			break;
 		default:
-			PrintAndLog("LEGIC CRC8: %X",  CRC8Legic(data, len) );
+			PrintAndLog("Legic crc8: %X",  CRC8Legic(data, len) );
 			break;
 	}
 	
@@ -782,6 +821,7 @@ static command_t CommandTable[] =  {
 	{"writeraw",CmdLegicRfRawWrite,	0, "<address> <value> <iv> -- Write direct to address"},
 	{"fill",	CmdLegicRfFill, 0, "<offset> <length> <value> -- Fill/Write tag with constant value"},
 	{"crc8",	CmdLegicCalcCrc8, 1, "Calculate Legic CRC8 over given hexbytes"},
+	{"info",	CmdLegicCalcCrc8, 1, "Information"},
 	{NULL, NULL, 0, NULL}
 };