Branch data Line data Source code
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 : :
11 : : extern void add_device_randomness(const void *, unsigned int);
12 : : extern void add_input_randomness(unsigned int type, unsigned int code,
13 : : unsigned int value);
14 : : extern void add_interrupt_randomness(int irq, int irq_flags);
15 : :
16 : : extern void get_random_bytes(void *buf, int nbytes);
17 : : extern void get_random_bytes_arch(void *buf, int nbytes);
18 : : void generate_random_uuid(unsigned char uuid_out[16]);
19 : : extern int random_int_secret_init(void);
20 : :
21 : : #ifndef MODULE
22 : : extern const struct file_operations random_fops, urandom_fops;
23 : : #endif
24 : :
25 : : unsigned int get_random_int(void);
26 : : unsigned long randomize_range(unsigned long start, unsigned long end, unsigned long len);
27 : :
28 : : u32 prandom_u32(void);
29 : : void prandom_bytes(void *buf, int nbytes);
30 : : void prandom_seed(u32 seed);
31 : : void prandom_reseed_late(void);
32 : :
33 : : struct rnd_state {
34 : : __u32 s1, s2, s3, s4;
35 : : };
36 : :
37 : : u32 prandom_u32_state(struct rnd_state *state);
38 : : void prandom_bytes_state(struct rnd_state *state, void *buf, int 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 : : */
52 : : static inline u32 prandom_u32_max(u32 ep_ro)
53 : : {
54 : 0 : return (u32)(((u64) prandom_u32() * ep_ro) >> 32);
55 : : }
56 : :
57 : : /*
58 : : * Handle minimum values for seeds
59 : : */
60 : : static inline u32 __seed(u32 x, u32 m)
61 : : {
62 [ # # ][ # # ]: 2730 : 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 : : */
70 : : static 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
83 : : static inline int arch_get_random_long(unsigned long *v)
84 : : {
85 : : return 0;
86 : : }
87 : : static inline int arch_get_random_int(unsigned int *v)
88 : : {
89 : : return 0;
90 : : }
91 : : #endif
92 : :
93 : : /* Pseudo random number generator from numerical recipes. */
94 : : static inline u32 next_pseudo_random32(u32 seed)
95 : : {
96 : 0 : return seed * 1664525 + 1013904223;
97 : : }
98 : :
99 : : #endif /* _LINUX_RANDOM_H */
|