]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
tests/unit/test_chkhash.c: add unit tests for `is_valid_hash()`
authorIker Pedrosa <ipedrosa@redhat.com>
Fri, 30 Jan 2026 14:56:23 +0000 (15:56 +0100)
committerAlejandro Colomar <foss+github@alejandro-colomar.es>
Tue, 17 Feb 2026 23:30:57 +0000 (00:30 +0100)
Introduce unit testing infrastructure for the `is_valid_hash()`
function. Add yescrypt algorithm validation tests.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
tests/unit/Makefile.am
tests/unit/test_chkhash.c [new file with mode: 0644]

index 250004ef6aa7746797e5f4f1863c5f35113868c6..9c548240f231855e5d572711d9c34f361a63d6ff 100644 (file)
@@ -6,6 +6,7 @@ TESTS = $(check_PROGRAMS)
 check_PROGRAMS = \
     test_adds \
     test_atoi_strtoi \
+    test_chkhash \
     test_chkname \
     test_snprintf \
     test_strncpy \
@@ -49,6 +50,19 @@ test_atoi_strtoi_LDADD = \
     $(CMOCKA_LIBS) \
     $(NULL)
 
+test_chkhash_SOURCES = \
+    ../../lib/chkhash.c \
+    test_chkhash.c \
+    $(NULL)
+test_chkhash_CFLAGS = \
+    $(AM_CFLAGS) \
+    $(NULL)
+test_chkhash_LDFLAGS = \
+    $(NULL)
+test_chkhash_LDADD = \
+    $(CMOCKA_LIBS) \
+    $(NULL)
+
 test_chkname_SOURCES = \
     ../../lib/chkname.c \
     test_chkname.c \
diff --git a/tests/unit/test_chkhash.c b/tests/unit/test_chkhash.c
new file mode 100644 (file)
index 0000000..7530837
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-FileCopyrightText: 2026, Iker Pedrosa <ipedrosa@redhat.com>
+// SPDX-License-Identifier: BSD-3-Clause
+
+
+#include "config.h"
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <stdarg.h>  // Required by <cmocka.h>
+#include <stddef.h>  // Required by <cmocka.h>
+#include <setjmp.h>  // Required by <cmocka.h>
+#include <stdint.h>  // Required by <cmocka.h>
+#include <cmocka.h>
+
+#include "chkhash.h"
+
+
+static void
+test_is_valid_hash_ok_yescrypt(void **)
+{
+       // Basic yescrypt hash: $y$ + params + $ + salt + $ + 43 character hash
+       assert_true(is_valid_hash("$y$j9T$salt$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"));
+
+       // Yescrypt with longer salt
+       assert_true(is_valid_hash("$y$j9T$longsalt$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"));
+
+       // Yescrypt with maximum salt length (86 characters)
+       assert_true(is_valid_hash("$y$j9T$abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890123456789012$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"));
+
+       // Yescrypt with minimum salt length (1 character)
+       assert_true(is_valid_hash("$y$j9T$a$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"));
+
+       // Yescrypt with different parameter configuration
+       assert_true(is_valid_hash("$y$v1.jCf$salt$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"));
+
+       // Yescrypt with numeric parameters and mixed case salt
+       assert_true(is_valid_hash("$y$123$SaLt123$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"));
+
+       // Yescrypt with special characters in salt (./A-Za-z0-9 charset)
+       assert_true(is_valid_hash("$y$j9T$salt./ABC123$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ"));
+}
+
+
+int
+main(void)
+{
+    const struct CMUnitTest tests[] = {
+        cmocka_unit_test(test_is_valid_hash_ok_yescrypt),
+    };
+
+    return cmocka_run_group_tests(tests, NULL, NULL);
+}