Skip to content

Commit

Permalink
crypto: rng - Introduce crypto_rng_generate
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
herbertx committed Apr 21, 2015
1 parent d0e8305 commit ff030b0
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
9 changes: 7 additions & 2 deletions crypto/rng.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
27 changes: 25 additions & 2 deletions include/crypto/rng.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down Expand Up @@ -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
Expand All @@ -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);
}

/**
Expand Down

0 comments on commit ff030b0

Please sign in to comment.