mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Brent Cook <busterb@gmail.com>
To: musl@lists.openwall.com
Subject: Re: getrandom syscall
Date: Wed, 28 Jan 2015 14:20:16 -0600	[thread overview]
Message-ID: <3AC86046-063E-4437-9BF6-F411E7C8C6E9@gmail.com> (raw)
In-Reply-To: <20150128191746.GK4574@brightrain.aerifal.cx>


> On Jan 28, 2015, at 1:17 PM, Rich Felker <dalias@libc.org> wrote:
> 
> On Wed, Jan 28, 2015 at 11:43:17AM -0600, Brent Cook wrote:
>> Here is the wrapper in LibreSSL for getrandom, to hopefully lend to
>> the discussion:
>> 
>> https://github.com/libressl-portable/openbsd/blob/master/src/lib/libcrypto/crypto/getentropy_linux.c#L194
> 
> This version is failing to set errno when rejecting len>256, which
> looks bad.

Right, it's not actually a problem in context of the whole file.
This is just the first of several fallbacks called by getentropy.

I think that was there originally just to remind what the limit is
before it changes blocking behavior. In this context, it can also fail
with ENOSYS too, so this on function is not a standalone gententropy
emulation.

>> It tries to avoid a couple of possible issues. FIrst, while <= 256
>> byte getrandom should not interrupt, it appears that if the kernel
>> entropy pool has not been initialized yet, it would still return EINTR
>> if called early enough in the boot process. How likely this is in
>> practice, I don't know.
> 
> You mean it would block and be subject to EINTR if a signal occurs? In
> this case I would think you'd probably _want_ the EINTR to cause it to
> fail. I can imagine an early-boot program using SIGALRM to prevent
> waiting too-long/forever for entropy that's not going to arrive.

Yes, that is a better description. Failing when receiving EINTR to avoid
an infinite loop is an interesting idea, but getentropy is documented
as only failing under a very narrow range of conditions:

http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man2/getentropy.2

>> Then, to avoid modifying errno even though there was an actual
>> success, the wrapper restores the previous errno value when it
>> succeeds.
> 
> Avoiding modification of errno when the call succeeds is not necessary
> or desirable. Callers should not be assuming errno is untouched after
> success.

I think the difference here was that this is attempting to emulate a
syscall, rather than a library function, so its trying to only set
errno on failure. This was suggested to me by Theo de Raadt.

But, you're right, callers shouldn't expect either anyway.

>> I just realized that the length check in getentropy_getrandom() is
>> redundant, since it is checked earlier in getentropy() as well, but
>> hopefully this is helpful.
> 
> Indeed, that masks the issue I mentioned above.

Right, this is just one of several entropy methods that it calls in
order to perform the emulation. The outer getentropy() function is the
one that matters.

> So, their version of getentropy is aiming to provide a meaningful
> result even on systems that don't have SYS_getrandom. Should we be
> doing the same?
> 
>> If a getentropy() were added to musl libc, but in such a way that it
>> might fail on older kernels, that would cause some problems with
>> LibreSSL, and now OpenNTPD. They will both try to use getentropy()
>> with arc4random() if it is found in a system, and arc4random() will
>> treat a getentropy() failure as fatal.
> 
> Yes, this sounds bad. So what fallbacks should we implement? Do we
> need a strong CSPRNG on top of AT_RANDOM?

You can see a variety of fallbacks there, and AT_RANDOM is included,
though that is not available on every kernel either. If you're going to
implement such a CSPRNG, the C library seems the place to do it though.

  - Brent



  parent reply	other threads:[~2015-01-28 20:20 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-27 22:12 Daniel Cegiełka
2015-01-28  9:02 ` Szabolcs Nagy
2015-01-28  9:10   ` Daniel Cegiełka
2015-01-28 12:26     ` Szabolcs Nagy
2015-01-28 12:42       ` Daniel Cegiełka
2015-01-28 14:49         ` Rich Felker
2015-01-28 14:54 ` Rich Felker
2015-01-28 15:41   ` Szabolcs Nagy
2015-01-28 15:50     ` Daniel Cegiełka
2015-01-28 16:03       ` Szabolcs Nagy
2015-01-28 16:12         ` Daniel Cegiełka
2015-01-28 16:21           ` Rich Felker
2015-01-28 17:02             ` Daniel Cegiełka
2015-01-28 17:09               ` Daniel Cegiełka
2015-01-28 17:43                 ` Brent Cook
2015-01-28 18:12                   ` Daniel Cegiełka
2015-01-28 19:17                   ` Rich Felker
2015-01-28 19:33                     ` Daniel Cegiełka
2015-01-28 20:20                     ` Brent Cook [this message]
2015-01-28 22:02                       ` Rich Felker
2015-01-28 22:59                         ` Josiah Worcester
2015-02-09 20:37                         ` Andy Lutomirski
2015-01-28 16:25         ` Daniel Cegiełka
2015-01-28 16:01     ` Daniel Cegiełka
2015-01-28 15:41   ` Daniel Cegiełka

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=3AC86046-063E-4437-9BF6-F411E7C8C6E9@gmail.com \
    --to=busterb@gmail.com \
    --cc=musl@lists.openwall.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.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

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).