diff options
| author | Mattias Andrée <m@maandree.se> | 2026-04-26 22:36:47 +0200 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-04-26 22:36:47 +0200 |
| commit | d77ab463184d113ca6119403887c9f4ed0dfdf0b (patch) | |
| tree | ca8a1de443f90a4b7def56ea5b61c96aaa949f45 /librecrypt_decompose_chain.c | |
| download | librecrypt-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.c | 153 |
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 |
