Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
char/lrng: add common generic hash support
The LRNG switchable DRNG support also allows the replacement of the hash implementation used as conditioning component. The common generic hash support code provides the required callbacks using the synchronous hash implementations of the kernel crypto API. All synchronous hash implementations supported by the kernel crypto API can be used as part of the LRNG with this generic support. The generic support is intended to be configured by separate switchable DRNG backends. CC: Torsten Duwe <duwe@lst.de> CC: "Eric W. Biederman" <ebiederm@xmission.com> CC: "Alexander E. Patrakov" <patrakov@gmail.com> CC: "Ahmed S. Darwish" <darwish.07@gmail.com> CC: "Theodore Y. Ts'o" <tytso@mit.edu> CC: Willy Tarreau <w@1wt.eu> CC: Matthew Garrett <mjg59@srcf.ucam.org> CC: Vito Caputo <vcaputo@pengaru.com> CC: Andreas Dilger <adilger.kernel@dilger.ca> CC: Jan Kara <jack@suse.cz> CC: Ray Strode <rstrode@redhat.com> CC: William Jon McCann <mccann@jhu.edu> CC: zhangjs <zachary@baishancloud.com> CC: Andy Lutomirski <luto@kernel.org> CC: Florian Weimer <fweimer@redhat.com> CC: Lennart Poettering <mzxreary@0pointer.de> CC: Nicolai Stange <nstange@suse.de> CC: Alexander Lobakin <alobakin@mailbox.org> CC: "Peter, Matthias" <matthias.peter@bsi.bund.de> CC: Marcelo Henrique Cerri <marcelo.cerri@canonical.com> CC: Neil Horman <nhorman@redhat.com> Signed-off-by: Stephan Mueller <smueller@chronox.de>
- Loading branch information
1 parent
d98ff2b
commit ed54a26
Showing
4 changed files
with
132 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause | ||
/* | ||
* Backend for providing the hash primitive using the kernel crypto API. | ||
* | ||
* Copyright (C) 2021, Stephan Mueller <smueller@chronox.de> | ||
*/ | ||
|
||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
|
||
#include <crypto/hash.h> | ||
|
||
#include "lrng_kcapi_hash.h" | ||
|
||
struct lrng_hash_info { | ||
struct crypto_shash *tfm; | ||
}; | ||
|
||
static inline void _lrng_kcapi_hash_free(struct lrng_hash_info *lrng_hash) | ||
{ | ||
struct crypto_shash *tfm = lrng_hash->tfm; | ||
|
||
crypto_free_shash(tfm); | ||
kfree(lrng_hash); | ||
} | ||
|
||
void *lrng_kcapi_hash_alloc(const char *name) | ||
{ | ||
struct lrng_hash_info *lrng_hash; | ||
struct crypto_shash *tfm; | ||
int ret; | ||
|
||
if (!name) { | ||
pr_err("Hash name missing\n"); | ||
return ERR_PTR(-EINVAL); | ||
} | ||
|
||
tfm = crypto_alloc_shash(name, 0, 0); | ||
if (IS_ERR(tfm)) { | ||
pr_err("could not allocate hash %s\n", name); | ||
return ERR_CAST(tfm); | ||
} | ||
|
||
ret = sizeof(struct lrng_hash_info); | ||
lrng_hash = kmalloc(ret, GFP_KERNEL); | ||
if (!lrng_hash) { | ||
crypto_free_shash(tfm); | ||
return ERR_PTR(-ENOMEM); | ||
} | ||
|
||
lrng_hash->tfm = tfm; | ||
|
||
pr_info("Hash %s allocated\n", name); | ||
|
||
return lrng_hash; | ||
} | ||
EXPORT_SYMBOL(lrng_kcapi_hash_alloc); | ||
|
||
u32 lrng_kcapi_hash_digestsize(void *hash) | ||
{ | ||
struct lrng_hash_info *lrng_hash = (struct lrng_hash_info *)hash; | ||
struct crypto_shash *tfm = lrng_hash->tfm; | ||
|
||
return crypto_shash_digestsize(tfm); | ||
} | ||
EXPORT_SYMBOL(lrng_kcapi_hash_digestsize); | ||
|
||
void lrng_kcapi_hash_dealloc(void *hash) | ||
{ | ||
struct lrng_hash_info *lrng_hash = (struct lrng_hash_info *)hash; | ||
|
||
_lrng_kcapi_hash_free(lrng_hash); | ||
pr_info("Hash deallocated\n"); | ||
} | ||
EXPORT_SYMBOL(lrng_kcapi_hash_dealloc); | ||
|
||
int lrng_kcapi_hash_init(struct shash_desc *shash, void *hash) | ||
{ | ||
struct lrng_hash_info *lrng_hash = (struct lrng_hash_info *)hash; | ||
struct crypto_shash *tfm = lrng_hash->tfm; | ||
|
||
shash->tfm = tfm; | ||
return crypto_shash_init(shash); | ||
} | ||
EXPORT_SYMBOL(lrng_kcapi_hash_init); | ||
|
||
int lrng_kcapi_hash_update(struct shash_desc *shash, const u8 *inbuf, | ||
u32 inbuflen) | ||
{ | ||
return crypto_shash_update(shash, inbuf, inbuflen); | ||
} | ||
EXPORT_SYMBOL(lrng_kcapi_hash_update); | ||
|
||
int lrng_kcapi_hash_final(struct shash_desc *shash, u8 *digest) | ||
{ | ||
return crypto_shash_final(shash, digest); | ||
} | ||
EXPORT_SYMBOL(lrng_kcapi_hash_final); | ||
|
||
void lrng_kcapi_hash_zero(struct shash_desc *shash) | ||
{ | ||
shash_desc_zero(shash); | ||
} | ||
EXPORT_SYMBOL(lrng_kcapi_hash_zero); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ | ||
/* | ||
* Copyright (C) 2020 - 2021, Stephan Mueller <smueller@chronox.de> | ||
*/ | ||
|
||
#ifndef _LRNG_KCAPI_HASH_H | ||
#define _LRNG_KCAPI_HASH_H | ||
|
||
#include <linux/module.h> | ||
|
||
void *lrng_kcapi_hash_alloc(const char *name); | ||
u32 lrng_kcapi_hash_digestsize(void *hash); | ||
void lrng_kcapi_hash_dealloc(void *hash); | ||
int lrng_kcapi_hash_init(struct shash_desc *shash, void *hash); | ||
int lrng_kcapi_hash_update(struct shash_desc *shash, const u8 *inbuf, | ||
u32 inbuflen); | ||
int lrng_kcapi_hash_final(struct shash_desc *shash, u8 *digest); | ||
void lrng_kcapi_hash_zero(struct shash_desc *shash); | ||
|
||
#endif /* _LRNG_KCAPI_HASH_H */ |