| Hardware driver for Intel i810 Random Number Generator (RNG) |
| Copyright 2000,2001 Jeff Garzik <jgarzik@mandrakesoft.com> |
| Copyright 2000,2001 Philipp Rumpf <prumpf@mandrakesoft.com> |
| |
| Introduction: |
| |
| The i810_rng device driver is software that makes use of a |
| special hardware feature on the Intel i8xx-based chipsets, |
| a Random Number Generator (RNG). |
| |
| In order to make effective use of this device driver, you |
| should download the support software as well. Download the |
| latest version of the "intel-rng-tools" package from the |
| i810_rng driver's official Web site: |
| |
| http://sourceforge.net/projects/gkernel/ |
| |
| About the Intel RNG hardware, from the firmware hub datasheet: |
| |
| The Firmware Hub integrates a Random Number Generator (RNG) |
| using thermal noise generated from inherently random quantum |
| mechanical properties of silicon. When not generating new random |
| bits the RNG circuitry will enter a low power state. Intel will |
| provide a binary software driver to give third party software |
| access to our RNG for use as a security feature. At this time, |
| the RNG is only to be used with a system in an OS-present state. |
| |
| Theory of operation: |
| |
| Character driver. Using the standard open() |
| and read() system calls, you can read random data from |
| the i810 RNG device. This data is NOT CHECKED by any |
| fitness tests, and could potentially be bogus (if the |
| hardware is faulty or has been tampered with). Data is only |
| output if the hardware "has-data" flag is set, but nevertheless |
| a security-conscious person would run fitness tests on the |
| data before assuming it is truly random. |
| |
| /dev/intel_rng is char device major 10, minor 183. |
| |
| Driver notes: |
| |
| * FIXME: support poll(2) |
| |
| NOTE: request_mem_region was removed, for two reasons: |
| 1) Only one RNG is supported by this driver, 2) The location |
| used by the RNG is a fixed location in MMIO-addressable memory, |
| 3) users with properly working BIOS e820 handling will always |
| have the region in which the RNG is located reserved, so |
| request_mem_region calls always fail for proper setups. |
| However, for people who use mem=XX, BIOS e820 information is |
| -not- in /proc/iomem, and request_mem_region(RNG_ADDR) can |
| succeed. |
| |
| Driver details: |
| |
| Based on: |
| Intel 82802AB/82802AC Firmware Hub (FWH) Datasheet |
| May 1999 Order Number: 290658-002 R |
| |
| Intel 82802 Firmware Hub: Random Number Generator |
| Programmer's Reference Manual |
| December 1999 Order Number: 298029-001 R |
| |
| Intel 82802 Firmware HUB Random Number Generator Driver |
| Copyright (c) 2000 Matt Sottek <msottek@quiknet.com> |
| |
| Special thanks to Matt Sottek. I did the "guts", he |
| did the "brains" and all the testing. |
| |
| Change history: |
| |
| Version 0.9.8: |
| * Support other i8xx chipsets by adding 82801E detection |
| |
| Version 0.9.7: |
| * Support other i8xx chipsets too (by adding 82801BA(M) and |
| 82801CA(M) detection) |
| |
| Version 0.9.6: |
| * Internal driver cleanups, prep for 1.0.0 release. |
| |
| Version 0.9.5: |
| * Rip out entropy injection via timer. It never ever worked, |
| and a better solution (rngd) is now available. |
| |
| Version 0.9.4: |
| * Fix: Remove request_mem_region |
| * Fix: Horrible bugs in FIPS calculation and test execution |
| |
| Version 0.9.3: |
| * Clean up rng_read a bit. |
| * Update i810_rng driver Web site URL. |
| * Increase default timer interval to 4 samples per second. |
| * Abort if mem region is not available. |
| * BSS zero-initialization cleanup. |
| * Call misc_register() from rng_init_one. |
| * Fix O_NONBLOCK to occur before we schedule. |
| |
| Version 0.9.2: |
| * Simplify open blocking logic |
| |
| Version 0.9.1: |
| * Support i815 chipsets too (Matt Sottek) |
| * Fix reference counting when statically compiled (prumpf) |
| * Rewrite rng_dev_read (prumpf) |
| * Make module races less likely (prumpf) |
| * Small miscellaneous bug fixes (prumpf) |
| * Use pci table for PCI id list |
| |
| Version 0.9.0: |
| * Don't register a pci_driver, because we are really |
| using PCI bridge vendor/device ids, and someone |
| may want to register a driver for the bridge. (bug fix) |
| * Don't let the usage count go negative (bug fix) |
| * Clean up spinlocks (bug fix) |
| * Enable PCI device, if necessary (bug fix) |
| * iounmap on module unload (bug fix) |
| * If RNG chrdev is already in use when open(2) is called, |
| sleep until it is available. |
| * Remove redundant globals rng_allocated, rng_use_count |
| * Convert numeric globals to unsigned |
| * Module unload cleanup |
| |
| Version 0.6.2: |
| * Clean up spinlocks. Since we don't have any interrupts |
| to worry about, but we do have a timer to worry about, |
| we use spin_lock_bh everywhere except the timer function |
| itself. |
| * Fix module load/unload. |
| * Fix timer function and h/w enable/disable logic |
| * New timer interval sysctl |
| * Clean up sysctl names |