1*362f9228SEric Biggers // SPDX-License-Identifier: GPL-2.0-or-later
2*362f9228SEric Biggers /*
3*362f9228SEric Biggers * Copyright 2025 Google LLC
4*362f9228SEric Biggers */
5*362f9228SEric Biggers #include <crypto/blake2s.h>
6*362f9228SEric Biggers #include "blake2s-testvecs.h"
7*362f9228SEric Biggers
8*362f9228SEric Biggers /*
9*362f9228SEric Biggers * The following are compatibility functions that present BLAKE2s as an unkeyed
10*362f9228SEric Biggers * hash function that produces hashes of fixed length BLAKE2S_HASH_SIZE, so that
11*362f9228SEric Biggers * hash-test-template.h can be reused to test it.
12*362f9228SEric Biggers */
13*362f9228SEric Biggers
blake2s_default(const u8 * data,size_t len,u8 out[BLAKE2S_HASH_SIZE])14*362f9228SEric Biggers static void blake2s_default(const u8 *data, size_t len,
15*362f9228SEric Biggers u8 out[BLAKE2S_HASH_SIZE])
16*362f9228SEric Biggers {
17*362f9228SEric Biggers blake2s(out, data, NULL, BLAKE2S_HASH_SIZE, len, 0);
18*362f9228SEric Biggers }
19*362f9228SEric Biggers
blake2s_init_default(struct blake2s_state * state)20*362f9228SEric Biggers static void blake2s_init_default(struct blake2s_state *state)
21*362f9228SEric Biggers {
22*362f9228SEric Biggers blake2s_init(state, BLAKE2S_HASH_SIZE);
23*362f9228SEric Biggers }
24*362f9228SEric Biggers
25*362f9228SEric Biggers /*
26*362f9228SEric Biggers * Generate the HASH_KUNIT_CASES using hash-test-template.h. These test BLAKE2s
27*362f9228SEric Biggers * with a key length of 0 and a hash length of BLAKE2S_HASH_SIZE.
28*362f9228SEric Biggers */
29*362f9228SEric Biggers #define HASH blake2s_default
30*362f9228SEric Biggers #define HASH_CTX blake2s_state
31*362f9228SEric Biggers #define HASH_SIZE BLAKE2S_HASH_SIZE
32*362f9228SEric Biggers #define HASH_INIT blake2s_init_default
33*362f9228SEric Biggers #define HASH_UPDATE blake2s_update
34*362f9228SEric Biggers #define HASH_FINAL blake2s_final
35*362f9228SEric Biggers #include "hash-test-template.h"
36*362f9228SEric Biggers
37*362f9228SEric Biggers /*
38*362f9228SEric Biggers * BLAKE2s specific test case which tests all possible combinations of key
39*362f9228SEric Biggers * length and hash length.
40*362f9228SEric Biggers */
test_blake2s_all_key_and_hash_lens(struct kunit * test)41*362f9228SEric Biggers static void test_blake2s_all_key_and_hash_lens(struct kunit *test)
42*362f9228SEric Biggers {
43*362f9228SEric Biggers const size_t data_len = 100;
44*362f9228SEric Biggers u8 *data = &test_buf[0];
45*362f9228SEric Biggers u8 *key = data + data_len;
46*362f9228SEric Biggers u8 *hash = key + BLAKE2S_KEY_SIZE;
47*362f9228SEric Biggers struct blake2s_state main_state;
48*362f9228SEric Biggers u8 main_hash[BLAKE2S_HASH_SIZE];
49*362f9228SEric Biggers
50*362f9228SEric Biggers rand_bytes_seeded_from_len(data, data_len);
51*362f9228SEric Biggers blake2s_init(&main_state, BLAKE2S_HASH_SIZE);
52*362f9228SEric Biggers for (int key_len = 0; key_len <= BLAKE2S_KEY_SIZE; key_len++) {
53*362f9228SEric Biggers rand_bytes_seeded_from_len(key, key_len);
54*362f9228SEric Biggers for (int out_len = 1; out_len <= BLAKE2S_HASH_SIZE; out_len++) {
55*362f9228SEric Biggers blake2s(hash, data, key, out_len, data_len, key_len);
56*362f9228SEric Biggers blake2s_update(&main_state, hash, out_len);
57*362f9228SEric Biggers }
58*362f9228SEric Biggers }
59*362f9228SEric Biggers blake2s_final(&main_state, main_hash);
60*362f9228SEric Biggers KUNIT_ASSERT_MEMEQ(test, main_hash, blake2s_keyed_testvec_consolidated,
61*362f9228SEric Biggers BLAKE2S_HASH_SIZE);
62*362f9228SEric Biggers }
63*362f9228SEric Biggers
64*362f9228SEric Biggers /*
65*362f9228SEric Biggers * BLAKE2s specific test case which tests using a guarded buffer for all allowed
66*362f9228SEric Biggers * key lengths. Also tests both blake2s() and blake2s_init_key().
67*362f9228SEric Biggers */
test_blake2s_with_guarded_key_buf(struct kunit * test)68*362f9228SEric Biggers static void test_blake2s_with_guarded_key_buf(struct kunit *test)
69*362f9228SEric Biggers {
70*362f9228SEric Biggers const size_t data_len = 100;
71*362f9228SEric Biggers
72*362f9228SEric Biggers rand_bytes(test_buf, data_len);
73*362f9228SEric Biggers for (int key_len = 0; key_len <= BLAKE2S_KEY_SIZE; key_len++) {
74*362f9228SEric Biggers u8 key[BLAKE2S_KEY_SIZE];
75*362f9228SEric Biggers u8 *guarded_key = &test_buf[TEST_BUF_LEN - key_len];
76*362f9228SEric Biggers u8 hash1[BLAKE2S_HASH_SIZE];
77*362f9228SEric Biggers u8 hash2[BLAKE2S_HASH_SIZE];
78*362f9228SEric Biggers struct blake2s_state state;
79*362f9228SEric Biggers
80*362f9228SEric Biggers rand_bytes(key, key_len);
81*362f9228SEric Biggers memcpy(guarded_key, key, key_len);
82*362f9228SEric Biggers
83*362f9228SEric Biggers blake2s(hash1, test_buf, key,
84*362f9228SEric Biggers BLAKE2S_HASH_SIZE, data_len, key_len);
85*362f9228SEric Biggers blake2s(hash2, test_buf, guarded_key,
86*362f9228SEric Biggers BLAKE2S_HASH_SIZE, data_len, key_len);
87*362f9228SEric Biggers KUNIT_ASSERT_MEMEQ(test, hash1, hash2, BLAKE2S_HASH_SIZE);
88*362f9228SEric Biggers
89*362f9228SEric Biggers blake2s_init_key(&state, BLAKE2S_HASH_SIZE,
90*362f9228SEric Biggers guarded_key, key_len);
91*362f9228SEric Biggers blake2s_update(&state, test_buf, data_len);
92*362f9228SEric Biggers blake2s_final(&state, hash2);
93*362f9228SEric Biggers KUNIT_ASSERT_MEMEQ(test, hash1, hash2, BLAKE2S_HASH_SIZE);
94*362f9228SEric Biggers }
95*362f9228SEric Biggers }
96*362f9228SEric Biggers
97*362f9228SEric Biggers /*
98*362f9228SEric Biggers * BLAKE2s specific test case which tests using a guarded output buffer for all
99*362f9228SEric Biggers * allowed output lengths.
100*362f9228SEric Biggers */
test_blake2s_with_guarded_out_buf(struct kunit * test)101*362f9228SEric Biggers static void test_blake2s_with_guarded_out_buf(struct kunit *test)
102*362f9228SEric Biggers {
103*362f9228SEric Biggers const size_t data_len = 100;
104*362f9228SEric Biggers
105*362f9228SEric Biggers rand_bytes(test_buf, data_len);
106*362f9228SEric Biggers for (int out_len = 1; out_len <= BLAKE2S_HASH_SIZE; out_len++) {
107*362f9228SEric Biggers u8 hash[BLAKE2S_HASH_SIZE];
108*362f9228SEric Biggers u8 *guarded_hash = &test_buf[TEST_BUF_LEN - out_len];
109*362f9228SEric Biggers
110*362f9228SEric Biggers blake2s(hash, test_buf, NULL, out_len, data_len, 0);
111*362f9228SEric Biggers blake2s(guarded_hash, test_buf, NULL, out_len, data_len, 0);
112*362f9228SEric Biggers KUNIT_ASSERT_MEMEQ(test, hash, guarded_hash, out_len);
113*362f9228SEric Biggers }
114*362f9228SEric Biggers }
115*362f9228SEric Biggers
116*362f9228SEric Biggers static struct kunit_case blake2s_test_cases[] = {
117*362f9228SEric Biggers HASH_KUNIT_CASES,
118*362f9228SEric Biggers KUNIT_CASE(test_blake2s_all_key_and_hash_lens),
119*362f9228SEric Biggers KUNIT_CASE(test_blake2s_with_guarded_key_buf),
120*362f9228SEric Biggers KUNIT_CASE(test_blake2s_with_guarded_out_buf),
121*362f9228SEric Biggers KUNIT_CASE(benchmark_hash),
122*362f9228SEric Biggers {},
123*362f9228SEric Biggers };
124*362f9228SEric Biggers
125*362f9228SEric Biggers static struct kunit_suite blake2s_test_suite = {
126*362f9228SEric Biggers .name = "blake2s",
127*362f9228SEric Biggers .test_cases = blake2s_test_cases,
128*362f9228SEric Biggers .suite_init = hash_suite_init,
129*362f9228SEric Biggers .suite_exit = hash_suite_exit,
130*362f9228SEric Biggers };
131*362f9228SEric Biggers kunit_test_suite(blake2s_test_suite);
132*362f9228SEric Biggers
133*362f9228SEric Biggers MODULE_DESCRIPTION("KUnit tests and benchmark for BLAKE2s");
134*362f9228SEric Biggers MODULE_LICENSE("GPL");
135