1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2021, Stephan Mueller <[email protected]>
- */
- #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 */
|