From: Justin M. Forbes <jfor...@fedoraproject.org>

Revert random: Add hook to override device reads and getrandom(2)

The random system upstream is in a period of major rewrite.  In the 5.18
merge window, it took a considerable amount of time to message this into
the random.c rewrites. In the 5.19 merge window, rng->extrng_read(buf,
count); does not even compile, with buf and count undefined.   As I do
not see the subsequent patch that allows the override with a FIPS rng, I
am just reverting the whole thing, and it can be added back when Herbert
has time or motivation to do so.

Signed-off-by: Justin M. Forbes <jfor...@fedoraproject.org>

diff --git a/drivers/char/random.c b/drivers/char/random.c
index blahblah..blahblah 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -53,7 +53,6 @@
 #include <linux/uaccess.h>
 #include <linux/suspend.h>
 #include <linux/siphash.h>
-#include <linux/rcupdate.h>
 #include <crypto/chacha.h>
 #include <crypto/blake2s.h>
 #include <asm/processor.h>
@@ -282,11 +281,6 @@ static bool crng_has_old_seed(void)
        return time_is_before_jiffies(READ_ONCE(base_crng.birth) + interval);
 }
 
-/*
- * Hook for external RNG.
- */
-static const struct random_extrng __rcu *extrng;
-
 /*
  * This function returns a ChaCha state that you may use for generating
  * random data. It also returns up to 32 bytes on its own of random data
@@ -675,9 +669,6 @@ static void __cold _credit_init_bits(size_t bits)
 }
 
 
-static const struct file_operations extrng_random_fops;
-static const struct file_operations extrng_urandom_fops;
-
 /**********************************************************************
  *
  * Entropy collection routines.
@@ -882,19 +873,6 @@ void __cold add_bootloader_randomness(const void *buf, 
size_t len)
 }
 EXPORT_SYMBOL_GPL(add_bootloader_randomness);
 
-void random_register_extrng(const struct random_extrng *rng)
-{
-       rcu_assign_pointer(extrng, rng);
-}
-EXPORT_SYMBOL_GPL(random_register_extrng);
-
-void random_unregister_extrng(void)
-{
-       RCU_INIT_POINTER(extrng, NULL);
-       synchronize_rcu();
-}
-EXPORT_SYMBOL_GPL(random_unregister_extrng);
-
 #if IS_ENABLED(CONFIG_VMGENID)
 static BLOCKING_NOTIFIER_HEAD(vmfork_chain);
 
@@ -1265,7 +1243,6 @@ SYSCALL_DEFINE3(getrandom, char __user *, ubuf, size_t, 
len, unsigned int, flags
        struct iov_iter iter;
        struct iovec iov;
        int ret;
-       const struct random_extrng *rng;
 
        if (flags & ~(GRND_NONBLOCK | GRND_RANDOM | GRND_INSECURE))
                return -EINVAL;
@@ -1277,18 +1254,6 @@ SYSCALL_DEFINE3(getrandom, char __user *, ubuf, size_t, 
len, unsigned int, flags
        if ((flags & (GRND_INSECURE | GRND_RANDOM)) == (GRND_INSECURE | 
GRND_RANDOM))
                return -EINVAL;
 
-       rcu_read_lock();
-       rng = rcu_dereference(extrng);
-       if (rng && !try_module_get(rng->owner))
-               rng = NULL;
-       rcu_read_unlock();
-
-       if (rng) {
-               ret = rng->extrng_read(buf, count);
-               module_put(rng->owner);
-               return ret;
-       }
-
        if (!crng_ready() && !(flags & GRND_INSECURE)) {
                if (flags & GRND_NONBLOCK)
                        return -EAGAIN;
@@ -1309,12 +1274,6 @@ static __poll_t random_poll(struct file *file, 
poll_table *wait)
        return crng_ready() ? EPOLLIN | EPOLLRDNORM : EPOLLOUT | EPOLLWRNORM;
 }
 
-static __poll_t extrng_poll(struct file *file, poll_table * wait)
-{
-       /* extrng pool is always full, always read, no writes */
-       return EPOLLIN | EPOLLRDNORM;
-}
-
 static ssize_t write_pool_user(struct iov_iter *iter)
 {
        u8 block[BLAKE2S_BLOCK_SIZE];
@@ -1451,58 +1410,7 @@ static int random_fasync(int fd, struct file *filp, int 
on)
        return fasync_helper(fd, filp, on, &fasync);
 }
 
