From 05a92e642456c8c244feef2b1aba6e81e110938a Mon Sep 17 00:00:00 2001 From: David Sterba Date: Mon, 8 Mar 2021 21:58:31 +0100 Subject: [PATCH] btrfs-progs: crypto: add test vectors Add test vectors, a subset without keys as found in linux kernel sources in crypto/test-mgr.h for all supported hash algorithms. Signed-off-by: David Sterba --- Makefile | 4 + crypto/hash-vectest.c | 177 ++++++++++++++++++++++++++++++++++++++++++ tests/hash-tests.sh | 41 ++++++++++ 3 files changed, 222 insertions(+) create mode 100644 crypto/hash-vectest.c create mode 100755 tests/hash-tests.sh diff --git a/Makefile b/Makefile index e288a336..498588cd 100644 --- a/Makefile +++ b/Makefile @@ -690,6 +690,10 @@ hash-speedtest: crypto/hash-speedtest.c $(objects) $(libs_static) @echo " [LD] $@" $(Q)$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) +hash-vectest: crypto/hash-vectest.c $(objects) $(libs_static) + @echo " [LD] $@" + $(Q)$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) + json-formatter-test: tests/json-formatter-test.c $(objects) $(libs_static) @echo " [LD] $@" $(Q)$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) diff --git a/crypto/hash-vectest.c b/crypto/hash-vectest.c new file mode 100644 index 00000000..a677d7ad --- /dev/null +++ b/crypto/hash-vectest.c @@ -0,0 +1,177 @@ +#include "../kerncompat.h" +#include "crypto/hash.h" +#include "crypto/crc32c.h" +#include "crypto/sha.h" +#include "crypto/blake2.h" + +struct hash_testvec { + const char *plaintext; + size_t psize; + const char *digest; +}; + +struct hash_testspec { + const char *name; + int digest_size; + const struct hash_testvec *testvec; + size_t count; + int (*hash)(const u8 *buf, size_t length, u8 *out); +}; + +static const struct hash_testvec crc32c_tv[] = { + { + .psize = 0, + .digest = "\x00\x00\x00\x00", + }, + { + .plaintext = "abcdefg", + .psize = 7, + .digest = "\x41\xf4\x27\xe6", + }, +}; + +static const struct hash_testvec xxhash64_tv[] = { + { + .psize = 0, + .digest = "\x99\xe9\xd8\x51\x37\xdb\x46\xef", + }, + { + .plaintext = "\x40", + .psize = 1, + .digest = "\x20\x5c\x91\xaa\x88\xeb\x59\xd0", + }, + { + .plaintext = "\x40\x8b\xb8\x41\xe4\x42\x15\x2d" + "\x88\xc7\x9a\x09\x1a\x9b", + .psize = 14, + .digest = "\xa8\xe8\x2b\xa9\x92\xa1\x37\x4a", + } +}; + +static const struct hash_testvec sha256_tv[] = { + { + .plaintext = "", + .psize = 0, + .digest = "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14" + "\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24" + "\x27\xae\x41\xe4\x64\x9b\x93\x4c" + "\xa4\x95\x99\x1b\x78\x52\xb8\x55", + }, { + .plaintext = "abc", + .psize = 3, + .digest = "\xba\x78\x16\xbf\x8f\x01\xcf\xea" + "\x41\x41\x40\xde\x5d\xae\x22\x23" + "\xb0\x03\x61\xa3\x96\x17\x7a\x9c" + "\xb4\x10\xff\x61\xf2\x00\x15\xad", + }, { + .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + .psize = 56, + .digest = "\x24\x8d\x6a\x61\xd2\x06\x38\xb8" + "\xe5\xc0\x26\x93\x0c\x3e\x60\x39" + "\xa3\x3c\xe4\x59\x64\xff\x21\x67" + "\xf6\xec\xed\xd4\x19\xdb\x06\xc1", + } +}; + +static const struct hash_testvec blake2b_256_tv[] = { + { + .plaintext = + "", + .psize = 0, + .digest = + "\x0e\x57\x51\xc0\x26\xe5\x43\xb2" + "\xe8\xab\x2e\xb0\x60\x99\xda\xa1" + "\xd1\xe5\xdf\x47\x77\x8f\x77\x87" + "\xfa\xab\x45\xcd\xf1\x2f\xe3\xa8", + }, { + .plaintext = + "\x00\x01\x02\x03\x04\x05\x06\x07" + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x10\x11\x12\x13\x14\x15\x16\x17" + "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x21\x22\x23\x24\x25\x26\x27" + "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f" + "\x30\x31\x32\x33\x34\x35\x36\x37" + "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f", + .psize = 64, + .digest = + "\x10\xd8\xe6\xd5\x34\xb0\x09\x39" + "\x84\x3f\xe9\xdc\xc4\xda\xe4\x8c" + "\xdf\x00\x8f\x6b\x8b\x2b\x82\xb1" + "\x56\xf5\x40\x4d\x87\x48\x87\xf5", + } +}; + +static const struct hash_testspec test_spec[] = { + { + .name = "crc32c", + .digest_size = 4, + .testvec = crc32c_tv, + .count = ARRAY_SIZE(crc32c_tv), + .hash = hash_crc32c + }, { + .name = "xxhash64", + .digest_size = 8, + .testvec = xxhash64_tv, + .count = ARRAY_SIZE(xxhash64_tv), + .hash = hash_xxhash + }, { + .name = "sha256", + .digest_size = 32, + .testvec = sha256_tv, + .count = ARRAY_SIZE(sha256_tv), + .hash = hash_sha256 + }, { + .name = "blake2b", + .digest_size = 32, + .testvec = blake2b_256_tv, + .count = ARRAY_SIZE(blake2b_256_tv), + .hash = hash_blake2b + } +}; + +int test_hash(const struct hash_testspec *spec) +{ + int i; + + for (i = 0; i < spec->count; i++) { + int ret; + const struct hash_testvec *vec = &spec->testvec[i]; + u8 csum[CRYPTO_HASH_SIZE_MAX]; + + ret = spec->hash((const u8 *)vec->plaintext, vec->psize, csum); + if (ret < 0) { + printf("ERROR: hash %s = %d\n", spec->name, ret); + return 1; + } + if (memcmp(csum, vec->digest, spec->digest_size) == 0) { + printf("%s vector %d: match\n", spec->name, i); + } else { + int j; + + printf("%s vector %d: MISMATCH\n", spec->name, i); + printf(" want:"); + for (j = 0; j < spec->digest_size; j++) + printf(" %02hhx", vec->digest[j]); + putchar('\n'); + printf(" have:"); + for (j = 0; j < spec->digest_size; j++) + printf(" %02hhx", csum[j]); + putchar('\n'); + } + } + + return 0; +} + +int main(int argc, char **argv) { + int i; + + for (i = 0; i < ARRAY_SIZE(test_spec); i++) { + printf("TEST: name=%s vectors=%zd\n", test_spec[i].name, + test_spec[i].count); + test_hash(&test_spec[i]); + } + + return 0; +} diff --git a/tests/hash-tests.sh b/tests/hash-tests.sh new file mode 100755 index 00000000..d77270f5 --- /dev/null +++ b/tests/hash-tests.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# Test all supported hash algorithms on all backends on the sample test vectors +# This requires all crypto backends available for full coverage. + +make=make +opts="-j16 $@" +verdict= + +die() { + echo "ERROR: $@" + exit 1 +} + +buildme() { + make clean-all + + echo "BUILD WITH: $1" + ./autogen.sh && configure \ + --disable-documentation --disable-convert --disable-python \ + --with-crypto="$1" || die "configure not working with: $@" + $make clean + $make $opts hash-vectest + if ./hash-vectest; then + verdict="$verdict +$1: OK" + fi +} + +# main() +if ! [ -f configure.ac ]; then + echo "Please run me from the top directory" + exit 1 +fi + +buildme builtin +buildme libgcrypt +buildme libsodium +buildme libkcapi + +echo "VERDICT:" +echo "$verdict"