mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
d0ba3bb1e2
it has been non-functional for years and caused numerous memleaks and crashes for people that tried to enable it. it has no maintained upstream source, and it does not look like it's going to be fixed any time soon Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 45423
167 lines
5.3 KiB
Diff
167 lines
5.3 KiB
Diff
--- a/drivers/char/random.c
|
|
+++ b/drivers/char/random.c
|
|
@@ -139,6 +139,9 @@
|
|
* that might otherwise be identical and have very little entropy
|
|
* available to them (particularly common in the embedded world).
|
|
*
|
|
+ * void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
|
|
+ * int random_input_wait(void);
|
|
+ *
|
|
* add_input_randomness() uses the input layer interrupt timing, as well as
|
|
* the event type information from the hardware.
|
|
*
|
|
@@ -152,6 +155,13 @@
|
|
* seek times do not make for good sources of entropy, as their seek
|
|
* times are usually fairly consistent.
|
|
*
|
|
+ * random_input_words() just provides a raw block of entropy to the input
|
|
+ * pool, such as from a hardware entropy generator.
|
|
+ *
|
|
+ * random_input_wait() suspends the caller until such time as the
|
|
+ * entropy pool falls below the write threshold, and returns a count of how
|
|
+ * much entropy (in bits) is needed to sustain the pool.
|
|
+ *
|
|
* All of these routines try to estimate how many bits of randomness a
|
|
* particular randomness source. They do this by keeping track of the
|
|
* first and second order deltas of the event timings.
|
|
@@ -938,6 +948,63 @@ void add_disk_randomness(struct gendisk
|
|
EXPORT_SYMBOL_GPL(add_disk_randomness);
|
|
#endif
|
|
|
|
+/*
|
|
+ * random_input_words - add bulk entropy to pool
|
|
+ *
|
|
+ * @buf: buffer to add
|
|
+ * @wordcount: number of __u32 words to add
|
|
+ * @ent_count: total amount of entropy (in bits) to credit
|
|
+ *
|
|
+ * this provides bulk input of entropy to the input pool
|
|
+ *
|
|
+ */
|
|
+void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
|
|
+{
|
|
+ mix_pool_bytes(&input_pool, buf, wordcount*4);
|
|
+
|
|
+ credit_entropy_bits(&input_pool, ent_count);
|
|
+
|
|
+ pr_notice("crediting %d bits => %d\n",
|
|
+ ent_count, input_pool.entropy_count);
|
|
+ /*
|
|
+ * Wake up waiting processes if we have enough
|
|
+ * entropy.
|
|
+ */
|
|
+ if (input_pool.entropy_count >= random_read_wakeup_bits)
|
|
+ wake_up_interruptible(&random_read_wait);
|
|
+}
|
|
+EXPORT_SYMBOL(random_input_words);
|
|
+
|
|
+/*
|
|
+ * random_input_wait - wait until random needs entropy
|
|
+ *
|
|
+ * this function sleeps until the /dev/random subsystem actually
|
|
+ * needs more entropy, and then return the amount of entropy
|
|
+ * that it would be nice to have added to the system.
|
|
+ */
|
|
+int random_input_wait(void)
|
|
+{
|
|
+ int count;
|
|
+
|
|
+ wait_event_interruptible(random_write_wait,
|
|
+ input_pool.entropy_count < random_write_wakeup_bits);
|
|
+
|
|
+ count = random_write_wakeup_bits - input_pool.entropy_count;
|
|
+
|
|
+ /* likely we got woken up due to a signal */
|
|
+ if (count <= 0) count = random_read_wakeup_bits;
|
|
+
|
|
+ pr_notice("requesting %d bits from input_wait()er %d<%d\n",
|
|
+ count,
|
|
+ input_pool.entropy_count, random_write_wakeup_bits);
|
|
+
|
|
+ return count;
|
|
+}
|
|
+EXPORT_SYMBOL(random_input_wait);
|
|
+
|
|
+
|
|
+#define EXTRACT_SIZE 10
|
|
+
|
|
/*********************************************************************
|
|
*
|
|
* Entropy extraction routines
|
|
--- a/fs/fcntl.c
|
|
+++ b/fs/fcntl.c
|
|
@@ -140,6 +140,7 @@ pid_t f_getown(struct file *filp)
|
|
read_unlock(&filp->f_owner.lock);
|
|
return pid;
|
|
}
|
|
+EXPORT_SYMBOL(sys_dup);
|
|
|
|
static int f_setown_ex(struct file *filp, unsigned long arg)
|
|
{
|
|
--- a/include/linux/miscdevice.h
|
|
+++ b/include/linux/miscdevice.h
|
|
@@ -19,6 +19,7 @@
|
|
#define APOLLO_MOUSE_MINOR 7 /* unused */
|
|
#define PC110PAD_MINOR 9 /* unused */
|
|
/*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */
|
|
+#define CRYPTODEV_MINOR 70 /* /dev/crypto */
|
|
#define WATCHDOG_MINOR 130 /* Watchdog timer */
|
|
#define TEMP_MINOR 131 /* Temperature Sensor */
|
|
#define RTC_MINOR 135
|
|
--- a/include/uapi/linux/random.h
|
|
+++ b/include/uapi/linux/random.h
|
|
@@ -34,6 +34,30 @@
|
|
/* Clear the entropy pool and associated counters. (Superuser only.) */
|
|
#define RNDCLEARPOOL _IO( 'R', 0x06 )
|
|
|
|
+#ifdef CONFIG_FIPS_RNG
|
|
+
|
|
+/* Size of seed value - equal to AES blocksize */
|
|
+#define AES_BLOCK_SIZE_BYTES 16
|
|
+#define SEED_SIZE_BYTES AES_BLOCK_SIZE_BYTES
|
|
+/* Size of AES key */
|
|
+#define KEY_SIZE_BYTES 16
|
|
+
|
|
+/* ioctl() structure used by FIPS 140-2 Tests */
|
|
+struct rand_fips_test {
|
|
+ unsigned char key[KEY_SIZE_BYTES]; /* Input */
|
|
+ unsigned char datetime[SEED_SIZE_BYTES]; /* Input */
|
|
+ unsigned char seed[SEED_SIZE_BYTES]; /* Input */
|
|
+ unsigned char result[SEED_SIZE_BYTES]; /* Output */
|
|
+};
|
|
+
|
|
+/* FIPS 140-2 RNG Variable Seed Test. (Superuser only.) */
|
|
+#define RNDFIPSVST _IOWR('R', 0x10, struct rand_fips_test)
|
|
+
|
|
+/* FIPS 140-2 RNG Monte Carlo Test. (Superuser only.) */
|
|
+#define RNDFIPSMCT _IOWR('R', 0x11, struct rand_fips_test)
|
|
+
|
|
+#endif /* #ifdef CONFIG_FIPS_RNG */
|
|
+
|
|
struct rand_pool_info {
|
|
int entropy_count;
|
|
int buf_size;
|
|
--- a/include/linux/random.h
|
|
+++ b/include/linux/random.h
|
|
@@ -13,6 +13,10 @@ extern void add_input_randomness(unsigne
|
|
unsigned int value);
|
|
extern void add_interrupt_randomness(int irq, int irq_flags);
|
|
|
|
+extern void random_input_words(__u32 *buf, size_t wordcount, int ent_count);
|
|
+extern int random_input_wait(void);
|
|
+#define HAS_RANDOM_INPUT_WAIT 1
|
|
+
|
|
extern void get_random_bytes(void *buf, int nbytes);
|
|
extern void get_random_bytes_arch(void *buf, int nbytes);
|
|
void generate_random_uuid(unsigned char uuid_out[16]);
|
|
--- a/kernel/pid.c
|
|
+++ b/kernel/pid.c
|
|
@@ -427,6 +427,7 @@ void transfer_pid(struct task_struct *ol
|
|
new->pids[type].pid = old->pids[type].pid;
|
|
hlist_replace_rcu(&old->pids[type].node, &new->pids[type].node);
|
|
}
|
|
+EXPORT_SYMBOL(find_task_by_vpid);
|
|
|
|
struct task_struct *pid_task(struct pid *pid, enum pid_type type)
|
|
{
|