aboutsummaryrefslogtreecommitdiffstats
path: root/librecrypt_decompose_chain.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-04-26 22:36:47 +0200
committerMattias Andrée <m@maandree.se>2026-04-26 22:36:47 +0200
commitd77ab463184d113ca6119403887c9f4ed0dfdf0b (patch)
treeca8a1de443f90a4b7def56ea5b61c96aaa949f45 /librecrypt_decompose_chain.c
downloadlibrecrypt-d77ab463184d113ca6119403887c9f4ed0dfdf0b.tar.gz
librecrypt-d77ab463184d113ca6119403887c9f4ed0dfdf0b.tar.bz2
librecrypt-d77ab463184d113ca6119403887c9f4ed0dfdf0b.tar.xz
First commit
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'librecrypt_decompose_chain.c')
-rw-r--r--librecrypt_decompose_chain.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/librecrypt_decompose_chain.c b/librecrypt_decompose_chain.c
new file mode 100644
index 0000000..9b7aede
--- /dev/null
+++ b/librecrypt_decompose_chain.c
@@ -0,0 +1,153 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+#ifndef TEST
+
+
+extern inline size_t librecrypt_decompose_chain(char *hash, char **chain_out_array, size_t size);
+
+
+#else
+
+
+#define HASH_1 "a$b"
+
+#define HASH_2_A "a$b"
+#define HASH_2_B "c$d"
+#define HASH_2_C "e$f"
+#define HASH_2_BC HASH_2_B">"HASH_2_C
+#define HASH_2 HASH_2_A">"HASH_2_BC
+
+#define HASH_3_A ""
+#define HASH_3_B "a$b"
+#define HASH_3_C "c$d"
+#define HASH_3_D "e$f"
+#define HASH_3_E ""
+#define HASH_3_DE HASH_3_D">"HASH_3_E
+#define HASH_3_CDE HASH_3_C">"HASH_3_DE
+#define HASH_3_BCDE HASH_3_B">"HASH_3_CDE
+#define HASH_3 HASH_3_A">"HASH_3_BCDE
+
+
+#define NULL_OUT(ARRAY)\
+ do {\
+ for (i = 0u; i < ELEMSOF(ARRAY); i++)\
+ (ARRAY)[i] = NULL;\
+ } while (0)
+
+
+int
+main(void)
+{
+ char buf[64u];
+ char *chain[10u];
+ size_t i;
+
+ SET_UP_ALARM();
+
+ stpcpy(buf, HASH_1);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 0u) == 1u);
+ EXPECT(!strcmp(buf, HASH_1));
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 1u) == 1u);
+ EXPECT(!strcmp(buf, HASH_1));
+ EXPECT(chain[0u] == buf);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, ELEMSOF(chain)) == 1u);
+ EXPECT(!strcmp(buf, HASH_1));
+ EXPECT(chain[0u] == buf);
+
+ stpcpy(buf, HASH_2);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 0u) == 3u);
+ EXPECT(!strcmp(buf, HASH_2));
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 1u) == 3u);
+ EXPECT(!strcmp(buf, HASH_2));
+ EXPECT(chain[0u] == buf);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 2u) == 3u);
+ EXPECT(chain[0u] != NULL);
+ EXPECT(chain[1u] != NULL);
+ EXPECT(chain[2u] == NULL);
+ EXPECT(!strcmp(chain[0u], HASH_2_A));
+ EXPECT(!strcmp(chain[1u], HASH_2_BC));
+ stpcpy(buf, HASH_2);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, ELEMSOF(chain)) == 3u);
+ EXPECT(chain[0u] != NULL);
+ EXPECT(chain[1u] != NULL);
+ EXPECT(chain[2u] != NULL);
+ EXPECT(chain[3u] == NULL);
+ EXPECT(!strcmp(chain[0u], HASH_2_A));
+ EXPECT(!strcmp(chain[1u], HASH_2_B));
+ EXPECT(!strcmp(chain[2u], HASH_2_C));
+
+ stpcpy(buf, HASH_3);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 0u) == 5u);
+ EXPECT(!strcmp(buf, HASH_3));
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 1u) == 5u);
+ EXPECT(!strcmp(buf, HASH_3));
+ EXPECT(chain[0u] == buf);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 2u) == 5u);
+ EXPECT(chain[0u] != NULL);
+ EXPECT(chain[1u] != NULL);
+ EXPECT(chain[2u] == NULL);
+ EXPECT(!strcmp(chain[0u], HASH_3_A));
+ EXPECT(!strcmp(chain[1u], HASH_3_BCDE));
+ stpcpy(buf, HASH_3);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 3u) == 5u);
+ EXPECT(chain[0u] != NULL);
+ EXPECT(chain[1u] != NULL);
+ EXPECT(chain[2u] != NULL);
+ EXPECT(chain[3u] == NULL);
+ EXPECT(!strcmp(chain[0u], HASH_3_A));
+ EXPECT(!strcmp(chain[1u], HASH_3_B));
+ EXPECT(!strcmp(chain[2u], HASH_3_CDE));
+ stpcpy(buf, HASH_3);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 4u) == 5u);
+ EXPECT(chain[0u] != NULL);
+ EXPECT(chain[1u] != NULL);
+ EXPECT(chain[2u] != NULL);
+ EXPECT(chain[3u] != NULL);
+ EXPECT(chain[4u] == NULL);
+ EXPECT(!strcmp(chain[0u], HASH_3_A));
+ EXPECT(!strcmp(chain[1u], HASH_3_B));
+ EXPECT(!strcmp(chain[2u], HASH_3_C));
+ EXPECT(!strcmp(chain[3u], HASH_3_DE));
+ stpcpy(buf, HASH_3);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 5u) == 5u);
+ EXPECT(chain[0u] != NULL);
+ EXPECT(chain[1u] != NULL);
+ EXPECT(chain[2u] != NULL);
+ EXPECT(chain[3u] != NULL);
+ EXPECT(chain[4u] != NULL);
+ EXPECT(chain[5u] == NULL);
+ EXPECT(!strcmp(chain[0u], HASH_3_A));
+ EXPECT(!strcmp(chain[1u], HASH_3_B));
+ EXPECT(!strcmp(chain[2u], HASH_3_C));
+ EXPECT(!strcmp(chain[3u], HASH_3_D));
+ EXPECT(!strcmp(chain[4u], HASH_3_E));
+ stpcpy(buf, HASH_3);
+ NULL_OUT(chain);
+ EXPECT(librecrypt_decompose_chain(buf, chain, 6u) == 5u);
+ EXPECT(chain[0u] != NULL);
+ EXPECT(chain[1u] != NULL);
+ EXPECT(chain[2u] != NULL);
+ EXPECT(chain[3u] != NULL);
+ EXPECT(chain[4u] != NULL);
+ EXPECT(chain[5u] == NULL);
+ EXPECT(!strcmp(chain[0u], HASH_3_A));
+ EXPECT(!strcmp(chain[1u], HASH_3_B));
+ EXPECT(!strcmp(chain[2u], HASH_3_C));
+ EXPECT(!strcmp(chain[3u], HASH_3_D));
+ EXPECT(!strcmp(chain[4u], HASH_3_E));
+
+ return 0;
+}
+
+
+#endif