mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-05 19:43:44 +00:00
d94f42f6e2
This package provides access to an operating system resource
(cryptographic numbers) and so needs to be replaced with a TinyGo
version that does this in a different way.
I've made the following choices while adding this feature:
- I'm using the getentropy call whenever possible (most POSIX like
systems), because it is easier to use and more reliable. Linux is
the exception: it only added getentropy relatively recently.
- I've left bare-metal implementations to a future patch. This because
it's hard to reliably get cryptographically secure random numbers on
embedded devices: most devices do not have a hardware PRNG for this
purpose.
39 lines
665 B
Go
39 lines
665 B
Go
// +build linux,!baremetal,!wasi
|
|
|
|
// This implementation of crypto/rand uses the /dev/urandom pseudo-file to
|
|
// generate random numbers.
|
|
// TODO: convert to the getentropy or getrandom libc function on Linux once it
|
|
// is more widely supported.
|
|
|
|
package rand
|
|
|
|
import (
|
|
"syscall"
|
|
)
|
|
|
|
func init() {
|
|
Reader = &reader{}
|
|
}
|
|
|
|
type reader struct {
|
|
fd int
|
|
}
|
|
|
|
func (r *reader) Read(b []byte) (n int, err error) {
|
|
if len(b) == 0 {
|
|
return
|
|
}
|
|
|
|
// Open /dev/urandom first if needed.
|
|
if r.fd == 0 {
|
|
fd, err := syscall.Open("/dev/urandom", syscall.O_RDONLY, 0)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
r.fd = fd
|
|
}
|
|
|
|
// Read from the file.
|
|
return syscall.Read(r.fd, b)
|
|
}
|