]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man2/getrandom.2
fuse.4: fuse_entry_out: rework discussion of uniqueness of nodeid + generation
[thirdparty/man-pages.git] / man2 / getrandom.2
CommitLineData
18647599 1.\" Copyright (C) 2014, Theodore Ts'o <tytso@mit.edu>
3907aed3 2.\" Copyright (C) 2014,2015 Heinrich Schuchardt <xypron.glpk@gmx.de>
35800487 3.\" Copyright (C) 2015, Michael Kerrisk <mtk.manpages@gmail.com>
18647599
HS
4.\"
5.\" %%%LICENSE_START(VERBATIM)
6.\" Permission is granted to make and distribute verbatim copies of this
7.\" manual provided the copyright notice and this permission notice are
8.\" preserved on all copies.
9.\"
10.\" Permission is granted to copy and distribute modified versions of
11.\" this manual under the conditions for verbatim copying, provided that
12.\" the entire resulting derived work is distributed under the terms of
13.\" a permission notice identical to this one.
14.\"
15.\" Since the Linux kernel and libraries are constantly changing, this
16.\" manual page may be incorrect or out-of-date. The author(s) assume.
17.\" no responsibility for errors or omissions, or for damages resulting.
18.\" from the use of the information contained herein. The author(s) may.
19.\" not have taken the same level of care in the production of this.
20.\" manual, which is licensed free of charge, as they might when working.
21.\" professionally.
22.\"
23.\" Formatted or processed versions of this manual, if unaccompanied by
24.\" the source, must acknowledge the copyright and authors of this work.
25.\" %%%LICENSE_END
cc5ba920 26.\"
b8efb414 27.TH GETRANDOM 2 2016-10-08 "Linux" "Linux Programmer's Manual"
18647599
HS
28.SH NAME
29getrandom \- obtain a series of random bytes
30.SH SYNOPSIS
31.B #include <linux/random.h>
32.sp
33.BI "int getrandom(void *"buf ", size_t " buflen ", unsigned int " flags );
34.SH DESCRIPTION
81d43c50 35The
18647599 36.BR getrandom ()
81d43c50 37system call fills the buffer pointed to by
18647599
HS
38.I buf
39with up to
40.I buflen
41random bytes.
077e532d 42These bytes can be used to seed user-space random number generators
473844a1 43or for cryptographic purposes.
7028ce50 44
7028ce50
MK
45By default,
46.BR getrandom ()
47draws entropy from the
e196d319 48.I urandom
dce6b796 49source (i.e., the same source as the
7028ce50 50.IR /dev/urandom
e196d319 51device).
7028ce50
MK
52This behavior can be changed via the
53.I flags
54argument.
b4a9630f 55
e14ee946 56If the
e196d319 57.I urandom
dce6b796 58source has been initialized,
053e5e69
MK
59reads of up to 256 bytes will always return as many bytes as
60requested and will not be interrupted by signals.
61No such guarantees apply for larger buffer sizes.
62For example, if the call is interrupted by a signal handler,
63it may return a partially filled buffer, or fail with the error
64.BR EINTR .
e196d319
MK
65
66If the
67.I urandom
dce6b796 68source has not yet been initialized, then
e196d319
MK
69.BR getrandom ()
70will block, unless
0594459d 71.B GRND_NONBLOCK
973ff2fc
MK
72is specified in
73.IR flags .
7028ce50 74
18647599
HS
75The
76.I flags
77argument is a bit mask that can contain zero or more of the following values
78ORed together:
79.TP
80.B GRND_RANDOM
81If this bit is set, then random bytes are drawn from the
e196d319 82.I random
dce6b796 83source
e196d319
MK
84(i.e., the same source as the
85.IR /dev/random
86device)
87instead of the
88.I urandom
dce6b796 89source.
18647599 90The
e196d319 91.I random
dce6b796 92source is limited based on the entropy that can be obtained from environmental
4f69e06a 93noise.
e196d319
MK
94If the number of available bytes in the
95.I random
dce6b796 96source is less than requested in
18647599 97.IR buflen ,
e8009a53 98the call returns just the available random bytes.
973ff2fc 99If no random bytes are available, the behavior depends on the presence of
18647599
HS
100.B GRND_NONBLOCK
101in the
102.I flags
103argument.
104.TP
105.B GRND_NONBLOCK
e196d319
MK
106By default, when reading from the
107.IR random
dce6b796 108source,
18647599 109.BR getrandom ()
0646abd6 110blocks if no random bytes are available,
e196d319
MK
111and when reading from the
112.IR urandom
dce6b796 113source, it blocks if the entropy pool has not yet been initialized.
18647599
HS
114If the
115.B GRND_NONBLOCK
d2a1b46b 116flag is set, then
18647599 117.BR getrandom ()
0646abd6 118does not block in these cases, but instead immediately returns \-1 with
d2a1b46b
MK
119.I errno
120set to
121.BR EAGAIN .
18647599
HS
122.SH RETURN VALUE
123On success,
124.BR getrandom ()
125returns the number of bytes that were copied to the buffer
126.IR buf .
01a64074 127This may be less than the number of bytes requested via
18647599 128.I buflen
e196d319 129if either
973ff2fc
MK
130.BR GRND_RANDOM
131was specified in
132.IR flags
133and insufficient entropy was present in the
e196d319 134.IR random
dce6b796 135source or the system call was interrupted by a signal.
18647599 136.PP
81d43c50 137On error, \-1 is returned, and
18647599
HS
138.I errno
139is set appropriately.
140.SH ERRORS
141.TP
18647599
HS
142.B EAGAIN
143The requested entropy was not available, and
144.BR getrandom ()
145would have blocked if the
146.B GRND_NONBLOCK
147flag was not set.
148.TP
26c04bd0
MK
149.B EFAULT
150The address referred to by
151.I buf
152is outside the accessible address space.
153.TP
18647599 154.B EINTR
3426471b 155The call was interrupted by a signal
18647599
HS
156handler; see the description of how interrupted
157.BR read (2)
158calls on "slow" devices are handled with and without the
159.B SA_RESTART
160flag in the
161.BR signal (7)
162man page.
26c04bd0
MK
163.TP
164.B EINVAL
165An invalid flag was specified in
166.IR flags .
18647599
HS
167.SH VERSIONS
168.BR getrandom ()
169was introduced in version 3.17 of the Linux kernel.
170.SH CONFORMING TO
171This system call is Linux-specific.
172.SH NOTES
9eaf7500
MK
173For an overview and comparison of the various interfaces that
174can be used to obtain randomness, see
175.BR random (7).
176
c35966b1
MK
177Unlike
178.IR /dev/random
179and
180.IR /dev/random ,
181.BR getrandom ()
182does not involve the use of pathnames or file descriptors.
183Thus,
184.BR getrandom ()
185can be useful in cases where
186.BR chroot (2)
187makes
188.I /dev
189pathnames invisible,
190and where an application (e.g., a daemon during start-up)
191closes a file descriptor for one of these files
192that was opened by a library.
193.\"
11353d7b
HS
194.SS Maximum number of bytes returned
195As of Linux 3.19 the following limits apply:
196.IP * 3
e196d319
MK
197When reading from the
198.IR urandom
dce6b796 199source, a maximum of 33554431 bytes is returned by a single call to
11353d7b 200.BR getrandom ()
724d21bb 201on systems where
11353d7b
HS
202.I int
203has a size of 32 bits.
204.IP *
e196d319
MK
205When reading from the
206.IR random
dce6b796 207source, a maximum of 512 bytes is returned.
18647599 208.SS Interruption by a signal handler
e196d319
MK
209When reading from the
210.I urandom
dce6b796 211source
e14ee946 212.RB ( GRND_RANDOM
3851c7aa 213is not set),
3426471b
MK
214.BR getrandom ()
215will block until the entropy pool has been initialized
216(unless the
217.BR GRND_NONBLOCK
218flag was specified).
e196d319 219If a request is made to read a large number of bytes (more than 256),
3426471b
MK
220.BR getrandom ()
221will block until those bytes have been generated and transferred
222from kernel memory to
223.IR buf .
e196d319
MK
224When reading from the
225.I random
dce6b796 226source
e14ee946 227.RB ( GRND_RANDOM
3851c7aa 228is set),
3426471b
MK
229.BR getrandom ()
230will block until some random bytes become available
231(unless the
232.BR GRND_NONBLOCK
233flag was specified).
e14ee946 234
978323c7 235The behavior when a call to
18647599 236.BR getrandom ()
e196d319
MK
237that is blocked while reading from the
238.I urandom
dce6b796 239source is interrupted by a signal handler
18647599 240depends on the initialization state of the entropy buffer
81d43c50 241and on the request size,
18647599 242.IR buflen .
05e4d7af 243If the entropy is not yet initialized, then the call will fail with the
18647599 244.B EINTR
81d43c50 245error.
05e4d7af
MK
246If the entropy pool has been initialized
247and the request size is large
248.RI ( buflen "\ >\ 256),"
249the call either succeeds, returning a partially filled buffer,
250or fails with the error
251.BR EINTR.
01a64074
MK
252If the entropy pool has been initialized and the request size is small
253.RI ( buflen "\ <=\ 256),"
81d43c50 254then
18647599 255.BR getrandom ()
81d43c50 256will not fail with
18647599
HS
257.BR EINTR .
258Instead, it will return all of the bytes that have been requested.
652febf0 259
e196d319
MK
260When reading from the
261.IR random
dce6b796 262source, blocking requests of any size can be interrupted by a signal handler
652febf0
MK
263(the call fails with the error
264.BR EINTR ).
265
e196d319 266Using
18647599 267.BR getrandom ()
e196d319
MK
268to read small buffers (<=\ 256 bytes) from the
269.I urandom
dce6b796 270source is the preferred mode of usage.
e196d319 271
18647599
HS
272The special treatment of small values of
273.I buflen
274was designed for compatibility with
275OpenBSD's
276.BR getentropy ()
277system call.
278.PP
279The user of
280.BR getrandom ()
281.I must
01a64074
MK
282always check the return value,
283to determine whether either an error occurred
284or fewer bytes than requested were returned.
18647599
HS
285In the case where
286.B GRND_RANDOM
287is not specified and
288.I buflen
289is less than or equal to 256,
290a return of fewer bytes than requested should never happen,
28ef3452 291but the careful programmer will check for this anyway!
2e1f8bfa 292.\"
18647599
HS
293.SS Emulating OpenBSD's getentropy()
294The
295.BR getentropy ()
296system call in OpenBSD can be emulated using the following
297function:
298
299.in +4n
300.nf
301int
302getentropy(void *buf, size_t buflen)
303{
304 int ret;
305
306 if (buflen > 256)
307 goto failure;
308 ret = getrandom(buf, buflen, 0);
309 if (ret < 0)
310 return ret;
311 if (ret == buflen)
312 return 0;
313failure:
314 errno = EIO;
81d43c50 315 return \-1;
18647599
HS
316}
317.fi
318.in
16199698
HS
319.SH BUGS
320As of Linux 3.19, the following bug exists:
16199698 321.\" FIXME patch proposed https://lkml.org/lkml/2014/11/29/16
81d43c50
MK
322.IP * 3
323Depending on CPU load,
16199698
HS
324.BR getrandom ()
325does not react to interrupts before reading all bytes requested.
18647599
HS
326.SH SEE ALSO
327.BR random (4),
2cc7c11a 328.BR urandom (4),
9eaf7500 329.BR random (7),
2cc7c11a 330.BR signal (7)