693def151adff1af707d82d28f55dba81ceb08e1.diff 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. diff --git a/src/crypto/rand/rand.go b/src/crypto/rand/rand.go
  2. index 62738e2cb1a7d..d0dcc7cc71fc0 100644
  3. --- a/src/crypto/rand/rand.go
  4. +++ b/src/crypto/rand/rand.go
  5. @@ -15,7 +15,7 @@ import "io"
  6. // available, /dev/urandom otherwise.
  7. // On OpenBSD and macOS, Reader uses getentropy(2).
  8. // On other Unix-like systems, Reader reads from /dev/urandom.
  9. -// On Windows systems, Reader uses the RtlGenRandom API.
  10. +// On Windows systems, Reader uses the ProcessPrng API.
  11. // On JS/Wasm, Reader uses the Web Crypto API.
  12. // On WASIP1/Wasm, Reader uses random_get from wasi_snapshot_preview1.
  13. var Reader io.Reader
  14. diff --git a/src/crypto/rand/rand_windows.go b/src/crypto/rand/rand_windows.go
  15. index 6c0655c72b692..7380f1f0f1e6e 100644
  16. --- a/src/crypto/rand/rand_windows.go
  17. +++ b/src/crypto/rand/rand_windows.go
  18. @@ -15,11 +15,8 @@ func init() { Reader = &rngReader{} }
  19. type rngReader struct{}
  20. -func (r *rngReader) Read(b []byte) (n int, err error) {
  21. - // RtlGenRandom only returns 1<<32-1 bytes at a time. We only read at
  22. - // most 1<<31-1 bytes at a time so that this works the same on 32-bit
  23. - // and 64-bit systems.
  24. - if err := batched(windows.RtlGenRandom, 1<<31-1)(b); err != nil {
  25. +func (r *rngReader) Read(b []byte) (int, error) {
  26. + if err := windows.ProcessPrng(b); err != nil {
  27. return 0, err
  28. }
  29. return len(b), nil
  30. diff --git a/src/internal/syscall/windows/syscall_windows.go b/src/internal/syscall/windows/syscall_windows.go
  31. index ab4ad2ec64108..5854ca60b5cef 100644
  32. --- a/src/internal/syscall/windows/syscall_windows.go
  33. +++ b/src/internal/syscall/windows/syscall_windows.go
  34. @@ -373,7 +373,7 @@ func ErrorLoadingGetTempPath2() error {
  35. //sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock
  36. //sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle syscall.Handle, err error) = kernel32.CreateEventW
  37. -//sys RtlGenRandom(buf []byte) (err error) = advapi32.SystemFunction036
  38. +//sys ProcessPrng(buf []byte) (err error) = bcryptprimitives.ProcessPrng
  39. type FILE_ID_BOTH_DIR_INFO struct {
  40. NextEntryOffset uint32
  41. diff --git a/src/internal/syscall/windows/zsyscall_windows.go b/src/internal/syscall/windows/zsyscall_windows.go
  42. index e3f6d8d2a2208..5a587ad4f146c 100644
  43. --- a/src/internal/syscall/windows/zsyscall_windows.go
  44. +++ b/src/internal/syscall/windows/zsyscall_windows.go
  45. @@ -37,13 +37,14 @@ func errnoErr(e syscall.Errno) error {
  46. }
  47. var (
  48. - modadvapi32 = syscall.NewLazyDLL(sysdll.Add("advapi32.dll"))
  49. - modiphlpapi = syscall.NewLazyDLL(sysdll.Add("iphlpapi.dll"))
  50. - modkernel32 = syscall.NewLazyDLL(sysdll.Add("kernel32.dll"))
  51. - modnetapi32 = syscall.NewLazyDLL(sysdll.Add("netapi32.dll"))
  52. - modpsapi = syscall.NewLazyDLL(sysdll.Add("psapi.dll"))
  53. - moduserenv = syscall.NewLazyDLL(sysdll.Add("userenv.dll"))
  54. - modws2_32 = syscall.NewLazyDLL(sysdll.Add("ws2_32.dll"))
  55. + modadvapi32 = syscall.NewLazyDLL(sysdll.Add("advapi32.dll"))
  56. + modbcryptprimitives = syscall.NewLazyDLL(sysdll.Add("bcryptprimitives.dll"))
  57. + modiphlpapi = syscall.NewLazyDLL(sysdll.Add("iphlpapi.dll"))
  58. + modkernel32 = syscall.NewLazyDLL(sysdll.Add("kernel32.dll"))
  59. + modnetapi32 = syscall.NewLazyDLL(sysdll.Add("netapi32.dll"))
  60. + modpsapi = syscall.NewLazyDLL(sysdll.Add("psapi.dll"))
  61. + moduserenv = syscall.NewLazyDLL(sysdll.Add("userenv.dll"))
  62. + modws2_32 = syscall.NewLazyDLL(sysdll.Add("ws2_32.dll"))
  63. procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges")
  64. procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx")
  65. @@ -55,7 +56,7 @@ var (
  66. procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus")
  67. procRevertToSelf = modadvapi32.NewProc("RevertToSelf")
  68. procSetTokenInformation = modadvapi32.NewProc("SetTokenInformation")
  69. - procSystemFunction036 = modadvapi32.NewProc("SystemFunction036")
  70. + procProcessPrng = modbcryptprimitives.NewProc("ProcessPrng")
  71. procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
  72. procCreateEventW = modkernel32.NewProc("CreateEventW")
  73. procGetACP = modkernel32.NewProc("GetACP")
  74. @@ -179,12 +180,12 @@ func SetTokenInformation(tokenHandle syscall.Token, tokenInformationClass uint32
  75. return
  76. }
  77. -func RtlGenRandom(buf []byte) (err error) {
  78. +func ProcessPrng(buf []byte) (err error) {
  79. var _p0 *byte
  80. if len(buf) > 0 {
  81. _p0 = &buf[0]
  82. }
  83. - r1, _, e1 := syscall.Syscall(procSystemFunction036.Addr(), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0)
  84. + r1, _, e1 := syscall.Syscall(procProcessPrng.Addr(), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0)
  85. if r1 == 0 {
  86. err = errnoErr(e1)
  87. }
  88. diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go
  89. index 8ca8d7790909e..3772a864b2ff4 100644
  90. --- a/src/runtime/os_windows.go
  91. +++ b/src/runtime/os_windows.go
  92. @@ -127,15 +127,8 @@ var (
  93. _WriteFile,
  94. _ stdFunction
  95. - // Use RtlGenRandom to generate cryptographically random data.
  96. - // This approach has been recommended by Microsoft (see issue
  97. - // 15589 for details).
  98. - // The RtlGenRandom is not listed in advapi32.dll, instead
  99. - // RtlGenRandom function can be found by searching for SystemFunction036.
  100. - // Also some versions of Mingw cannot link to SystemFunction036
  101. - // when building executable as Cgo. So load SystemFunction036
  102. - // manually during runtime startup.
  103. - _RtlGenRandom stdFunction
  104. + // Use ProcessPrng to generate cryptographically random data.
  105. + _ProcessPrng stdFunction
  106. // Load ntdll.dll manually during startup, otherwise Mingw
  107. // links wrong printf function to cgo executable (see issue
  108. @@ -151,11 +144,11 @@ var (
  109. )
  110. var (
  111. - advapi32dll = [...]uint16{'a', 'd', 'v', 'a', 'p', 'i', '3', '2', '.', 'd', 'l', 'l', 0}
  112. - ntdlldll = [...]uint16{'n', 't', 'd', 'l', 'l', '.', 'd', 'l', 'l', 0}
  113. - powrprofdll = [...]uint16{'p', 'o', 'w', 'r', 'p', 'r', 'o', 'f', '.', 'd', 'l', 'l', 0}
  114. - winmmdll = [...]uint16{'w', 'i', 'n', 'm', 'm', '.', 'd', 'l', 'l', 0}
  115. - ws2_32dll = [...]uint16{'w', 's', '2', '_', '3', '2', '.', 'd', 'l', 'l', 0}
  116. + bcryptprimitivesdll = [...]uint16{'b', 'c', 'r', 'y', 'p', 't', 'p', 'r', 'i', 'm', 'i', 't', 'i', 'v', 'e', 's', '.', 'd', 'l', 'l', 0}
  117. + ntdlldll = [...]uint16{'n', 't', 'd', 'l', 'l', '.', 'd', 'l', 'l', 0}
  118. + powrprofdll = [...]uint16{'p', 'o', 'w', 'r', 'p', 'r', 'o', 'f', '.', 'd', 'l', 'l', 0}
  119. + winmmdll = [...]uint16{'w', 'i', 'n', 'm', 'm', '.', 'd', 'l', 'l', 0}
  120. + ws2_32dll = [...]uint16{'w', 's', '2', '_', '3', '2', '.', 'd', 'l', 'l', 0}
  121. )
  122. // Function to be called by windows CreateThread
  123. @@ -251,11 +244,11 @@ func windowsLoadSystemLib(name []uint16) uintptr {
  124. }
  125. func loadOptionalSyscalls() {
  126. - a32 := windowsLoadSystemLib(advapi32dll[:])
  127. - if a32 == 0 {
  128. - throw("advapi32.dll not found")
  129. + bcryptPrimitives := windowsLoadSystemLib(bcryptprimitivesdll[:])
  130. + if bcryptPrimitives == 0 {
  131. + throw("bcryptprimitives.dll not found")
  132. }
  133. - _RtlGenRandom = windowsFindfunc(a32, []byte("SystemFunction036\000"))
  134. + _ProcessPrng = windowsFindfunc(bcryptPrimitives, []byte("ProcessPrng\000"))
  135. n32 := windowsLoadSystemLib(ntdlldll[:])
  136. if n32 == 0 {
  137. @@ -531,7 +524,7 @@ func osinit() {
  138. //go:nosplit
  139. func readRandom(r []byte) int {
  140. n := 0
  141. - if stdcall2(_RtlGenRandom, uintptr(unsafe.Pointer(&r[0])), uintptr(len(r)))&0xff != 0 {
  142. + if stdcall2(_ProcessPrng, uintptr(unsafe.Pointer(&r[0])), uintptr(len(r)))&0xff != 0 {
  143. n = len(r)
  144. }
  145. return n