rand_urandom.mx raw
1 //go:build linux && !baremetal && !wasip1 && !wasip2
2
3 // This implementation of crypto/rand uses the /dev/urandom pseudo-file to
4 // generate random numbers.
5 // TODO: convert to the getentropy or getrandom libc function on Linux once it
6 // is more widely supported.
7
8 package rand
9
10 import (
11 "syscall"
12 )
13
14 func init() {
15 Reader = &reader{}
16 }
17
18 type reader struct {
19 fd int
20 }
21
22 func (r *reader) Read(b []byte) (n int, err error) {
23 if len(b) == 0 {
24 return
25 }
26
27 // Open /dev/urandom first if needed.
28 if r.fd == 0 {
29 fd, err := syscall.Open("/dev/urandom", syscall.O_RDONLY, 0)
30 if err != nil {
31 return 0, err
32 }
33 r.fd = fd
34 }
35
36 // Read from the file.
37 return syscall.Read(r.fd, b)
38 }
39