v2 / vlib / crypto / rand / rand_solaris.c.v
41 lines · 35 sloc · 1.15 KB · e45337e52bdcd902980294ed0b7d8aa6953b523d
Raw
1// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
2// Use of this source code is governed by an MIT license
3// that can be found in the LICENSE file.
4
5module rand
6
7#include <sys/random.h>
8
9fn C.getrandom(p &u8, n usize, flags u32) i32
10
11const read_batch_size = 256
12
13// read returns an array of `bytes_needed` random bytes read from the OS.
14pub fn read(bytes_needed int) ![]u8 {
15 mut buffer := unsafe { malloc_noscan(bytes_needed) }
16 mut bytes_read := 0
17 mut remaining_bytes := bytes_needed
18 // getrandom syscall wont block if requesting <= 256 bytes
19 for bytes_read < bytes_needed {
20 batch_size := if remaining_bytes > read_batch_size {
21 read_batch_size
22 } else {
23 remaining_bytes
24 }
25 rbytes := unsafe { getrandom(batch_size, buffer + bytes_read) }
26 if rbytes == -1 {
27 unsafe { free(buffer) }
28 return &ReadError{}
29 }
30 bytes_read += rbytes
31 remaining_bytes -= rbytes
32 }
33 return unsafe { buffer.vbytes(bytes_needed) }
34}
35
36fn v_getrandom(bytes_needed int, buffer voidptr) int {
37 if bytes_needed > read_batch_size {
38 panic('getrandom() dont request more than ${read_batch_size} bytes at once.')
39 }
40 return C.getrandom(buffer, bytes_needed, 0)
41}
42