mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.5 KiB
71 lines
1.5 KiB
/* 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 */
|
|
|