commit 73db980f320f469e6c785d38a83777a2e92448ee
parent c04af09692f2647ea97f4b332b0fd9bab545ce86
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 7 Sep 2022 08:54:28 +0200
Add and test the smsh_desc_compute_hash function
Diffstat:
3 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/src/smsh.c b/src/smsh.c
@@ -289,3 +289,27 @@ smsh_get_desc(const struct smsh* smsh, struct smsh_desc* desc)
desc->dcell = smsh->dcell;
return RES_OK;
}
+
+res_T
+smsh_desc_compute_hash(const struct smsh_desc* desc, hash256_T hash)
+{
+ struct sha256_ctx ctx;
+
+ if(!desc || !hash) return RES_BAD_ARG;
+
+ #define HASH(Var, Nb) \
+ sha256_ctx_update(&ctx, (const char*)(Var), sizeof(*Var)*(Nb));
+
+ sha256_ctx_init(&ctx);
+ HASH(desc->nodes, desc->nnodes);
+ HASH(desc->cells, desc->ncells);
+ HASH(&desc->nnodes, 1);
+ HASH(&desc->ncells, 1);
+ HASH(&desc->dnode, 1);
+ HASH(&desc->dcell, 1);
+ sha256_ctx_finalize(&ctx, hash);
+
+ #undef HASH
+
+ return RES_OK;
+}
diff --git a/src/smsh.h b/src/smsh.h
@@ -16,6 +16,7 @@
#ifndef SMSH_H
#define SMSH_H
+#include <rsys/hash.h>
#include <rsys/rsys.h>
/* Library symbol management */
@@ -97,6 +98,11 @@ smsh_get_desc
(const struct smsh* smsh,
struct smsh_desc* desc);
+SMSH_API res_T
+smsh_desc_compute_hash
+ (const struct smsh_desc* desc,
+ hash256_T hash);
+
static INLINE const double*
smsh_desc_get_node
(const struct smsh_desc* desc,
diff --git a/src/test_smsh_load.c b/src/test_smsh_load.c
@@ -67,6 +67,8 @@ check_smsh_desc
static void
test_load_mesh(struct smsh* smsh, const uint32_t dnode, const uint32_t dcell)
{
+ hash256_T hash0;
+ hash256_T hash1;
struct smsh_desc desc = SMSH_DESC_NULL;
FILE* fp = NULL;
const char* filename = "test_file.smsh";
@@ -122,10 +124,18 @@ test_load_mesh(struct smsh* smsh, const uint32_t dnode, const uint32_t dcell)
CHK(smsh_get_desc(smsh, &desc) == RES_OK);
check_smsh_desc(&desc, nnodes, ncells, dnode, dcell);
+ CHK(smsh_desc_compute_hash(NULL, hash0) == RES_BAD_ARG);
+ CHK(smsh_desc_compute_hash(&desc, NULL) == RES_BAD_ARG);
+ CHK(smsh_desc_compute_hash(&desc, hash0) == RES_OK);
+
rewind(fp);
CHK(smsh_load_stream(smsh, fp, filename) == RES_OK);
+ CHK(smsh_get_desc(smsh, &desc) == RES_OK);
check_smsh_desc(&desc, nnodes, ncells, dnode, dcell);
+ CHK(smsh_desc_compute_hash(&desc, hash1) == RES_OK);
+ CHK(hash256_eq(hash0, hash1));
+
CHK(smsh_load(NULL, filename) == RES_BAD_ARG);
CHK(smsh_load(smsh, NULL) == RES_BAD_ARG);
CHK(smsh_load(smsh, "nop") == RES_IO_ERR);
@@ -196,6 +206,7 @@ test_load_fail(struct smsh* smsh)
static void
test_load_files(struct smsh* smsh, int argc, char** argv)
{
+ hash256_T hash;
int i;
CHK(smsh);
FOR_EACH(i, 1, argc) {
@@ -207,6 +218,7 @@ test_load_files(struct smsh* smsh, int argc, char** argv)
printf("Load %s\n", argv[i]);
CHK(smsh_load(smsh, argv[i]) == RES_OK);
CHK(smsh_get_desc(smsh, &desc) == RES_OK);
+ CHK(smsh_desc_compute_hash(&desc, hash) == RES_OK);
FOR_EACH(inode, 0, desc.nnodes) {
const double* node = smsh_desc_get_node(&desc, inode);