]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/util.c
ADD: @marshmellow42 's fixes for Q5, t55xx, fskclock,
[proxmark3-svn] / client / util.c
index 118912339bcd212072e25dbc2fa5d42200c17ab6..159929b5858234b3fc61d24308dcb430d8ab9212 100644 (file)
@@ -9,6 +9,7 @@
 //-----------------------------------------------------------------------------
 
 #include "util.h"
+#define MAX_BIN_BREAK_LENGTH   (3072+384+1)
 
 #ifndef _WIN32
 #include <termios.h>
@@ -122,17 +123,31 @@ char *sprint_hex(const uint8_t *data, const size_t len) {
 }
 
 char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) {
-       
-       int maxLen = ( len > 1020) ? 1020 : len;
-       static char buf[1024];
-       memset(buf, 0x00, 1024);
+       // make sure we don't go beyond our char array memory
+       int max_len;
+       if (breaks==0)
+               max_len = ( len > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len;
+       else
+               max_len = ( len+(len/breaks) > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len+(len/breaks);
+
+       static char buf[MAX_BIN_BREAK_LENGTH]; // 3072 + end of line characters if broken at 8 bits
+       //clear memory
+       memset(buf, 0x00, sizeof(buf));
        char *tmp = buf;
 
-       for (size_t i=0; i < maxLen; ++i){
-               sprintf(tmp++, "%u", data[i]);
-               if (breaks > 0 && !((i+1) % breaks))
+       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++) {
+               // 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
+               if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) {
+                       // increment and print line break
+                       out_index++;
                        sprintf(tmp++, "%s","\n");
        }
+               in_index++;
+       }
 
        return buf;
 }
@@ -140,6 +155,14 @@ char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t brea
 char *sprint_bin(const uint8_t *data, const size_t len) {
        return sprint_bin_break(data, len, 0);
 }
+
+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);   
+       return buf;
+}
 void num_to_bytes(uint64_t n, size_t len, uint8_t* dest)
 {
        while (len--) {
@@ -182,28 +205,6 @@ uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockS
        return tmp;
 }
 
-//assumes little endian
-char * printBits(size_t const size, void const * const ptr)
-{
-    unsigned char *b = (unsigned char*) ptr;   
-    unsigned char byte;
-       static char buf[1024];
-       char * tmp = buf;
-    int i, j;
-
-    for (i=size-1;i>=0;i--)
-    {
-        for (j=7;j>=0;j--)
-        {
-            byte = b[i] & (1<<j);
-            byte >>= j;
-            sprintf(tmp, "%u", byte);
-                       tmp++;
-        }
-    }
-       return buf;
-}
-
 //  -------------------------------------------------------------------------
 //  string parameters lib
 //  -------------------------------------------------------------------------
@@ -322,13 +323,11 @@ int param_gethex(const char *line, int paramnum, uint8_t * data, int hexcnt)
 {
        int bg, en, temp, i;
 
-       if (hexcnt % 2)
-               return 1;
+       if (hexcnt & 1) return 1;
        
        if (param_getptr(line, &bg, &en, paramnum)) return 1;
 
-       if (en - bg + 1 != hexcnt) 
-               return 1;
+       if (en - bg + 1 != hexcnt) return 1;
 
        for(i = 0; i < hexcnt; i += 2) {
                if (!(isxdigit(line[bg + i]) && isxdigit(line[bg + i + 1])) )   return 1;
@@ -481,17 +480,25 @@ int32_t le24toh (uint8_t data[3]) {
     return (data[2] << 16) | (data[1] << 8) | data[0];
 }
 
-
 uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits) {
+
+       if (len > 32) return 0;
        
        int i = start;
        int j = len-1;
-
-       if (len > 32) return 0;
-
        uint32_t tmp = 0;
+
        for (; j >= 0; --j, ++i)
                tmp     |= bits[i] << j;
 
        return tmp;
 }
+
+// RotateLeft - Ultralight, Desfire
+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;
+}
\ No newline at end of file
Impressum, Datenschutz