diff --git a/crypto/rng.c b/crypto/rng.c index c6165c8eb387..53a268ad5104 100644 --- a/crypto/rng.c +++ b/crypto/rng.c @@ -145,6 +145,20 @@ void crypto_put_default_rng(void) } EXPORT_SYMBOL_GPL(crypto_put_default_rng); +int crypto_stdrng_get_bytes(void *buf, unsigned int len) +{ + int err; + + err = crypto_get_default_rng(); + if (err) + return err; + + err = crypto_rng_get_bytes(crypto_default_rng, buf, len); + crypto_put_default_rng(); + return err; +} +EXPORT_SYMBOL_GPL(crypto_stdrng_get_bytes); + #if defined(CONFIG_CRYPTO_RNG) || defined(CONFIG_CRYPTO_RNG_MODULE) int crypto_del_default_rng(void) { diff --git a/include/crypto/rng.h b/include/crypto/rng.h index d451b54b322a..db6c3962a7df 100644 --- a/include/crypto/rng.h +++ b/include/crypto/rng.h @@ -62,6 +62,19 @@ extern struct crypto_rng *crypto_default_rng; int crypto_get_default_rng(void); void crypto_put_default_rng(void); +/** + * crypto_stdrng_get_bytes() - get cryptographically secure random bytes + * @buf: output buffer holding the random numbers + * @len: length of the output buffer + * + * This function fills the caller-allocated buffer with random numbers using the + * highest-priority "stdrng" algorithm in the crypto_rng subsystem. + * + * Context: May sleep + * Return: 0 function was successful; < 0 if an error occurred + */ +int crypto_stdrng_get_bytes(void *buf, unsigned int len); + /** * DOC: Random number generator API *