From: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>
To: "Jason A. Donenfeld" <Jason@zx2c4.com>, libc-alpha@sourceware.org
Cc: "Florian Weimer" <fweimer@redhat.com>,
"Cristian Rodríguez" <crrodriguez@opensuse.org>,
"Paul Eggert" <eggert@cs.ucla.edu>,
"Mark Harris" <mark.hsj@gmail.com>,
"Eric Biggers" <ebiggers@kernel.org>,
linux-crypto@vger.kernel.org
Subject: Re: [PATCH v6] arc4random: simplify design for better safety
Date: Tue, 26 Jul 2022 17:56:21 -0300 [thread overview]
Message-ID: <9101f76a-c5d4-4101-0583-d942fb247b72@linaro.org> (raw)
In-Reply-To: <bb9b0cad-5b7a-e215-a9d2-ca8bcf664318@linaro.org>
On 26/07/22 17:17, Adhemerval Zanella Netto wrote:
>
>
> On 26/07/22 16:58, Jason A. Donenfeld wrote:
>> Rather than buffering 16 MiB of entropy in userspace (by way of
>> chacha20), simply call getrandom() every time.
>>
>> This approach is doubtlessly slower, for now, but trying to prematurely
>> optimize arc4random appears to be leading toward all sorts of nasty
>> properties and gotchas. Instead, this patch takes a much more
>> conservative approach. The interface is added as a basic loop wrapper
>> around getrandom(), and then later, the kernel and libc together can
>> work together on optimizing that.
>>
>> This prevents numerous issues in which userspace is unaware of when it
>> really must throw away its buffer, since we avoid buffering all
>> together. Future improvements may include userspace learning more from
>> the kernel about when to do that, which might make these sorts of
>> chacha20-based optimizations more possible. The current heuristic of 16
>> MiB is meaningless garbage that doesn't correspond to anything the
>> kernel might know about. So for now, let's just do something
>> conservative that we know is correct and won't lead to cryptographic
>> issues for users of this function.
>>
>> This patch might be considered along the lines of, "optimization is the
>> root of all evil," in that the much more complex implementation it
>> replaces moves too fast without considering security implications,
>> whereas the incremental approach done here is a much safer way of going
>> about things. Once this lands, we can take our time in optimizing this
>> properly using new interplay between the kernel and userspace.
>>
>> getrandom(0) is used, since that's the one that ensures the bytes
>> returned are cryptographically secure. But on systems without it, we
>> fallback to using /dev/urandom. This is unfortunate because it means
>> opening a file descriptor, but there's not much of a choice. Secondly,
>> as part of the fallback, in order to get more or less the same
>> properties of getrandom(0), we poll on /dev/random, and if the poll
>> succeeds at least once, then we assume the RNG is initialized. This is a
>> rough approximation, as the ancient "non-blocking pool" initialized
>> after the "blocking pool", not before, and it may not port back to all
>> ancient kernels, though it does to all kernels supported by glibc
>> (≥3.2), so generally it's the best approximation we can do.
>>
>> The motivation for including arc4random, in the first place, is to have
>> source-level compatibility with existing code. That means this patch
>> doesn't attempt to litigate the interface itself. It does, however,
>> choose a conservative approach for implementing it.
>
> LGTM, I agree this is safe solution for 2.36, we can optimize it later
> if is were the case.
>
> I will run some tests and push it upstream.
>
> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
And I think we will need to tune down stdlib/tst-arc4random-thread internal
parameters because it now takes about 1 minute on my testing machine (which
is somewhat recent processor). I will send a patch to adjust the maximum
number of threads depending of the configured system CPU (to avoid syscall
contention).
next prev parent reply other threads:[~2022-07-26 20:56 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-23 16:22 arc4random - are you sure we want these? Jason A. Donenfeld
2022-07-23 16:25 ` Jason A. Donenfeld
2022-07-23 17:18 ` Paul Eggert
2022-07-24 23:55 ` Jason A. Donenfeld
2022-07-25 20:31 ` Paul Eggert
2022-07-23 17:39 ` Adhemerval Zanella Netto
2022-07-23 22:54 ` Jason A. Donenfeld
2022-07-25 15:33 ` Rich Felker
2022-07-25 15:59 ` Adhemerval Zanella Netto
2022-07-25 16:18 ` Sandy Harris
2022-07-25 16:40 ` Florian Weimer
2022-07-25 16:51 ` Jason A. Donenfeld
2022-07-25 17:44 ` Rich Felker
2022-07-25 18:33 ` Cristian Rodríguez
2022-07-25 18:49 ` Rich Felker
2022-07-25 18:49 ` Rich Felker
[not found] ` <YuCa1lDqoxdnZut/@mit.edu>
[not found] ` <a5b6307d-6811-61b6-c13d-febaa6ad1e48@linaro.org>
[not found] ` <YuEwR0bJhOvRtmFe@mit.edu>
2022-07-27 12:49 ` Florian Weimer
2022-07-27 20:15 ` Theodore Ts'o
2022-07-27 21:59 ` Rich Felker
2022-07-28 0:30 ` Theodore Ts'o
2022-07-28 0:39 ` Cristian Rodríguez
2022-07-23 19:04 ` Cristian Rodríguez
2022-07-23 22:59 ` Jason A. Donenfeld
2022-07-24 16:23 ` Cristian Rodríguez
2022-07-24 21:57 ` Jason A. Donenfeld
2022-07-25 10:14 ` Florian Weimer
2022-07-25 10:11 ` Florian Weimer
2022-07-25 11:04 ` Jason A. Donenfeld
2022-07-25 12:39 ` Florian Weimer
2022-07-25 13:43 ` Jason A. Donenfeld
2022-07-25 13:58 ` Cristian Rodríguez
2022-07-25 16:06 ` Rich Felker
2022-07-25 16:43 ` Florian Weimer
2022-07-26 14:27 ` Overwrittting AT_RANDOM after use (was Re: arc4random - are you sure we want these?) Yann Droneaud
2022-07-26 14:35 ` arc4random - are you sure we want these? Yann Droneaud
2022-07-25 13:25 ` Jeffrey Walton
2022-07-25 13:48 ` Jason A. Donenfeld
2022-07-25 14:56 ` Rich Felker
2022-07-25 22:57 ` [PATCH] arc4random: simplify design for better safety Jason A. Donenfeld
2022-07-25 23:11 ` Jason A. Donenfeld
2022-07-25 23:28 ` [PATCH v2] " Jason A. Donenfeld
2022-07-25 23:59 ` Eric Biggers
2022-07-26 10:26 ` Jason A. Donenfeld
2022-07-26 1:10 ` Mark Harris
2022-07-26 10:41 ` Jason A. Donenfeld
2022-07-26 11:06 ` Florian Weimer
2022-07-26 16:51 ` Mark Harris
2022-07-26 18:42 ` Jason A. Donenfeld
2022-07-26 19:24 ` Jason A. Donenfeld
2022-07-26 9:55 ` Florian Weimer
2022-07-26 11:04 ` Jason A. Donenfeld
2022-07-26 11:07 ` [PATCH v3] " Jason A. Donenfeld
2022-07-26 11:11 ` Jason A. Donenfeld
2022-07-26 11:12 ` [PATCH v2] " Florian Weimer
2022-07-26 11:20 ` Jason A. Donenfeld
2022-07-26 11:35 ` Adhemerval Zanella Netto
2022-07-26 11:33 ` Adhemerval Zanella Netto
2022-07-26 11:54 ` Jason A. Donenfeld
2022-07-26 12:08 ` Jason A. Donenfeld
2022-07-26 12:20 ` Jason A. Donenfeld
2022-07-26 12:34 ` Adhemerval Zanella Netto
2022-07-26 12:47 ` Jason A. Donenfeld
2022-07-26 13:11 ` Adhemerval Zanella Netto
2022-07-26 13:30 ` [PATCH v4] " Jason A. Donenfeld
2022-07-26 15:21 ` Yann Droneaud
2022-07-26 16:20 ` Adhemerval Zanella Netto
2022-07-26 18:36 ` Jason A. Donenfeld
2022-07-26 19:08 ` [PATCH v5] " Jason A. Donenfeld
2022-07-26 19:58 ` [PATCH v6] " Jason A. Donenfeld
2022-07-26 20:17 ` Adhemerval Zanella Netto
2022-07-26 20:56 ` Adhemerval Zanella Netto [this message]
2022-07-28 10:29 ` Szabolcs Nagy
2022-07-28 10:36 ` Szabolcs Nagy
2022-07-28 11:01 ` Adhemerval Zanella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9101f76a-c5d4-4101-0583-d942fb247b72@linaro.org \
--to=adhemerval.zanella@linaro.org \
--cc=Jason@zx2c4.com \
--cc=crrodriguez@opensuse.org \
--cc=ebiggers@kernel.org \
--cc=eggert@cs.ucla.edu \
--cc=fweimer@redhat.com \
--cc=libc-alpha@sourceware.org \
--cc=linux-crypto@vger.kernel.org \
--cc=mark.hsj@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).