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.
This commit is contained in:
Xavier Del Campo Romero 2023-03-09 01:14:10 +01:00
parent e0fc222f1d
commit ad7fb045ad
Signed by: xavi
GPG Key ID: 84FF3612A9BF43F2
5 changed files with 67 additions and 22 deletions

View File

@ -5,6 +5,7 @@ add_executable(${PROJECT_NAME}
base64.c
cftw.c
handler.c
hex.c
html.c
http.c
jwt.c

View File

@ -14,6 +14,7 @@ OBJECTS = \
base64.o \
cftw.o \
handler.o \
hex.o \
html.o \
http.o \
jwt.o \

29
auth.c
View File

@ -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;
}

49
hex.c Normal file
View File

@ -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;
}

9
hex.h Normal file
View File

@ -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 */