]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/rand: use arc4random_buf() on OpenBSD
authorFilippo Valsorda <filippo@golang.org>
Sun, 25 Aug 2024 11:55:59 +0000 (13:55 +0200)
committerFilippo Valsorda <filippo@golang.org>
Mon, 7 Oct 2024 15:34:19 +0000 (15:34 +0000)
OpenBSD system calls are mediated by libc anyway, and arc4random_buf()
is the preferred mechanism to obtain random bytes.

Also, rename NetBSD's function to reflect it's not actually calling
getentropy(3).

Cq-Include-Trybots: luci.golang.try:gotip-openbsd-amd64
Change-Id: Id1f3f7af16750537e2420bcf44b086de5854198c
Reviewed-on: https://go-review.googlesource.com/c/go/+/608395
Reviewed-by: Daniel McCarney <daniel@binaryparadox.net>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Bypass: Filippo Valsorda <filippo@golang.org>
Reviewed-by: Roland Shoemaker <roland@golang.org>
22 files changed:
src/crypto/rand/rand.go
src/crypto/rand/rand_arc4random.go [moved from src/crypto/rand/rand_darwin.go with 95% similarity]
src/crypto/rand/rand_netbsd.go [moved from src/crypto/rand/rand_getentropy.go with 60% similarity]
src/internal/syscall/unix/arandom_netbsd.go [moved from src/internal/syscall/unix/getentropy_netbsd.go with 93% similarity]
src/internal/syscall/unix/arc4random_openbsd.go [new file with mode: 0644]
src/internal/syscall/unix/asm_openbsd.s
src/internal/syscall/unix/getentropy_openbsd.go [deleted file]
src/internal/syscall/unix/getentropy_openbsd_mips64.go [deleted file]
src/syscall/linkname_openbsd.go
src/syscall/syscall_openbsd_libc.go
src/syscall/zsyscall_openbsd_386.go
src/syscall/zsyscall_openbsd_386.s
src/syscall/zsyscall_openbsd_amd64.go
src/syscall/zsyscall_openbsd_amd64.s
src/syscall/zsyscall_openbsd_arm.go
src/syscall/zsyscall_openbsd_arm.s
src/syscall/zsyscall_openbsd_arm64.go
src/syscall/zsyscall_openbsd_arm64.s
src/syscall/zsyscall_openbsd_ppc64.go
src/syscall/zsyscall_openbsd_ppc64.s
src/syscall/zsyscall_openbsd_riscv64.go
src/syscall/zsyscall_openbsd_riscv64.s

