summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2023-02-19 13:18:52 +0100
committerSander Vrijders <sander@ouroboros.rocks>2023-02-23 14:01:00 +0100
commit59703c95fb529386574a334c9cff7cd5d4f16255 (patch)
treea9d0b25b10a2c737410bb9f4fce00504ab51dbbe /src
parent269f25d3bac5ab871d8044935eacc15cfeadeec6 (diff)
downloadouroboros-59703c95fb529386574a334c9cff7cd5d4f16255.tar.gz
ouroboros-59703c95fb529386574a334c9cff7cd5d4f16255.zip
lib: Refactor hash internals
The internal hash enum now matches the public one w.r.t. directory hash policies. This removes some unnecessary conversion. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/ipcp.c22
-rw-r--r--src/lib/dev.c3
-rw-r--r--src/lib/hash.c54
3 files changed, 35 insertions, 44 deletions
diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c
index 1e777637..5d9c6e7a 100644
--- a/src/ipcpd/ipcp.c
+++ b/src/ipcpd/ipcp.c
@@ -288,6 +288,8 @@ static void handle_bootstrap(ipcp_config_msg_t * conf_msg,
ipcp_type = conf_msg->ipcp_type;
+ conf.layer_info.dir_hash_algo = conf_msg->layer_info->dir_hash_algo;
+
switch(ipcp_type) {
case IPCP_LOCAL:
break;
@@ -322,26 +324,6 @@ static void handle_bootstrap(ipcp_config_msg_t * conf_msg,
return;
}
- /* UDP and broadcast use fixed hash algorithm. */
- if (ipcp_type != IPCP_UDP && ipcp_type != IPCP_BROADCAST) {
- switch(conf_msg->layer_info->dir_hash_algo) {
- case DIR_HASH_SHA3_224:
- conf.layer_info.dir_hash_algo = HASH_SHA3_224;
- break;
- case DIR_HASH_SHA3_256:
- conf.layer_info.dir_hash_algo = HASH_SHA3_256;
- break;
- case DIR_HASH_SHA3_384:
- conf.layer_info.dir_hash_algo = HASH_SHA3_384;
- break;
- case DIR_HASH_SHA3_512:
- conf.layer_info.dir_hash_algo = HASH_SHA3_512;
- break;
- default:
- assert(false);
- }
- }
-
ret_msg->result = ipcpi.ops->ipcp_bootstrap(&conf);
if (ret_msg->result == 0) {
layer_info_msg->layer_name = strdup(conf.layer_info.layer_name);
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 360b65d5..c46bbdd7 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -50,6 +50,9 @@
#include <ouroboros/rib.h>
#endif
+#ifdef HAVE_LIBGCRYPT
+#include <gcrypt.h>
+#endif
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
diff --git a/src/lib/hash.c b/src/lib/hash.c
index 438c43f4..12a8b09f 100644
--- a/src/lib/hash.c
+++ b/src/lib/hash.c
@@ -31,41 +31,47 @@
#include <ouroboros/hash.h>
-#ifndef HAVE_LIBGCRYPT
+#ifdef HAVE_LIBGCRYPT
+#include <gcrypt.h>
+#else
#include <ouroboros/crc32.h>
#include <ouroboros/md5.h>
#include <ouroboros/sha3.h>
-#else
-#include <gcrypt.h>
#endif
#include <string.h>
#include <assert.h>
#include <stdbool.h>
+#ifdef HAVE_LIBGCRYPT
+int gcry_algo_tbl [] = {
+ /* DIR_HASH policies first */
+ GCRY_MD_SHA3_224,
+ GCRY_MD_SHA3_256,
+ GCRY_MD_SHA3_384,
+ GCRY_MD_SHA3_512,
+ /* Below for internal use only */
+ GCRY_MD_CRC32,
+ GCRY_MD_MD5,
+};
+#else
+int hash_len_tbl [] = {
+ /* DIR_HASH policies first */
+ SHA3_224_HASH_LEN,
+ SHA3_256_HASH_LEN,
+ SHA3_384_HASH_LEN,
+ SHA3_512_HASH_LEN,
+ /* Below for internal use only */
+ CRC32_HASH_LEN,
+ MD5_HASH_LEN
+};
+#endif
+
uint16_t hash_len(enum hash_algo algo)
{
#ifdef HAVE_LIBGCRYPT
- return (uint16_t) gcry_md_get_algo_dlen(algo);
+ return (uint16_t) gcry_md_get_algo_dlen(gcry_algo_tbl[algo]);
#else
- switch (algo) {
- case HASH_CRC32:
- return CRC32_HASH_LEN;
- case HASH_MD5:
- return MD5_HASH_LEN;
- case HASH_SHA3_224:
- return SHA3_224_HASH_LEN;
- case HASH_SHA3_256:
- return SHA3_256_HASH_LEN;
- case HASH_SHA3_384:
- return SHA3_384_HASH_LEN;
- case HASH_SHA3_512:
- return SHA3_512_HASH_LEN;
- default:
- assert(false);
- break;
- }
-
- return 0;
+ return hash_len_tbl[algo];
#endif
}
@@ -75,7 +81,7 @@ void mem_hash(enum hash_algo algo,
size_t len)
{
#ifdef HAVE_LIBGCRYPT
- gcry_md_hash_buffer(algo, dst, buf, len);
+ gcry_md_hash_buffer(gcry_algo_tbl[algo], dst, buf, len);
#else
struct sha3_ctx sha3_ctx;
struct md5_ctx md5_ctx;