|
Packit Service |
4684c1 |
/* CC0 license (public domain) - see LICENSE file for details */
|
|
Packit Service |
4684c1 |
#include <config.h>
|
|
Packit Service |
4684c1 |
#include <hex.h>
|
|
Packit Service |
4684c1 |
#include <stdio.h>
|
|
Packit Service |
4684c1 |
#include <stdlib.h>
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
static bool char_to_hex(unsigned char *val, char c)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
if (c >= '0' && c <= '9') {
|
|
Packit Service |
4684c1 |
*val = c - '0';
|
|
Packit Service |
4684c1 |
return true;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
if (c >= 'a' && c <= 'f') {
|
|
Packit Service |
4684c1 |
*val = c - 'a' + 10;
|
|
Packit Service |
4684c1 |
return true;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
if (c >= 'A' && c <= 'F') {
|
|
Packit Service |
4684c1 |
*val = c - 'A' + 10;
|
|
Packit Service |
4684c1 |
return true;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
return false;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
unsigned char v1, v2;
|
|
Packit Service |
4684c1 |
unsigned char *p = buf;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
while (slen > 1) {
|
|
Packit Service |
4684c1 |
if (!char_to_hex(&v1, str[0]) || !char_to_hex(&v2, str[1]))
|
|
Packit Service |
4684c1 |
return false;
|
|
Packit Service |
4684c1 |
if (!bufsize)
|
|
Packit Service |
4684c1 |
return false;
|
|
Packit Service |
4684c1 |
*(p++) = (v1 << 4) | v2;
|
|
Packit Service |
4684c1 |
str += 2;
|
|
Packit Service |
4684c1 |
slen -= 2;
|
|
Packit Service |
4684c1 |
bufsize--;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
return slen == 0 && bufsize == 0;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
static char hexchar(unsigned int val)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
if (val < 10)
|
|
Packit Service |
4684c1 |
return '0' + val;
|
|
Packit Service |
4684c1 |
if (val < 16)
|
|
Packit Service |
4684c1 |
return 'a' + val - 10;
|
|
Packit Service |
4684c1 |
abort();
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
bool hex_encode(const void *buf, size_t bufsize, char *dest, size_t destsize)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
size_t used = 0;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
if (destsize < 1)
|
|
Packit Service |
4684c1 |
return false;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
while (used < bufsize) {
|
|
Packit Service |
4684c1 |
unsigned int c = ((const unsigned char *)buf)[used];
|
|
Packit Service |
4684c1 |
if (destsize < 3)
|
|
Packit Service |
4684c1 |
return false;
|
|
Packit Service |
4684c1 |
*(dest++) = hexchar(c >> 4);
|
|
Packit Service |
4684c1 |
*(dest++) = hexchar(c & 0xF);
|
|
Packit Service |
4684c1 |
used++;
|
|
Packit Service |
4684c1 |
destsize -= 2;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
*dest = '\0';
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
return used + 1;
|
|
Packit Service |
4684c1 |
}
|