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;
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;
#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;
};
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
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);
}
/**