package rand
import (
- "internal/syscall"
+ "internal/syscall/unix"
"sync"
)
// - the machine has no entropy available (early boot + no hardware
// entropy source?) and we want to avoid blocking later.
var buf [1]byte
- n, err := syscall.GetRandom(buf[:], syscall.GRND_NONBLOCK)
+ n, err := unix.GetRandom(buf[:], unix.GRND_NONBLOCK)
useSyscall = n == 1 && err == nil
}
if !useSyscall {
return false
}
- n, err := syscall.GetRandom(p, 0)
+ n, err := unix.GetRandom(p, 0)
return n == len(p) && err == nil
}
// Random byte, number generation.
// This would be part of core crypto except that it imports
// math/big, which imports fmt.
- "crypto/rand": {"L4", "CRYPTO", "OS", "math/big", "syscall", "internal/syscall"},
+ "crypto/rand": {"L4", "CRYPTO", "OS", "math/big", "syscall", "internal/syscall/unix"},
// Mathematical crypto: dependencies on fmt (L4) and math/big.
// We could avoid some of the fmt, but math/big imports fmt anyway.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-package syscall
+package unix
import (
"runtime"
"sync/atomic"
- stdsyscall "syscall"
+ "syscall"
"unsafe"
)
// See https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c6e9d6f38894798696f23c8084ca7edbf16ee895
func GetRandom(p []byte, flags GetRandomFlag) (n int, err error) {
if randomTrap == 0 {
- return 0, stdsyscall.ENOSYS
+ return 0, syscall.ENOSYS
}
if len(p) == 0 {
return 0, nil
}
if atomic.LoadInt32(&randomUnsupported) != 0 {
- return 0, stdsyscall.ENOSYS
+ return 0, syscall.ENOSYS
}
- r1, _, errno := stdsyscall.Syscall(randomTrap,
+ r1, _, errno := syscall.Syscall(randomTrap,
uintptr(unsafe.Pointer(&p[0])),
uintptr(len(p)),
uintptr(flags))
if errno != 0 {
- if errno == stdsyscall.ENOSYS {
+ if errno == syscall.ENOSYS {
atomic.StoreInt32(&randomUnsupported, 1)
}
return 0, errno