use Security.framework with SecRandomCopyBytes for rand_bytes on darwin

This commit is contained in:
Laytan Laats
2023-12-03 20:43:46 +01:00
parent 3bc172c70b
commit 91cf0826c1
3 changed files with 36 additions and 1 deletions

View File

@@ -0,0 +1,11 @@
package crypto
import "core:fmt"
import "core:sys/darwin"
_rand_bytes :: proc(dst: []byte) {
res := darwin.SecRandomCopyBytes(count=len(dst), bytes=raw_data(dst))
if res != .Success {
panic(fmt.tprintf("crypto/rand_bytes: SecRandomCopyBytes returned non-zero result: %v", res))
}
}

View File

@@ -1,4 +1,4 @@
//+build freebsd, openbsd, darwin
//+build freebsd, openbsd
package crypto
foreign import libc "system:c"

View File

@@ -0,0 +1,24 @@
//+build darwin
package darwin
foreign import security "system:Security.framework"
// A reference to a random number generator.
SecRandomRef :: distinct rawptr
OSStatus :: distinct i32
errSec :: enum OSStatus {
Success = 0, // No error.
Unimplemented = -4, // Function or operation not implemented.
// Many more...
}
foreign security {
// Synonym for nil, uses a cryptographically secure random number generator.
kSecRandomDefault: SecRandomRef
// Generates an array of cryptographically secure random bytes.
SecRandomCopyBytes :: proc(rnd: SecRandomRef = kSecRandomDefault, count: uint, bytes: [^]byte) -> errSec ---
}