diff --git a/lib/std/crypto.zig b/lib/std/crypto.zig index 38a825654d006f920c9e11581fbd6e12b3d7d354..1a839f0c94ee24ea58f6e2a521f57649dba1bf59 100644 --- a/lib/std/crypto.zig +++ b/lib/std/crypto.zig @@ -302,6 +302,7 @@ test { _ = core.aes; _ = core.keccak; _ = core.Ascon; + _ = core.keccak; _ = core.modes; _ = dh.X25519; diff --git a/lib/std/crypto/keccak_p.zig b/lib/std/crypto/keccak_p.zig index 9164ba48bab7b6776ac8a4ab7f79d28b492c8120..fdcb993c96edf161e8c42580cd5545611451689b 100644 --- a/lib/std/crypto/keccak_p.zig +++ b/lib/std/crypto/keccak_p.zig @@ -78,7 +78,7 @@ pub fn KeccakF(comptime f: u11) type { /// XOR a byte into the state at a given offset. pub fn addByte(self: *Self, byte: u8, offset: usize) void { - const z = @sizeOf(T) * @as(math.Log2Int(T), @truncate(offset % @sizeOf(T))); + const z: math.Log2Int(T) = @intCast(8 * (offset % @sizeOf(T))); self.st[offset / @sizeOf(T)] ^= @as(T, byte) << z; } @@ -382,6 +382,21 @@ test "Keccak-f800" { try std.testing.expectEqualSlices(u32, &st.st, &expected); } +test "addByte" { + inline for (.{ 200, 400, 800, 1600 }) |f| { + const F = KeccakF(f); + for (0..F.block_bytes) |offset| { + var a: F = .{}; + a.addByte(0xa5, offset); + var bytes: [F.block_bytes]u8 = @splat(0); + bytes[offset] = 0xa5; + var b: F = .{}; + b.addBytes(&bytes); + try std.testing.expectEqual(b.st, a.st); + } + } +} + test "squeeze" { var st: State(800, 256, 22) = .init(@splat(0x80), 0x01);