aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-03-09 01:14:10 +0100
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-03-09 01:14:10 +0100
commitad7fb045add90c3e4b3b7abe2a20eea3d05cfb1d (patch)
treed8391ddb2fbf7eeb1136f0ace915b079c77eff3c
parente0fc222f1d3dc1a6672bdbbd7009b08cfd49d776 (diff)
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.
-rw-r--r--CMakeLists.txt1
-rw-r--r--Makefile1
-rw-r--r--auth.c29
-rw-r--r--hex.c49
-rw-r--r--hex.h9
5 files changed, 67 insertions, 22 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2578291..83c25b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,6 +5,7 @@ add_executable(${PROJECT_NAME}
base64.c
cftw.c
handler.c
+ hex.c
html.c
http.c
jwt.c
diff --git a/Makefile b/Makefile
index fc00b3a..517959c 100644
--- a/Makefile
+++ b/Makefile
@@ -14,6 +14,7 @@ OBJECTS = \
base64.o \
cftw.o \
handler.o \
+ hex.o \
html.o \
http.o \
jwt.o \
diff --git a/auth.c b/auth.c
index b56e072..64e9a26 100644
--- a/auth.c
+++ b/auth.c
@@ -1,4 +1,5 @@
#include "auth.h"
+#include "hex.h"
#include "http.h"
#include "jwt.h"
#include <cjson/cJSON.h>
@@ -70,22 +71,6 @@ end:
return ret;
}
-static int decode_hex(const char *const hex, unsigned char *buf, size_t n)
-{
- for (const char *s = hex; *s; s += 2)
- {
- const char nibble[sizeof "00"] = {*s, *(s + 1)};
-
- if (!n)
- return -1;
-
- *buf++ = strtoul(nibble, NULL, 16);
- n--;
- }
-
- return n ? -1 : 0;
-}
-
static int find_cookie(const cJSON *const users, const char *const cookie)
{
const cJSON *u;
@@ -107,9 +92,9 @@ static int find_cookie(const cJSON *const users, const char *const cookie)
fprintf(stderr, "%s: missing key\n", __func__);
return -1;
}
- else if (decode_hex(key, dkey, sizeof dkey))
+ else if (hex_decode(key, dkey, sizeof dkey))
{
- fprintf(stderr, "%s: decode_hex failed\n", __func__);
+ fprintf(stderr, "%s: hex_decode failed\n", __func__);
return -1;
}
@@ -177,9 +162,9 @@ static int generate_cookie(const cJSON *const json, const char *const path,
int ret = -1;
char *jwt = NULL;
- if (decode_hex(key, dkey, sizeof dkey))
+ if (hex_decode(key, dkey, sizeof dkey))
{
- fprintf(stderr, "%s: decode_hex failed\n", __func__);
+ fprintf(stderr, "%s: hex_decode failed\n", __func__);
goto end;
}
else if (!(jwt = jwt_encode(name, dkey, sizeof dkey)))
@@ -220,9 +205,9 @@ static int compare_pwd(const char *const salt, const char *const password,
fprintf(stderr, "%s: malloc(3): %s\n", __func__, strerror(errno));
goto end;
}
- else if (decode_hex(salt, dec_salt, sizeof dec_salt))
+ else if (hex_decode(salt, dec_salt, sizeof dec_salt))
{
- fprintf(stderr, "%s: decode_hex failed\n", __func__);
+ fprintf(stderr, "%s: hex_decode failed\n", __func__);
goto end;
}
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 <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+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;
+}
diff --git a/hex.h b/hex.h
new file mode 100644
index 0000000..2195415
--- /dev/null
+++ b/hex.h
@@ -0,0 +1,9 @@
+#ifndef HEX_H
+#define HEX_H
+
+#include <stddef.h>
+
+int hex_encode(const void *buf, char *hex, size_t buflen, size_t hexlen);
+int hex_decode(const char *hex, void *buf, size_t n);
+
+#endif /* HEX_H */