-static int random_open(struct inode *inode, struct file *filp)
-{
-       const struct random_extrng *rng;
-
-       rcu_read_lock();
-       rng = rcu_dereference(extrng);
-       if (rng && !try_module_get(rng->owner))
-               rng = NULL;
-       rcu_read_unlock();
-
-       if (!rng)
-               return 0;
-
-       filp->f_op = &extrng_random_fops;
-       filp->private_data = rng->owner;
-
-       return 0;
-}
-
-static int urandom_open(struct inode *inode, struct file *filp)
-{
-       const struct random_extrng *rng;
-
-       rcu_read_lock();
-       rng = rcu_dereference(extrng);
-       if (rng && !try_module_get(rng->owner))
-               rng = NULL;
-       rcu_read_unlock();
-
-       if (!rng)
-               return 0;
-
-       filp->f_op = &extrng_urandom_fops;
-       filp->private_data = rng->owner;
-
-       return 0;
-}
-
-static int extrng_release(struct inode *inode, struct file *filp)
-{
-       module_put(filp->private_data);
-       return 0;
-}
-
-static ssize_t
-extrng_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
-{
-       return rcu_dereference_raw(extrng)->extrng_read(buf, nbytes);
-}
-
 const struct file_operations random_fops = {
-       .open  = random_open,
        .read_iter = random_read_iter,
        .write_iter = random_write_iter,
        .poll = random_poll,
@@ -1515,7 +1423,6 @@ const struct file_operations random_fops = {
 };
 
 const struct file_operations urandom_fops = {
-       .open  = urandom_open,
        .read_iter = urandom_read_iter,
        .write_iter = random_write_iter,
        .unlocked_ioctl = random_ioctl,
@@ -1526,26 +1433,6 @@ const struct file_operations urandom_fops = {
        .splice_write = iter_file_splice_write,
 };
 
-static const struct file_operations extrng_random_fops = {
-       .open  = random_open,
-       .read  = extrng_read,
-       .write = random_write,
-       .poll  = extrng_poll,
-       .unlocked_ioctl = random_ioctl,
-       .fasync = random_fasync,
-       .llseek = noop_llseek,
-       .release = extrng_release,
-};
-
-static const struct file_operations extrng_urandom_fops = {
-       .open  = urandom_open,
-       .read  = extrng_read,
-       .write = random_write,
-       .unlocked_ioctl = random_ioctl,
-       .fasync = random_fasync,
-       .llseek = noop_llseek,
-       .release = extrng_release,
-};
 
 /********************************************************************
  *
diff --git a/include/linux/random.h b/include/linux/random.h
index blahblah..blahblah 100644
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -10,11 +10,6 @@
 
 #include <uapi/linux/random.h>
 
-struct random_extrng {
-       ssize_t (*extrng_read)(void __user *buf, size_t buflen);
-       struct module *owner;
-};
-
 struct notifier_block;
 
 void add_device_randomness(const void *buf, size_t len);
@@ -146,9 +141,6 @@ int random_prepare_cpu(unsigned int cpu);
 int random_online_cpu(unsigned int cpu);
 #endif
 
-void random_register_extrng(const struct random_extrng *rng);
-void random_unregister_extrng(void);
-
 #ifndef MODULE
 extern const struct file_operations random_fops, urandom_fops;
 #endif

--
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/1809
_______________________________________________
kernel mailing list -- kernel@lists.fedoraproject.org
To unsubscribe send an email to kernel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/kernel@lists.fedoraproject.org
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to