[PATCH 28/38] crypto: drbg - Simplify drbg_generate_long() and fold into caller
From: Eric Biggers
Date: Mon Apr 20 2026 - 02:41:34 EST
Simplify drbg_generate_long() to use a more straightforward loop, and
then fold it into its only caller. No functional change.
Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx>
---
crypto/drbg.c | 48 +++++++++++++++++-------------------------------
1 file changed, 17 insertions(+), 31 deletions(-)
diff --git a/crypto/drbg.c b/crypto/drbg.c
index b0cd8da51b26..9ff1a0e1b129 100644
--- a/crypto/drbg.c
+++ b/crypto/drbg.c
@@ -504,39 +504,10 @@ static int drbg_generate(struct drbg_state *drbg,
len = 0;
err:
return len;
}
-/*
- * Wrapper around drbg_generate which can pull arbitrary long strings
- * from the DRBG without hitting the maximum request limitation.
- *
- * Parameters: see drbg_generate
- * Return codes: see drbg_generate -- if one drbg_generate request fails,
- * the entire drbg_generate_long request fails
- */
-static int drbg_generate_long(struct drbg_state *drbg,
- unsigned char *buf, unsigned int buflen,
- const u8 *addtl, size_t addtl_len)
-{
- unsigned int len = 0;
- unsigned int slice = 0;
- do {
- int err = 0;
- unsigned int chunk = 0;
- slice = (buflen - len) / DRBG_MAX_REQUEST_BYTES;
- chunk = slice ? DRBG_MAX_REQUEST_BYTES : (buflen - len);
- mutex_lock(&drbg->drbg_mutex);
- err = drbg_generate(drbg, buf + len, chunk, addtl, addtl_len);
- mutex_unlock(&drbg->drbg_mutex);
- if (0 > err)
- return err;
- len += chunk;
- } while (slice > 0 && (len < buflen));
- return 0;
-}
-
static int drbg_prepare_hrng(struct drbg_state *drbg)
{
/* We do not need an HRNG in test mode. */
if (drbg->test_entropylen != 0)
return 0;
@@ -674,11 +645,10 @@ static void drbg_kcapi_cleanup(struct crypto_tfm *tfm)
drbg_uninstantiate(crypto_tfm_ctx(tfm));
}
/*
* Generate random numbers invoked by the kernel crypto API:
- * The API of the kernel crypto API is extended as follows:
*
* 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.
@@ -687,11 +657,27 @@ static int drbg_kcapi_random(struct crypto_rng *tfm,
const u8 *src, unsigned int slen,
u8 *dst, unsigned int dlen)
{
struct drbg_state *drbg = crypto_rng_ctx(tfm);
- return drbg_generate_long(drbg, dst, dlen, src, slen);
+ /*
+ * Break the request into multiple requests if needed, to avoid
+ * exceeding the maximum request length of the core algorithm.
+ */
+ do {
+ unsigned int n = min(dlen, DRBG_MAX_REQUEST_BYTES);
+ int err;
+
+ mutex_lock(&drbg->drbg_mutex);
+ err = drbg_generate(drbg, dst, n, src, slen);
+ mutex_unlock(&drbg->drbg_mutex);
+ if (err < 0)
+ return err;
+ dst += n;
+ 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)
--
2.53.0