From a89353a992abfcf12606f065a9f6bec798c21bee Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 23 Sep 2026 20:16:23 +0200 Subject: More testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- librecrypt_crypt.c | 30 ++++++++++++++++++++++++++++++ librecrypt_hash.c | 25 +++++++++++++++++++++++++ librecrypt_hash_binary.c | 33 +++++++++++++++++++++++++++++++-- librecrypt_verify.c | 21 ++++++++++++++++++++- 4 files changed, 106 insertions(+), 3 deletions(-) diff --git a/librecrypt_crypt.c b/librecrypt_crypt.c index d837724..1879a54 100644 --- a/librecrypt_crypt.c +++ b/librecrypt_crypt.c @@ -201,6 +201,9 @@ static const struct librecrypt_algorithm trunc_algo = { #define TEST_HASH_ROT4_TRUNC "8j93l0@@" #define TEST_HASH_ROT4_TRUNC6 "8j93l6lS" #define TEST_HASH_TRUNC_TRUNC6 "4ycQhg00" +#define WRONG_HASH_ROT4 "AAAAAAAAAAA#" +#define WRONG_HASH_TRUNC "000000@@" +#define WRONG_HASH_TRUNC6 "00000000" #define SP4 " " #define SP20 SP4 SP4 SP4 SP4 SP4 @@ -290,6 +293,21 @@ check(const char *phrase, const char *settings, const char *chain, size_t chain_ } while (0) +#define CHECK_DIFF(PHRASE, CONF, HASHLEN, IS_DEFAULT_HASHLEN /* -1 if fixed */, HASH, DIFFHASH)\ + do {\ + size_t scratchsize = GET_SCRATCH_SIZE(HASHLEN);\ + if (IS_DEFAULT_HASHLEN >= 0) {\ + check(PHRASE, CONF DIFFHASH, CONF "*" #HASHLEN ">" CONF DIFFHASH,\ + sizeof(CONF "*" #HASHLEN ">" CONF) - 1u, CONF HASH,\ + sizeof(CONF) - 1u, scratchsize, ctx);\ + }\ + if (IS_DEFAULT_HASHLEN) {\ + check(PHRASE, CONF DIFFHASH, CONF ">" CONF DIFFHASH, sizeof(CONF ">" CONF) - 1u,\ + CONF HASH, sizeof(CONF) - 1u, scratchsize, ctx);\ + }\ + } while (0) + + #define CHECK_BAD(ALGO)\ do {\ errno = 0;\ @@ -482,6 +500,18 @@ main(void) CHECK(TEST_PHRASE, "$trunc$*6>$trunc$", 4, 1, TEST_HASH_TRUNC); CHECK(TEST_PHRASE, "$trunc$*6>$trunc$", 6, 0, TEST_HASH_TRUNC6); CHECK(TEST_PHRASE, "$rot4$>$rot4$", 8, -1, TEST_PHRASE64_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$", 6, 0, TEST_HASH_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$rot4$", 8, -1, TEST_HASH_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$trunc$", 4, 1, TEST_HASH_ROT4_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$trunc$", 6, 0, TEST_HASH_ROT4_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$rot4$", 8, -1, TEST_HASH_TRUNC_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$rot4$", 8, -1, TEST_HASH_TRUNC6_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$trunc$", 6, 0, TEST_HASH_TRUNC_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$trunc$", 6, 0, TEST_HASH_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$rot4$", 8, -1, TEST_PHRASE64_ROT4, WRONG_HASH_ROT4); #undef GET_SCRATCH_SIZE librecrypt_free_context(ctx); diff --git a/librecrypt_hash.c b/librecrypt_hash.c index 18627d1..f62b03b 100644 --- a/librecrypt_hash.c +++ b/librecrypt_hash.c @@ -201,6 +201,9 @@ static const struct librecrypt_algorithm trunc_algo = { #define TEST_HASH_ROT4_TRUNC "8j93l0@@" #define TEST_HASH_ROT4_TRUNC6 "8j93l6lS" #define TEST_HASH_TRUNC_TRUNC6 "4ycQhg00" +#define WRONG_HASH_ROT4 "AAAAAAAAAAA#" +#define WRONG_HASH_TRUNC "000000@@" +#define WRONG_HASH_TRUNC6 "00000000" #define SP4 " " #define SP20 SP4 SP4 SP4 SP4 SP4 @@ -286,6 +289,16 @@ check(const char *phrase, const char *settings, const char *chain, } while (0) +#define CHECK_DIFF(PHRASE, CONF, HASHLEN, IS_DEFAULT_HASHLEN /* -1 if fixed */, HASH, DIFFHASH)\ + do {\ + size_t scratchsize = GET_SCRATCH_SIZE(HASHLEN);\ + if (IS_DEFAULT_HASHLEN >= 0)\ + check(PHRASE, CONF DIFFHASH, CONF "*" #HASHLEN ">" CONF DIFFHASH, HASH, scratchsize, ctx);\ + if (IS_DEFAULT_HASHLEN)\ + check(PHRASE, CONF DIFFHASH, CONF ">" CONF DIFFHASH, HASH, scratchsize, ctx);\ + } while (0) + + #define CHECK_BAD(ALGO)\ do {\ errno = 0;\ @@ -423,6 +436,18 @@ main(void) CHECK(TEST_PHRASE, "$trunc$*6>$trunc$", 4, 1, TEST_HASH_TRUNC); CHECK(TEST_PHRASE, "$trunc$*6>$trunc$", 6, 0, TEST_HASH_TRUNC6); CHECK(TEST_PHRASE, "$rot4$>$rot4$", 8, -1, TEST_PHRASE64_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$", 6, 0, TEST_HASH_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$rot4$", 8, -1, TEST_HASH_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$trunc$", 4, 1, TEST_HASH_ROT4_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$trunc$", 6, 0, TEST_HASH_ROT4_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$rot4$", 8, -1, TEST_HASH_TRUNC_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$rot4$", 8, -1, TEST_HASH_TRUNC6_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$trunc$", 6, 0, TEST_HASH_TRUNC_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$trunc$", 6, 0, TEST_HASH_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$rot4$", 8, -1, TEST_PHRASE64_ROT4, WRONG_HASH_ROT4); #undef GET_SCRATCH_SIZE librecrypt_free_context(ctx); diff --git a/librecrypt_hash_binary.c b/librecrypt_hash_binary.c index 398f7e3..35bd0ed 100644 --- a/librecrypt_hash_binary.c +++ b/librecrypt_hash_binary.c @@ -201,6 +201,9 @@ static const struct librecrypt_algorithm trunc_algo = { #define TEST_HASH_ROT4_TRUNC "8j93l0@@" #define TEST_HASH_ROT4_TRUNC6 "8j93l6lS" #define TEST_HASH_TRUNC_TRUNC6 "4ycQhg00" +#define WRONG_HASH_ROT4 "AAAAAAAAAAA#" +#define WRONG_HASH_TRUNC "000000@@" +#define WRONG_HASH_TRUNC6 "00000000" #define SP4 " " #define SP20 SP4 SP4 SP4 SP4 SP4 @@ -264,8 +267,10 @@ check(const char *phrase, const char *settings, const char *chain, const char *h do {\ size_t scratchsize = GET_SCRATCH_SIZE(HASHLEN);\ if (IS_DEFAULT_HASHLEN >= 0) {\ - check(PHRASE, CONF HASH, CONF "*" #HASHLEN ">" CONF HASH, HASH, (size_t)HASHLEN, scratchsize, ctx);\ - check(PHRASE, CONF "*" #HASHLEN, CONF "*" #HASHLEN ">" CONF "*" #HASHLEN, HASH, (size_t)HASHLEN, scratchsize, ctx);\ + check(PHRASE, CONF HASH, CONF "*" #HASHLEN ">" CONF HASH,\ + HASH, (size_t)HASHLEN, scratchsize, ctx);\ + check(PHRASE, CONF "*" #HASHLEN, CONF "*" #HASHLEN ">" CONF "*" #HASHLEN,\ + HASH, (size_t)HASHLEN, scratchsize, ctx);\ }\ if (IS_DEFAULT_HASHLEN) {\ check(PHRASE, CONF, CONF ">" CONF, HASH, (size_t)HASHLEN, scratchsize, ctx);\ @@ -274,6 +279,18 @@ check(const char *phrase, const char *settings, const char *chain, const char *h } while (0) +#define CHECK_DIFF(PHRASE, CONF, HASHLEN, IS_DEFAULT_HASHLEN /* -1 if fixed */, HASH, DIFFHASH)\ + do {\ + size_t scratchsize = GET_SCRATCH_SIZE(HASHLEN);\ + if (IS_DEFAULT_HASHLEN >= 0) {\ + check(PHRASE, CONF DIFFHASH, CONF "*" #HASHLEN ">" CONF DIFFHASH,\ + HASH, (size_t)HASHLEN, scratchsize, ctx);\ + }\ + if (IS_DEFAULT_HASHLEN)\ + check(PHRASE, CONF DIFFHASH, CONF ">" CONF DIFFHASH, HASH, (size_t)HASHLEN, scratchsize, ctx);\ + } while (0) + + #define CHECK_BAD(ALGO)\ do {\ errno = 0;\ @@ -371,6 +388,18 @@ main(void) CHECK(TEST_PHRASE, "$trunc$*6>$trunc$", 4, 1, TEST_HASH_TRUNC); CHECK(TEST_PHRASE, "$trunc$*6>$trunc$", 6, 0, TEST_HASH_TRUNC6); CHECK(TEST_PHRASE, "$rot4$>$rot4$", 8, -1, TEST_PHRASE64_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$", 6, 0, TEST_HASH_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$rot4$", 8, -1, TEST_HASH_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$trunc$", 4, 1, TEST_HASH_ROT4_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$trunc$", 6, 0, TEST_HASH_ROT4_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$rot4$", 8, -1, TEST_HASH_TRUNC_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$rot4$", 8, -1, TEST_HASH_TRUNC6_ROT4, WRONG_HASH_ROT4); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$>$trunc$", 6, 0, TEST_HASH_TRUNC_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$trunc$", 4, 1, TEST_HASH_TRUNC, WRONG_HASH_TRUNC); + CHECK_DIFF(TEST_PHRASE, "$trunc$*6>$trunc$", 6, 0, TEST_HASH_TRUNC6, WRONG_HASH_TRUNC6); + CHECK_DIFF(TEST_PHRASE, "$rot4$>$rot4$", 8, -1, TEST_PHRASE64_ROT4, WRONG_HASH_ROT4); #undef GET_SCRATCH_SIZE librecrypt_free_context(ctx); diff --git a/librecrypt_verify.c b/librecrypt_verify.c index aa304ca..a9edb30 100644 --- a/librecrypt_verify.c +++ b/librecrypt_verify.c @@ -251,6 +251,9 @@ static const struct librecrypt_algorithm trunc_algo = { #define TEST_HASH_ROT4_TRUNC "8j93l0@@" #define TEST_HASH_ROT4_TRUNC6 "8j93l6lS" #define TEST_HASH_TRUNC_TRUNC6 "4ycQhg00" +#define WRONG_HASH_ROT4 "AAAAAAAAAAA#" +#define WRONG_HASH_TRUNC "000000@@" +#define WRONG_HASH_TRUNC6 "00000000" int @@ -343,8 +346,9 @@ main(void) EXPECT(librecrypt_verify(spaces, 80u, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$mzPlVOVjVos", ctx) == 1); #endif -#define CHECK(CRYPT) EXPECT(librecrypt_verify(TEST_PHRASE, sizeof(TEST_PHRASE) - 1u, CRYPT, ctx) == 1); librecrypt_set_custom_algorithms(ctx, custom, ELEMSOF(custom)); + +#define CHECK(CRYPT) EXPECT(librecrypt_verify(TEST_PHRASE, sizeof(TEST_PHRASE) - 1u, CRYPT, ctx) == 1); CHECK("$trunc$"TEST_HASH_TRUNC); CHECK("$trunc$"TEST_HASH_TRUNC6); CHECK("$rot4$"TEST_HASH_ROT4); @@ -359,6 +363,21 @@ main(void) CHECK("$rot4$>$rot4$"TEST_PHRASE64_ROT4); #undef CHECK +#define CHECK(CRYPT) EXPECT(librecrypt_verify(TEST_PHRASE, sizeof(TEST_PHRASE) - 1u, CRYPT, ctx) == 0); + CHECK("$trunc$"WRONG_HASH_TRUNC); + CHECK("$trunc$"WRONG_HASH_TRUNC6); + CHECK("$rot4$"WRONG_HASH_ROT4); + CHECK("$rot4$>$trunc$"WRONG_HASH_TRUNC); + CHECK("$rot4$>$trunc$"WRONG_HASH_TRUNC6); + CHECK("$trunc$>$rot4$"WRONG_HASH_ROT4); + CHECK("$trunc$*6>$rot4$"WRONG_HASH_ROT4); + CHECK("$trunc$>$trunc$"WRONG_HASH_TRUNC); + CHECK("$trunc$>$trunc$"WRONG_HASH_TRUNC6); + CHECK("$trunc$*6>$trunc$"WRONG_HASH_TRUNC); + CHECK("$trunc$*6>$trunc$"WRONG_HASH_TRUNC6); + CHECK("$rot4$>$rot4$"WRONG_HASH_ROT4); +#undef CHECK + librecrypt_free_context(ctx); STOP_RESOURCE_TEST(); -- cgit v1.3.1