Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 
0003 /*
0004  * Copyright (C) 2021, Stephan Mueller <smueller@chronox.de>
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 /* _CRYPTO_KDF_SELFTEST_H */