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>
This commit is contained in:
parent
d0e83059a6
commit
ff030b099a
2 changed files with 32 additions and 4 deletions
|
@ -36,6 +36,12 @@ static inline struct crypto_rng *__crypto_rng_cast(struct crypto_tfm *tfm)
|
||||||
return container_of(tfm, struct crypto_rng, base);
|
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)
|
static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
|
||||||
{
|
{
|
||||||
u8 *buf = NULL;
|
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)
|
static int crypto_rng_init_tfm(struct crypto_tfm *tfm)
|
||||||
{
|
{
|
||||||
struct crypto_rng *rng = __crypto_rng_cast(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;
|
rng->seed = rngapi_reset;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -16,7 +16,9 @@
|
||||||
#include <linux/crypto.h>
|
#include <linux/crypto.h>
|
||||||
|
|
||||||
struct crypto_rng {
|
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);
|
int (*seed)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
|
||||||
struct crypto_tfm base;
|
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_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
|
* crypto_rng_get_bytes() - get random number
|
||||||
* @tfm: cipher handle
|
* @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,
|
static inline int crypto_rng_get_bytes(struct crypto_rng *tfm,
|
||||||
u8 *rdata, unsigned int dlen)
|
u8 *rdata, unsigned int dlen)
|
||||||
{
|
{
|
||||||
return tfm->generate(tfm, rdata, dlen);
|
return crypto_rng_generate(tfm, NULL, 0, rdata, dlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue