linux/drivers/char/hw_random/core.c
<<
>>
Prefs
   1/*
   2 * hw_random/core.c: HWRNG core API
   3 *
   4 * Copyright 2006 Michael Buesch <m@bues.ch>
   5 * Copyright 2005 (c) MontaVista Software, Inc.
   6 *
   7 * Please read Documentation/hw_random.txt for details on use.
   8 *
   9 * This software may be used and distributed according to the terms
  10 * of the GNU General Public License, incorporated herein by reference.
  11 */
  12
  13#include <linux/delay.h>
  14#include <linux/device.h>
  15#include <linux/err.h>
  16#include <linux/fs.h>
  17#include <linux/hw_random.h>
  18#include <linux/kernel.h>
  19#include <linux/kthread.h>
  20#include <linux/sched/signal.h>
  21#include <linux/miscdevice.h>
  22#include <linux/module.h>
  23#include <linux/random.h>
  24#include <linux/sched.h>
  25#include <linux/slab.h>
  26#include <linux/uaccess.h>
  27
  28#define RNG_MODULE_NAME         "hw_random"
  29
  30static struct hwrng *current_rng;
  31static struct task_struct *hwrng_fill;
  32static LIST_HEAD(rng_list);
  33/* Protects rng_list and current_rng */
  34static DEFINE_MUTEX(rng_mutex);
  35/* Protects rng read functions, data_avail, rng_buffer and rng_fillbuf */
  36static DEFINE_MUTEX(reading_mutex);
  37static int data_avail;
  38static u8 *rng_buffer, *rng_fillbuf;
  39static unsigned short current_quality;
  40static unsigned short default_quality; /* = 0; default to "off" */
  41
  42module_param(current_quality, ushort, 0644);
  43MODULE_PARM_DESC(current_quality,
  44                 "current hwrng entropy estimation per mill");
  45module_param(default_quality, ushort, 0644);
  46MODULE_PARM_DESC(default_quality,
  47                 "default entropy content of hwrng per mill");
  48
  49static void drop_current_rng(void);
  50static int hwrng_init(struct hwrng *rng);
  51static void start_khwrngd(void);
  52
  53static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
  54                               int wait);
  55
  56static size_t rng_buffer_size(void)
  57{
  58        return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
  59}
  60
  61static void add_early_randomness(struct hwrng *rng)
  62{
  63        int bytes_read;
  64        size_t size = min_t(size_t, 16, rng_buffer_size());
  65
  66        mutex_lock(&reading_mutex);
  67        bytes_read = rng_get_data(rng, rng_buffer, size, 1);
  68        mutex_unlock(&reading_mutex);
  69        if (bytes_read > 0)
  70                add_device_randomness(rng_buffer, bytes_read);
  71}
  72
  73static inline void cleanup_rng(struct kref *kref)
  74{
  75        struct hwrng *rng = container_of(kref, struct hwrng, ref);
  76
  77        if (rng->cleanup)
  78                rng->cleanup(rng);
  79
  80        complete(&rng->cleanup_done);
  81}
  82
  83static int set_current_rng(struct hwrng *rng)
  84{
  85        int err;
  86
  87        BUG_ON(!mutex_is_locked(&rng_mutex));
  88
  89        err = hwrng_init(rng);
  90        if (err)
  91                return err;
  92
  93        drop_current_rng();
  94        current_rng = rng;
  95
  96        return 0;
  97}
  98
  99static void drop_current_rng(void)
 100{
 101        BUG_ON(!mutex_is_locked(&rng_mutex));
 102        if (!current_rng)
 103                return;
 104
 105        /* decrease last reference for triggering the cleanup */
 106        kref_put(&current_rng->ref, cleanup_rng);
 107        current_rng = NULL;
 108}
 109
 110/* Returns ERR_PTR(), NULL or refcounted hwrng */
 111static struct hwrng *get_current_rng(void)
 112{
 113        struct hwrng *rng;
 114
 115        if (mutex_lock_interruptible(&rng_mutex))
 116                return ERR_PTR(-ERESTARTSYS);
 117
 118        rng = current_rng;
 119        if (rng)
 120                kref_get(&rng->ref);
 121
 122        mutex_unlock(&rng_mutex);
 123        return rng;
 124}
 125
 126static void put_rng(struct hwrng *rng)
 127{
 128        /*
 129         * Hold rng_mutex here so we serialize in case they set_current_rng
 130         * on rng again immediately.
 131         */
 132        mutex_lock(&rng_mutex);
 133        if (rng)
 134                kref_put(&rng->ref, cleanup_rng);
 135        mutex_unlock(&rng_mutex);
 136}
 137
 138static int hwrng_init(struct hwrng *rng)
 139{
 140        if (kref_get_unless_zero(&rng->ref))
 141                goto skip_init;
 142
 143        if (rng->init) {
 144                int ret;
 145
 146                ret =  rng->init(rng);
 147                if (ret)
 148                        return ret;
 149        }
 150
 151        kref_init(&rng->ref);
 152        reinit_completion(&rng->cleanup_done);
 153
 154skip_init:
 155        add_early_randomness(rng);
 156
 157        current_quality = rng->quality ? : default_quality;
 158        if (current_quality > 1024)
 159                current_quality = 1024;
 160
 161        if (current_quality == 0 && hwrng_fill)
 162                kthread_stop(hwrng_fill);
 163        if (current_quality > 0 && !hwrng_fill)
 164                start_khwrngd();
 165
 166        return 0;
 167}
 168
 169static int rng_dev_open(struct inode *inode, struct file *filp)
 170{
 171        /* enforce read-only access to this chrdev */
 172        if ((filp->f_mode & FMODE_READ) == 0)
 173                return -EINVAL;
 174        if (filp->f_mode & FMODE_WRITE)
 175                return -EINVAL;
 176        return 0;
 177}
 178
 179static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
 180                        int wait) {
 181        int present;
 182
 183        BUG_ON(!mutex_is_locked(&reading_mutex));
 184        if (rng->read)
 185                return rng->read(rng, (void *)buffer, size, wait);
 186
 187        if (rng->data_present)
 188                present = rng->data_present(rng, wait);
 189        else
 190                present = 1;
 191
 192        if (present)
 193                return rng->data_read(rng, (u32 *)buffer);
 194
 195        return 0;
 196}
 197
 198static ssize_t rng_dev_read(struct file *filp, char __user *buf,
 199                            size_t size, loff_t *offp)
 200{
 201        ssize_t ret = 0;
 202        int err = 0;
 203        int bytes_read, len;
 204        struct hwrng *rng;
 205
 206        while (size) {
 207                rng = get_current_rng();
 208                if (IS_ERR(rng)) {
 209                        err = PTR_ERR(rng);
 210                        goto out;
 211                }
 212                if (!rng) {
 213                        err = -ENODEV;
 214                        goto out;
 215                }
 216
 217                if (mutex_lock_interruptible(&reading_mutex)) {
 218                        err = -ERESTARTSYS;
 219                        goto out_put;
 220                }
 221                if (!data_avail) {
 222                        bytes_read = rng_get_data(rng, rng_buffer,
 223                                rng_buffer_size(),
 224                                !(filp->f_flags & O_NONBLOCK));
 225                        if (bytes_read < 0) {
 226                                err = bytes_read;
 227                                goto out_unlock_reading;
 228                        }
 229                        data_avail = bytes_read;
 230                }
 231
 232                if (!data_avail) {
 233                        if (filp->f_flags & O_NONBLOCK) {
 234                                err = -EAGAIN;
 235                                goto out_unlock_reading;
 236                        }
 237                } else {
 238                        len = data_avail;
 239                        if (len > size)
 240                                len = size;
 241
 242                        data_avail -= len;
 243
 244                        if (copy_to_user(buf + ret, rng_buffer + data_avail,
 245                                                                len)) {
 246                                err = -EFAULT;
 247                                goto out_unlock_reading;
 248                        }
 249
 250                        size -= len;
 251                        ret += len;
 252                }
 253
 254                mutex_unlock(&reading_mutex);
 255                put_rng(rng);
 256
 257                if (need_resched())
 258                        schedule_timeout_interruptible(1);
 259
 260                if (signal_pending(current)) {
 261                        err = -ERESTARTSYS;
 262                        goto out;
 263                }
 264        }
 265out:
 266        return ret ? : err;
 267
 268out_unlock_reading:
 269        mutex_unlock(&reading_mutex);
 270out_put:
 271        put_rng(rng);
 272        goto out;
 273}
 274
 275static const struct file_operations rng_chrdev_ops = {
 276        .owner          = THIS_MODULE,
 277        .open           = rng_dev_open,
 278        .read           = rng_dev_read,
 279        .llseek         = noop_llseek,
 280};
 281
 282static const struct attribute_group *rng_dev_groups[];
 283
 284static struct miscdevice rng_miscdev = {
 285        .minor          = HWRNG_MINOR,
 286        .name           = RNG_MODULE_NAME,
 287        .nodename       = "hwrng",
 288        .fops           = &rng_chrdev_ops,
 289        .groups         = rng_dev_groups,
 290};
 291
 292static ssize_t hwrng_attr_current_store(struct device *dev,
 293                                        struct device_attribute *attr,
 294                                        const char *buf, size_t len)
 295{
 296        int err;
 297        struct hwrng *rng;
 298
 299        err = mutex_lock_interruptible(&rng_mutex);
 300        if (err)
 301                return -ERESTARTSYS;
 302        err = -ENODEV;
 303        list_for_each_entry(rng, &rng_list, list) {
 304                if (sysfs_streq(rng->name, buf)) {
 305                        err = 0;
 306                        if (rng != current_rng)
 307                                err = set_current_rng(rng);
 308                        break;
 309                }
 310        }
 311        mutex_unlock(&rng_mutex);
 312
 313        return err ? : len;
 314}
 315
 316static ssize_t hwrng_attr_current_show(struct device *dev,
 317                                       struct device_attribute *attr,
 318                                       char *buf)
 319{
 320        ssize_t ret;
 321        struct hwrng *rng;
 322
 323        rng = get_current_rng();
 324        if (IS_ERR(rng))
 325                return PTR_ERR(rng);
 326
 327        ret = snprintf(buf, PAGE_SIZE, "%s\n", rng ? rng->name : "none");
 328        put_rng(rng);
 329
 330        return ret;
 331}
 332
 333static ssize_t hwrng_attr_available_show(struct device *dev,
 334                                         struct device_attribute *attr,
 335                                         char *buf)
 336{
 337        int err;
 338        struct hwrng *rng;
 339
 340        err = mutex_lock_interruptible(&rng_mutex);
 341        if (err)
 342                return -ERESTARTSYS;
 343        buf[0] = '\0';
 344        list_for_each_entry(rng, &rng_list, list) {
 345                strlcat(buf, rng->name, PAGE_SIZE);
 346                strlcat(buf, " ", PAGE_SIZE);
 347        }
 348        strlcat(buf, "\n", PAGE_SIZE);
 349        mutex_unlock(&rng_mutex);
 350
 351        return strlen(buf);
 352}
 353
 354static DEVICE_ATTR(rng_current, S_IRUGO | S_IWUSR,
 355                   hwrng_attr_current_show,
 356                   hwrng_attr_current_store);
 357static DEVICE_ATTR(rng_available, S_IRUGO,
 358                   hwrng_attr_available_show,
 359                   NULL);
 360
 361static struct attribute *rng_dev_attrs[] = {
 362        &dev_attr_rng_current.attr,
 363        &dev_attr_rng_available.attr,
 364        NULL
 365};
 366
 367ATTRIBUTE_GROUPS(rng_dev);
 368
 369static void __exit unregister_miscdev(void)
 370{
 371        misc_deregister(&rng_miscdev);
 372}
 373
 374static int __init register_miscdev(void)
 375{
 376        return misc_register(&rng_miscdev);
 377}
 378
 379static int hwrng_fillfn(void *unused)
 380{
 381        long rc;
 382
 383        while (!kthread_should_stop()) {
 384                struct hwrng *rng;
 385
 386                rng = get_current_rng();
 387                if (IS_ERR(rng) || !rng)
 388                        break;
 389                mutex_lock(&reading_mutex);
 390                rc = rng_get_data(rng, rng_fillbuf,
 391                                  rng_buffer_size(), 1);
 392                mutex_unlock(&reading_mutex);
 393                put_rng(rng);
 394                if (rc <= 0) {
 395                        pr_warn("hwrng: no data available\n");
 396                        msleep_interruptible(10000);
 397                        continue;
 398                }
 399                /* Outside lock, sure, but y'know: randomness. */
 400                add_hwgenerator_randomness((void *)rng_fillbuf, rc,
 401                                           rc * current_quality * 8 >> 10);
 402        }
 403        hwrng_fill = NULL;
 404        return 0;
 405}
 406
 407static void start_khwrngd(void)
 408{
 409        hwrng_fill = kthread_run(hwrng_fillfn, NULL, "hwrng");
 410        if (IS_ERR(hwrng_fill)) {
 411                pr_err("hwrng_fill thread creation failed");
 412                hwrng_fill = NULL;
 413        }
 414}
 415
 416int hwrng_register(struct hwrng *rng)
 417{
 418        int err = -EINVAL;
 419        struct hwrng *old_rng, *tmp;
 420
 421        if (!rng->name || (!rng->data_read && !rng->read))
 422                goto out;
 423
 424        mutex_lock(&rng_mutex);
 425        /* Must not register two RNGs with the same name. */
 426        err = -EEXIST;
 427        list_for_each_entry(tmp, &rng_list, list) {
 428                if (strcmp(tmp->name, rng->name) == 0)
 429                        goto out_unlock;
 430        }
 431
 432        init_completion(&rng->cleanup_done);
 433        complete(&rng->cleanup_done);
 434
 435        old_rng = current_rng;
 436        err = 0;
 437        if (!old_rng) {
 438                err = set_current_rng(rng);
 439                if (err)
 440                        goto out_unlock;
 441        }
 442        list_add_tail(&rng->list, &rng_list);
 443
 444        if (old_rng && !rng->init) {
 445                /*
 446                 * Use a new device's input to add some randomness to
 447                 * the system.  If this rng device isn't going to be
 448                 * used right away, its init function hasn't been
 449                 * called yet; so only use the randomness from devices
 450                 * that don't need an init callback.
 451                 */
 452                add_early_randomness(rng);
 453        }
 454
 455out_unlock:
 456        mutex_unlock(&rng_mutex);
 457out:
 458        return err;
 459}
 460EXPORT_SYMBOL_GPL(hwrng_register);
 461
 462void hwrng_unregister(struct hwrng *rng)
 463{
 464        mutex_lock(&rng_mutex);
 465
 466        list_del(&rng->list);
 467        if (current_rng == rng) {
 468                drop_current_rng();
 469                if (!list_empty(&rng_list)) {
 470                        struct hwrng *tail;
 471
 472                        tail = list_entry(rng_list.prev, struct hwrng, list);
 473
 474                        set_current_rng(tail);
 475                }
 476        }
 477
 478        if (list_empty(&rng_list)) {
 479                mutex_unlock(&rng_mutex);
 480                if (hwrng_fill)
 481                        kthread_stop(hwrng_fill);
 482        } else
 483                mutex_unlock(&rng_mutex);
 484
 485        wait_for_completion(&rng->cleanup_done);
 486}
 487EXPORT_SYMBOL_GPL(hwrng_unregister);
 488
 489static void devm_hwrng_release(struct device *dev, void *res)
 490{
 491        hwrng_unregister(*(struct hwrng **)res);
 492}
 493
 494static int devm_hwrng_match(struct device *dev, void *res, void *data)
 495{
 496        struct hwrng **r = res;
 497
 498        if (WARN_ON(!r || !*r))
 499                return 0;
 500
 501        return *r == data;
 502}
 503
 504int devm_hwrng_register(struct device *dev, struct hwrng *rng)
 505{
 506        struct hwrng **ptr;
 507        int error;
 508
 509        ptr = devres_alloc(devm_hwrng_release, sizeof(*ptr), GFP_KERNEL);
 510        if (!ptr)
 511                return -ENOMEM;
 512
 513        error = hwrng_register(rng);
 514        if (error) {
 515                devres_free(ptr);
 516                return error;
 517        }
 518
 519        *ptr = rng;
 520        devres_add(dev, ptr);
 521        return 0;
 522}
 523EXPORT_SYMBOL_GPL(devm_hwrng_register);
 524
 525void devm_hwrng_unregister(struct device *dev, struct hwrng *rng)
 526{
 527        devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng);
 528}
 529EXPORT_SYMBOL_GPL(devm_hwrng_unregister);
 530
 531static int __init hwrng_modinit(void)
 532{
 533        int ret = -ENOMEM;
 534
 535        /* kmalloc makes this safe for virt_to_page() in virtio_rng.c */
 536        rng_buffer = kmalloc(rng_buffer_size(), GFP_KERNEL);
 537        if (!rng_buffer)
 538                return -ENOMEM;
 539
 540        rng_fillbuf = kmalloc(rng_buffer_size(), GFP_KERNEL);
 541        if (!rng_fillbuf) {
 542                kfree(rng_buffer);
 543                return -ENOMEM;
 544        }
 545
 546        ret = register_miscdev();
 547        if (ret) {
 548                kfree(rng_fillbuf);
 549                kfree(rng_buffer);
 550        }
 551
 552        return ret;
 553}
 554
 555static void __exit hwrng_modexit(void)
 556{
 557        mutex_lock(&rng_mutex);
 558        BUG_ON(current_rng);
 559        kfree(rng_buffer);
 560        kfree(rng_fillbuf);
 561        mutex_unlock(&rng_mutex);
 562
 563        unregister_miscdev();
 564}
 565
 566module_init(hwrng_modinit);
 567module_exit(hwrng_modexit);
 568
 569MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver");
 570MODULE_LICENSE("GPL");
 571