aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-04-20 01:39:04 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-04-20 22:19:58 -0400
commitff030b099a21a4753af575b4304249e88400e506 (patch)
treef54046623574ff38c4da038d3eff37837978aec6
parentd0e83059a6c9b04f00264a74b8f6439948de4613 (diff)
crypto: rng - Introduce crypto_rng_generate
This patch adds the new top-level function crypto_rng_generate which generates random numbers with additional input. It also extends the mid-level rng_gen_random function to take additional data as input. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/rng.c9
-rw-r--r--include/crypto/rng.h27
2 files changed, 32 insertions, 4 deletions
diff --git a/crypto/rng.c b/crypto/rng.c
index 87fa2f4933b0..4514d3755f79 100644
--- a/crypto/rng.c
+++ b/crypto/rng.c
@@ -36,6 +36,12 @@ static inline struct crypto_rng *__crypto_rng_cast(struct crypto_tfm *tfm)
36 return container_of(tfm, struct crypto_rng, base); 36 return container_of(tfm, struct crypto_rng, base);
37} 37}
38 38
39static int generate(struct crypto_rng *tfm, const u8 *src, unsigned int slen,
40 u8 *dst, unsigned int dlen)
41{
42 return crypto_rng_alg(tfm)->rng_make_random(tfm, dst, dlen);
43}
44
39static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen) 45static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
40{ 46{
41 u8 *buf = NULL; 47 u8 *buf = NULL;
@@ -59,9 +65,8 @@ static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
59static int crypto_rng_init_tfm(struct crypto_tfm *tfm) 65static int crypto_rng_init_tfm(struct crypto_tfm *tfm)
60{ 66{
61 struct crypto_rng *rng = __crypto_rng_cast(tfm); 67 struct crypto_rng *rng = __crypto_rng_cast(tfm);
62 struct rng_alg *alg = &tfm->__crt_alg->cra_rng;
63 68
64 rng->generate = alg->rng_make_random; 69 rng->generate = generate;
65 rng->seed = rngapi_reset; 70 rng->seed = rngapi_reset;
66 71
67 return 0; 72 return 0;
diff --git a/include/crypto/rng.h b/include/crypto/rng.h
index f13f3faca4d7..f20f068154bc 100644
--- a/include/crypto/rng.h
+++ b/include/crypto/rng.h
@@ -16,7 +16,9 @@
16#include <linux/crypto.h> 16#include <linux/crypto.h>
17 17
18struct crypto_rng { 18struct crypto_rng {
19 int (*generate)(struct crypto_rng *tfm, u8 *rdata, unsigned int dlen); 19 int (*generate)(struct crypto_rng *tfm,
20 const u8 *src, unsigned int slen,
21 u8 *dst, unsigned int dlen);
20 int (*seed)(struct crypto_rng *tfm, u8 *seed, unsigned int slen); 22 int (*seed)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
21 struct crypto_tfm base; 23 struct crypto_tfm base;
22}; 24};
@@ -83,6 +85,27 @@ static inline void crypto_free_rng(struct crypto_rng *tfm)
83} 85}
84 86
85/** 87/**
88 * crypto_rng_generate() - get random number
89 * @tfm: cipher handle
90 * @src: Input buffer holding additional data, may be NULL
91 * @slen: Length of additional data
92 * @dst: output buffer holding the random numbers
93 * @dlen: length of the output buffer
94 *
95 * This function fills the caller-allocated buffer with random
96 * numbers using the random number generator referenced by the
97 * cipher handle.
98 *
99 * Return: 0 function was successful; < 0 if an error occurred
100 */
101static inline int crypto_rng_generate(struct crypto_rng *tfm,
102 const u8 *src, unsigned int slen,
103 u8 *dst, unsigned int dlen)
104{
105 return tfm->generate(tfm, src, slen, dst, dlen);
106}
107
108/**
86 * crypto_rng_get_bytes() - get random number 109 * crypto_rng_get_bytes() - get random number
87 * @tfm: cipher handle 110 * @tfm: cipher handle
88 * @rdata: output buffer holding the random numbers 111 * @rdata: output buffer holding the random numbers
@@ -96,7 +119,7 @@ static inline void crypto_free_rng(struct crypto_rng *tfm)
96static inline int crypto_rng_get_bytes(struct crypto_rng *tfm, 119static inline int crypto_rng_get_bytes(struct crypto_rng *tfm,
97 u8 *rdata, unsigned int dlen) 120 u8 *rdata, unsigned int dlen)
98{ 121{
99 return tfm->generate(tfm, rdata, dlen); 122 return crypto_rng_generate(tfm, NULL, 0, rdata, dlen);
100} 123}
101 124
102/** 125/**