Skip to main content
Module

std/hash/_sha3/keccakf.ts

Deno standard library
Go to Latest
File
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
// Ported from Go:// https://github.com/golang/crypto/blob/master/sha3/keccakf.go// Copyright 2011 The Go Authors. All rights reserved. BSD license.// https://github.com/golang/go/blob/master/LICENSE// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.// This module is browser compatible.
const KECCAK_ROUNDS = 24;const KECCAK_RC: number[] = [ 0x1, 0x0, 0x8082, 0x0, 0x808a, 0x80000000, 0x80008000, 0x80000000, 0x808b, 0x0, 0x80000001, 0x0, 0x80008081, 0x80000000, 0x8009, 0x80000000, 0x8a, 0x0, 0x88, 0x0, 0x80008009, 0x0, 0x8000000a, 0x0, 0x8000808b, 0x0, 0x8b, 0x80000000, 0x8089, 0x80000000, 0x8003, 0x80000000, 0x8002, 0x80000000, 0x80, 0x80000000, 0x800a, 0x0, 0x8000000a, 0x80000000, 0x80008081, 0x80000000, 0x8080, 0x80000000, 0x80000001, 0x0, 0x80008008, 0x80000000,];
/** keccak1600 permutation function */export function keccakf(state: Uint8Array): void { const s = new Uint32Array(state.buffer); let bc0 = 0; let bc1 = 0; let bc2 = 0; let bc3 = 0; let bc4 = 0; let bc5 = 0; let bc6 = 0; let bc7 = 0; let bc8 = 0; let bc9 = 0; let d0 = 0; let d1 = 0; let d2 = 0; let d3 = 0; let d4 = 0; let d5 = 0; let d6 = 0; let d7 = 0; let d8 = 0; let d9 = 0; let t0 = 0; let t1 = 0;
for (let n = 0; n < KECCAK_ROUNDS * 2; n += 8) { // Round 1 bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31)); d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31)); d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31)); d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31)); d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31)); d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31)); d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31)); d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31)); d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31)); d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
bc0 = s[0] ^ d0; bc1 = s[1] ^ d1; t0 = s[12] ^ d2; t1 = s[13] ^ d3; bc2 = (t1 << 12) | (t0 >>> 20); bc3 = (t0 << 12) | (t1 >>> 20); t0 = s[24] ^ d4; t1 = s[25] ^ d5; bc4 = (t1 << 11) | (t0 >>> 21); bc5 = (t0 << 11) | (t1 >>> 21); t0 = s[36] ^ d6; t1 = s[37] ^ d7; bc6 = (t0 << 21) | (t1 >>> 11); bc7 = (t1 << 21) | (t0 >>> 11); t0 = s[48] ^ d8; t1 = s[49] ^ d9; bc8 = (t0 << 14) | (t1 >>> 18); bc9 = (t1 << 14) | (t0 >>> 18); s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n]; s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 1]; s[12] = bc2 ^ (bc6 & ~bc4); s[13] = bc3 ^ (bc7 & ~bc5); s[24] = bc4 ^ (bc8 & ~bc6); s[25] = bc5 ^ (bc9 & ~bc7); s[36] = bc6 ^ (bc0 & ~bc8); s[37] = bc7 ^ (bc1 & ~bc9); s[48] = bc8 ^ (bc2 & ~bc0); s[49] = bc9 ^ (bc3 & ~bc1);
t0 = s[20] ^ d0; t1 = s[21] ^ d1; bc4 = (t0 << 3) | (t1 >>> 29); bc5 = (t1 << 3) | (t0 >>> 29); t0 = s[32] ^ d2; t1 = s[33] ^ d3; bc6 = (t1 << 13) | (t0 >>> 19); bc7 = (t0 << 13) | (t1 >>> 19); t0 = s[44] ^ d4; t1 = s[45] ^ d5; bc8 = (t1 << 29) | (t0 >>> 3); bc9 = (t0 << 29) | (t1 >>> 3); t0 = s[6] ^ d6; t1 = s[7] ^ d7; bc0 = (t0 << 28) | (t1 >>> 4); bc1 = (t1 << 28) | (t0 >>> 4); t0 = s[18] ^ d8; t1 = s[19] ^ d9; bc2 = (t0 << 20) | (t1 >>> 12); bc3 = (t1 << 20) | (t0 >>> 12); s[20] = bc0 ^ (bc4 & ~bc2); s[21] = bc1 ^ (bc5 & ~bc3); s[32] = bc2 ^ (bc6 & ~bc4); s[33] = bc3 ^ (bc7 & ~bc5); s[44] = bc4 ^ (bc8 & ~bc6); s[45] = bc5 ^ (bc9 & ~bc7); s[6] = bc6 ^ (bc0 & ~bc8); s[7] = bc7 ^ (bc1 & ~bc9); s[18] = bc8 ^ (bc2 & ~bc0); s[19] = bc9 ^ (bc3 & ~bc1);
t0 = s[40] ^ d0; t1 = s[41] ^ d1; bc8 = (t0 << 18) | (t1 >>> 14); bc9 = (t1 << 18) | (t0 >>> 14); t0 = s[2] ^ d2; t1 = s[3] ^ d3; bc0 = (t0 << 1) | (t1 >>> 31); bc1 = (t1 << 1) | (t0 >>> 31); t0 = s[14] ^ d4; t1 = s[15] ^ d5; bc2 = (t0 << 6) | (t1 >>> 26); bc3 = (t1 << 6) | (t0 >>> 26); t0 = s[26] ^ d6; t1 = s[27] ^ d7; bc4 = (t0 << 25) | (t1 >>> 7); bc5 = (t1 << 25) | (t0 >>> 7); t0 = s[38] ^ d8; t1 = s[39] ^ d9; bc6 = (t0 << 8) | (t1 >>> 24); bc7 = (t1 << 8) | (t0 >>> 24); s[40] = bc0 ^ (bc4 & ~bc2); s[41] = bc1 ^ (bc5 & ~bc3); s[2] = bc2 ^ (bc6 & ~bc4); s[3] = bc3 ^ (bc7 & ~bc5); s[14] = bc4 ^ (bc8 & ~bc6); s[15] = bc5 ^ (bc9 & ~bc7); s[26] = bc6 ^ (bc0 & ~bc8); s[27] = bc7 ^ (bc1 & ~bc9); s[38] = bc8 ^ (bc2 & ~bc0); s[39] = bc9 ^ (bc3 & ~bc1);
t0 = s[10] ^ d0; t1 = s[11] ^ d1; bc2 = (t1 << 4) | (t0 >>> 28); bc3 = (t0 << 4) | (t1 >>> 28); t0 = s[22] ^ d2; t1 = s[23] ^ d3; bc4 = (t0 << 10) | (t1 >>> 22); bc5 = (t1 << 10) | (t0 >>> 22); t0 = s[34] ^ d4; t1 = s[35] ^ d5; bc6 = (t0 << 15) | (t1 >>> 17); bc7 = (t1 << 15) | (t0 >>> 17); t0 = s[46] ^ d6; t1 = s[47] ^ d7; bc8 = (t1 << 24) | (t0 >>> 8); bc9 = (t0 << 24) | (t1 >>> 8); t0 = s[8] ^ d8; t1 = s[9] ^ d9; bc0 = (t0 << 27) | (t1 >>> 5); bc1 = (t1 << 27) | (t0 >>> 5); s[10] = bc0 ^ (bc4 & ~bc2); s[11] = bc1 ^ (bc5 & ~bc3); s[22] = bc2 ^ (bc6 & ~bc4); s[23] = bc3 ^ (bc7 & ~bc5); s[34] = bc4 ^ (bc8 & ~bc6); s[35] = bc5 ^ (bc9 & ~bc7); s[46] = bc6 ^ (bc0 & ~bc8); s[47] = bc7 ^ (bc1 & ~bc9); s[8] = bc8 ^ (bc2 & ~bc0); s[9] = bc9 ^ (bc3 & ~bc1);
t0 = s[30] ^ d0; t1 = s[31] ^ d1; bc6 = (t1 << 9) | (t0 >>> 23); bc7 = (t0 << 9) | (t1 >>> 23); t0 = s[42] ^ d2; t1 = s[43] ^ d3; bc8 = (t0 << 2) | (t1 >>> 30); bc9 = (t1 << 2) | (t0 >>> 30); t0 = s[4] ^ d4; t1 = s[5] ^ d5; bc0 = (t1 << 30) | (t0 >>> 2); bc1 = (t0 << 30) | (t1 >>> 2); t0 = s[16] ^ d6; t1 = s[17] ^ d7; bc2 = (t1 << 23) | (t0 >>> 9); bc3 = (t0 << 23) | (t1 >>> 9); t0 = s[28] ^ d8; t1 = s[29] ^ d9; bc4 = (t1 << 7) | (t0 >>> 25); bc5 = (t0 << 7) | (t1 >>> 25); s[30] = bc0 ^ (bc4 & ~bc2); s[31] = bc1 ^ (bc5 & ~bc3); s[42] = bc2 ^ (bc6 & ~bc4); s[43] = bc3 ^ (bc7 & ~bc5); s[4] = bc4 ^ (bc8 & ~bc6); s[5] = bc5 ^ (bc9 & ~bc7); s[16] = bc6 ^ (bc0 & ~bc8); s[17] = bc7 ^ (bc1 & ~bc9); s[28] = bc8 ^ (bc2 & ~bc0); s[29] = bc9 ^ (bc3 & ~bc1);
// Round 2 bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31)); d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31)); d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31)); d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31)); d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31)); d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31)); d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31)); d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31)); d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31)); d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
bc0 = s[0] ^ d0; bc1 = s[1] ^ d1; t0 = s[32] ^ d2; t1 = s[33] ^ d3; bc2 = (t1 << 12) | (t0 >>> 20); bc3 = (t0 << 12) | (t1 >>> 20); t0 = s[14] ^ d4; t1 = s[15] ^ d5; bc4 = (t1 << 11) | (t0 >>> 21); bc5 = (t0 << 11) | (t1 >>> 21); t0 = s[46] ^ d6; t1 = s[47] ^ d7; bc6 = (t0 << 21) | (t1 >>> 11); bc7 = (t1 << 21) | (t0 >>> 11); t0 = s[28] ^ d8; t1 = s[29] ^ d9; bc8 = (t0 << 14) | (t1 >>> 18); bc9 = (t1 << 14) | (t0 >>> 18); s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n + 2]; s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 3]; s[32] = bc2 ^ (bc6 & ~bc4); s[33] = bc3 ^ (bc7 & ~bc5); s[14] = bc4 ^ (bc8 & ~bc6); s[15] = bc5 ^ (bc9 & ~bc7); s[46] = bc6 ^ (bc0 & ~bc8); s[47] = bc7 ^ (bc1 & ~bc9); s[28] = bc8 ^ (bc2 & ~bc0); s[29] = bc9 ^ (bc3 & ~bc1);
t0 = s[40] ^ d0; t1 = s[41] ^ d1; bc4 = (t0 << 3) | (t1 >>> 29); bc5 = (t1 << 3) | (t0 >>> 29); t0 = s[22] ^ d2; t1 = s[23] ^ d3; bc6 = (t1 << 13) | (t0 >>> 19); bc7 = (t0 << 13) | (t1 >>> 19); t0 = s[4] ^ d4; t1 = s[5] ^ d5; bc8 = (t1 << 29) | (t0 >>> 3); bc9 = (t0 << 29) | (t1 >>> 3); t0 = s[36] ^ d6; t1 = s[37] ^ d7; bc0 = (t0 << 28) | (t1 >>> 4); bc1 = (t1 << 28) | (t0 >>> 4); t0 = s[18] ^ d8; t1 = s[19] ^ d9; bc2 = (t0 << 20) | (t1 >>> 12); bc3 = (t1 << 20) | (t0 >>> 12); s[40] = bc0 ^ (bc4 & ~bc2); s[41] = bc1 ^ (bc5 & ~bc3); s[22] = bc2 ^ (bc6 & ~bc4); s[23] = bc3 ^ (bc7 & ~bc5); s[4] = bc4 ^ (bc8 & ~bc6); s[5] = bc5 ^ (bc9 & ~bc7); s[36] = bc6 ^ (bc0 & ~bc8); s[37] = bc7 ^ (bc1 & ~bc9); s[18] = bc8 ^ (bc2 & ~bc0); s[19] = bc9 ^ (bc3 & ~bc1);
t0 = s[30] ^ d0; t1 = s[31] ^ d1; bc8 = (t0 << 18) | (t1 >>> 14); bc9 = (t1 << 18) | (t0 >>> 14); t0 = s[12] ^ d2; t1 = s[13] ^ d3; bc0 = (t0 << 1) | (t1 >>> 31); bc1 = (t1 << 1) | (t0 >>> 31); t0 = s[44] ^ d4; t1 = s[45] ^ d5; bc2 = (t0 << 6) | (t1 >>> 26); bc3 = (t1 << 6) | (t0 >>> 26); t0 = s[26] ^ d6; t1 = s[27] ^ d7; bc4 = (t0 << 25) | (t1 >>> 7); bc5 = (t1 << 25) | (t0 >>> 7); t0 = s[8] ^ d8; t1 = s[9] ^ d9; bc6 = (t0 << 8) | (t1 >>> 24); bc7 = (t1 << 8) | (t0 >>> 24); s[30] = bc0 ^ (bc4 & ~bc2); s[31] = bc1 ^ (bc5 & ~bc3); s[12] = bc2 ^ (bc6 & ~bc4); s[13] = bc3 ^ (bc7 & ~bc5); s[44] = bc4 ^ (bc8 & ~bc6); s[45] = bc5 ^ (bc9 & ~bc7); s[26] = bc6 ^ (bc0 & ~bc8); s[27] = bc7 ^ (bc1 & ~bc9); s[8] = bc8 ^ (bc2 & ~bc0); s[9] = bc9 ^ (bc3 & ~bc1);
t0 = s[20] ^ d0; t1 = s[21] ^ d1; bc2 = (t1 << 4) | (t0 >>> 28); bc3 = (t0 << 4) | (t1 >>> 28); t0 = s[2] ^ d2; t1 = s[3] ^ d3; bc4 = (t0 << 10) | (t1 >>> 22); bc5 = (t1 << 10) | (t0 >>> 22); t0 = s[34] ^ d4; t1 = s[35] ^ d5; bc6 = (t0 << 15) | (t1 >>> 17); bc7 = (t1 << 15) | (t0 >>> 17); t0 = s[16] ^ d6; t1 = s[17] ^ d7; bc8 = (t1 << 24) | (t0 >>> 8); bc9 = (t0 << 24) | (t1 >>> 8); t0 = s[48] ^ d8; t1 = s[49] ^ d9; bc0 = (t0 << 27) | (t1 >>> 5); bc1 = (t1 << 27) | (t0 >>> 5); s[20] = bc0 ^ (bc4 & ~bc2); s[21] = bc1 ^ (bc5 & ~bc3); s[2] = bc2 ^ (bc6 & ~bc4); s[3] = bc3 ^ (bc7 & ~bc5); s[34] = bc4 ^ (bc8 & ~bc6); s[35] = bc5 ^ (bc9 & ~bc7); s[16] = bc6 ^ (bc0 & ~bc8); s[17] = bc7 ^ (bc1 & ~bc9); s[48] = bc8 ^ (bc2 & ~bc0); s[49] = bc9 ^ (bc3 & ~bc1);
t0 = s[10] ^ d0; t1 = s[11] ^ d1; bc6 = (t1 << 9) | (t0 >>> 23); bc7 = (t0 << 9) | (t1 >>> 23); t0 = s[42] ^ d2; t1 = s[43] ^ d3; bc8 = (t0 << 2) | (t1 >>> 30); bc9 = (t1 << 2) | (t0 >>> 30); t0 = s[24] ^ d4; t1 = s[25] ^ d5; bc0 = (t1 << 30) | (t0 >>> 2); bc1 = (t0 << 30) | (t1 >>> 2); t0 = s[6] ^ d6; t1 = s[7] ^ d7; bc2 = (t1 << 23) | (t0 >>> 9); bc3 = (t0 << 23) | (t1 >>> 9); t0 = s[38] ^ d8; t1 = s[39] ^ d9; bc4 = (t1 << 7) | (t0 >>> 25); bc5 = (t0 << 7) | (t1 >>> 25); s[10] = bc0 ^ (bc4 & ~bc2); s[11] = bc1 ^ (bc5 & ~bc3); s[42] = bc2 ^ (bc6 & ~bc4); s[43] = bc3 ^ (bc7 & ~bc5); s[24] = bc4 ^ (bc8 & ~bc6); s[25] = bc5 ^ (bc9 & ~bc7); s[6] = bc6 ^ (bc0 & ~bc8); s[7] = bc7 ^ (bc1 & ~bc9); s[38] = bc8 ^ (bc2 & ~bc0); s[39] = bc9 ^ (bc3 & ~bc1);
// Round 3 bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31)); d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31)); d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31)); d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31)); d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31)); d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31)); d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31)); d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31)); d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31)); d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
bc0 = s[0] ^ d0; bc1 = s[1] ^ d1; t0 = s[22] ^ d2; t1 = s[23] ^ d3; bc2 = (t1 << 12) | (t0 >>> 20); bc3 = (t0 << 12) | (t1 >>> 20); t0 = s[44] ^ d4; t1 = s[45] ^ d5; bc4 = (t1 << 11) | (t0 >>> 21); bc5 = (t0 << 11) | (t1 >>> 21); t0 = s[16] ^ d6; t1 = s[17] ^ d7; bc6 = (t0 << 21) | (t1 >>> 11); bc7 = (t1 << 21) | (t0 >>> 11); t0 = s[38] ^ d8; t1 = s[39] ^ d9; bc8 = (t0 << 14) | (t1 >>> 18); bc9 = (t1 << 14) | (t0 >>> 18); s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n + 4]; s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 5]; s[22] = bc2 ^ (bc6 & ~bc4); s[23] = bc3 ^ (bc7 & ~bc5); s[44] = bc4 ^ (bc8 & ~bc6); s[45] = bc5 ^ (bc9 & ~bc7); s[16] = bc6 ^ (bc0 & ~bc8); s[17] = bc7 ^ (bc1 & ~bc9); s[38] = bc8 ^ (bc2 & ~bc0); s[39] = bc9 ^ (bc3 & ~bc1);
t0 = s[30] ^ d0; t1 = s[31] ^ d1; bc4 = (t0 << 3) | (t1 >>> 29); bc5 = (t1 << 3) | (t0 >>> 29); t0 = s[2] ^ d2; t1 = s[3] ^ d3; bc6 = (t1 << 13) | (t0 >>> 19); bc7 = (t0 << 13) | (t1 >>> 19); t0 = s[24] ^ d4; t1 = s[25] ^ d5; bc8 = (t1 << 29) | (t0 >>> 3); bc9 = (t0 << 29) | (t1 >>> 3); t0 = s[46] ^ d6; t1 = s[47] ^ d7; bc0 = (t0 << 28) | (t1 >>> 4); bc1 = (t1 << 28) | (t0 >>> 4); t0 = s[18] ^ d8; t1 = s[19] ^ d9; bc2 = (t0 << 20) | (t1 >>> 12); bc3 = (t1 << 20) | (t0 >>> 12); s[30] = bc0 ^ (bc4 & ~bc2); s[31] = bc1 ^ (bc5 & ~bc3); s[2] = bc2 ^ (bc6 & ~bc4); s[3] = bc3 ^ (bc7 & ~bc5); s[24] = bc4 ^ (bc8 & ~bc6); s[25] = bc5 ^ (bc9 & ~bc7); s[46] = bc6 ^ (bc0 & ~bc8); s[47] = bc7 ^ (bc1 & ~bc9); s[18] = bc8 ^ (bc2 & ~bc0); s[19] = bc9 ^ (bc3 & ~bc1);
t0 = s[10] ^ d0; t1 = s[11] ^ d1; bc8 = (t0 << 18) | (t1 >>> 14); bc9 = (t1 << 18) | (t0 >>> 14); t0 = s[32] ^ d2; t1 = s[33] ^ d3; bc0 = (t0 << 1) | (t1 >>> 31); bc1 = (t1 << 1) | (t0 >>> 31); t0 = s[4] ^ d4; t1 = s[5] ^ d5; bc2 = (t0 << 6) | (t1 >>> 26); bc3 = (t1 << 6) | (t0 >>> 26); t0 = s[26] ^ d6; t1 = s[27] ^ d7; bc4 = (t0 << 25) | (t1 >>> 7); bc5 = (t1 << 25) | (t0 >>> 7); t0 = s[48] ^ d8; t1 = s[49] ^ d9; bc6 = (t0 << 8) | (t1 >>> 24); bc7 = (t1 << 8) | (t0 >>> 24); s[10] = bc0 ^ (bc4 & ~bc2); s[11] = bc1 ^ (bc5 & ~bc3); s[32] = bc2 ^ (bc6 & ~bc4); s[33] = bc3 ^ (bc7 & ~bc5); s[4] = bc4 ^ (bc8 & ~bc6); s[5] = bc5 ^ (bc9 & ~bc7); s[26] = bc6 ^ (bc0 & ~bc8); s[27] = bc7 ^ (bc1 & ~bc9); s[48] = bc8 ^ (bc2 & ~bc0); s[49] = bc9 ^ (bc3 & ~bc1);
t0 = s[40] ^ d0; t1 = s[41] ^ d1; bc2 = (t1 << 4) | (t0 >>> 28); bc3 = (t0 << 4) | (t1 >>> 28); t0 = s[12] ^ d2; t1 = s[13] ^ d3; bc4 = (t0 << 10) | (t1 >>> 22); bc5 = (t1 << 10) | (t0 >>> 22); t0 = s[34] ^ d4; t1 = s[35] ^ d5; bc6 = (t0 << 15) | (t1 >>> 17); bc7 = (t1 << 15) | (t0 >>> 17); t0 = s[6] ^ d6; t1 = s[7] ^ d7; bc8 = (t1 << 24) | (t0 >>> 8); bc9 = (t0 << 24) | (t1 >>> 8); t0 = s[28] ^ d8; t1 = s[29] ^ d9; bc0 = (t0 << 27) | (t1 >>> 5); bc1 = (t1 << 27) | (t0 >>> 5); s[40] = bc0 ^ (bc4 & ~bc2); s[41] = bc1 ^ (bc5 & ~bc3); s[12] = bc2 ^ (bc6 & ~bc4); s[13] = bc3 ^ (bc7 & ~bc5); s[34] = bc4 ^ (bc8 & ~bc6); s[35] = bc5 ^ (bc9 & ~bc7); s[6] = bc6 ^ (bc0 & ~bc8); s[7] = bc7 ^ (bc1 & ~bc9); s[28] = bc8 ^ (bc2 & ~bc0); s[29] = bc9 ^ (bc3 & ~bc1);
t0 = s[20] ^ d0; t1 = s[21] ^ d1; bc6 = (t1 << 9) | (t0 >>> 23); bc7 = (t0 << 9) | (t1 >>> 23); t0 = s[42] ^ d2; t1 = s[43] ^ d3; bc8 = (t0 << 2) | (t1 >>> 30); bc9 = (t1 << 2) | (t0 >>> 30); t0 = s[14] ^ d4; t1 = s[15] ^ d5; bc0 = (t1 << 30) | (t0 >>> 2); bc1 = (t0 << 30) | (t1 >>> 2); t0 = s[36] ^ d6; t1 = s[37] ^ d7; bc2 = (t1 << 23) | (t0 >>> 9); bc3 = (t0 << 23) | (t1 >>> 9); t0 = s[8] ^ d8; t1 = s[9] ^ d9; bc4 = (t1 << 7) | (t0 >>> 25); bc5 = (t0 << 7) | (t1 >>> 25); s[20] = bc0 ^ (bc4 & ~bc2); s[21] = bc1 ^ (bc5 & ~bc3); s[42] = bc2 ^ (bc6 & ~bc4); s[43] = bc3 ^ (bc7 & ~bc5); s[14] = bc4 ^ (bc8 & ~bc6); s[15] = bc5 ^ (bc9 & ~bc7); s[36] = bc6 ^ (bc0 & ~bc8); s[37] = bc7 ^ (bc1 & ~bc9); s[8] = bc8 ^ (bc2 & ~bc0); s[9] = bc9 ^ (bc3 & ~bc1);
// Round 4 bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31)); d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31)); d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31)); d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31)); d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31)); d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31)); d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31)); d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31)); d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31)); d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
bc0 = s[0] ^ d0; bc1 = s[1] ^ d1; t0 = s[2] ^ d2; t1 = s[3] ^ d3; bc2 = (t1 << 12) | (t0 >>> 20); bc3 = (t0 << 12) | (t1 >>> 20); t0 = s[4] ^ d4; t1 = s[5] ^ d5; bc4 = (t1 << 11) | (t0 >>> 21); bc5 = (t0 << 11) | (t1 >>> 21); t0 = s[6] ^ d6; t1 = s[7] ^ d7; bc6 = (t0 << 21) | (t1 >>> 11); bc7 = (t1 << 21) | (t0 >>> 11); t0 = s[8] ^ d8; t1 = s[9] ^ d9; bc8 = (t0 << 14) | (t1 >>> 18); bc9 = (t1 << 14) | (t0 >>> 18); s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n + 6]; s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 7]; s[2] = bc2 ^ (bc6 & ~bc4); s[3] = bc3 ^ (bc7 & ~bc5); s[4] = bc4 ^ (bc8 & ~bc6); s[5] = bc5 ^ (bc9 & ~bc7); s[6] = bc6 ^ (bc0 & ~bc8); s[7] = bc7 ^ (bc1 & ~bc9); s[8] = bc8 ^ (bc2 & ~bc0); s[9] = bc9 ^ (bc3 & ~bc1);
t0 = s[10] ^ d0; t1 = s[11] ^ d1; bc4 = (t0 << 3) | (t1 >>> 29); bc5 = (t1 << 3) | (t0 >>> 29); t0 = s[12] ^ d2; t1 = s[13] ^ d3; bc6 = (t1 << 13) | (t0 >>> 19); bc7 = (t0 << 13) | (t1 >>> 19); t0 = s[14] ^ d4; t1 = s[15] ^ d5; bc8 = (t1 << 29) | (t0 >>> 3); bc9 = (t0 << 29) | (t1 >>> 3); t0 = s[16] ^ d6; t1 = s[17] ^ d7; bc0 = (t0 << 28) | (t1 >>> 4); bc1 = (t1 << 28) | (t0 >>> 4); t0 = s[18] ^ d8; t1 = s[19] ^ d9; bc2 = (t0 << 20) | (t1 >>> 12); bc3 = (t1 << 20) | (t0 >>> 12); s[10] = bc0 ^ (bc4 & ~bc2); s[11] = bc1 ^ (bc5 & ~bc3); s[12] = bc2 ^ (bc6 & ~bc4); s[13] = bc3 ^ (bc7 & ~bc5); s[14] = bc4 ^ (bc8 & ~bc6); s[15] = bc5 ^ (bc9 & ~bc7); s[16] = bc6 ^ (bc0 & ~bc8); s[17] = bc7 ^ (bc1 & ~bc9); s[18] = bc8 ^ (bc2 & ~bc0); s[19] = bc9 ^ (bc3 & ~bc1);
t0 = s[20] ^ d0; t1 = s[21] ^ d1; bc8 = (t0 << 18) | (t1 >>> 14); bc9 = (t1 << 18) | (t0 >>> 14); t0 = s[22] ^ d2; t1 = s[23] ^ d3; bc0 = (t0 << 1) | (t1 >>> 31); bc1 = (t1 << 1) | (t0 >>> 31); t0 = s[24] ^ d4; t1 = s[25] ^ d5; bc2 = (t0 << 6) | (t1 >>> 26); bc3 = (t1 << 6) | (t0 >>> 26); t0 = s[26] ^ d6; t1 = s[27] ^ d7; bc4 = (t0 << 25) | (t1 >>> 7); bc5 = (t1 << 25) | (t0 >>> 7); t0 = s[28] ^ d8; t1 = s[29] ^ d9; bc6 = (t0 << 8) | (t1 >>> 24); bc7 = (t1 << 8) | (t0 >>> 24); s[20] = bc0 ^ (bc4 & ~bc2); s[21] = bc1 ^ (bc5 & ~bc3); s[22] = bc2 ^ (bc6 & ~bc4); s[23] = bc3 ^ (bc7 & ~bc5); s[24] = bc4 ^ (bc8 & ~bc6); s[25] = bc5 ^ (bc9 & ~bc7); s[26] = bc6 ^ (bc0 & ~bc8); s[27] = bc7 ^ (bc1 & ~bc9); s[28] = bc8 ^ (bc2 & ~bc0); s[29] = bc9 ^ (bc3 & ~bc1);
t0 = s[30] ^ d0; t1 = s[31] ^ d1; bc2 = (t1 << 4) | (t0 >>> 28); bc3 = (t0 << 4) | (t1 >>> 28); t0 = s[32] ^ d2; t1 = s[33] ^ d3; bc4 = (t0 << 10) | (t1 >>> 22); bc5 = (t1 << 10) | (t0 >>> 22); t0 = s[34] ^ d4; t1 = s[35] ^ d5; bc6 = (t0 << 15) | (t1 >>> 17); bc7 = (t1 << 15) | (t0 >>> 17); t0 = s[36] ^ d6; t1 = s[37] ^ d7; bc8 = (t1 << 24) | (t0 >>> 8); bc9 = (t0 << 24) | (t1 >>> 8); t0 = s[38] ^ d8; t1 = s[39] ^ d9; bc0 = (t0 << 27) | (t1 >>> 5); bc1 = (t1 << 27) | (t0 >>> 5); s[30] = bc0 ^ (bc4 & ~bc2); s[31] = bc1 ^ (bc5 & ~bc3); s[32] = bc2 ^ (bc6 & ~bc4); s[33] = bc3 ^ (bc7 & ~bc5); s[34] = bc4 ^ (bc8 & ~bc6); s[35] = bc5 ^ (bc9 & ~bc7); s[36] = bc6 ^ (bc0 & ~bc8); s[37] = bc7 ^ (bc1 & ~bc9); s[38] = bc8 ^ (bc2 & ~bc0); s[39] = bc9 ^ (bc3 & ~bc1);
t0 = s[40] ^ d0; t1 = s[41] ^ d1; bc6 = (t1 << 9) | (t0 >>> 23); bc7 = (t0 << 9) | (t1 >>> 23); t0 = s[42] ^ d2; t1 = s[43] ^ d3; bc8 = (t0 << 2) | (t1 >>> 30); bc9 = (t1 << 2) | (t0 >>> 30); t0 = s[44] ^ d4; t1 = s[45] ^ d5; bc0 = (t1 << 30) | (t0 >>> 2); bc1 = (t0 << 30) | (t1 >>> 2); t0 = s[46] ^ d6; t1 = s[47] ^ d7; bc2 = (t1 << 23) | (t0 >>> 9); bc3 = (t0 << 23) | (t1 >>> 9); t0 = s[48] ^ d8; t1 = s[49] ^ d9; bc4 = (t1 << 7) | (t0 >>> 25); bc5 = (t0 << 7) | (t1 >>> 25); s[40] = bc0 ^ (bc4 & ~bc2); s[41] = bc1 ^ (bc5 & ~bc3); s[42] = bc2 ^ (bc6 & ~bc4); s[43] = bc3 ^ (bc7 & ~bc5); s[44] = bc4 ^ (bc8 & ~bc6); s[45] = bc5 ^ (bc9 & ~bc7); s[46] = bc6 ^ (bc0 & ~bc8); s[47] = bc7 ^ (bc1 & ~bc9); s[48] = bc8 ^ (bc2 & ~bc0); s[49] = bc9 ^ (bc3 & ~bc1); }}