0001
0002
0003
0004
0005
0006
0007 #ifndef _CRYPTO_KDF_SELFTEST_H
0008 #define _CRYPTO_KDF_SELFTEST_H
0009
0010 #include <crypto/hash.h>
0011 #include <linux/uio.h>
0012
0013 struct kdf_testvec {
0014 unsigned char *key;
0015 size_t keylen;
0016 unsigned char *ikm;
0017 size_t ikmlen;
0018 struct kvec info;
0019 unsigned char *expected;
0020 size_t expectedlen;
0021 };
0022
0023 static inline int
0024 kdf_test(const struct kdf_testvec *test, const char *name,
0025 int (*crypto_kdf_setkey)(struct crypto_shash *kmd,
0026 const u8 *key, size_t keylen,
0027 const u8 *ikm, size_t ikmlen),
0028 int (*crypto_kdf_generate)(struct crypto_shash *kmd,
0029 const struct kvec *info,
0030 unsigned int info_nvec,
0031 u8 *dst, unsigned int dlen))
0032 {
0033 struct crypto_shash *kmd;
0034 int ret;
0035 u8 *buf = kzalloc(test->expectedlen, GFP_KERNEL);
0036
0037 if (!buf)
0038 return -ENOMEM;
0039
0040 kmd = crypto_alloc_shash(name, 0, 0);
0041 if (IS_ERR(kmd)) {
0042 pr_err("alg: kdf: could not allocate hash handle for %s\n",
0043 name);
0044 kfree(buf);
0045 return -ENOMEM;
0046 }
0047
0048 ret = crypto_kdf_setkey(kmd, test->key, test->keylen,
0049 test->ikm, test->ikmlen);
0050 if (ret) {
0051 pr_err("alg: kdf: could not set key derivation key\n");
0052 goto err;
0053 }
0054
0055 ret = crypto_kdf_generate(kmd, &test->info, 1, buf, test->expectedlen);
0056 if (ret) {
0057 pr_err("alg: kdf: could not obtain key data\n");
0058 goto err;
0059 }
0060
0061 ret = memcmp(test->expected, buf, test->expectedlen);
0062 if (ret)
0063 ret = -EINVAL;
0064
0065 err:
0066 crypto_free_shash(kmd);
0067 kfree(buf);
0068 return ret;
0069 }
0070
0071 #endif