mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +00:00
crypto: kdf - Add key derivation self-test support code
As a preparation to add the key derivation implementations, the self-test data structure definition and the common test code is made available. The test framework follows the testing applied by the NIST CAVP test approach. The structure of the test code follows the implementations found in crypto/testmgr.c|h. In case the KDF implementations will be made available via a kernel crypto API templates, the test code is intended to be merged into testmgr.c|h. Signed-off-by: Stephan Mueller <smueller@chronox.de> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
83f50f2948
commit
b808f32023
71
include/crypto/internal/kdf_selftest.h
Normal file
71
include/crypto/internal/kdf_selftest.h
Normal file
@ -0,0 +1,71 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2021, Stephan Mueller <smueller@chronox.de>
|
||||
*/
|
||||
|
||||
#ifndef _CRYPTO_KDF_SELFTEST_H
|
||||
#define _CRYPTO_KDF_SELFTEST_H
|
||||
|
||||
#include <crypto/hash.h>
|
||||
#include <linux/uio.h>
|
||||
|
||||
struct kdf_testvec {
|
||||
unsigned char *key;
|
||||
size_t keylen;
|
||||
unsigned char *ikm;
|
||||
size_t ikmlen;
|
||||
struct kvec info;
|
||||
unsigned char *expected;
|
||||
size_t expectedlen;
|
||||
};
|
||||
|
||||
static inline int
|
||||
kdf_test(const struct kdf_testvec *test, const char *name,
|
||||
int (*crypto_kdf_setkey)(struct crypto_shash *kmd,
|
||||
const u8 *key, size_t keylen,
|
||||
const u8 *ikm, size_t ikmlen),
|
||||
int (*crypto_kdf_generate)(struct crypto_shash *kmd,
|
||||
const struct kvec *info,
|
||||
unsigned int info_nvec,
|
||||
u8 *dst, unsigned int dlen))
|
||||
{
|
||||
struct crypto_shash *kmd;
|
||||
int ret;
|
||||
u8 *buf = kzalloc(test->expectedlen, GFP_KERNEL);
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
kmd = crypto_alloc_shash(name, 0, 0);
|
||||
if (IS_ERR(kmd)) {
|
||||
pr_err("alg: kdf: could not allocate hash handle for %s\n",
|
||||
name);
|
||||
kfree(buf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = crypto_kdf_setkey(kmd, test->key, test->keylen,
|
||||
test->ikm, test->ikmlen);
|
||||
if (ret) {
|
||||
pr_err("alg: kdf: could not set key derivation key\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = crypto_kdf_generate(kmd, &test->info, 1, buf, test->expectedlen);
|
||||
if (ret) {
|
||||
pr_err("alg: kdf: could not obtain key data\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = memcmp(test->expected, buf, test->expectedlen);
|
||||
if (ret)
|
||||
ret = -EINVAL;
|
||||
|
||||
err:
|
||||
crypto_free_shash(kmd);
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* _CRYPTO_KDF_SELFTEST_H */
|
Loading…
Reference in New Issue
Block a user