| ... | ... | @@ -15284,9 +15284,9 @@ fn fallbackSeedWasi(seed: *[Csprng.seed_len]u8) void { |
| 15284 | 15284 | |
| 15285 | 15285 | fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void { |
| 15286 | 15286 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 15287 | | if (buffer.len == 0) return; |
| 15288 | 15287 | |
| 15289 | 15288 | if (is_windows) { |
| 15289 | if (buffer.len == 0) return; |
| 15290 | 15290 | // ProcessPrng from bcryptprimitives.dll has the following properties: |
| 15291 | 15291 | // * introduces a dependency on bcryptprimitives.dll, which apparently |
| 15292 | 15292 | // runs a test suite every time it is loaded |
| ... | ... | @@ -15331,11 +15331,13 @@ fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void { |
| 15331 | 15331 | } |
| 15332 | 15332 | |
| 15333 | 15333 | if (builtin.link_libc and @TypeOf(posix.system.arc4random_buf) != void) { |
| 15334 | if (buffer.len == 0) return; |
| 15334 | 15335 | posix.system.arc4random_buf(buffer.ptr, buffer.len); |
| 15335 | 15336 | return; |
| 15336 | 15337 | } |
| 15337 | 15338 | |
| 15338 | 15339 | if (native_os == .wasi) { |
| 15340 | if (buffer.len == 0) return; |
| 15339 | 15341 | const syscall: Syscall = try .start(); |
| 15340 | 15342 | while (true) switch (std.os.wasi.random_get(buffer.ptr, buffer.len)) { |
| 15341 | 15343 | .SUCCESS => return syscall.finish(), |
| ... | ... | @@ -15351,7 +15353,7 @@ fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void { |
| 15351 | 15353 | const getrandom = if (use_libc_getrandom) std.c.getrandom else std.os.linux.getrandom; |
| 15352 | 15354 | var i: usize = 0; |
| 15353 | 15355 | const syscall: Syscall = try .start(); |
| 15354 | | while (i < buffer.len) { |
| 15356 | while (buffer.len - i != 0) { |
| 15355 | 15357 | const buf = buffer[i..]; |
| 15356 | 15358 | const rc = getrandom(buf.ptr, buf.len, 0); |
| 15357 | 15359 | switch (posix.errno(rc)) { |
| ... | ... | @@ -15372,6 +15374,7 @@ fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void { |
| 15372 | 15374 | } |
| 15373 | 15375 | |
| 15374 | 15376 | if (native_os == .emscripten) { |
| 15377 | if (buffer.len == 0) return; |
| 15375 | 15378 | const err = posix.errno(std.c.getentropy(buffer.ptr, buffer.len)); |
| 15376 | 15379 | switch (err) { |
| 15377 | 15380 | .SUCCESS => return, |
| ... | ... | @@ -15391,13 +15394,7 @@ fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void { |
| 15391 | 15394 | .SUCCESS => { |
| 15392 | 15395 | syscall.finish(); |
| 15393 | 15396 | const n: usize = @intCast(rc); |
| 15394 | | if (n == 0) { |
| 15395 | | if (buffer.len - i != 0) { |
| 15396 | | return error.EntropyUnavailable; |
| 15397 | | } else { |
| 15398 | | return; |
| 15399 | | } |
| 15400 | | } |
| 15397 | if (n == 0) return error.EntropyUnavailable; |
| 15401 | 15398 | i += n; |
| 15402 | 15399 | continue; |
| 15403 | 15400 | }, |