index 0911666f0062a14c32025f53cfd1c35aae19da79..b3d0a7368f7fa0550f108055d35b2514a3df4077 100644 (file)
@@ -21,8 +21,7 @@ import (
 //
 //   - On Linux, FreeBSD, Dragonfly, and Solaris, Reader uses getrandom(2).
 //   - On legacy Linux (< 3.17), Reader opens /dev/urandom on first use.
-//   - On macOS and iOS, Reader uses arc4random_buf(3).
-//   - On OpenBSD, Reader uses getentropy(2).
+//   - On macOS, iOS, and OpenBSD Reader, uses arc4random_buf(3).
 //   - On NetBSD, Reader uses the kern.arandom sysctl.
 //   - On Windows, Reader uses the ProcessPrng API.
 //   - On js/wasm, Reader uses the Web Crypto API.
similarity index 95%
rename from src/crypto/rand/rand_darwin.go
rename to src/crypto/rand/rand_arc4random.go
index abbfec87cb637980c8c907345faf00e1c3be4753..f2e27004f8384850415f84f6ea4983b15f327e35 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+//go:build darwin || openbsd
+
 package rand
 
 import "internal/syscall/unix"
similarity index 60%
rename from src/crypto/rand/rand_getentropy.go
rename to src/crypto/rand/rand_netbsd.go
index b9e41433a2de4adf91443b0e9b987349292c763c..b25d261e1528d837040b7196e98e11fd5b5b6386 100644 (file)
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build openbsd || netbsd
-
 package rand
 
 import "internal/syscall/unix"
@@ -11,11 +9,13 @@ import "internal/syscall/unix"
 func read(b []byte) error {
        for len(b) > 0 {
                size := len(b)
+               // "Returns independent uniformly distributed bytes at random each time,
+               // as many as requested up to 256, derived from the system entropy pool;
+               // see rnd(4)." -- man sysctl(7)
                if size > 256 {
                        size = 256
                }
-               // getentropy(2) returns a maximum of 256 bytes per call.
-               if err := unix.GetEntropy(b[:size]); err != nil {
+               if err := unix.Arandom(b[:size]); err != nil {
                        return err
                }
                b = b[size:]
similarity index 93%
rename from src/internal/syscall/unix/getentropy_netbsd.go
rename to src/internal/syscall/unix/arandom_netbsd.go
index 02bac1be00ccfeb0c45c8a50eba456b11385c5bc..23ca8739e81b2394c10248acc7ee69c43d6cdc2b 100644 (file)
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build netbsd
-
 package unix
 
 import (
@@ -17,7 +15,7 @@ const (
        _KERN_ARND = 81
 )
 
-func GetEntropy(p []byte) error {
+func Arandom(p []byte) error {
        mib := [2]uint32{_CTL_KERN, _KERN_ARND}
        n := uintptr(len(p))
        _, _, errno := syscall.Syscall6(
diff --git a/src/internal/syscall/unix/arc4random_openbsd.go b/src/internal/syscall/unix/arc4random_openbsd.go
new file mode 100644 (file)
index 0000000..652e0cb
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2024 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 (
+       "internal/abi"
+       "syscall"
+       "unsafe"
+)
+
+//go:linkname syscall_syscall syscall.syscall
+func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
+
+//go:cgo_import_dynamic libc_arc4random_buf arc4random_buf "libc.so"
+
+func libc_arc4random_buf_trampoline()
+
+func ARC4Random(p []byte) {
+       syscall_syscall(abi.FuncPCABI0(libc_arc4random_buf_trampoline),
+               uintptr(unsafe.Pointer(unsafe.SliceData(p))), uintptr(len(p)), 0)
+}
index cc54a14ca5e36a8cd100b94f9db56155f2e6b251..d6c43205396019145b5419e1dfada8f982cba2c0 100644 (file)
@@ -8,3 +8,5 @@
 
 TEXT ·libc_faccessat_trampoline(SB),NOSPLIT,$0-0
         JMP    libc_faccessat(SB)
+TEXT ·libc_arc4random_buf_trampoline(SB),NOSPLIT,$0-0
+        JMP    libc_arc4random_buf(SB)
diff --git a/src/internal/syscall/unix/getentropy_openbsd.go b/src/internal/syscall/unix/getentropy_openbsd.go
deleted file mode 100644 (file)
index 7516ac7..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2022 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.
-
-//go:build openbsd && !mips64
-
-package unix
-
-import _ "unsafe" // for linkname
-
-// GetEntropy calls the OpenBSD getentropy system call.
-func GetEntropy(p []byte) error {
-       return getentropy(p)
-}
-
-//go:linkname getentropy syscall.getentropy
-//go:noescape
-func getentropy(p []byte) error
diff --git a/src/internal/syscall/unix/getentropy_openbsd_mips64.go b/src/internal/syscall/unix/getentropy_openbsd_mips64.go
deleted file mode 100644 (file)
index d5caa80..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 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 (
-       "syscall"
-       "unsafe"
-)
-
-// getentropy(2)'s syscall number, from /usr/src/sys/kern/syscalls.master
-const entropyTrap uintptr = 7
-
-// GetEntropy calls the OpenBSD getentropy system call.
-func GetEntropy(p []byte) error {
-       _, _, errno := syscall.Syscall(entropyTrap,
-               uintptr(unsafe.Pointer(&p[0])),
-               uintptr(len(p)),
-               0)
-       if errno != 0 {
-               return errno
-       }
-       return nil
-}
index 5f5c517ab585992dfe1a7aaae8ac60a3c08f2db3..bbb56c10eca378aea6d66c69b7b7af6d67955a25 100644 (file)
@@ -12,4 +12,3 @@ import _ "unsafe"
 //go:linkname unlinkat
 //go:linkname openat
 //go:linkname fstatat
-//go:linkname getentropy
index 5dea268c3e42325eb33426b8a1bfe1d8b7a75ed7..13311398b9986b09dc232fbf9c30684522bb5723 100644 (file)
@@ -79,7 +79,6 @@ func syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
 //sysnb execve(path *byte, argv **byte, envp **byte) (err error)
 //sysnb exit(res int) (err error)
 //sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
-//sysnb getentropy(p []byte) (err error)
 //sys   fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
 //sys   unlinkat(fd int, path string, flags int) (err error)
 //sys   openat(fd int, path string, flags int, perm uint32) (fdret int, err error)
index d2bd3ea0125a124f6283c8a38b84fa24b32840a4..c8cf7f231b1cb55f726342663843d296d1b1bc15 100644 (file)
@@ -1854,26 +1854,6 @@ func libc_ptrace_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func getentropy(p []byte) (err error) {
-       var _p0 unsafe.Pointer
-       if len(p) > 0 {
-               _p0 = unsafe.Pointer(&p[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_getentropy_trampoline()
-
-//go:cgo_import_dynamic libc_getentropy getentropy "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 9a820e9f3eb9112e7b209711eecbc081e80358d5..f86ac2c0779e1f55376b4a57cadd3222f75fd979 100644 (file)
@@ -227,8 +227,6 @@ TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_exit(SB)
 TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_ptrace(SB)
-TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_getentropy(SB)
 TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat(SB)
 TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
index 170a74b457ba0a80cf53ff38e289d21f064adb7d..9188756a870a0a9bb696f5665e876dfd282daac8 100644 (file)
@@ -1854,26 +1854,6 @@ func libc_ptrace_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func getentropy(p []byte) (err error) {
-       var _p0 unsafe.Pointer
-       if len(p) > 0 {
-               _p0 = unsafe.Pointer(&p[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_getentropy_trampoline()
-
-//go:cgo_import_dynamic libc_getentropy getentropy "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 9b70dc096e12d6d3e854c61ae4aa0119f1704c85..4ec62202814c3e33198cacc26ca1b089717ebf07 100644 (file)
@@ -227,8 +227,6 @@ TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_exit(SB)
 TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_ptrace(SB)
-TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_getentropy(SB)
 TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat(SB)
 TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
index e75bd0b443b902e59a810375af4738305001668f..ecdfa636721893d5549a9fce42b1d808bfbcfc74 100644 (file)
@@ -1854,26 +1854,6 @@ func libc_ptrace_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func getentropy(p []byte) (err error) {
-       var _p0 unsafe.Pointer
-       if len(p) > 0 {
-               _p0 = unsafe.Pointer(&p[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_getentropy_trampoline()
-
-//go:cgo_import_dynamic libc_getentropy getentropy "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 0333377b8b71557e5f5c9d5298096bb1efefae44..75251d0305a43eb92f81ef1fb1c2ae036da7acb3 100644 (file)
@@ -227,8 +227,6 @@ TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_exit(SB)
 TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_ptrace(SB)
-TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_getentropy(SB)
 TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat(SB)
 TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
index bc027b44755f225bd0fced365e5fde83850fc970..d28d3c5e1ea71eb1059e78b2726a1d1cfcccdc80 100644 (file)
@@ -1854,26 +1854,6 @@ func libc_ptrace_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func getentropy(p []byte) (err error) {
-       var _p0 unsafe.Pointer
-       if len(p) > 0 {
-               _p0 = unsafe.Pointer(&p[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_getentropy_trampoline()
-
-//go:cgo_import_dynamic libc_getentropy getentropy "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 654e6c69a35316553e619c40a404e16807552178..deea88ec7c4149d452125e750b09fbe49808a45a 100644 (file)
@@ -227,8 +227,6 @@ TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_exit(SB)
 TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_ptrace(SB)
-TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_getentropy(SB)
 TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat(SB)
 TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
index 6808092a5a27b0f4b99071d5fe60b6d88ffea019..0e6828bcafdfebd0ea2c187058bdb3f816554e4d 100644 (file)
@@ -1854,26 +1854,6 @@ func libc_ptrace_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func getentropy(p []byte) (err error) {
-       var _p0 unsafe.Pointer
-       if len(p) > 0 {
-               _p0 = unsafe.Pointer(&p[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_getentropy_trampoline()
-
-//go:cgo_import_dynamic libc_getentropy getentropy "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 86a5745c0ae63e5681e1a4d27ed8b0098639a801..cc4eb952eb62c1e7bda5f930e521db8ba965db99 100644 (file)
@@ -340,9 +340,6 @@ TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
 TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
        CALL    libc_ptrace(SB)
        RET
-TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0
-       CALL    libc_getentropy(SB)
-       RET
 TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0
        CALL    libc_fstatat(SB)
        RET
index 2979ff78c25b70f685503aebd8bf3f5f6ff58803..920147074d091b295520e7a8356cb601b31d6245 100644 (file)
@@ -1854,26 +1854,6 @@ func libc_ptrace_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func getentropy(p []byte) (err error) {
-       var _p0 unsafe.Pointer
-       if len(p) > 0 {
-               _p0 = unsafe.Pointer(&p[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := rawSyscall(abi.FuncPCABI0(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_getentropy_trampoline()
-
-//go:cgo_import_dynamic libc_getentropy getentropy "libc.so"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index c8728190e5554c6999c42df32dfc805d061c356a..14b7b23222df085dedb4b7dd40249993a73c8fcd 100644 (file)
@@ -227,8 +227,6 @@ TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_exit(SB)
 TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_ptrace(SB)
-TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_getentropy(SB)
 TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat(SB)
 TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0