linux/include/linux/random.h
<<
>>
Prefs
   1/*
   2 * include/linux/random.h
   3 *
   4 * Include file for the random number generator.
   5 */
   6#ifndef _LINUX_RANDOM_H
   7#define _LINUX_RANDOM_H
   8
   9#include <uapi/linux/random.h>
  10
  11extern void add_device_randomness(const void *, unsigned int);
  12extern void add_input_randomness(unsigned int type, unsigned int code,
  13                                 unsigned int value);
  14extern void add_interrupt_randomness(int irq, int irq_flags);
  15
  16extern void get_random_bytes(void *buf, int nbytes);
  17extern void get_random_bytes_arch(void *buf, int nbytes);
  18void generate_random_uuid(unsigned char uuid_out[16]);
  19extern int random_int_secret_init(void);
  20
  21#ifndef MODULE
  22extern const struct file_operations random_fops, urandom_fops;
  23#endif
  24
  25unsigned int get_random_int(void);
  26unsigned long randomize_range(unsigned long start, unsigned long end, unsigned long len);
  27
  28u32 prandom_u32(void);
  29void prandom_bytes(void *buf, size_t nbytes);
  30void prandom_seed(u32 seed);
  31void prandom_reseed_late(void);
  32
  33struct rnd_state {
  34        __u32 s1, s2, s3, s4;
  35};
  36
  37u32 prandom_u32_state(struct rnd_state *state);
  38void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes);
  39
  40/**
  41 * prandom_u32_max - returns a pseudo-random number in interval [0, ep_ro)
  42 * @ep_ro: right open interval endpoint
  43 *
  44 * Returns a pseudo-random number that is in interval [0, ep_ro). Note
  45 * that the result depends on PRNG being well distributed in [0, ~0U]
  46 * u32 space. Here we use maximally equidistributed combined Tausworthe
  47 * generator, that is, prandom_u32(). This is useful when requesting a
  48 * random index of an array containing ep_ro elements, for example.
  49 *
  50 * Returns: pseudo-random number in interval [0, ep_ro)
  51 */
  52static inline u32 prandom_u32_max(u32 ep_ro)
  53{
  54        return (u32)(((u64) prandom_u32() * ep_ro) >> 32);
  55}
  56
  57/*
  58 * Handle minimum values for seeds
  59 */
  60static inline u32 __seed(u32 x, u32 m)
  61{
  62        return (x < m) ? x + m : x;
  63}
  64
  65/**
  66 * prandom_seed_state - set seed for prandom_u32_state().
  67 * @state: pointer to state structure to receive the seed.
  68 * @seed: arbitrary 64-bit value to use as a seed.
  69 */
  70static inline void prandom_seed_state(struct rnd_state *state, u64 seed)
  71{
  72        u32 i = (seed >> 32) ^ (seed << 10) ^ seed;
  73
  74        state->s1 = __seed(i,   2U);
  75        state->s2 = __seed(i,   8U);
  76        state->s3 = __seed(i,  16U);
  77        state->s4 = __seed(i, 128U);
  78}
  79
  80#ifdef CONFIG_ARCH_RANDOM
  81# include <asm/archrandom.h>
  82#else
  83static inline int arch_get_random_long(unsigned long *v)
  84{
  85        return 0;
  86}
  87static inline int arch_get_random_int(unsigned int *v)
  88{
  89        return 0;
  90}
  91static inline int arch_has_random(void)
  92{
  93        return 0;
  94}
  95static inline int arch_get_random_seed_long(unsigned long *v)
  96{
  97        return 0;
  98}
  99static inline int arch_get_random_seed_int(unsigned int *v)
 100{
 101        return 0;
 102}
 103static inline int arch_has_random_seed(void)
 104{
 105        return 0;
 106}
 107#endif
 108
 109/* Pseudo random number generator from numerical recipes. */
 110static inline u32 next_pseudo_random32(u32 seed)
 111{
 112        return seed * 1664525 + 1013904223;
 113}
 114
 115#endif /* _LINUX_RANDOM_H */
 116