summaryrefslogtreecommitdiffstats
path: root/lib/random.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/random.c')
-rw-r--r--lib/random.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/lib/random.c b/lib/random.c
index fb3580f9c0..e83935d0e1 100644
--- a/lib/random.c
+++ b/lib/random.c
@@ -34,17 +34,8 @@ void get_random_bytes(void *_buf, int len)
*buf++ = rand() % 256;
}
-/**
- * get_crypto_bytes - get random numbers suitable for cryptographic needs.
- */
-static int _get_crypto_bytes(void *buf, int len)
+int hwrng_get_crypto_bytes(struct hwrng *rng, void *buf, int len)
{
- struct hwrng *rng;
-
- rng = hwrng_get_first();
- if (IS_ERR(rng))
- return PTR_ERR(rng);
-
while (len) {
int bytes = hwrng_get_data(rng, buf, len, true);
if (!bytes)
@@ -60,20 +51,28 @@ static int _get_crypto_bytes(void *buf, int len)
return 0;
}
+/**
+ * get_crypto_bytes - get random numbers suitable for cryptographic needs.
+ */
int get_crypto_bytes(void *buf, int len)
{
+ struct hwrng *rng;
int err;
- err = _get_crypto_bytes(buf, len);
- if (!err)
- return 0;
+ rng = hwrng_get_first();
+ err = PTR_ERR_OR_ZERO(rng);
+ if (!err) {
+ err = hwrng_get_crypto_bytes(rng, buf, len);
+ if (!err)
+ return 0;
+ }
if (!IS_ENABLED(CONFIG_ALLOW_PRNG_FALLBACK)) {
- pr_err("error: no HWRNG available!\n");
+ pr_err("no HWRNG available!\n");
return err;
}
- pr_warn("warning: falling back to Pseudo RNG source!\n");
+ pr_warn("falling back to Pseudo RNG source!\n");
get_random_bytes(buf, len);