authorgravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2022-11-03 13:10:08+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-09 13:46:46-07:00
log72199c26b90aa8b31f2a70a5c7b3b8d443feef0b
tree31d77f0b6ae64a5f846d8529be8f994c381e1817
parentab4b538d91a586244bd4207088e4e9da6c75a5a9

std.crypto.pwhash.bcrypt: inline the Feistel network function (#13416)

std/crypto/benchmark.zig results: * Intel i5 before: 3.144 s/ops after: 1.922 s/ops * Apple M1 before: 2.067 s/ops after: 1.373 s/ops

1 files changed, 7 insertions(+), 11 deletions(-)

lib/std/crypto/bcrypt.zig+7-11
......@@ -374,22 +374,18 @@ pub const State = struct {
374374
375375 const Halves = struct { l: u32, r: u32 };
376376
377 fn feistelF(state: State, x: u32) u32 {
378 var r = state.sboxes[0][@truncate(u8, x >> 24)];
379 r +%= state.sboxes[1][@truncate(u8, x >> 16)];
380 r ^= state.sboxes[2][@truncate(u8, x >> 8)];
381 r +%= state.sboxes[3][@truncate(u8, x)];
382 return r;
383 }
384
385377 fn halfRound(state: State, i: u32, j: u32, n: usize) u32 {
386 return i ^ state.feistelF(j) ^ state.subkeys[n];
378 var r = state.sboxes[0][@truncate(u8, j >> 24)];
379 r +%= state.sboxes[1][@truncate(u8, j >> 16)];
380 r ^= state.sboxes[2][@truncate(u8, j >> 8)];
381 r +%= state.sboxes[3][@truncate(u8, j)];
382 return i ^ r ^ state.subkeys[n];
387383 }
388384
389385 fn encipher(state: State, halves: *Halves) void {
390386 halves.l ^= state.subkeys[0];
391 var i: usize = 1;
392 while (i < 16) : (i += 2) {
387 comptime var i = 1;
388 inline while (i < 16) : (i += 2) {
393389 halves.r = state.halfRound(halves.r, halves.l, i);
394390 halves.l = state.halfRound(halves.l, halves.r, i + 1);
395391 }