All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] getrandom.2: clarification of open questions
@ 2015-01-27 21:27 Heinrich Schuchardt
       [not found] ` <1422394068-10106-1-git-send-email-xypron.glpk-Mmb7MZpHnFY@public.gmane.org>
  0 siblings, 1 reply; 2+ messages in thread
From: Heinrich Schuchardt @ 2015-01-27 21:27 UTC (permalink / raw)
  To: Michael Kerrisk (man-pages)
  Cc: Theodore Ts'o, linux-man, Heinrich Schuchardt

With his last patches for getrandom.2 Michael Kerrisk posed a few
questions and left some comments in the man-page. This patch
seeks to clarify the open issues.

 72 For example, if the call is interrupted by a signal handler,
 73 it may return a partially filled buffer, or fail with the error
 74 .BR EINTR .
 75 .\" Tested with buffer sizes > 256 bytes: both partial reads
 76 .\" and EINTR can occur, with the former being more frequent.
 77 .\"

Michael's observation agrees with the code.
For buffer size > 256: If the buffer is still empty EINTR occurs. If
any number of bytes has been read to the buffer, that number is returned.
The comment can be removed.

 78 .\" mtk: In the absence of signals, in my testing, even very large reads
 79 .\" return full buffers. I found that reads of up to 33554431 always
 80 .\" returned a filled buffer. Specifying 'buflen' > 33554431 always
 81 .\" returned just 33554431 bytes. (I'm not sure where that number comes
        from.

The maximum number of bytes transferred is limited for /dev/urandom to
nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
// <= 0x1fffff

and for /dev/random to
nbytes = min_t(size_t, nbytes, SEC_XFER_SIZE); // <= 0x200

Lets put this into the NOTES section.

 224 When reading from
 225 .IR /dev/random ,
 226 blocking requests of any size can be interrupted by a signal
 227 (the call fails with the error
 228 .BR EINTR ).

Thats ok.

 82 If the pool has not yet been initialized, then the call blocks, unless
 83 .B GRND_RANDOM
 84 is specified in
 85 .IR flags .
 86 .\" FIXME We need a bit more information here.
 87 .\"       The reader will ask: when is /dev/urandom initialized?
 88 .\"       There should be some text here to explain that.

Entropy is collected from different sources, e.g.
 - time of reaping a thread
 - MAC address of a network interfaces
 - Allwinner security ID
 - ROM content of a firewire device
 - ...

When more than 128 bits have been collected, the pool is set to initialized.

I suggest that detailed information about the initialization should be provided
on the random.4 page.

I added a paragraph in the NOTES section.

Signed-off-by: Heinrich Schuchardt <xypron.glpk-Mmb7MZpHnFY@public.gmane.org>
---
 man2/getrandom.2 | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/man2/getrandom.2 b/man2/getrandom.2
index f66cebe..469da27 100644
--- a/man2/getrandom.2
+++ b/man2/getrandom.2
@@ -72,20 +72,10 @@ No such guarantees apply for larger buffer sizes.
 For example, if the call is interrupted by a signal handler,
 it may return a partially filled buffer, or fail with the error
 .BR EINTR .
-.\" Tested with buffer sizes > 256 bytes: both partial reads
-.\" and EINTR can occur, with the former being more frequent.
-.\"
-.\" mtk: In the absence of signals, in my testing, even very large reads
-.\" return full buffers. I found that reads of up to 33554431 always
-.\" returned a filled buffer. Specifying 'buflen' > 33554431 always
-.\" returned just 33554431 bytes. (I'm not sure where that number comes from.
 If the pool has not yet been initialized, then the call blocks, unless
 .B GRND_RANDOM
 is specified in
 .IR flags .
-.\" FIXME We need a bit more information here.
-.\"       The reader will ask: when is /dev/urandom initialized?
-.\"       There should be some text here to explain that.
 
 The
 .I flags
@@ -179,6 +169,25 @@ was introduced in version 3.17 of the Linux kernel.
 .SH CONFORMING TO
 This system call is Linux-specific.
 .SH NOTES
+.SS Maximum number of bytes returned
+As of Linux 3.19 the following limits apply:
+.IP * 3
+When reading from
+.I /dev/urandom
+a maximum of 33554431 bytes is returned by a single call to
+.BR getrandom ()
+on a system where
+.I int
+has a size of 32 bits.
+.IP *
+When reading from
+.I /dev/random
+a maximum of 512 bytes is returned.
+.SS Initilization of the entropy pool
+The kernel collects bits of entropy from environment.
+When a sufficient number of random bits has been collected the
+.I /dev/urandom
+entropy pool is set to initialized.
 .SS Interruption by a signal handler
 A call to
 .BR getrandom ()
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH 1/1] getrandom.2: clarification of open questions
       [not found] ` <1422394068-10106-1-git-send-email-xypron.glpk-Mmb7MZpHnFY@public.gmane.org>
