diff --git a/README.md b/README.md index 492c3c04bb8e6ba75e4e2149855e497df1b92d00..dd6d9d39c7d83775bdb1ed880a9fb1fe0f39bce2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ![loc](https://sloc.xyz/github/nektro/zig-totp) [![license](https://img.shields.io/github/license/nektro/zig-totp.svg)](https://github.com/nektro/zig-totp/blob/master/LICENSE) [![nektro @ github sponsors](https://img.shields.io/badge/sponsors-nektro-purple?logo=github)](https://github.com/sponsors/nektro) -[![Zig](https://img.shields.io/badge/Zig-0.15-f7a41d)](https://ziglang.org/) +[![Zig](https://img.shields.io/badge/Zig-0.16-f7a41d)](https://ziglang.org/) [![Zigmod](https://img.shields.io/badge/Zigmod-latest-f7a41d)](https://github.com/nektro/zigmod) RFC 6238: TOTP: Time-Based One-Time Password Algorithm diff --git a/build.zig b/build.zig index fe5b54594c752343ec4acc64a2db5d0740e36883..691ea5f05fe8afee54f787f133ee48b396977f8f 100644 --- a/build.zig +++ b/build.zig @@ -14,6 +14,7 @@ pub fn build(b: *std.Build) void { }), }); deps.addAllTo(tests); + tests.root_module.link_libc = true; tests.use_llvm = !disable_llvm; tests.use_lld = !disable_llvm; b.getInstallStep().dependOn(&tests.step); diff --git a/totp.zig b/totp.zig index 83f22e500a3662110c3a50942c9286f0540e2656..f862f9a691672748822ed08823a77cafb7b4a398 100644 --- a/totp.zig +++ b/totp.zig @@ -1,6 +1,7 @@ const std = @import("std"); const extras = @import("extras"); const url = @import("url"); +const nio = @import("nio"); pub fn totp(digits: comptime_int, Hash: type, epoch: u64, X: u64, K: *const [Hash.digest_length]u8, time_now_s: u64) [digits]u8 { const T = (time_now_s - epoch) / X; @@ -56,32 +57,32 @@ pub fn generateUrl(allocator: std.mem.Allocator, issuer: []const u8, account: [] std.debug.assert(secret_raw.len <= algo.digest_length()); std.debug.assert(digits == 6 or digits == 7 or digits == 8); std.debug.assert(period == 15 or period == 30 or period == 60); - var list: std.array_list.Managed(u8) = .init(allocator); + var list: nio.AllocatingWriter = .init(allocator); errdefer list.deinit(); - try list.appendSlice("otpauth://"); - try list.appendSlice("totp/"); + try list.writeAll("otpauth://"); + try list.writeAll("totp/"); try url.percentEncodeAL(&list, issuer, url.is_path_percent_char); - try list.append(':'); + try list.writeAll(":"); try url.percentEncodeAL(&list, account, url.is_path_percent_char); - try list.appendSlice("?secret="); + try list.writeAll("?secret="); try encodeBase32(&list, secret_raw); - try list.appendSlice("&algorithm="); - try list.appendSlice(@tagName(algo)); - try list.appendSlice("&digits="); - try list.writer().print("{d}", .{digits}); - try list.appendSlice("&period="); - try list.writer().print("{d}", .{period}); - try list.appendSlice("&issuer="); + try list.writeAll("&algorithm="); + try list.writeAll(@tagName(algo)); + try list.writeAll("&digits="); + try list.print("{d}", .{digits}); + try list.writeAll("&period="); + try list.print("{d}", .{period}); + try list.writeAll("&issuer="); try url.percentEncodeAL(&list, issuer, url.is_query_percent_char); return list.toOwnedSlice(); } // RFC3548 base32 // input.len is gonna be 64 | 32 | 64 -fn encodeBase32(list: *std.array_list.Managed(u8), input: []const u8) !void { +fn encodeBase32(list: *nio.AllocatingWriter, input: []const u8) !void { const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; var iter = BufBiterator.init(input); - while (iter.nextInt(u5)) |idx| try list.append(alphabet[idx]); + while (iter.nextInt(u5)) |idx| try list.writeAll(alphabet[idx..][0..1]); } const BufBiterator = struct { diff --git a/zigmod.yml b/zigmod.yml index df50742a403c0363841b77dc83cb4565218d95f6..583ef4e16e89fbe1c221d01f162ee45357c1e8c9 100644 --- a/zigmod.yml +++ b/zigmod.yml @@ -6,6 +6,7 @@ description: "RFC 6238: TOTP: Time-Based One-Time Password Algorithm" dependencies: - src: git https://github.com/nektro/zig-extras - src: git https://github.com/nektro/zig-whatwg-url + - src: git https://github.com/nektro/zig-nio root_dependencies: - src: git https://github.com/nektro/zig-extras - src: git https://github.com/nektro/zig-expect