[PATCH 29/38] crypto: drbg - Put rng_alg methods in logical order
From: Eric Biggers
Date: Mon Apr 20 2026 - 02:43:45 EST
Put the DRBG implementation of the rng_alg methods in the order in which
they're called (cra_init => set_ent => seed => generate => cra_exit) so
that it's easier to understand the flow.
Also rename drbg_kcapi_random to drbg_kcapi_generate, and
drbg_kcapi_cleanup to drbg_kcapi_exit, so they match the method names.
Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx>
---
crypto/drbg.c | 82 ++++++++++++++++++++++-----------------------------
1 file changed, 36 insertions(+), 46 deletions(-)
diff --git a/crypto/drbg.c b/crypto/drbg.c
index 9ff1a0e1b129..ef9c3e9fdf6e 100644
--- a/crypto/drbg.c
+++ b/crypto/drbg.c
@@ -607,17 +607,24 @@ static int drbg_uninstantiate(struct drbg_state *drbg)
drbg_dealloc_state(drbg);
/* no scrubbing of test_data -- this shall survive an uninstantiate */
return 0;
}
-/*
- * Helper function for setting the test data in the DRBG
- *
- * @drbg DRBG state handle
- * @data test data
- * @len test data length
- */
+/***************************************************************
+ * Kernel crypto API interface to DRBG
+ ***************************************************************/
+
+static int drbg_kcapi_init(struct crypto_tfm *tfm)
+{
+ struct drbg_state *drbg = crypto_tfm_ctx(tfm);
+
+ mutex_init(&drbg->drbg_mutex);
+
+ return 0;
+}
+
+/* Set test entropy in the DRBG. */
static void drbg_kcapi_set_entropy(struct crypto_rng *tfm,
const u8 *data, unsigned int len)
{
struct drbg_state *drbg = crypto_rng_ctx(tfm);
@@ -625,39 +632,42 @@ static void drbg_kcapi_set_entropy(struct crypto_rng *tfm,
drbg->test_entropy = data;
drbg->test_entropylen = len;
mutex_unlock(&drbg->drbg_mutex);
}
-/***************************************************************
- * Kernel crypto API interface to register DRBG
- ***************************************************************/
-
-static int drbg_kcapi_init(struct crypto_tfm *tfm)
+/* Seed (i.e. instantiate) or re-seed the DRBG. */
+static int drbg_kcapi_seed(struct crypto_rng *tfm,
+ const u8 *seed, unsigned int slen, bool pr)
{
- struct drbg_state *drbg = crypto_tfm_ctx(tfm);
+ struct drbg_state *drbg = crypto_rng_ctx(tfm);
- mutex_init(&drbg->drbg_mutex);
+ return drbg_instantiate(drbg, seed, slen, pr);
+}
- return 0;
+static int drbg_kcapi_seed_pr(struct crypto_rng *tfm,
+ const u8 *seed, unsigned int slen)
+{
+ return drbg_kcapi_seed(tfm, seed, slen, /* pr= */ true);
}
-static void drbg_kcapi_cleanup(struct crypto_tfm *tfm)
+static int drbg_kcapi_seed_nopr(struct crypto_rng *tfm,
+ const u8 *seed, unsigned int slen)
{
- drbg_uninstantiate(crypto_tfm_ctx(tfm));
+ return drbg_kcapi_seed(tfm, seed, slen, /* pr= */ false);
}
/*
* Generate random numbers invoked by the kernel crypto API:
*
* src is additional input supplied to the RNG.
* slen is the length of src.
* dst is the output buffer where random data is to be stored.
* dlen is the length of dst.
*/
-static int drbg_kcapi_random(struct crypto_rng *tfm,
- const u8 *src, unsigned int slen,
- u8 *dst, unsigned int dlen)
+static int drbg_kcapi_generate(struct crypto_rng *tfm,
+ const u8 *src, unsigned int slen,
+ u8 *dst, unsigned int dlen)
{
struct drbg_state *drbg = crypto_rng_ctx(tfm);
/*
* Break the request into multiple requests if needed, to avoid
@@ -676,35 +686,15 @@ static int drbg_kcapi_random(struct crypto_rng *tfm,
dlen -= n;
} while (dlen);
return 0;
}
-/* Seed (i.e. instantiate) or re-seed the DRBG. */
-static int drbg_kcapi_seed(struct crypto_rng *tfm,
- const u8 *seed, unsigned int slen, bool pr)
+static void drbg_kcapi_exit(struct crypto_tfm *tfm)
{
- struct drbg_state *drbg = crypto_rng_ctx(tfm);
-
- return drbg_instantiate(drbg, seed, slen, pr);
-}
-
-static int drbg_kcapi_seed_pr(struct crypto_rng *tfm,
- const u8 *seed, unsigned int slen)
-{
- return drbg_kcapi_seed(tfm, seed, slen, /* pr= */ true);
-}
-
-static int drbg_kcapi_seed_nopr(struct crypto_rng *tfm,
- const u8 *seed, unsigned int slen)
-{
- return drbg_kcapi_seed(tfm, seed, slen, /* pr= */ false);
+ drbg_uninstantiate(crypto_tfm_ctx(tfm));
}
-/***************************************************************
- * Kernel module: code to load the module
- ***************************************************************/
-
/*
* Tests as defined in 11.3.2 in addition to the cipher tests: testing
* of the error handling.
*
* Note: testing of failing seed source as defined in 11.3.2 is not applicable
@@ -767,24 +757,24 @@ static struct rng_alg drbg_algs[] = {
.base.cra_ctxsize = sizeof(struct drbg_state),
.base.cra_module = THIS_MODULE,
.base.cra_init = drbg_kcapi_init,
.set_ent = drbg_kcapi_set_entropy,
.seed = drbg_kcapi_seed_pr,
- .generate = drbg_kcapi_random,
- .base.cra_exit = drbg_kcapi_cleanup,
+ .generate = drbg_kcapi_generate,
+ .base.cra_exit = drbg_kcapi_exit,
},
{
.base.cra_name = "stdrng",
.base.cra_driver_name = "drbg_nopr_hmac_sha512",
.base.cra_priority = 201,
.base.cra_ctxsize = sizeof(struct drbg_state),
.base.cra_module = THIS_MODULE,
.base.cra_init = drbg_kcapi_init,
.set_ent = drbg_kcapi_set_entropy,
.seed = drbg_kcapi_seed_nopr,
- .generate = drbg_kcapi_random,
- .base.cra_exit = drbg_kcapi_cleanup,
+ .generate = drbg_kcapi_generate,
+ .base.cra_exit = drbg_kcapi_exit,
},
};
static int __init drbg_init(void)
{
--
2.53.0