diff --git a/src/crypto.c b/src/crypto.c index 9fc4dcc..4795e3d 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -209,7 +209,12 @@ unsigned char *hex_decode(const char *orig, size_t *sz) { } char *buf = malloc(sizeof(char) * buf_sz); - strcpy(buf, orig); + if (strlen(orig) % 2 != 0) { + strcpy(buf + 1, orig); + buf[0] = '0'; + } else { + strcpy(buf, orig); + } buf[buf_sz - 1] = '\0'; *sz = buf_sz / 2; diff --git a/tests/tests.c b/tests/tests.c index e88a1f9..142b87a 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -335,6 +335,16 @@ void test_crypto() { assert(s[i] == h[i]); } free(s); + + // Odd number of characters + s = hex_decode("f00f5", &s_sz); + unsigned char h2[4] = { + 0x0F, 0x00, 0xF5 + }; + for (size_t i = 0; i < 3; ++i) { + assert(s[i] == h2[i]); + } + free(s); } #if defined(__APPLE__) || defined(__MACH__)