@ 2015-01-28  6:11   ` Michael Kerrisk (man-pages)
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Kerrisk (man-pages) @ 2015-01-28  6:11 UTC (permalink / raw)
  To: Heinrich Schuchardt
  Cc: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, Theodore Ts'o, linux-man

Hello Heinrich,

Patch applied, with a few minor wording/spelling tweaks. One change
(addition) below.

On 01/27/2015 10:27 PM, Heinrich Schuchardt wrote:
> With his last patches for getrandom.2 Michael Kerrisk posed a few
> questions and left some comments in the man-page. This patch
> seeks to clarify the open issues.
> 
>  72 For example, if the call is interrupted by a signal handler,
>  73 it may return a partially filled buffer, or fail with the error
>  74 .BR EINTR .
>  75 .\" Tested with buffer sizes > 256 bytes: both partial reads
>  76 .\" and EINTR can occur, with the former being more frequent.
>  77 .\"
> 
> Michael's observation agrees with the code.
> For buffer size > 256: If the buffer is still empty EINTR occurs. If
> any number of bytes has been read to the buffer, that number is returned.
> The comment can be removed.
> 
>  78 .\" mtk: In the absence of signals, in my testing, even very large reads
>  79 .\" return full buffers. I found that reads of up to 33554431 always
>  80 .\" returned a filled buffer. Specifying 'buflen' > 33554431 always
>  81 .\" returned just 33554431 bytes. (I'm not sure where that number comes
>         from.
> 
> The maximum number of bytes transferred is limited for /dev/urandom to
> nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
> // <= 0x1fffff
> 
> and for /dev/random to
> nbytes = min_t(size_t, nbytes, SEC_XFER_SIZE); // <= 0x200

Ahh -- thanks for uncovering that.

> Lets put this into the NOTES section.
> 
>  224 When reading from
>  225 .IR /dev/random ,
>  226 blocking requests of any size can be interrupted by a signal
>  227 (the call fails with the error
>  228 .BR EINTR ).
> 
> Thats ok.
> 
>  82 If the pool has not yet been initialized, then the call blocks, unless
>  83 .B GRND_RANDOM
>  84 is specified in
>  85 .IR flags .
>  86 .\" FIXME We need a bit more information here.
>  87 .\"       The reader will ask: when is /dev/urandom initialized?
>  88 .\"       There should be some text here to explain that.
> 
> Entropy is collected from different sources, e.g.
>  - time of reaping a thread
>  - MAC address of a network interfaces
>  - Allwinner security ID
>  - ROM content of a firewire device
>  - ...
> 
> When more than 128 bits have been collected, the pool is set to initialized.
> 
> I suggest that detailed information about the initialization should be provided
> on the random.4 page.

Yes, that would be more appropriate.

> 
> I added a paragraph in the NOTES section.

Thanks!

> Signed-off-by: Heinrich Schuchardt <xypron.glpk-Mmb7MZpHnFY@public.gmane.org>
> ---
>  man2/getrandom.2 | 29 +++++++++++++++++++----------
>  1 file changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/man2/getrandom.2 b/man2/getrandom.2
> index f66cebe..469da27 100644
> --- a/man2/getrandom.2
> +++ b/man2/getrandom.2
> @@ -72,20 +72,10 @@ No such guarantees apply for larger buffer sizes.
>  For example, if the call is interrupted by a signal handler,
>  it may return a partially filled buffer, or fail with the error
>  .BR EINTR .
> -.\" Tested with buffer sizes > 256 bytes: both partial reads
> -.\" and EINTR can occur, with the former being more frequent.
> -.\"
> -.\" mtk: In the absence of signals, in my testing, even very large reads
> -.\" return full buffers. I found that reads of up to 33554431 always
> -.\" returned a filled buffer. Specifying 'buflen' > 33554431 always
> -.\" returned just 33554431 bytes. (I'm not sure where that number comes from.
>  If the pool has not yet been initialized, then the call blocks, unless
>  .B GRND_RANDOM
>  is specified in
>  .IR flags .
> -.\" FIXME We need a bit more information here.
> -.\"       The reader will ask: when is /dev/urandom initialized?
> -.\"       There should be some text here to explain that.
>  
>  The
>  .I flags
> @@ -179,6 +169,25 @@ was introduced in version 3.17 of the Linux kernel.
>  .SH CONFORMING TO
>  This system call is Linux-specific.
>  .SH NOTES
> +.SS Maximum number of bytes returned
> +As of Linux 3.19 the following limits apply:
> +.IP * 3
> +When reading from
> +.I /dev/urandom
> +a maximum of 33554431 bytes is returned by a single call to
> +.BR getrandom ()
> +on a system where
> +.I int
> +has a size of 32 bits.
> +.IP *
> +When reading from
> +.I /dev/random
> +a maximum of 512 bytes is returned.
> +.SS Initilization of the entropy pool
> +The kernel collects bits of entropy from environment.
> +When a sufficient number of random bits has been collected the
> +.I /dev/urandom
> +entropy pool is set to initialized.

I added a sentence here:

This state is normally reached early in the system bootstrap phase.

>  .SS Interruption by a signal handler
>  A call to
>  .BR getrandom ()

Thanks,

Michael



-- 
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-01-28  6:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-27 21:27 [PATCH 1/1] getrandom.2: clarification of open questions Heinrich Schuchardt
     [not found] ` <1422394068-10106-1-git-send-email-xypron.glpk-Mmb7MZpHnFY@public.gmane.org>
2015-01-28  6:11   ` Michael Kerrisk (man-pages)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.