RandRead: Generate random numbers in chunks of MX_CPRNG_DRAW_MAX_LEN.
Change-Id: If8b0f7380eb49de254397ad37428a9c4153643f6
diff --git a/src/syscall/mx/handle.go b/src/syscall/mx/handle.go
index b7b93e2..307b587 100644
--- a/src/syscall/mx/handle.go
+++ b/src/syscall/mx/handle.go
@@ -20,6 +20,8 @@
RootNSMap map[string]Handle
)
+const _MX_CPRNG_DRAW_MAX_LEN = 256
+
type HandleInfo uint32
func NewHandleInfo(t, arg uint32) HandleInfo {
@@ -507,11 +509,22 @@
}
func RandRead(b []byte) (n int, err error) {
- var actual uint
- if status := sys_cprng_draw(unsafe.Pointer(&b[0]), uint(len(b)), &actual); status != ErrOk {
- return int(actual), Error{Status: status, Text: "mx.RandRead"}
+ var total uint
+
+ toRead := _MX_CPRNG_DRAW_MAX_LEN
+ for start := 0; start < len(b); start += _MX_CPRNG_DRAW_MAX_LEN {
+ if start+toRead > len(b) {
+ toRead = len(b) - start
+ }
+ var actual uint
+ if status := sys_cprng_draw(unsafe.Pointer(&b[start]), uint(toRead), &actual); status != ErrOk {
+ total += actual
+ return int(total), Error{Status: status, Text: "mx.RandRead"}
+ }
+ total += actual
}
- return int(actual), nil
+
+ return int(total), nil
}
// Error is a Status with associated error text.