From c579a23c5d997964a67883db5677c290bdbd7da6 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sun, 16 Apr 2023 13:27:38 +0100 Subject: [PATCH 1/2] std: add CCRandomGenerateBytes macOs native api. --- lib/std/c/darwin.zig | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/std/c/darwin.zig b/lib/std/c/darwin.zig index a46337b721..4ede0b3891 100644 --- a/lib/std/c/darwin.zig +++ b/lib/std/c/darwin.zig @@ -897,7 +897,35 @@ pub extern "c" fn pthread_attr_get_qos_class_np(attr: *pthread_attr_t, qos_class pub extern "c" fn pthread_set_qos_class_self_np(qos_class: qos_class_t, relative_priority: c_int) c_int; pub extern "c" fn pthread_get_qos_class_np(pthread: std.c.pthread_t, qos_class: *qos_class_t, relative_priority: *c_int) c_int; +pub const CCryptorStatus = enum(i32) { + /// Operation completed + kCCSuccess = 0, + /// Illegal parameter + kCCParamError = -4300, + /// Provided buffer too small + kCCBufferTooSmall = -4301, + /// Failed memory allocation + kCCMemoryFailure = -4302, + /// Size alignment issue + kCCAlignmentError = -4303, + /// Decoding issue + kCCDecodeError = -4304, + /// Call not implemented + kCCUnimplemented = -4305, + kCCOverflow = -4306, + kCCRNGFailure = -4307, + /// Unspecified error + kCCUnspecifiedError = -4308, + kCCCallSequenceError = -4309, + kCCKeySizeError = -4310, + /// Invalid key + kCCInvalidKey = -4311, +}; + +pub const CCRNGStatus = CCryptorStatus; + pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void; +pub extern "c" fn CCRandomGenerateBytes(bytes: ?*anyopaque, count: usize) CCRNGStatus; // Grand Central Dispatch is exposed by libSystem. pub extern "c" fn dispatch_release(object: *anyopaque) void; From 6248ac535b9bfc7113101c1ff0f0bb1e41c394d4 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sun, 16 Apr 2023 15:49:42 +0100 Subject: [PATCH 2/2] os: getrandom wrapper favoring it for macOs/iOs only --- lib/std/os.zig | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/std/os.zig b/lib/std/os.zig index 13b0c62455..c2591ac355 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -512,7 +512,18 @@ pub fn getrandom(buffer: []u8) GetRandomError!void { return; } switch (builtin.os.tag) { - .netbsd, .openbsd, .macos, .ios, .tvos, .watchos => { + .macos, .ios => { + const rc = darwin.CCRandomGenerateBytes(buffer.ptr, buffer.len); + if (rc != darwin.CCRNGStatus.kCCSuccess) { + if (rc == darwin.CCRNGStatus.kCCParamError or rc == darwin.CCRNGStatus.kCCBufferTooSmall) { + return error.InvalidHandle; + } else { + return error.SystemResources; + } + } + return; + }, + .netbsd, .openbsd, .tvos, .watchos => { system.arc4random_buf(buffer.ptr, buffer.len); return; }, @@ -991,7 +1002,7 @@ pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize { if (have_pread_but_not_preadv) { // We could loop here; but proper usage of `preadv` must handle partial reads anyway. // So we simply read into the first vector only. - if (iov.len == 0) return @as(usize, 0); + if (iov.len == 0) return @intCast(usize, 0); const first = iov[0]; return pread(fd, first.iov_base[0..first.iov_len], offset); }