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