From 444eabd20771420992ffb9ade798db0698d2373e Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 6 Jul 2022 07:38:04 +0200 Subject: [PATCH] fixed hex_to_buffer fct. --- client/src/util.c | 93 +++++++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 32 deletions(-) diff --git a/client/src/util.c b/client/src/util.c index 27a23c3e2..0565dc129 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -33,7 +33,7 @@ #include "ui.h" // PrintAndLog -#define UTIL_BUFFER_SIZE_SPRINT 8193 +#define UTIL_BUFFER_SIZE_SPRINT 8196 // global client debug variable uint8_t g_debugMode = 0; // global client disable logging variable @@ -90,6 +90,22 @@ int kbd_enter_pressed(void) { } #endif +static char b2s(uint8_t v, bool uppercase) { + // clear higher bits + v &= 0xF; + + switch(v) { + case 0xA : return (uppercase ? 'A' : 'a') ; + case 0xB : return (uppercase ? 'B' : 'b') ; + case 0xC : return (uppercase ? 'C' : 'c') ; + case 0xD : return (uppercase ? 'D' : 'd') ; + case 0xE : return (uppercase ? 'E' : 'e') ; + case 0xF : return (uppercase ? 'F' : 'f') ; + default: + return (char)(v + 0x30); + } +} + // create filename on hex uid. // param *fn - pointer to filename char array // param *uid - pointer to uid byte array @@ -181,33 +197,41 @@ void ascii_to_buffer(uint8_t *buf, const uint8_t *hex_data, const size_t hex_len void hex_to_buffer(uint8_t *buf, const uint8_t *hex_data, const size_t hex_len, const size_t hex_max_len, const size_t min_str_len, const size_t spaces_between, bool uppercase) { - if (buf == NULL) return; + // sanity check + if (buf == NULL || hex_len < 1) + return; + // 1. hex string length. + // 2. byte array to be converted to string + // + + size_t max_byte_len = (hex_len > hex_max_len) ? hex_max_len : hex_len; + size_t max_str_len = (max_byte_len * ( 2 + spaces_between )) + 1; char *tmp_base = (char *)buf; char *tmp = tmp_base; - size_t max_len = (hex_len > hex_max_len) ? hex_max_len : hex_len; - size_t i; - for (i = 0; i < max_len && (tmp - tmp_base); ++i, tmp += 2 + spaces_between) { + for (i = 0; (i < max_byte_len) && (max_str_len > strlen(tmp_base)) ; ++i) { - snprintf(tmp, hex_max_len - (tmp - tmp_base), (uppercase) ? "%02X" : "%02x", (unsigned int) hex_data[i]); + *(tmp++) = b2s((hex_data[i] >> 4), uppercase); + *(tmp++) = b2s(hex_data[i], uppercase); for (size_t j = 0; j < spaces_between; j++) - *(tmp + 2 + j) = ' '; + *(tmp++) = ' '; } i *= (2 + spaces_between); - size_t m = min_str_len > i ? min_str_len : 0; + size_t m = (min_str_len > i) ? min_str_len : 0; if (m > hex_max_len) m = hex_max_len; - for (; i < m; i++, tmp++) - *tmp = ' '; + while (m--) + *(tmp++) = ' '; // remove last space *tmp = '\0'; + } // printing and converting functions @@ -299,7 +323,6 @@ void print_buffer_with_offset(const uint8_t *data, const size_t len, int offset, } } - void print_blocks(uint32_t *data, size_t len) { PrintAndLogEx(SUCCESS, "Blk | Data "); PrintAndLogEx(SUCCESS, "----+------------"); @@ -313,13 +336,15 @@ void print_blocks(uint32_t *data, size_t len) { } char *sprint_hex(const uint8_t *data, const size_t len) { - static char buf[UTIL_BUFFER_SIZE_SPRINT - 3] = {0}; + static char buf[UTIL_BUFFER_SIZE_SPRINT] = {0}; + memset(buf, 0x00, sizeof(buf)); hex_to_buffer((uint8_t *)buf, data, len, sizeof(buf) - 1, 0, 1, true); return buf; } char *sprint_hex_inrow_ex(const uint8_t *data, const size_t len, const size_t min_str_len) { - static char buf[UTIL_BUFFER_SIZE_SPRINT - 3] = {0}; + static char buf[UTIL_BUFFER_SIZE_SPRINT] = {0}; + memset(buf, 0x00, sizeof(buf)); hex_to_buffer((uint8_t *)buf, data, len, sizeof(buf) - 1, min_str_len, 0, true); return buf; } @@ -327,8 +352,10 @@ char *sprint_hex_inrow_ex(const uint8_t *data, const size_t len, const size_t mi char *sprint_hex_inrow(const uint8_t *data, const size_t len) { return sprint_hex_inrow_ex(data, len, 0); } + char *sprint_hex_inrow_spaces(const uint8_t *data, const size_t len, size_t spaces_between) { - static char buf[UTIL_BUFFER_SIZE_SPRINT - 3] = {0}; + static char buf[UTIL_BUFFER_SIZE_SPRINT] = {0}; + memset(buf, 0x00, sizeof(buf)); hex_to_buffer((uint8_t *)buf, data, len, sizeof(buf) - 1, 0, spaces_between, true); return buf; } @@ -339,8 +366,7 @@ char *sprint_bytebits_bin_break(const uint8_t *data, const size_t len, const uin size_t rowlen = (len > MAX_BIN_BREAK_LENGTH) ? MAX_BIN_BREAK_LENGTH : len; // 3072 + end of line characters if broken at 8 bits - static char buf[MAX_BIN_BREAK_LENGTH]; - memset(buf, 0x00, sizeof(buf)); + static char buf[MAX_BIN_BREAK_LENGTH] = {0}; char *tmp = buf; // loop through the out_index to make sure we don't go too far @@ -414,39 +440,40 @@ char *sprint_bytebits_bin(const uint8_t *data, const size_t len) { char *sprint_bin(const uint8_t *data, const size_t len) { size_t binlen = (len * 8 > MAX_BIN_BREAK_LENGTH) ? MAX_BIN_BREAK_LENGTH : len * 8; - static uint8_t buf[MAX_BIN_BREAK_LENGTH]; + static uint8_t buf[MAX_BIN_BREAK_LENGTH] = {0}; bytes_to_bytebits(data, binlen / 8, buf); return sprint_bytebits_bin_break(buf, binlen, 0); } char *sprint_hex_ascii(const uint8_t *data, const size_t len) { - static char buf[UTIL_BUFFER_SIZE_SPRINT]; - memset(buf, 0x00, UTIL_BUFFER_SIZE_SPRINT); + static char buf[UTIL_BUFFER_SIZE_SPRINT + 20] = {0}; + memset(buf, 0x00, sizeof(buf)); size_t max_len = (len > 1010) ? 1010 : len; - snprintf(buf, sizeof(buf), "%s| ", sprint_hex(data, max_len)); + int ret = snprintf(buf, sizeof(buf) - 1, "%s| ", sprint_hex(data, max_len)); + if ( ret < 0) { + goto out; + } size_t i = 0; size_t pos = (max_len * 3) + 2; while (i < max_len) { - char c = data[i]; - if ((c < 32) || (c == 127)) - c = '.'; - - snprintf(buf + pos + i, sizeof(buf) - (pos + 1), "%c", c); + buf[pos + i] = ((c < 32) || (c == 127)) ? '.' : 'c'; ++i; } + +out: return buf; } char *sprint_ascii_ex(const uint8_t *data, const size_t len, const size_t min_str_len) { - static char buf[UTIL_BUFFER_SIZE_SPRINT]; + static char buf[UTIL_BUFFER_SIZE_SPRINT] = {0}; char *tmp = buf; - memset(buf, 0x00, UTIL_BUFFER_SIZE_SPRINT); size_t max_len = (len > 1010) ? 1010 : len; size_t i = 0; + while (i < max_len) { char c = data[i]; tmp[i] = ((c < 32) || (c == 127)) ? '.' : c; @@ -728,13 +755,14 @@ int param_gethex_ex(const char *line, int paramnum, uint8_t *data, int *hexcnt) } int param_gethex_to_eol(const char *line, int paramnum, uint8_t *data, int maxdatalen, int *datalen) { - int bg, en; - uint32_t temp; - char buf[5] = {0}; - if (param_getptr(line, &bg, &en, paramnum)) return 1; + int bg, en; + + if (param_getptr(line, &bg, &en, paramnum)) + return 1; *datalen = 0; + char buf[5] = {0}; int indx = bg; while (line[indx]) { @@ -757,8 +785,9 @@ int param_gethex_to_eol(const char *line, int paramnum, uint8_t *data, int maxda } if (strlen(buf) >= 2) { + uint32_t temp = 0; sscanf(buf, "%x", &temp); - data[*datalen] = (uint8_t)(temp & 0xff); + data[*datalen] = (uint8_t)(temp & 0xFF); *buf = 0; (*datalen)++; }