crypto: rng - Introduce crypto_rng_generate
authorHerbert Xu <herbert@gondor.apana.org.au>
Mon, 20 Apr 2015 05:39:04 +0000 (13:39 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 21 Apr 2015 02:19:58 +0000 (10:19 +0800)
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>
crypto/rng.c
include/crypto/rng.h

index 87fa2f4933b0555d6059b1a516fa079c77e6eebf..4514d3755f7941a416e6b5fbfc66e1e65b6b750c 100644 (file)
@@ -36,6 +36,12 @@ static inline struct crypto_rng *__crypto_rng_cast(struct crypto_tfm *tfm)
        return container_of(tfm, struct crypto_rng, base);
 }
 
+static int generate(struct crypto_rng *tfm, const u8 *src, unsigned int slen,
+                   u8 *dst, unsigned int dlen)
+{
+       return crypto_rng_alg(tfm)->rng_make_random(tfm, dst, dlen);
+}
+
 static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
 {
        u8 *buf = NULL;
@@ -59,9 +65,8 @@ static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
 static int crypto_rng_init_tfm(struct crypto_tfm *tfm)
 {
        struct crypto_rng *rng = __crypto_rng_cast(tfm);
-       struct rng_alg *alg = &tfm->__crt_alg->cra_rng;
 
-       rng->generate = alg->rng_make_random;
+       rng->generate = generate;
        rng->seed = rngapi_reset;
 
        return 0;
index f13f3faca4d7779abd0d58d74b32e91d0968c461..f20f068154bcab5662068dfa1e4ff44d8c58d272 100644 (file)
@@ -16,7 +16,9 @@
 #include <linux/crypto.h>
 
 struct crypto_rng {
-       int (*generate)(struct crypto_rng *tfm, u8 *rdata, unsigned int dlen);
+       int (*generate)(struct crypto_rng *tfm,
+                       const u8 *src, unsigned int slen,
+                       u8 *dst, unsigned int dlen);
        int (*seed)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
        struct crypto_tfm base;
 };
@@ -82,6 +84,27 @@ static inline void crypto_free_rng(struct crypto_rng *tfm)
        crypto_destroy_tfm(tfm, crypto_rng_tfm(tfm));
 }
 
+/**
+ * crypto_rng_generate() - get random number
+ * @tfm: cipher handle
+ * @src: Input buffer holding additional data, may be NULL
+ * @slen: Length of additional data
+ * @dst: output buffer holding the random numbers
+ * @dlen: length of the output buffer
+ *
+ * This function fills the caller-allocated buffer with random
+ * numbers using the random number generator referenced by the
+ * cipher handle.
+ *
+ * Return: 0 function was successful; < 0 if an error occurred
+ */
+static inline int crypto_rng_generate(struct crypto_rng *tfm,
+                                     const u8 *src, unsigned int slen,
+                                     u8 *dst, unsigned int dlen)
+{
+       return tfm->generate(tfm, src, slen, dst, dlen);
+}
+
 /**
  * crypto_rng_get_bytes() - get random number
  * @tfm: cipher handle
@@ -96,7 +119,7 @@ static inline void crypto_free_rng(struct crypto_rng *tfm)
 static inline int crypto_rng_get_bytes(struct crypto_rng *tfm,
                                       u8 *rdata, unsigned int dlen)
 {
-       return tfm->generate(tfm, rdata, dlen);
+       return crypto_rng_generate(tfm, NULL, 0, rdata, dlen);
 }
 
 /**