mirror of
https://github.com/golang/go
synced 2024-11-26 06:27:58 -07:00
crypto/rand, internal/syscall/unix: add support for getrandom syscall on solaris
The getrandom syscall is available on Solaris and Illumos, see https://docs.oracle.com/cd/E88353_01/html/E37841/getrandom-2.html and https://illumos.org/man/2/getrandom Change-Id: Id1c65d6a5b2fbc80d20b43d8b32dab137ca950ca Reviewed-on: https://go-review.googlesource.com/c/go/+/299134 Trust: Tobias Klauser <tobias.klauser@gmail.com> Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
79e3ee52f4
commit
9ece63f064
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build linux || freebsd || dragonfly
|
||||
// +build linux freebsd dragonfly
|
||||
//go:build linux || freebsd || dragonfly || solaris
|
||||
// +build linux freebsd dragonfly solaris
|
||||
|
||||
package rand
|
||||
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build linux || freebsd || dragonfly
|
||||
// +build linux freebsd dragonfly
|
||||
//go:build linux || freebsd || dragonfly || solaris
|
||||
// +build linux freebsd dragonfly solaris
|
||||
|
||||
package rand
|
||||
|
||||
|
10
src/crypto/rand/rand_solaris.go
Normal file
10
src/crypto/rand/rand_solaris.go
Normal file
@ -0,0 +1,10 @@
|
||||
// Copyright 2021 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package rand
|
||||
|
||||
// maxGetRandomRead is the maximum number of bytes to ask for in one call to the
|
||||
// getrandom() syscall. Across all the Solaris platforms, 256 bytes is the
|
||||
// lowest number of bytes returned atomically per call.
|
||||
const maxGetRandomRead = 1 << 8
|
53
src/internal/syscall/unix/getrandom_solaris.go
Normal file
53
src/internal/syscall/unix/getrandom_solaris.go
Normal file
@ -0,0 +1,53 @@
|
||||
// Copyright 2021 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package unix
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
//go:cgo_import_dynamic libc_getrandom getrandom "libc.so"
|
||||
|
||||
//go:linkname procGetrandom libc_getrandom
|
||||
|
||||
var procGetrandom uintptr
|
||||
|
||||
var getrandomUnsupported int32 // atomic
|
||||
|
||||
// GetRandomFlag is a flag supported by the getrandom system call.
|
||||
type GetRandomFlag uintptr
|
||||
|
||||
const (
|
||||
// GRND_NONBLOCK means return EAGAIN rather than blocking.
|
||||
GRND_NONBLOCK GetRandomFlag = 0x0001
|
||||
|
||||
// GRND_RANDOM means use the /dev/random pool instead of /dev/urandom.
|
||||
GRND_RANDOM GetRandomFlag = 0x0002
|
||||
)
|
||||
|
||||
// GetRandom calls the getrandom system call.
|
||||
func GetRandom(p []byte, flags GetRandomFlag) (n int, err error) {
|
||||
if len(p) == 0 {
|
||||
return 0, nil
|
||||
}
|
||||
if atomic.LoadInt32(&getrandomUnsupported) != 0 {
|
||||
return 0, syscall.ENOSYS
|
||||
}
|
||||
r1, _, errno := syscall6(uintptr(unsafe.Pointer(&procGetrandom)),
|
||||
3,
|
||||
uintptr(unsafe.Pointer(&p[0])),
|
||||
uintptr(len(p)),
|
||||
uintptr(flags),
|
||||
0, 0, 0)
|
||||
if errno != 0 {
|
||||
if errno == syscall.ENOSYS {
|
||||
atomic.StoreInt32(&getrandomUnsupported, 1)
|
||||
}
|
||||
return 0, errno
|
||||
}
|
||||
return int(r1), nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user