mirror of
https://github.com/golang/go
synced 2024-11-26 13:08:08 -07:00
crypto/rand: supports for getrandom syscall in DragonFlyBSD
Since the 5.7 release, DragonFlyBSD supports as well
the getrandom function, the actual stable is 5.8.
Change-Id: I2b8fc468771b10ac12b38ea7e8e5314342de6375
GitHub-Last-Rev: c5c496f418
GitHub-Pull-Request: golang/go#42617
Reviewed-on: https://go-review.googlesource.com/c/go/+/269999
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Trust: Ian Lance Taylor <iant@golang.org>
Trust: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
This commit is contained in:
parent
4d608eb224
commit
cf59850466
@ -2,8 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build linux || freebsd
|
//go:build linux || freebsd || dragonfly
|
||||||
// +build linux freebsd
|
// +build linux freebsd dragonfly
|
||||||
|
|
||||||
package rand
|
package rand
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build linux || freebsd
|
//go:build linux || freebsd || dragonfly
|
||||||
// +build linux freebsd
|
// +build linux freebsd dragonfly
|
||||||
|
|
||||||
package rand
|
package rand
|
||||||
|
|
||||||
|
9
src/crypto/rand/rand_dragonfly.go
Normal file
9
src/crypto/rand/rand_dragonfly.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 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. In DragonFlyBSD at most 256 bytes will be returned per call.
|
||||||
|
const maxGetRandomRead = 1 << 8
|
51
src/internal/syscall/unix/getrandom_dragonfly.go
Normal file
51
src/internal/syscall/unix/getrandom_dragonfly.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
// 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"
|
||||||
|
)
|
||||||
|
|
||||||
|
var randomUnsupported int32 // atomic
|
||||||
|
|
||||||
|
// DragonFlyBSD getrandom system call number.
|
||||||
|
const randomTrap uintptr = 550
|
||||||
|
|
||||||
|
// GetRandomFlag is a flag supported by the getrandom system call.
|
||||||
|
type GetRandomFlag uintptr
|
||||||
|
|
||||||
|
const (
|
||||||
|
// GRND_RANDOM is only set for portability purpose, no-op on DragonFlyBSD.
|
||||||
|
GRND_RANDOM GetRandomFlag = 0x0001
|
||||||
|
|
||||||
|
// GRND_NONBLOCK means return EAGAIN rather than blocking.
|
||||||
|
GRND_NONBLOCK GetRandomFlag = 0x0002
|
||||||
|
|
||||||
|
// GRND_INSECURE is an GRND_NONBLOCK alias
|
||||||
|
GRND_INSECURE GetRandomFlag = 0x0004
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetRandom calls the DragonFlyBSD getrandom system call.
|
||||||
|
func GetRandom(p []byte, flags GetRandomFlag) (n int, err error) {
|
||||||
|
if len(p) == 0 {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
if atomic.LoadInt32(&randomUnsupported) != 0 {
|
||||||
|
return 0, syscall.ENOSYS
|
||||||
|
}
|
||||||
|
r1, _, errno := syscall.Syscall(randomTrap,
|
||||||
|
uintptr(unsafe.Pointer(&p[0])),
|
||||||
|
uintptr(len(p)),
|
||||||
|
uintptr(flags))
|
||||||
|
if errno != 0 {
|
||||||
|
if errno == syscall.ENOSYS {
|
||||||
|
atomic.StoreInt32(&randomUnsupported, 1)
|
||||||
|
}
|
||||||
|
return 0, errno
|
||||||
|
}
|
||||||
|
return int(r1), nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user