History log of /src/sys/dist/pf/netinet/tcp_rndiss.c |
Revision | | Date | Author | Comments |
1.4 |
| 17-Dec-2011 |
tls | Separate /dev/random pseudodevice implemenation from kernel entropy pool implementation. Rewrite pseudodevice code to use cprng_strong(9).
The new pseudodevice is cloning, so each caller gets bits from a stream generated with its own key. Users of /dev/urandom get their generators keyed on a "best effort" basis -- the kernel will rekey generators whenever the entropy pool hits the high water mark -- while users of /dev/random get their generators rekeyed every time key-length bits are output.
The underlying cprng_strong API can use AES-256 or AES-128, but we use AES-128 because of concerns about related-key attacks on AES-256. This improves performance (and reduces entropy pool depletion) significantly for users of /dev/urandom but does cause users of /dev/random to rekey twice as often.
Also fixes various bugs (including some missing locking and a reseed-counter overflow in the CTR_DRBG code) found while testing this.
For long reads, this generator is approximately 20 times as fast as the old generator (dd with bs=64K yields 53MB/sec on 2Ghz Core2 instead of 2.5MB/sec) and also uses a separate mutex per instance so concurrency is greatly improved. For reads of typical key sizes for modern cryptosystems (16-32 bytes) performance is about the same as the old code: a little better for 32 bytes, a little worse for 16 bytes.
|
1.3 |
| 19-Nov-2011 |
tls | branches: 1.3.2; First step of random number subsystem rework described in <20111022023242.BA26F14A158@mail.netbsd.org>. This change includes the following:
An initial cleanup and minor reorganization of the entropy pool code in sys/dev/rnd.c and sys/dev/rndpool.c. Several bugs are fixed. Some effort is made to accumulate entropy more quickly at boot time.
A generic interface, "rndsink", is added, for stream generators to request that they be re-keyed with good quality entropy from the pool as soon as it is available.
The arc4random()/arc4randbytes() implementation in libkern is adjusted to use the rndsink interface for rekeying, which helps address the problem of low-quality keys at boot time.
An implementation of the FIPS 140-2 statistical tests for random number generator quality is provided (libkern/rngtest.c). This is based on Greg Rose's implementation from Qualcomm.
A new random stream generator, nist_ctr_drbg, is provided. It is based on an implementation of the NIST SP800-90 CTR_DRBG by Henric Jungheim. This generator users AES in a modified counter mode to generate a backtracking-resistant random stream.
An abstraction layer, "cprng", is provided for in-kernel consumers of randomness. The arc4random/arc4randbytes API is deprecated for in-kernel use. It is replaced by "cprng_strong". The current cprng_fast implementation wraps the existing arc4random implementation. The current cprng_strong implementation wraps the new CTR_DRBG implementation. Both interfaces are rekeyed from the entropy pool automatically at intervals justifiable from best current cryptographic practice.
In some quick tests, cprng_fast() is about the same speed as the old arc4randbytes(), and cprng_strong() is about 20% faster than rnd_extract_data(). Performance is expected to improve.
The AES code in src/crypto/rijndael is no longer an optional kernel component, as it is required by cprng_strong, which is not an optional kernel component.
The entropy pool output is subjected to the rngtest tests at startup time; if it fails, the system will reboot. There is approximately a 3/10000 chance of a false positive from these tests. Entropy pool _input_ from hardware random numbers is subjected to the rngtest tests at attach time, as well as the FIPS continuous-output test, to detect bad or stuck hardware RNGs; if any are detected, they are detached, but the system continues to run.
A problem with rndctl(8) is fixed -- datastructures with pointers in arrays are no longer passed to userspace (this was not a security problem, but rather a major issue for compat32). A new kernel will require a new rndctl.
The sysctl kern.arandom() and kern.urandom() nodes are hooked up to the new generators, but the /dev/*random pseudodevices are not, yet.
Manual pages for the new kernel interfaces are forthcoming.
|
1.2 |
| 18-Jun-2008 |
yamt | branches: 1.2.2; 1.2.4; 1.2.34; merge yamt-pf42 branch. (import newer pf from OpenBSD 4.2)
ok'ed by peter@. requested by core@
|
1.1 |
| 19-Apr-2008 |
yamt | branches: 1.1.1; 1.1.2; 1.1.4; 1.1.6; file tcp_rndiss.c was initially added on branch yamt-pf42.
|
1.1.6.1 |
| 18-Jun-2008 |
simonb | Sync with head.
|
1.1.4.1 |
| 04-May-2009 |
yamt | sync with head.
|
1.1.2.1 |
| 19-Apr-2008 |
yamt | Peter Postma's work-in-progress pf import from OpenBSD 4.2. updated to -current by me.
|
1.1.1.1 |
| 01-Dec-2009 |
martti | Import PF from OpenBSD 4.2
|
1.2.34.1 |
| 17-Apr-2012 |
yamt | sync with head
|
1.2.4.2 |
| 29-Jun-2008 |
mjf | Sync with HEAD.
|
1.2.4.1 |
| 18-Jun-2008 |
mjf | file tcp_rndiss.c was added on branch mjf-devfs2 on 2008-06-29 09:33:12 +0000
|
1.2.2.2 |
| 24-Jun-2008 |
wrstuden | Add two files missed in previous sync with head.
|
1.2.2.1 |
| 18-Jun-2008 |
wrstuden | file tcp_rndiss.c was added on branch wrstuden-revivesa on 2008-06-24 05:01:07 +0000
|
1.3.2.1 |
| 18-Feb-2012 |
mrg | merge to -current.
|