// ============================================================================= // Std::Crypto::Random — cryptographically secure random bytes // ============================================================================= module Std::Crypto::Random { import Std::Mem::{Alloc, Free}; extern func bux_random_bytes(buf: *void, len: int) -> int; extern func bux_base64_encode(data: String, len: int) -> String; extern func bux_bytes_to_hex(data: *void, len: int) -> String; // RandomBytes: returns n cryptographically secure random bytes as a raw string func Random_Bytes(n: int) -> String { if n <= 0 { return ""; } let buf: *void = Alloc(n as uint); if bux_random_bytes(buf, n) != 1 { Free(buf); return ""; } // Return raw buffer as string (binary-safe) return buf as String; } // RandomHex: returns n random bytes as lowercase hex func Random_Hex(n: int) -> String { if n <= 0 { return ""; } let buf: *void = Alloc(n as uint); if bux_random_bytes(buf, n) != 1 { Free(buf); return ""; } let result: String = bux_bytes_to_hex(buf, n); Free(buf); return result; } // RandomBase64: returns n random bytes as base64-encoded string func Random_Base64(n: int) -> String { if n <= 0 { return ""; } let buf: *void = Alloc(n as uint); if bux_random_bytes(buf, n) != 1 { Free(buf); return ""; } let result: String = bux_base64_encode(buf as String, n); Free(buf); return result; } // RandomUint32: returns a random 32-bit unsigned integer func Random_Uint32() -> uint { let buf: *void = Alloc(4); if bux_random_bytes(buf, 4) != 1 { Free(buf); return 0; } // Interpret first 4 bytes as uint (native endian) let ptr: *uint = buf as *uint; let val: uint = *ptr; Free(buf); return val; } }