Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1431554 > unrolled thread
| Started by | Pavel Machek <pavel@ucw.cz> |
|---|---|
| First post | 2016-06-26 20:50 +0200 |
| Last post | 2016-06-27 01:00 +0200 |
| Articles | 3 — 3 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH 5/7] random: replace non-blocking pool with a Chacha20-based CRNG Pavel Machek <pavel@ucw.cz> - 2016-06-26 20:50 +0200
Re: [PATCH 5/7] random: replace non-blocking pool with a Chacha20-based CRNG Stephan Mueller <smueller@chronox.de> - 2016-06-26 21:20 +0200
Re: [PATCH 5/7] random: replace non-blocking pool with a Chacha20-based CRNG Theodore Ts'o <tytso@mit.edu> - 2016-06-27 01:00 +0200
| From | Pavel Machek <pavel@ucw.cz> |
|---|---|
| Date | 2016-06-26 20:50 +0200 |
| Subject | Re: [PATCH 5/7] random: replace non-blocking pool with a Chacha20-based CRNG |
| Message-ID | <rOni1-6sk-5@gated-at.bofh.it> |
Hi! > Yes, I understand the argument that the networking stack is now > requiring the crypto layer --- but not all IOT devices may necessarily > require the IP stack (they might be using some alternate wireless > communications stack) and I'd much rather not make things worse. > > > The final thing is that it's not at all clear that the accelerated > implementation is all that important anyway. Consider the following > two results using the unaccelerated ChaCha20: > > % dd if=/dev/urandom bs=4M count=32 of=/dev/null > 32+0 records in > 32+0 records out > 134217728 bytes (134 MB, 128 MiB) copied, 1.18647 s, 113 MB/s > > % dd if=/dev/urandom bs=32 count=4194304 of=/dev/null > 4194304+0 records in > 4194304+0 records out > 134217728 bytes (134 MB, 128 MiB) copied, 7.08294 s, 18.9 MB/s > > So in both cases, we are reading 128M from the CRNG. In the first > case, we see the sort of speed we would get if we were using the CRNG > for some illegitimate, such as "dd if=/dev/urandom of=/dev/sdX bs=4M" > (because they were too lazy to type "apt-get install nwipe"). > > In the second case, we see the use of /dev/urandom in a much more > reasonable, proper, real-world use case for /de/urandom, which is some > userspace process needing a 256 bit session key for a TLS connection, > or some such. In this case, we see that the other overheads of > providing the anti-backtracking protection, system call overhead, > etc., completely dominate the speed of the core crypto primitive. > > So even if the AVX optimized is 100% faster than the generic version, > it would change the time needed to create a 256 byte session key from > 1.68 microseconds to 1.55 microseconds. And this is ignoring the Ok, so lets say I'm writing some TLS server, and I know that traffic is currently heavy because it was heavy in last 5 minutes. Would it make sense for me to request 128M of randomness from /dev/urandom, and then use that internally, to avoid the syscall overhead? Ok, maybe 128M is a bit much because by requesting that much in single request i'd turn urandom into PRNG, but perhaps 1MB block makes sense? And I guess even requesting 128M would make sense, as kernel can select best crypto implementation for CRNG, and I'd prefer to avoid that code in my application as it is hardware-specific... Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[toc] | [next] | [standalone]
| From | Stephan Mueller <smueller@chronox.de> |
|---|---|
| Date | 2016-06-26 21:20 +0200 |
| Subject | Re: [PATCH 5/7] random: replace non-blocking pool with a Chacha20-based CRNG |
| Message-ID | <rOnL3-6RG-13@gated-at.bofh.it> |
| In reply to | #1431554 |
Am Sonntag, 26. Juni 2016, 20:47:43 schrieb Pavel Machek: Hi Pavel, > Hi! > > > Yes, I understand the argument that the networking stack is now > > requiring the crypto layer --- but not all IOT devices may necessarily > > require the IP stack (they might be using some alternate wireless > > communications stack) and I'd much rather not make things worse. > > > > > > The final thing is that it's not at all clear that the accelerated > > implementation is all that important anyway. Consider the following > > two results using the unaccelerated ChaCha20: > > > > % dd if=/dev/urandom bs=4M count=32 of=/dev/null > > 32+0 records in > > 32+0 records out > > 134217728 bytes (134 MB, 128 MiB) copied, 1.18647 s, 113 MB/s > > > > % dd if=/dev/urandom bs=32 count=4194304 of=/dev/null > > 4194304+0 records in > > 4194304+0 records out > > 134217728 bytes (134 MB, 128 MiB) copied, 7.08294 s, 18.9 MB/s > > > > So in both cases, we are reading 128M from the CRNG. In the first > > case, we see the sort of speed we would get if we were using the CRNG > > for some illegitimate, such as "dd if=/dev/urandom of=/dev/sdX bs=4M" > > (because they were too lazy to type "apt-get install nwipe"). > > > > In the second case, we see the use of /dev/urandom in a much more > > reasonable, proper, real-world use case for /de/urandom, which is some > > userspace process needing a 256 bit session key for a TLS connection, > > or some such. In this case, we see that the other overheads of > > providing the anti-backtracking protection, system call overhead, > > etc., completely dominate the speed of the core crypto primitive. > > > > So even if the AVX optimized is 100% faster than the generic version, > > it would change the time needed to create a 256 byte session key from > > 1.68 microseconds to 1.55 microseconds. And this is ignoring the > > Ok, so lets say I'm writing some TLS server, and I know that traffic > is currently heavy because it was heavy in last 5 minutes. Would it > make sense for me to request 128M of randomness from /dev/urandom, and > then use that internally, to avoid the syscall overhead? > > Ok, maybe 128M is a bit much because by requesting that much in single > request i'd turn urandom into PRNG, but perhaps 1MB block makes sense? I would definitely say that this is appropriate when you use the data stream from urandom directly as keying material. > > And I guess even requesting 128M would make sense, as kernel can > select best crypto implementation for CRNG, and I'd prefer to avoid > that code in my application as it is hardware-specific... The code in the server should only make sure it memset(0) any of the random data immediately after use. This way even when the server dumps core, all you see is *unused* random data which does not hurt. Ciao Stephan
[toc] | [prev] | [next] | [standalone]
| From | Theodore Ts'o <tytso@mit.edu> |
|---|---|
| Date | 2016-06-27 01:00 +0200 |
| Message-ID | <rOrbX-lY-3@gated-at.bofh.it> |
| In reply to | #1431554 |
On Sun, Jun 26, 2016 at 08:47:43PM +0200, Pavel Machek wrote: > Ok, so lets say I'm writing some TLS server, and I know that traffic > is currently heavy because it was heavy in last 5 minutes. Would it > make sense for me to request 128M of randomness from /dev/urandom, and > then use that internally, to avoid the syscall overhead? Probably not. Keep in mind that even requesting a 256 bit key one at a time, it's still only taking 1.7 microseconds. The time to do the Diffie-Hellman will vary depending on whether you are doing DH in a log field or a ECC field, but whether it's around 18-20ms or 3-4ms, it's over *three* orders of magnitude more than the time it takes to generate a random session key. So trying to grab 1M of randomness and managing it in your TLS server is almost certainly optimizing for The Wrong Thing. (Not to mention the potential for disaster if that randomness gets stolen via some kind of wild pointer bug, etc., etc.) This is why I think it's a waste of time talknig about trying to use AVX or SIMD optimized version of ChaCha20. Even if the cost to do the XSAVE / XRESTORE doesn't crush the optimization of advantages of ChaCha20, and if you ignore the costs of adding backtracking defenses, etc., bloating the kernel by adding support for the crypto layer doesn't make sense when using the generic ChaCha20 already gets you down into the microsecond arena. You might be able to get the session key generation down by another .3 or .4 microseconds, but even if you cut it down by half to .9 microseconds, the public key operations and the diffie-hellman operations are going to make such savings be almost completely unnoticeable. - Ted
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web