X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f4d0ffd1b99481943e77fce805be5eb10241b2d9..489c39c9a5e9046dc9438b4ec1c57b1feace1038:/client/util.c?ds=inline

diff --git a/client/util.c b/client/util.c
index a3672130..ab158222 100644
--- a/client/util.c
+++ b/client/util.c
@@ -21,14 +21,14 @@ int ukbhit(void)
   int error;
   static struct termios Otty, Ntty;
 
-  tcgetattr( 0, &Otty);
+  if ( tcgetattr( 0, &Otty) == -1) return -1;
   Ntty = Otty;
 
-  Ntty.c_iflag          = 0;       /* input mode                */
-  Ntty.c_oflag          = 0;       /* output mode               */
-  Ntty.c_lflag         &= ~ICANON; /* raw mode */
-  Ntty.c_cc[VMIN]       = CMIN;    /* minimum time to wait      */
-  Ntty.c_cc[VTIME]      = CTIME;   /* minimum characters to wait for */
+  Ntty.c_iflag		= 0;       /* input mode                */
+  Ntty.c_oflag		= 0;       /* output mode               */
+  Ntty.c_lflag		&= ~ICANON; /* raw mode */
+  Ntty.c_cc[VMIN]	= CMIN;    /* minimum time to wait      */
+  Ntty.c_cc[VTIME]	= CTIME;   /* minimum characters to wait for */
 
   if (0 == (error = tcsetattr(0, TCSANOW, &Ntty))) {
     error += ioctl(0, FIONREAD, &cnt);
@@ -97,14 +97,22 @@ void FillFileNameByUID(char *fileName, uint8_t * uid, char *ext, int byteCount)
 }
 
 // printing and converting functions
-
-void print_hex(const uint8_t * data, const size_t len)
-{
+void print_hex(const uint8_t * data, const size_t len) {
 	size_t i;
-
-	for (i=0; i < len; i++)
+	for (i=0; i < len; ++i)
 		printf("%02x ", data[i]);
+	printf("\n");
+}
+void print_hex_break(const uint8_t *data, const size_t len, uint8_t breaks) {
+	size_t i;
+	for ( i = 0; i < len; ++i) {
 
+		printf("%02X ", data[i]);
+		
+		// check if a line break is needed
+		if ( breaks > 0 && !(i+1 % breaks) )
+			printf("(%d %d)\n", i+1 , breaks);
+	}
 	printf("\n");
 }
 
@@ -137,7 +145,7 @@ char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t brea
 
 	size_t in_index = 0;
 	// loop through the out_index to make sure we don't go too far
-	for (size_t out_index=0; out_index < max_len; out_index++) {
+	for (size_t out_index=0; out_index < max_len-2; out_index++) {
 		// set character
 		sprintf(tmp++, "%u", data[in_index]);
 		// check if a line break is needed and we have room to print it in our array
@@ -158,9 +166,10 @@ char *sprint_bin(const uint8_t *data, const size_t len) {
 
 char *sprint_hex_ascii(const uint8_t *data, const size_t len) {
 	static char buf[1024];
-	memset(buf, 0x00, 1024);
 	char *tmp = buf;
-	sprintf(tmp, "%s| %s", sprint_hex(data, len) , data);	
+	memset(buf, 0x00, 1024);
+	size_t max_len = (len > 1010) ? 1010 : len;
+	sprintf(tmp, "%s| %s", sprint_hex(data, max_len) , data);	
 	return buf;
 }
 void num_to_bytes(uint64_t n, size_t len, uint8_t* dest)
@@ -463,11 +472,9 @@ void binarraytobinstring(char *target, char *source,  int length)
 uint8_t GetParity( uint8_t *bits, uint8_t type, int length)
 {
     int x;
-
-    for(x= 0 ; length > 0 ; --length)
+    for( x = 0 ; length > 0 ; --length)
         x += bits[length - 1];
     x %= 2;
-
     return x ^ type;
 }
 
@@ -503,11 +510,20 @@ uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits) {
 	return tmp;
 }
 
-// RotateLeft - Ultralight, Desfire
-void rol(uint8_t *data, const size_t len){
+// RotateLeft - Ultralight, Desfire, works on byte level
+// 00-01-02  >> 01-02-00
+void rol(uint8_t *data, const size_t len){	
     uint8_t first = data[0];
     for (size_t i = 0; i < len-1; i++) {
         data[i] = data[i+1];
     }
     data[len-1] = first;
+}
+
+uint32_t SwapBits(uint32_t value, int nrbits) {
+	uint32_t newvalue = 0;
+	for(int i = 0; i < nrbits; i++) {
+		newvalue ^= ((value >> i) & 1) << (nrbits - 1 - i);
+	}
+	return newvalue;
 }
\ No newline at end of file