random.h 2.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9
/*
 * include/linux/random.h
 *
 * Include file for the random number generator.
 */

#ifndef _LINUX_RANDOM_H
#define _LINUX_RANDOM_H

10
#include <linux/types.h>
L
Linus Torvalds 已提交
11
#include <linux/ioctl.h>
12
#include <linux/irqnr.h>
L
Linus Torvalds 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

/* ioctl()'s for the random number generator */

/* Get the entropy count. */
#define RNDGETENTCNT	_IOR( 'R', 0x00, int )

/* Add to (or subtract from) the entropy count.  (Superuser only.) */
#define RNDADDTOENTCNT	_IOW( 'R', 0x01, int )

/* Get the contents of the entropy pool.  (Superuser only.) */
#define RNDGETPOOL	_IOR( 'R', 0x02, int [2] )

/* 
 * Write bytes into the entropy pool and add to the entropy count.
 * (Superuser only.)
 */
#define RNDADDENTROPY	_IOW( 'R', 0x03, int [2] )

/* Clear entropy count to 0.  (Superuser only.) */
#define RNDZAPENTCNT	_IO( 'R', 0x04 )

/* Clear the entropy pool and associated counters.  (Superuser only.) */
#define RNDCLEARPOOL	_IO( 'R', 0x06 )

struct rand_pool_info {
	int	entropy_count;
	int	buf_size;
	__u32	buf[0];
};

43 44 45 46
struct rnd_state {
	__u32 s1, s2, s3;
};

L
Linus Torvalds 已提交
47 48 49 50
/* Exported functions */

#ifdef __KERNEL__

51
extern void add_device_randomness(const void *, unsigned int);
L
Linus Torvalds 已提交
52 53
extern void add_input_randomness(unsigned int type, unsigned int code,
				 unsigned int value);
54
extern void add_interrupt_randomness(int irq, int irq_flags);
L
Linus Torvalds 已提交
55 56

extern void get_random_bytes(void *buf, int nbytes);
57
extern void get_random_bytes_arch(void *buf, int nbytes);
L
Linus Torvalds 已提交
58 59 60
void generate_random_uuid(unsigned char uuid_out[16]);

#ifndef MODULE
61
extern const struct file_operations random_fops, urandom_fops;
L
Linus Torvalds 已提交
62 63 64 65 66
#endif

unsigned int get_random_int(void);
unsigned long randomize_range(unsigned long start, unsigned long end, unsigned long len);

67 68 69
u32 random32(void);
void srandom32(u32 seed);

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
u32 prandom32(struct rnd_state *);

/*
 * Handle minimum values for seeds
 */
static inline u32 __seed(u32 x, u32 m)
{
	return (x < m) ? x + m : x;
}

/**
 * prandom32_seed - set seed for prandom32().
 * @state: pointer to state structure to receive the seed.
 * @seed: arbitrary 64-bit value to use as a seed.
 */
static inline void prandom32_seed(struct rnd_state *state, u64 seed)
{
	u32 i = (seed >> 32) ^ (seed << 10) ^ seed;

	state->s1 = __seed(i, 1);
	state->s2 = __seed(i, 7);
	state->s3 = __seed(i, 15);
}

94 95 96 97 98 99 100 101 102 103 104 105 106
#ifdef CONFIG_ARCH_RANDOM
# include <asm/archrandom.h>
#else
static inline int arch_get_random_long(unsigned long *v)
{
	return 0;
}
static inline int arch_get_random_int(unsigned int *v)
{
	return 0;
}
#endif

L
Linus Torvalds 已提交
107 108 109
#endif /* __KERNEL___ */

#endif /* _LINUX_RANDOM_H */