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/ › ml_kem.zig › NistDRBG
NistDRBG
ml_kem.NistDRBG
const NistDRBG = struct
File
Code
const NistDRBG = struct {
key : [32 ]u8 ,
v : [16 ]u8 ,
fn incV (g : *NistDRBG ) void {
const val = std .mem .readInt (u128 , &g .v , .big );
std .mem .writeInt (u128 , &g .v , val +% 1 , .big );
}
fn update (g : *NistDRBG , pd : ?[48 ]u8 ) void {
var buf : [48 ]u8 = undefined ;
const ctx = crypto .core .aes .Aes256 .initEnc (g .key );
var i : usize = 0 ;
while (i < 3 ) : (i += 1 ) {
g .incV ();
var block : [16 ]u8 = undefined ;
ctx .encrypt (&block , &g .v );
buf [i * 16 ..][0 ..16 ].* = block ;
}
if (pd ) |p | {
for (&buf , p ) |*b , x | {
b .* ^= x ;
}
}
g .key = buf [0 ..32 ].*;
g .v = buf [32 ..48 ].*;
}
fn fill (g : *NistDRBG , out : []u8 ) void {
var block : [16 ]u8 = undefined ;
var dst = out ;
const ctx = crypto .core .aes .Aes256 .initEnc (g .key );
while (dst .len > 0 ) {
g .incV ();
ctx .encrypt (&block , &g .v );
if (dst .len < 16 ) {
@memcpy (dst , block [0 ..dst .len ]);
break ;
}
dst [0 ..block .len ].* = block ;
dst = dst [16 ..dst .len ];
}
g .update (null );
}
fn init (seed : [48 ]u8 ) NistDRBG {
var ret : NistDRBG = .{ .key = @splat (0 ), .v = @splat (0 ) };
ret .update (seed );
return ret ;
}
}