Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff030b09 authored by Herbert Xu's avatar Herbert Xu
Browse files

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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent d0e83059
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -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;
+25 −2
Original line number Original line Diff line number Diff line
@@ -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);
}
}


/**
/**