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