From ad7fb045add90c3e4b3b7abe2a20eea3d05cfb1d Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Thu, 9 Mar 2023 01:14:10 +0100 Subject: Move decode_hex into its own file - Error detection against strotul(3) has been improved, as done in other places. - New function encode_hex has been implemented, which will be used by future commits. --- hex.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 hex.c (limited to 'hex.c') diff --git a/hex.c b/hex.c new file mode 100644 index 0000000..61cf55f --- /dev/null +++ b/hex.c @@ -0,0 +1,49 @@ +#include "hex.h" +#include +#include +#include +#include + +int hex_encode(const void *const b, char *hex, const size_t buflen, + size_t hexlen) +{ + const char *buf = b; + + for (size_t i = 0; i < buflen; i++) + { + const int r = snprintf(hex, hexlen, "%02hhx", *(const char *)buf++); + + if (r < 0 || r >= hexlen) + return -1; + + hexlen -= r; + hex += 2; + } + + return 0; +} + +int hex_decode(const char *const hex, void *const b, size_t n) +{ + unsigned char *buf = b; + + for (const char *s = hex; *s; s += 2) + { + const char nibble[sizeof "00"] = {*s, *(s + 1)}; + + if (!n) + return -1; + + char *end; + + errno = 0; + *buf++ = strtoul(nibble, &end, 16); + + if (errno || *end) + return -1; + + n--; + } + + return n ? -1 : 0; +} -- cgit v1.2.3