Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › crypto/ › argon2.zig › blake2bLong
blake2bLong
argon2.blake2bLong
fn blake2bLong (out : []u8 , in : []const u8 ) void
File
Code
fn blake2bLong (out : []u8 , in : []const u8 ) void {
const H = Blake2b512 ;
var outlen_bytes : [4 ]u8 = undefined ;
mem .writeInt (u32 , &outlen_bytes , @as (u32 , @intCast (out .len )), .little );
var out_buf : [H .digest_length ]u8 = undefined ;
if (out .len <= H .digest_length ) {
var h = H .init (.{ .expected_out_bits = out .len * 8 });
h .update (&outlen_bytes );
h .update (in );
h .final (&out_buf );
@memcpy (out , out_buf [0 ..out .len ]);
return ;
}
var h = H .init (.{});
h .update (&outlen_bytes );
h .update (in );
h .final (&out_buf );
var out_slice = out ;
out_slice [0 .. H .digest_length / 2 ].* = out_buf [0 .. H .digest_length / 2 ].*;
out_slice = out_slice [H .digest_length / 2 ..];
var in_buf : [H .digest_length ]u8 = undefined ;
while (out_slice .len > H .digest_length ) {
in_buf = out_buf ;
H .hash (&in_buf , &out_buf , .{});
out_slice [0 .. H .digest_length / 2 ].* = out_buf [0 .. H .digest_length / 2 ].*;
out_slice = out_slice [H .digest_length / 2 ..];
}
in_buf = out_buf ;
H .hash (&in_buf , &out_buf , .{ .expected_out_bits = out_slice .len * 8 });
@memcpy (out_slice , out_buf [0 ..out_slice .len ]);
}