Răsfoiți Sursa

use `Security.framework` with `SecRandomCopyBytes` for rand_bytes on darwin

Laytan Laats 1 an în urmă
părinte
comite
91cf0826c1

+ 11 - 0
core/crypto/rand_darwin.odin

@@ -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))
+	}
+}

+ 1 - 1
core/crypto/rand_darwin_and_bsd.odin

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

+ 24 - 0
core/sys/darwin/security.odin

@@ -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 ---
+}