summaryrefslogtreecommitdiff
path: root/sys/dev/random/randomdev_soft.c
AgeCommit message (Collapse)Author
2015-06-30Huge cleanup of random(4) code.Mark Murray
* GENERAL - Update copyright. - Make kernel options for RANDOM_YARROW and RANDOM_DUMMY. Set neither to ON, which means we want Fortuna - If there is no 'device random' in the kernel, there will be NO random(4) device in the kernel, and the KERN_ARND sysctl will return nothing. With RANDOM_DUMMY there will be a random(4) that always blocks. - Repair kern.arandom (KERN_ARND sysctl). The old version went through arc4random(9) and was a bit weird. - Adjust arc4random stirring a bit - the existing code looks a little suspect. - Fix the nasty pre- and post-read overloading by providing explictit functions to do these tasks. - Redo read_random(9) so as to duplicate random(4)'s read internals. This makes it a first-class citizen rather than a hack. - Move stuff out of locked regions when it does not need to be there. - Trim RANDOM_DEBUG printfs. Some are excess to requirement, some behind boot verbose. - Use SYSINIT to sequence the startup. - Fix init/deinit sysctl stuff. - Make relevant sysctls also tunables. - Add different harvesting "styles" to allow for different requirements (direct, queue, fast). - Add harvesting of FFS atime events. This needs to be checked for weighing down the FS code. - Add harvesting of slab allocator events. This needs to be checked for weighing down the allocator code. - Fix the random(9) manpage. - Loadable modules are not present for now. These will be re-engineered when the dust settles. - Use macros for locks. - Fix comments. * src/share/man/... - Update the man pages. * src/etc/... - The startup/shutdown work is done in D2924. * src/UPDATING - Add UPDATING announcement. * src/sys/dev/random/build.sh - Add copyright. - Add libz for unit tests. * src/sys/dev/random/dummy.c - Remove; no longer needed. Functionality incorporated into randomdev.*. * live_entropy_sources.c live_entropy_sources.h - Remove; content moved. - move content to randomdev.[ch] and optimise. * src/sys/dev/random/random_adaptors.c src/sys/dev/random/random_adaptors.h - Remove; plugability is no longer used. Compile-time algorithm selection is the way to go. * src/sys/dev/random/random_harvestq.c src/sys/dev/random/random_harvestq.h - Add early (re)boot-time randomness caching. * src/sys/dev/random/randomdev_soft.c src/sys/dev/random/randomdev_soft.h - Remove; no longer needed. * src/sys/dev/random/uint128.h - Provide a fake uint128_t; if a real one ever arrived, we can use that instead. All that is needed here is N=0, N++, N==0, and some localised trickery is used to manufacture a 128-bit 0ULLL. * src/sys/dev/random/unit_test.c src/sys/dev/random/unit_test.h - Improve unit tests; previously the testing human needed clairvoyance; now the test will do a basic check of compressibility. Clairvoyant talent is still a good idea. - This is still a long way off a proper unit test. * src/sys/dev/random/fortuna.c src/sys/dev/random/fortuna.h - Improve messy union to just uint128_t. - Remove unneeded 'static struct fortuna_start_cache'. - Tighten up up arithmetic. - Provide a method to allow eternal junk to be introduced; harden it against blatant by compress/hashing. - Assert that locks are held correctly. - Fix the nasty pre- and post-read overloading by providing explictit functions to do these tasks. - Turn into self-sufficient module (no longer requires randomdev_soft.[ch]) * src/sys/dev/random/yarrow.c src/sys/dev/random/yarrow.h - Improve messy union to just uint128_t. - Remove unneeded 'staic struct start_cache'. - Tighten up up arithmetic. - Provide a method to allow eternal junk to be introduced; harden it against blatant by compress/hashing. - Assert that locks are held correctly. - Fix the nasty pre- and post-read overloading by providing explictit functions to do these tasks. - Turn into self-sufficient module (no longer requires randomdev_soft.[ch]) - Fix some magic numbers elsewhere used as FAST and SLOW. Differential Revision: https://reviews.freebsd.org/D2025 Reviewed by: vsevolod,delphij,rwatson,trasz,jmg Approved by: so (delphij) Notes: svn path=/head/; revision=284959
2014-11-07Fix random.ko module.Konstantin Belousov
- Remove duplicated sources between standard part of the kernel and module. In particular, it caused duplicated lock initialization and sysctl registration, both having bad consequences. - Add missed source files to module. - Static part of the kernel provides randomdev module, not random_adaptors. Correct dependencies. - Use cdev modules declaration macros. Approved by: secteam (delphij) Reviewed by: markm Notes: svn path=/head/; revision=274252
2014-10-30This is the much-discussed major upgrade to the random(4) device, known to ↵Mark Murray
you all as /dev/random. This code has had an extensive rewrite and a good series of reviews, both by the author and other parties. This means a lot of code has been simplified. Pluggable structures for high-rate entropy generators are available, and it is most definitely not the case that /dev/random can be driven by only a hardware souce any more. This has been designed out of the device. Hardware sources are stirred into the CSPRNG (Yarrow, Fortuna) like any other entropy source. Pluggable modules may be written by third parties for additional sources. The harvesting structures and consequently the locking have been simplified. Entropy harvesting is done in a more general way (the documentation for this will follow). There is some GREAT entropy to be had in the UMA allocator, but it is disabled for now as messing with that is likely to annoy many people. The venerable (but effective) Yarrow algorithm, which is no longer supported by its authors now has an alternative, Fortuna. For now, Yarrow is retained as the default algorithm, but this may be changed using a kernel option. It is intended to make Fortuna the default algorithm for 11.0. Interested parties are encouraged to read ISBN 978-0-470-47424-2 "Cryptography Engineering" By Ferguson, Schneier and Kohno for Fortuna's gory details. Heck, read it anyway. Many thanks to Arthur Mesh who did early grunt work, and who got caught in the crossfire rather more than he deserved to. My thanks also to folks who helped me thresh this out on whiteboards and in the odd "Hallway track", or otherwise. My Nomex pants are on. Let the feedback commence! Reviewed by: trasz,des(partial),imp(partial?),rwatson(partial?) Approved by: so(des) Notes: svn path=/head/; revision=273872
2013-10-12Fix a problem where the priority order of yarrow,dummy can get reversedMark Murray
to dummy,yarrow and break the usability of /dev/random. Fix the name of the tunable to something logical that 'sysctl kern.random' emits. Submitted by: des@ (the idea, code by me) Notes: svn path=/projects/random_number_generator/; revision=256399
2013-10-09Add a RANDOM_RWFILE option and hide the entropy cache code behind it.Dag-Erling Smørgrav
Rename YARROW_RNG and FORTUNA_RNG to RANDOM_YARROW and RANDOM_FORTUNA. Add the RANDOM_* options to LINT. Notes: svn path=/projects/random_number_generator/; revision=256240
2013-10-08Add YARROW_RNG and FORTUNA_RNG to sys/conf/options.Dag-Erling Smørgrav
Add a SYSINIT that forces a reseed during proc0 setup, which happens fairly late in the boot process. Add a RANDOM_DEBUG option which enables some debugging printf()s. Add a new RANDOM_ATTACH entropy source which harvests entropy from the get_cyclecount() delta across each call to a device attach method. Notes: svn path=/projects/random_number_generator/; revision=256138
2013-10-06Snapshot.Mark Murray
Looking pretty good; this mostly works now. New code includes: * Read cached entropy at startup, both from files and from loader(8) preloaded entropy. Failures are soft, but announced. Untested. * Use EVENTHANDLER to do above just before we go multiuser. Untested. Notes: svn path=/projects/random_number_generator/; revision=256094
2013-10-06SNAPSHOT.Mark Murray
Simplify the malloc pools; We only need one for this device. Simplify the harvest queue. Marginally improve the entropy pool hashing, making it a bit faster in the process. Connect up the hardware "live" source harvesting. This is simplistic for now, and will need to be made rate-adaptive. All of the above passes a compile test but needs to be debugged. Notes: svn path=/projects/random_number_generator/; revision=256081
2013-10-04Snapshot. This passes the build test, but has not yet been finished or debugged.Mark Murray
Contains: * Refactor the hardware RNG CPU instruction sources to feed into the software mixer. This is unfinished. The actual harvesting needs to be sorted out. Modified by me (see below). * Remove 'frac' parameter from random_harvest(). This was never used and adds extra code for no good reason. * Remove device write entropy harvesting. This provided a weak attack vector, was not very good at bootstrapping the device. To follow will be a replacement explicit reseed knob. * Separate out all the RANDOM_PURE sources into separate harvest entities. This adds some secuity in the case where more than one is present. * Review all the code and fix anything obviously messy or inconsistent. Address som review concerns while I'm here, like rename the pseudo-rng to 'dummy'. Submitted by: Arthur Mesh <arthurmesh@gmail.com> (the first item) Notes: svn path=/projects/random_number_generator/; revision=256042
2013-09-07Fix the build; Certain linkable symbols need to always be present.Mark Murray
Pass the pointy hat please. Also unblock the software (Yarrow) generator for now. This will be reverted; Yarrow needs to block until secure, not this behaviour of serving as soon as asked. Folks with specific requiremnts will be able to (can!) unblock this device with any write, and are encouraged to do so in /etc/rc.d/* scripting. ("Any" in this case could be "echo '' > /dev/random" as root). Notes: svn path=/head/; revision=255379
2013-08-30Separate out the Software RNG entropy harvesting queue and thread into its ↵Mark Murray
own files. Submitted by: Arthur Mesh <arthurmesh@gmail.com> Notes: svn path=/projects/random_number_generator/; revision=255071
2013-08-26Remove the short-lived namei experiment.Mark Murray
Notes: svn path=/projects/random_number_generator/; revision=254934
2013-08-26Snapshot of current work;Mark Murray
1) Clean up namespace; only use "Yarrow" where it is Yarrow-specific or close enough to the Yarrow algorithm. For the rest use a neutral name. 2) Tidy up headers; put private stuff in private places. More could be done here. 3) Streamline the hashing/encryption; no need for a 256-bit counter; 128 bits will last for long enough. There are bits of debug code lying around; these will be removed at a later stage. Notes: svn path=/projects/random_number_generator/; revision=254927
2013-08-09* Add random_adaptors.[ch] which is basically a store of random_adaptor's.David E. O'Brien
random_adaptor is basically an adapter that plugs in to random(4). random_adaptor can only be plugged in to random(4) very early in bootup. Unplugging random_adaptor from random(4) is not supported, and is probably a bad idea anyway, due to potential loss of entropy pools. We currently have 3 random_adaptors: + yarrow + rdrand (ivy.c) + nehemeiah * Remove platform dependent logic from probe.c, and move it into corresponding registration routines of each random_adaptor provider. probe.c doesn't do anything other than picking a specific random_adaptor from a list of registered ones. * If the kernel doesn't have any random_adaptor adapters present then the creation of /dev/random is postponed until next random_adaptor is kldload'ed. * Fix randomdev_soft.c to refer to its own random_adaptor, instead of a system wide one. Submitted by: arthurmesh@gmail.com, obrien Obtained from: Juniper Networks Reviewed by: so (des) Notes: svn path=/head/; revision=254147
2013-07-31Back out r253779 & r253786.David E. O'Brien
Notes: svn path=/head/; revision=253845
2013-07-29Decouple yarrow from random(4) device.David E. O'Brien
* Make Yarrow an optional kernel component -- enabled by "YARROW_RNG" option. The files sha2.c, hash.c, randomdev_soft.c and yarrow.c comprise yarrow. * random(4) device doesn't really depend on rijndael-*. Yarrow, however, does. * Add random_adaptors.[ch] which is basically a store of random_adaptor's. random_adaptor is basically an adapter that plugs in to random(4). random_adaptor can only be plugged in to random(4) very early in bootup. Unplugging random_adaptor from random(4) is not supported, and is probably a bad idea anyway, due to potential loss of entropy pools. We currently have 3 random_adaptors: + yarrow + rdrand (ivy.c) + nehemeiah * Remove platform dependent logic from probe.c, and move it into corresponding registration routines of each random_adaptor provider. probe.c doesn't do anything other than picking a specific random_adaptor from a list of registered ones. * If the kernel doesn't have any random_adaptor adapters present then the creation of /dev/random is postponed until next random_adaptor is kldload'ed. * Fix randomdev_soft.c to refer to its own random_adaptor, instead of a system wide one. Submitted by: arthurmesh@gmail.com, obrien Obtained from: Juniper Networks Reviewed by: obrien Notes: svn path=/head/; revision=253779
2013-07-09Refactor random_systat to be a *random_systat. This avoids unnecessaryDavid E. O'Brien
structure copying in random_ident_hardware(). This change will also help further modularization of random(4) subsystem. Submitted by: arthurmesh@gmail.com Reviewed by: obrien Obtained from: Juniper Networks Notes: svn path=/head/; revision=253122
2013-04-19Attempt to mitigate poor initialization of arc4 by one-shotAndrey A. Chernov
reinitialization from yarrow right after good entropy is harvested. Approved by: secteam (delphij) MFC after: 1 week Notes: svn path=/head/; revision=249631
2013-03-04MFcalloutng (r236314 by mav):Davide Italiano
Specify that wakeup rate of 7.5-10Hz is enough for yarrow harvesting thread. Sponsored by: Google Summer of Code 2012, iXsystems inc. Tested by: flo, marius, ian, markj, Fabian Keil Notes: svn path=/head/; revision=247799
2013-02-26Correct a typo introduced in r153575, which gives inverted logic whenXin LI
handling blocking semantics when seeding. PR: kern/143298 Submitted by: James Juran <james juran baesystems com> Reviewed by: markm MFC after: 3 days Notes: svn path=/head/; revision=247334
2011-02-21Fix typos - remove duplicate "the".Rebecca Cran
PR: bin/154928 Submitted by: Eitan Adler <lists at eitanadler.com> MFC after: 3 days Notes: svn path=/head/; revision=218909
2009-05-25There is rubbish hereMark Murray
It is time to take it out Now it is cleaner Notes: svn path=/head/; revision=192774
2008-11-24Make sure arc4random(9) is properly seeded when /etc/rc.d/initrandom returns.Colin Percival
Approved by: so (cperciva) Approved by: re (kensmith) Security: FreeBSD-SA-08:11.arc4random Notes: svn path=/head/; revision=185254
2007-10-20Rename the kthread_xxx (e.g. kthread_create()) callsJulian Elischer
to kproc_xxx as they actually make whole processes. Thos makes way for us to add REAL kthread_create() and friends that actually make theads. it turns out that most of these calls actually end up being moved back to the thread version when it's added. but we need to make this cosmetic change first. I'd LOVE to do this rename in 7.0 so that we can eventually MFC the new kthread_xxx() calls. Notes: svn path=/head/; revision=172836
2007-05-28Don't save SYSCTL_ADD_*() results in a local variable just to throw themRobert Watson
away; preserve the ones that are needed for further calls in the init function and ignore the rest entirely. Found with: Coverity Prevent(tm) CID: 563 Notes: svn path=/head/; revision=170067
2007-02-27Use pause() rather than tsleep() on stack variables and function pointers.John Baldwin
Notes: svn path=/head/; revision=167086
2006-04-17Change msleep() and tsleep() to not alter the calling thread's priorityJohn Baldwin
if the specified priority is zero. This avoids a race where the calling thread could read a snapshot of it's current priority, then a different thread could change the first thread's priority, then the original thread would call sched_prio() inside msleep() undoing the change made by the second thread. I used a priority of zero as no thread that calls msleep() or tsleep() should be specifying a priority of zero anyway. The various places that passed 'curthread->td_priority' or some variant as the priority now pass 0. Notes: svn path=/head/; revision=157815
2005-12-20Remove GIANT from device random.Paul Saab
Submitted by: ups Notes: svn path=/head/; revision=153575
2005-03-29Revert to the more correct array size, and correct a KASSERT toMark Murray
only allow proper values. ENTROPYSOURCE is a maxval+1, not an allowable number. Suggested loose protons in the solution: phk Prefers to keep the pH close to seven: markm Notes: svn path=/head/; revision=144291
2005-03-18Fix off-by-one (too little!) array size problem.Poul-Henning Kamp
Detected by: Coverity (ID#661) Notes: svn path=/head/; revision=143793
2004-12-22Check O_NONBLOCK not IO_NDELAY.Poul-Henning Kamp
Don't include vnode.h Notes: svn path=/head/; revision=139194
2004-11-05Don't change the priority to PUSER when sleeping, just keep the currentJohn Baldwin
priority. Notes: svn path=/head/; revision=137276
2004-11-03(1) Move from O(n) list copies to O(1) list concatenation, which isRobert Watson
supported for STAILQ via STAILQ_CONCAT(). (2) Maintain a count of the number of entries in the thread-local entropy fifo so that we can keep the other fifo counts in synch. MFC after: 3 weeks MFC with: randomdev_soft.c revisions 1.5 and 1.6 Suggested by: jhb (1) Notes: svn path=/head/; revision=137152
2004-10-12Assert that the entropy source category provided by a caller submittingRobert Watson
entropy is valid, as an invalid source will cause dereferencing of an array of queues to an incorrect memory location. Notes: svn path=/head/; revision=136434
2004-10-09Modify entropy harvesting locking strategy:Robert Watson
- Trade off granularity to reduce overhead, since the current model doesn't appear to reduce contention substantially: move to a single harvest mutex protecting harvesting queues, rather than one mutex per source plus a mutex for the free list. - Reduce mutex operations in a harvesting event to 2 from 4, and maintain lockless read to avoid mutex operations if the queue is full. - When reaping harvested entries from the queue, move all entries from the queue at once, and when done with them, insert them all into a thread-local queue for processing; then insert them all into the empty fifo at once. This reduces O(4n) mutex operations to O(2) mutex operations per wakeup. In the future, we may want to look at re-introducing granularity, although perhaps at the granularity of the source rather than the source class; both the new and old strategies would cause contention between different instances of the same source (i.e., multiple network interfaces). Reviewed by: markm Notes: svn path=/head/; revision=136338
2004-08-11Perform a lockless read to test whether an entropy havesting fifo isRobert Watson
full, avoiding the cost of mutex operations if it is. We re-test once the mutex is acquired to make sure it's still true before doing the -modify-write part of the read-modify-write. Note that due to the maximum fifo depth being pretty deep, this is unlikely to improve harvesting performance yet. Approved by: markm Notes: svn path=/head/; revision=133465
2004-07-18Start the entropy device insecure/unblocked. I'll be handing overMark Murray
responsibility for critical randomness requirements (like sshd) to rc.d/* Requested by: many Notes: svn path=/head/; revision=132346
2004-04-16Default to harvesting everything. This is to help give a fasterMark Murray
startup. harvesting can be turned OFF in etc/rc.d/* if it is a burden. Notes: svn path=/head/; revision=128320
2004-04-09Reorganise the entropy device so that high-yield entropy sourcesMark Murray
can more easily be used INSTEAD OF the hard-working Yarrow. The only hardware source used at this point is the one inside the VIA C3 Nehemiah (Stepping 3 and above) CPU. More sources will be added in due course. Contributions welcome! Notes: svn path=/head/; revision=128059