From: Eric Biggers Date: Mon, 20 Apr 2026 06:34:03 +0000 (-0700) Subject: crypto: drbg - De-virtualize drbg_state_ops X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=aaa891b7c71a493d8746d877cf4c02ecf261ecc4;p=thirdparty%2Fkernel%2Flinux.git crypto: drbg - De-virtualize drbg_state_ops Now that there's only one set of state operations, use direct calls to those operations. No change in behavior. In particular, drbg_alloc_state() doesn't change behavior, because the only remaining drbg_core uses HMAC_DRBG. drbg_uninstantiate() doesn't change behavior, because a NULL d_ops implied NULL priv_data which makes a drbg_fini_hash_kernel() a no-op. Signed-off-by: Eric Biggers Signed-off-by: Herbert Xu --- diff --git a/crypto/drbg.c b/crypto/drbg.c index 4a778d0d1fc4a..04c798d7a8b64 100644 --- a/crypto/drbg.c +++ b/crypto/drbg.c @@ -111,17 +111,6 @@ struct drbg_core { char backend_cra_name[CRYPTO_MAX_ALG_NAME]; }; -struct drbg_state_ops { - int (*update)(struct drbg_state *drbg, struct list_head *seed, - int reseed); - int (*generate)(struct drbg_state *drbg, - unsigned char *buf, unsigned int buflen, - struct list_head *addtl); - int (*crypto_init)(struct drbg_state *drbg); - int (*crypto_fini)(struct drbg_state *drbg); - -}; - enum drbg_seed_state { DRBG_SEED_STATE_UNSEEDED, DRBG_SEED_STATE_PARTIAL, /* Seeded with !rng_is_initialized() */ @@ -143,7 +132,6 @@ struct drbg_state { unsigned long last_seed_time; bool pr; /* Prediction resistance enabled? */ struct crypto_rng *jent; - const struct drbg_state_ops *d_ops; const struct drbg_core *core; struct drbg_string test_data; }; @@ -250,7 +238,7 @@ static inline unsigned short drbg_sec_strength(drbg_flag_t flags) } /****************************************************************** - * HMAC DRBG callback functions + * HMAC DRBG functions ******************************************************************/ static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval, @@ -360,21 +348,10 @@ static int drbg_hmac_generate(struct drbg_state *drbg, return len; } -static const struct drbg_state_ops drbg_hmac_ops = { - .update = drbg_hmac_update, - .generate = drbg_hmac_generate, - .crypto_init = drbg_init_hash_kernel, - .crypto_fini = drbg_fini_hash_kernel, -}; - -/****************************************************************** - * Functions common for DRBG implementations - ******************************************************************/ - static inline int __drbg_seed(struct drbg_state *drbg, struct list_head *seed, int reseed, enum drbg_seed_state new_seed_state) { - int ret = drbg->d_ops->update(drbg, seed, reseed); + int ret = drbg_hmac_update(drbg, seed, reseed); if (ret) return ret; @@ -578,7 +555,6 @@ static inline void drbg_dealloc_state(struct drbg_state *drbg) drbg->Cbuf = NULL; drbg->C = NULL; drbg->reseed_ctr = 0; - drbg->d_ops = NULL; drbg->core = NULL; } @@ -590,16 +566,7 @@ static inline int drbg_alloc_state(struct drbg_state *drbg) { int ret = -ENOMEM; - switch (drbg->core->flags & DRBG_TYPE_MASK) { - case DRBG_HMAC: - drbg->d_ops = &drbg_hmac_ops; - break; - default: - ret = -EOPNOTSUPP; - goto err; - } - - ret = drbg->d_ops->crypto_init(drbg); + ret = drbg_init_hash_kernel(drbg); if (ret < 0) goto err; @@ -619,16 +586,12 @@ static inline int drbg_alloc_state(struct drbg_state *drbg) return 0; fini: - drbg->d_ops->crypto_fini(drbg); + drbg_fini_hash_kernel(drbg); err: drbg_dealloc_state(drbg); return ret; } -/************************************************************************* - * DRBG interface functions - *************************************************************************/ - /* * DRBG generate function as required by SP800-90A - this function * generates random numbers @@ -714,7 +677,7 @@ static int drbg_generate(struct drbg_state *drbg, if (addtl && 0 < addtl->len) list_add_tail(&addtl->list, &addtllist); /* 9.3.1 step 8 and 10 */ - len = drbg->d_ops->generate(drbg, buf, buflen, &addtllist); + len = drbg_hmac_generate(drbg, buf, buflen, &addtllist); /* 10.1.2.5 step 7 */ drbg->reseed_ctr++; @@ -879,8 +842,7 @@ static int drbg_uninstantiate(struct drbg_state *drbg) crypto_free_rng(drbg->jent); drbg->jent = NULL; - if (drbg->d_ops) - drbg->d_ops->crypto_fini(drbg); + drbg_fini_hash_kernel(drbg); drbg_dealloc_state(drbg); /* no scrubbing of test_data -- this shall survive an uninstantiate */ return 0;