use crate::{common::common::QRC_SYSTEM_IS_LITTLE_ENDIAN, tools::intutils::{qrc_intutils_be16to8, qrc_intutils_be8to64, qrc_intutils_clear64, qrc_intutils_clear8, qrc_intutils_copy64, qrc_intutils_copy8, qrc_intutils_le64to8, qrc_intutils_le8to64, qrc_intutils_min, qrc_intutils_rotl64, qrc_intutils_transform_64to8, qrc_intutils_transform_8to64, qrc_intutils_xor}};
use core::{mem::size_of, default::Default};
pub const QRC_KECCAK_CSHAKE_DOMAIN_ID: u8 = 0x04;
pub const QRC_KECCAK_KMAC_DOMAIN_ID: u8 = 0x04;
pub const QRC_KECCAK_KPA_DOMAIN_ID: u8 = 0x41;
pub const QRC_KECCAK_PERMUTATION_ROUNDS: usize = 24;
pub const QRC_KECCAK_PERMUTATION_MAX_ROUNDS: usize = 48;
pub const QRC_KECCAK_PERMUTATION_MIN_ROUNDS: usize = 12;
pub const QRC_KECCAK_SHA3_DOMAIN_ID: u8 = 0x06;
pub const QRC_KECCAK_SHAKE_DOMAIN_ID: u8 = 0x1F;
pub const QRC_KECCAK_128_RATE: usize = 168;
pub const QRC_KECCAK_256_RATE: usize = 136;
pub const QRC_SHAKE_256_RATE: usize = 136;
pub const QRC_KECCAK_512_RATE: usize = 72;
pub const QRC_KECCAK_STATE_SIZE: usize = 25;
pub const QRC_SHAKE_512_RATE: usize = 72;
pub const QRC_SHAKE_STATE_SIZE: usize = 25;
pub const QRC_KECCAK_STATE_BYTE_SIZE: usize = 200;
pub const QRC_KMAC_256_KEY_SIZE: usize = 32;
pub const QRC_KMAC_512_KEY_SIZE: usize = 64;
pub const QRC_SHA3_128_HASH_SIZE: usize = 16;
pub const QRC_SHA3_256_HASH_SIZE: usize = 32;
pub const QRC_SHA3_512_HASH_SIZE: usize = 64;
pub const QRC_SHAKE_256_KEY_SIZE: usize = 32;
pub const QRC_SHAKE512_KEY_SIZE: usize = 64;
#[derive(PartialEq, Clone)]
pub struct QrcKeccakState {
pub state: [u64; QRC_KECCAK_STATE_SIZE],
pub buffer: [u8; QRC_KECCAK_STATE_BYTE_SIZE],
pub position: usize,
}
impl Default for QrcKeccakState {
fn default() -> Self {
Self {
state: [Default::default(); QRC_KECCAK_STATE_SIZE],
buffer: [Default::default(); QRC_KECCAK_STATE_BYTE_SIZE],
position: Default::default(),
}
}
}
#[derive(Clone, Copy, PartialEq)]
pub enum QrcKeccakRate {
QrcKeccakRateNone = 0,
QrcKeccakRate128 = QRC_KECCAK_128_RATE as isize,
QrcKeccakRate256 = QRC_KECCAK_256_RATE as isize,
QrcKeccakRate512 = QRC_KECCAK_512_RATE as isize,
}
pub fn qrc_keccak_absorb(ctx: &mut QrcKeccakState, rate: usize, mut message: &[u8], mut msglen: usize, domain: u8, rounds: usize) {
if !message.is_empty() {
let msg = &mut [0u8; QRC_KECCAK_STATE_BYTE_SIZE];
while msglen >= rate {
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
let mut state_slice = qrc_intutils_transform_64to8(&mut ctx.state);
qrc_intutils_xor(&mut state_slice, message, rate);
qrc_intutils_copy64(&mut ctx.state, &qrc_intutils_transform_8to64(&state_slice), QRC_KECCAK_STATE_SIZE);
} else {
for i in 0..(rate/size_of::<u64>()) {
ctx.state[i] ^= qrc_intutils_le8to64(&message[(size_of::<u64>() * i)..]);
}
}
qrc_keccak_permute(ctx, rounds, false);
msglen -= rate;
message = &message[rate..];
}
qrc_intutils_copy8(msg, message, msglen);
msg[msglen] = domain;
qrc_intutils_clear8(&mut msg[(msglen + 1)..], 200-(msglen + 1));
msg[rate - 1] |= 128;
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
let mut state_slice = qrc_intutils_transform_64to8(&mut ctx.state);
qrc_intutils_xor(&mut state_slice, msg, rate);
qrc_intutils_copy64(&mut ctx.state, &qrc_intutils_transform_8to64(&state_slice), QRC_KECCAK_STATE_SIZE);
} else {
for i in 0..(rate/8) {
ctx.state[i] ^= qrc_intutils_le8to64(&msg[(8 * i)..]);
}
}
}
}
pub fn qrc_keccak_absorb_custom(ctx: &mut QrcKeccakState, rate: usize, custom: &[u8], custlen: usize, name: &[u8], namelen: usize, rounds: usize) {
let pad = &mut [0u8; QRC_KECCAK_STATE_BYTE_SIZE];
let mut oft: usize = keccak_left_encode(pad, rate);
oft += keccak_left_encode(&mut pad[oft..], namelen * 8);
if !name.is_empty() {
for i in 0..namelen {
if oft == rate {
keccak_fast_absorb(&mut ctx.state, pad, rate);
qrc_keccak_permute(ctx, rounds, false);
oft = 0;
}
pad[oft] = name[i];
oft = oft + 1;
}
}
oft = oft + keccak_left_encode(&mut pad[oft..], custlen * 8);
if !custom.is_empty() {
for i in 0..custlen {
if oft == rate {
keccak_fast_absorb(&mut ctx.state, pad, rate);
qrc_keccak_permute(ctx, rounds, false);
oft = 0;
}
pad[oft] = custom[i];
oft = oft + 1;
}
}
qrc_intutils_clear8(&mut pad[oft..], 200-oft);
keccak_fast_absorb(&mut ctx.state, pad, rate);
qrc_keccak_permute(ctx, rounds, false);
}
pub fn qrc_keccak_absorb_key_custom(ctx: &mut QrcKeccakState, rate: usize, key: &[u8], keylen: usize, custom: &[u8], custlen: usize, name: &[u8], namelen: usize, rounds: usize) {
let pad = &mut [0u8; QRC_KECCAK_STATE_BYTE_SIZE];
qrc_intutils_clear64(&mut ctx.state, QRC_KECCAK_STATE_SIZE);
qrc_intutils_clear8(&mut ctx.buffer, QRC_KECCAK_STATE_BYTE_SIZE);
ctx.position = 0;
let mut oft = keccak_left_encode(pad, rate);
oft = oft + keccak_left_encode(&mut pad[oft..], namelen * 8);
if !name.is_empty() {
for i in 0..namelen {
pad[oft + i] = name[i];
}
}
oft += namelen;
oft += keccak_left_encode(&mut pad[oft..], custlen * 8);
if !custom.is_empty() {
for i in 0..custlen {
if oft == rate {
keccak_fast_absorb(&mut ctx.state, pad, rate);
qrc_keccak_permute(ctx, rounds, false);
oft = 0;
}
pad[oft] = custom[i];
oft = oft + 1;
}
}
qrc_intutils_clear8(&mut pad[oft..], 200-oft);
keccak_fast_absorb(&mut ctx.state, pad, rate);
qrc_keccak_permute(ctx, rounds, false);
qrc_intutils_clear8(pad, 200);
oft = keccak_left_encode(pad, rate);
oft += keccak_left_encode(&mut pad[oft..], keylen * 8);
if !key.is_empty() {
for i in 0..keylen {
if oft == rate {
keccak_fast_absorb(&mut ctx.state, pad, rate);
qrc_keccak_permute(ctx, rounds, false);
oft = 0;
}
pad[oft] = key[i];
oft = oft + 1;
}
}
qrc_intutils_clear8(&mut pad[oft..], 200-oft);
keccak_fast_absorb(&mut ctx.state, pad, rate);
qrc_keccak_permute(ctx, rounds, false);
}
pub fn qrc_keccak_dispose(ctx: &mut QrcKeccakState) {
qrc_intutils_clear64(&mut ctx.state, QRC_KECCAK_STATE_SIZE);
qrc_intutils_clear8(&mut ctx.buffer, QRC_KECCAK_STATE_BYTE_SIZE);
ctx.position = 0;
}
pub fn qrc_keccak_finalize(ctx: &mut QrcKeccakState, rate: usize, mut output: &mut [u8], mut outlen: usize, domain: usize, rounds: usize) {
let buf = &mut [0u8; size_of::<usize>() + 1];
let pad = &mut [0u8; QRC_KECCAK_STATE_BYTE_SIZE];
qrc_intutils_copy8(pad, &ctx.buffer, ctx.position);
let bitlen = keccak_right_encode(buf, outlen * 8);
if ctx.position + bitlen >= rate {
keccak_fast_absorb(&mut ctx.state, pad, ctx.position);
qrc_keccak_permute(ctx, rounds, false);
ctx.position = 0;
}
qrc_intutils_copy8(&mut pad[ctx.position..], buf, bitlen);
pad[ctx.position + bitlen] = domain as u8;
pad[rate - 1] |= 128;
keccak_fast_absorb(&mut ctx.state, pad, rate);
while outlen >= rate {
qrc_keccak_squeezeblocks(ctx, pad, 1, rate, rounds);
qrc_intutils_copy8(output, pad, rate);
output = &mut output[rate..];
outlen -= rate;
}
if outlen > 0 {
qrc_keccak_squeezeblocks(ctx, pad, 1, rate, rounds);
qrc_intutils_copy8(output, pad, outlen);
}
qrc_intutils_clear8(&mut ctx.buffer, QRC_KECCAK_STATE_BYTE_SIZE);
ctx.position = 0;
}
pub fn qrc_keccak_incremental_absorb(ctx: &mut QrcKeccakState, rate: usize, mut message: &[u8], mut msglen: usize) {
let t = &mut [0u8; 8];
if ctx.position & 7 > 0 {
let mut i = ctx.position & 7;
while i < 8 && msglen > 0 {
t[i] = message[i];
message = &message[1..];
i = i + 1;
msglen = msglen - 1;
ctx.position = ctx.position + 1;
}
ctx.state[(ctx.position - i) / 8] ^= qrc_intutils_le8to64(t);
}
if ctx.position >= rate - ctx.position && msglen >= rate - ctx.position {
for i in 0..((rate - ctx.position) / 8) {
ctx.state[(ctx.position / 8) + i] ^= qrc_intutils_le8to64(&message[(8 * i)..]);
}
message = &message[(rate - ctx.position)..];
msglen -= rate - ctx.position;
ctx.position = 0;
qrc_keccak_permute_p1600c(&mut ctx.state, QRC_KECCAK_PERMUTATION_ROUNDS);
}
while msglen >= rate {
for i in 0..(rate / 8) {
ctx.state[i as usize] ^= qrc_intutils_le8to64(&message[(8 * i as usize)..]);
}
message = &message[rate..];
msglen -= rate;
qrc_keccak_permute_p1600c(&mut ctx.state, QRC_KECCAK_PERMUTATION_ROUNDS);
}
let mut i = 0;
while i < msglen / 8 {
ctx.state[(ctx.position / 8) + i] ^= qrc_intutils_le8to64(&message[(8 * i)..]);
i += 1;
}
message = &message[(8 * i)..];
msglen -= 8 * i;
ctx.position = ctx.position + (8 * i);
if msglen > 0 {
for i in 0..8 {
t[i] = 0;
}
for i in 0..msglen {
t[i] = message[i];
}
ctx.state[ctx.position / 8] ^= qrc_intutils_le8to64(t);
ctx.position = ctx.position + msglen;
}
}
pub fn qrc_keccak_incremental_block_absorb(ctx: &mut QrcKeccakState, rate: usize, mut message: &[u8], mut msglen: usize) {
while msglen + ctx.position >= rate {
for i in 0..rate - ctx.position {
ctx.state[ctx.position + i >> 3] ^= (message[i] as u64) << (8 * ((ctx.position + i) & 0x07));
}
msglen -= rate - ctx.position;
message = &message[rate - ctx.position..];
ctx.position = 0;
qrc_keccak_permute_p1600c(&mut ctx.state, QRC_KECCAK_PERMUTATION_ROUNDS);
}
for i in 0..msglen {
ctx.state[(ctx.position + i) as usize >> 3] ^= (message[i] as u64) << (8 * ((ctx.position + i) & 0x07)) as u64;
}
ctx.position += msglen;
}
pub fn qrc_keccak_incremental_finalize(ctx: &mut QrcKeccakState, rate: usize, domain: u8) {
let i = ctx.position >> 3;
let j = ctx.position & 7;
ctx.state[i] ^= (domain as u64) << (8 * j);
ctx.state[(rate / 8) - 1] ^= 1 << 63;
ctx.position = 0;
}
pub fn qrc_keccak_incremental_squeeze(ctx: &mut QrcKeccakState, rate: usize, mut output: &mut [u8], mut outlen: usize) {
let mut i: usize;
let t = &mut [0u8; 8];
if (ctx.position & 7) > 0 {
qrc_intutils_le64to8(t, ctx.state[ctx.position / 8]);
i = ctx.position & 7;
while i < 8 && outlen > 0 {
output[i] = t[i];
output = &mut output[1..];
i = i + 1;
outlen = outlen - 1;
ctx.position = ctx.position + 1;
}
}
if ctx.position >= rate - ctx.position && outlen >= rate - ctx.position {
for i in 0..(rate - ctx.position) / 8 {
qrc_intutils_le64to8(&mut output[(8 * i)..], ctx.state[(ctx.position / 8) + i]);
}
output = &mut output[(rate - ctx.position)..];
outlen -= rate - ctx.position;
ctx.position = 0;
}
while outlen >= rate {
qrc_keccak_permute_p1600c(&mut ctx.state, QRC_KECCAK_PERMUTATION_ROUNDS);
for i in 0..rate / 8 {
qrc_intutils_le64to8(&mut output[(8 * i)..], ctx.state[i]);
}
output = &mut output[rate..];
outlen -= rate;
}
if outlen > 0 {
if ctx.position == 0 {
qrc_keccak_permute_p1600c(&mut ctx.state, QRC_KECCAK_PERMUTATION_ROUNDS);
}
let mut i = 0;
while i < outlen / 8 {
qrc_intutils_le64to8(&mut output[(8 * i)..], ctx.state[(ctx.position / 8) + i]);
i += 1;
}
output = &mut output[(8 * i)..];
outlen -= 8 * i;
ctx.position += 8 * i;
qrc_intutils_le64to8(t, ctx.state[ctx.position / 8]);
for i in 0..outlen {
output[i] = t[i];
}
ctx.position += outlen;
}
}
pub fn qrc_keccak_incremental_block_squeeze(ctx: &mut QrcKeccakState, rate: usize, mut output: &mut [u8], mut outlen: usize) {
let mut i = 0;
for _ in 0..qrc_intutils_min(outlen, ctx.position as usize) {
output[i] = (ctx.state[(rate - ctx.position + i ) >> 3] >> (8 * ((rate - ctx.position + i) & 0x07))) as u8;
i += 1;
}
output = &mut output[i..];
outlen -= i;
ctx.position -= i;
while outlen > 0 {
qrc_keccak_permute_p1600c(&mut ctx.state, QRC_KECCAK_PERMUTATION_ROUNDS);
let mut i = 0;
for _ in 0..qrc_intutils_min(outlen, rate as usize) {
output[i] = (ctx.state[i >> 3] >> (8 * (i & 0x07))) as u8;
i += 1;
}
output = &mut output[i..];
outlen -= i;
ctx.position = rate - i;
}
}
pub fn qrc_keccak_permute(ctx: &mut QrcKeccakState, rounds: usize, qrc_keccak_unrolled_permutation: bool) {
if qrc_keccak_unrolled_permutation {
qrc_keccak_permute_p1600u(&mut ctx.state)
} else {
qrc_keccak_permute_p1600c(&mut ctx.state, rounds);
}
}
pub fn qrc_keccak_permute_p1600c(state: &mut [u64], rounds: usize) {
let mut aba = state[0];
let mut abe = state[1];
let mut abi = state[2];
let mut abo = state[3];
let mut abu = state[4];
let mut aga = state[5];
let mut age = state[6];
let mut agi = state[7];
let mut ago = state[8];
let mut agu = state[9];
let mut aka = state[10];
let mut ake = state[11];
let mut aki = state[12];
let mut ako = state[13];
let mut aku = state[14];
let mut ama = state[15];
let mut ame = state[16];
let mut ami = state[17];
let mut amo = state[18];
let mut amu = state[19];
let mut asa = state[20];
let mut ase = state[21];
let mut asi = state[22];
let mut aso = state[23];
let mut asu = state[24];
for i in (0..rounds).step_by(2) {
let mut bca = aba ^ aga ^ aka ^ ama ^ asa;
let mut bce = abe ^ age ^ ake ^ ame ^ ase;
let mut bci = abi ^ agi ^ aki ^ ami ^ asi;
let mut bco = abo ^ ago ^ ako ^ amo ^ aso;
let mut bcu = abu ^ agu ^ aku ^ amu ^ asu;
let mut da = bcu ^ qrc_intutils_rotl64(bce, 1);
let mut de = bca ^ qrc_intutils_rotl64(bci, 1);
let mut di = bce ^ qrc_intutils_rotl64(bco, 1);
let mut dz = bci ^ qrc_intutils_rotl64(bcu, 1);
let mut du = bco ^ qrc_intutils_rotl64(bca, 1);
aba ^= da;
bca = aba;
age ^= de;
bce = qrc_intutils_rotl64(age, 44);
aki ^= di;
bci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
bco = qrc_intutils_rotl64(amo, 21);
asu ^= du;
bcu = qrc_intutils_rotl64(asu, 14);
let mut eba = bca ^ ((!bce) & bci);
eba ^= KECCAK_ROUND_CONSTANTS[i];
let mut ebe = bce ^ ((!bci) & bco);
let mut ebi = bci ^ ((!bco) & bcu);
let mut ebo = bco ^ ((!bcu) & bca);
let mut ebu = bcu ^ ((!bca) & bce);
abo ^= dz;
bca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
bce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
bci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
bco = qrc_intutils_rotl64(ame, 45);
asi ^= di;
bcu = qrc_intutils_rotl64(asi, 61);
let mut ega = bca ^ ((!bce) & bci);
let mut ege = bce ^ ((!bci) & bco);
let mut egi = bci ^ ((!bco) & bcu);
let mut ego = bco ^ ((!bcu) & bca);
let mut egu = bcu ^ ((!bca) & bce);
abe ^= de;
bca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
bce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
bci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
bco = qrc_intutils_rotl64(amu, 8);
asa ^= da;
bcu = qrc_intutils_rotl64(asa, 18);
let mut eka = bca ^ ((!bce) & bci);
let mut eke = bce ^ ((!bci) & bco);
let mut eki = bci ^ ((!bco) & bcu);
let mut eko = bco ^ ((!bcu) & bca);
let mut eku = bcu ^ ((!bca) & bce);
abu ^= du;
bca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
bce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
bci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
bco = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
bcu = qrc_intutils_rotl64(aso, 56);
let mut ema = bca ^ ((!bce) & bci);
let mut eme = bce ^ ((!bci) & bco);
let mut emi = bci ^ ((!bco) & bcu);
let mut emo = bco ^ ((!bcu) & bca);
let mut emu = bcu ^ ((!bca) & bce);
abi ^= di;
bca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
bce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
bci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
bco = qrc_intutils_rotl64(ama, 41);
ase ^= de;
bcu = qrc_intutils_rotl64(ase, 2);
let mut esa = bca ^ ((!bce) & bci);
let mut ese = bce ^ ((!bci) & bco);
let mut esi = bci ^ ((!bco) & bcu);
let mut eso = bco ^ ((!bcu) & bca);
let mut esu = bcu ^ ((!bca) & bce);
bca = eba ^ ega ^ eka ^ ema ^ esa;
bce = ebe ^ ege ^ eke ^ eme ^ ese;
bci = ebi ^ egi ^ eki ^ emi ^ esi;
bco = ebo ^ ego ^ eko ^ emo ^ eso;
bcu = ebu ^ egu ^ eku ^ emu ^ esu;
da = bcu ^ qrc_intutils_rotl64(bce, 1);
de = bca ^ qrc_intutils_rotl64(bci, 1);
di = bce ^ qrc_intutils_rotl64(bco, 1);
dz = bci ^ qrc_intutils_rotl64(bcu, 1);
du = bco ^ qrc_intutils_rotl64(bca, 1);
eba ^= da;
bca = eba;
ege ^= de;
bce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
bci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
bco = qrc_intutils_rotl64(emo, 21);
esu ^= du;
bcu = qrc_intutils_rotl64(esu, 14);
aba = bca ^ ((!bce) & bci);
aba ^= KECCAK_ROUND_CONSTANTS[i + 1];
abe = bce ^ ((!bci) & bco);
abi = bci ^ ((!bco) & bcu);
abo = bco ^ ((!bcu) & bca);
abu = bcu ^ ((!bca) & bce);
ebo ^= dz;
bca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
bce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
bci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
bco = qrc_intutils_rotl64(eme, 45);
esi ^= di;
bcu = qrc_intutils_rotl64(esi, 61);
aga = bca ^ ((!bce) & bci);
age = bce ^ ((!bci) & bco);
agi = bci ^ ((!bco) & bcu);
ago = bco ^ ((!bcu) & bca);
agu = bcu ^ ((!bca) & bce);
ebe ^= de;
bca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
bce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
bci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
bco = qrc_intutils_rotl64(emu, 8);
esa ^= da;
bcu = qrc_intutils_rotl64(esa, 18);
aka = bca ^ ((!bce) & bci);
ake = bce ^ ((!bci) & bco);
aki = bci ^ ((!bco) & bcu);
ako = bco ^ ((!bcu) & bca);
aku = bcu ^ ((!bca) & bce);
ebu ^= du;
bca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
bce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
bci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
bco = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
bcu = qrc_intutils_rotl64(eso, 56);
ama = bca ^ ((!bce) & bci);
ame = bce ^ ((!bci) & bco);
ami = bci ^ ((!bco) & bcu);
amo = bco ^ ((!bcu) & bca);
amu = bcu ^ ((!bca) & bce);
ebi ^= di;
bca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
bce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
bci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
bco = qrc_intutils_rotl64(ema, 41);
ese ^= de;
bcu = qrc_intutils_rotl64(ese, 2);
asa = bca ^ ((!bce) & bci);
ase = bce ^ ((!bci) & bco);
asi = bci ^ ((!bco) & bcu);
aso = bco ^ ((!bcu) & bca);
asu = bcu ^ ((!bca) & bce);
}
state[0] = aba;
state[1] = abe;
state[2] = abi;
state[3] = abo;
state[4] = abu;
state[5] = aga;
state[6] = age;
state[7] = agi;
state[8] = ago;
state[9] = agu;
state[10] = aka;
state[11] = ake;
state[12] = aki;
state[13] = ako;
state[14] = aku;
state[15] = ama;
state[16] = ame;
state[17] = ami;
state[18] = amo;
state[19] = amu;
state[20] = asa;
state[21] = ase;
state[22] = asi;
state[23] = aso;
state[24] = asu;
}
pub fn qrc_keccak_permute_p1600u(state: &mut [u64]) {
let mut aba = state[0];
let mut abe = state[1];
let mut abi = state[2];
let mut abo = state[3];
let mut abu = state[4];
let mut aga = state[5];
let mut age = state[6];
let mut agi = state[7];
let mut ago = state[8];
let mut agu = state[9];
let mut aka = state[10];
let mut ake = state[11];
let mut aki = state[12];
let mut ako = state[13];
let mut aku = state[14];
let mut ama = state[15];
let mut ame = state[16];
let mut ami = state[17];
let mut amo = state[18];
let mut amu = state[19];
let mut asa = state[20];
let mut ase = state[21];
let mut asi = state[22];
let mut aso = state[23];
let mut asu = state[24];
let mut ca = aba ^ aga ^ aka ^ ama ^ asa;
let mut ce = abe ^ age ^ ake ^ ame ^ ase;
let mut ci = abi ^ agi ^ aki ^ ami ^ asi;
let mut co = abo ^ ago ^ ako ^ amo ^ aso;
let mut cu = abu ^ agu ^ aku ^ amu ^ asu;
let mut da = cu ^ qrc_intutils_rotl64(ce, 1);
let mut de = ca ^ qrc_intutils_rotl64(ci, 1);
let mut di = ce ^ qrc_intutils_rotl64(co, 1);
let mut dz = ci ^ qrc_intutils_rotl64(cu, 1);
let mut du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
let mut eba = ca ^ ((!ce) & ci);
eba ^= 0x0000000000000001;
let mut ebe = ce ^ ((!ci) & co);
let mut ebi = ci ^ ((!co) & cu);
let mut ebo = co ^ ((!cu) & ca);
let mut ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
let mut ega = ca ^ ((!ce) & ci);
let mut ege = ce ^ ((!ci) & co);
let mut egi = ci ^ ((!co) & cu);
let mut ego = co ^ ((!cu) & ca);
let mut egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
let mut eka = ca ^ ((!ce) & ci);
let mut eke = ce ^ ((!ci) & co);
let mut eki = ci ^ ((!co) & cu);
let mut eko = co ^ ((!cu) & ca);
let mut eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
let mut ema = ca ^ ((!ce) & ci);
let mut eme = ce ^ ((!ci) & co);
let mut emi = ci ^ ((!co) & cu);
let mut emo = co ^ ((!cu) & ca);
let mut emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
let mut esa = ca ^ ((!ce) & ci);
let mut ese = ce ^ ((!ci) & co);
let mut esi = ci ^ ((!co) & cu);
let mut eso = co ^ ((!cu) & ca);
let mut esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x0000000000008082;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x800000000000808A;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x8000000080008000;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x000000000000808B;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x0000000080000001;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x8000000080008081;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x8000000000008009;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x000000000000008A;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x0000000000000088;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x0000000080008009;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x000000008000000A;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x000000008000808B;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x800000000000008B;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x8000000000008089;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x8000000000008003;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x8000000000008002;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x8000000000000080;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x000000000000800A;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x800000008000000A;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x8000000080008081;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x8000000000008080;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
ca = aba ^ aga ^ aka ^ ama ^ asa;
ce = abe ^ age ^ ake ^ ame ^ ase;
ci = abi ^ agi ^ aki ^ ami ^ asi;
co = abo ^ ago ^ ako ^ amo ^ aso;
cu = abu ^ agu ^ aku ^ amu ^ asu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
aba ^= da;
ca = aba;
age ^= de;
ce = qrc_intutils_rotl64(age, 44);
aki ^= di;
ci = qrc_intutils_rotl64(aki, 43);
amo ^= dz;
co = qrc_intutils_rotl64(amo, 21);
asu ^= du;
cu = qrc_intutils_rotl64(asu, 14);
eba = ca ^ ((!ce) & ci);
eba ^= 0x0000000080000001;
ebe = ce ^ ((!ci) & co);
ebi = ci ^ ((!co) & cu);
ebo = co ^ ((!cu) & ca);
ebu = cu ^ ((!ca) & ce);
abo ^= dz;
ca = qrc_intutils_rotl64(abo, 28);
agu ^= du;
ce = qrc_intutils_rotl64(agu, 20);
aka ^= da;
ci = qrc_intutils_rotl64(aka, 3);
ame ^= de;
co = qrc_intutils_rotl64(ame, 45);
asi ^= di;
cu = qrc_intutils_rotl64(asi, 61);
ega = ca ^ ((!ce) & ci);
ege = ce ^ ((!ci) & co);
egi = ci ^ ((!co) & cu);
ego = co ^ ((!cu) & ca);
egu = cu ^ ((!ca) & ce);
abe ^= de;
ca = qrc_intutils_rotl64(abe, 1);
agi ^= di;
ce = qrc_intutils_rotl64(agi, 6);
ako ^= dz;
ci = qrc_intutils_rotl64(ako, 25);
amu ^= du;
co = qrc_intutils_rotl64(amu, 8);
asa ^= da;
cu = qrc_intutils_rotl64(asa, 18);
eka = ca ^ ((!ce) & ci);
eke = ce ^ ((!ci) & co);
eki = ci ^ ((!co) & cu);
eko = co ^ ((!cu) & ca);
eku = cu ^ ((!ca) & ce);
abu ^= du;
ca = qrc_intutils_rotl64(abu, 27);
aga ^= da;
ce = qrc_intutils_rotl64(aga, 36);
ake ^= de;
ci = qrc_intutils_rotl64(ake, 10);
ami ^= di;
co = qrc_intutils_rotl64(ami, 15);
aso ^= dz;
cu = qrc_intutils_rotl64(aso, 56);
ema = ca ^ ((!ce) & ci);
eme = ce ^ ((!ci) & co);
emi = ci ^ ((!co) & cu);
emo = co ^ ((!cu) & ca);
emu = cu ^ ((!ca) & ce);
abi ^= di;
ca = qrc_intutils_rotl64(abi, 62);
ago ^= dz;
ce = qrc_intutils_rotl64(ago, 55);
aku ^= du;
ci = qrc_intutils_rotl64(aku, 39);
ama ^= da;
co = qrc_intutils_rotl64(ama, 41);
ase ^= de;
cu = qrc_intutils_rotl64(ase, 2);
esa = ca ^ ((!ce) & ci);
ese = ce ^ ((!ci) & co);
esi = ci ^ ((!co) & cu);
eso = co ^ ((!cu) & ca);
esu = cu ^ ((!ca) & ce);
ca = eba ^ ega ^ eka ^ ema ^ esa;
ce = ebe ^ ege ^ eke ^ eme ^ ese;
ci = ebi ^ egi ^ eki ^ emi ^ esi;
co = ebo ^ ego ^ eko ^ emo ^ eso;
cu = ebu ^ egu ^ eku ^ emu ^ esu;
da = cu ^ qrc_intutils_rotl64(ce, 1);
de = ca ^ qrc_intutils_rotl64(ci, 1);
di = ce ^ qrc_intutils_rotl64(co, 1);
dz = ci ^ qrc_intutils_rotl64(cu, 1);
du = co ^ qrc_intutils_rotl64(ca, 1);
eba ^= da;
ca = eba;
ege ^= de;
ce = qrc_intutils_rotl64(ege, 44);
eki ^= di;
ci = qrc_intutils_rotl64(eki, 43);
emo ^= dz;
co = qrc_intutils_rotl64(emo, 21);
esu ^= du;
cu = qrc_intutils_rotl64(esu, 14);
aba = ca ^ ((!ce) & ci);
aba ^= 0x8000000080008008;
abe = ce ^ ((!ci) & co);
abi = ci ^ ((!co) & cu);
abo = co ^ ((!cu) & ca);
abu = cu ^ ((!ca) & ce);
ebo ^= dz;
ca = qrc_intutils_rotl64(ebo, 28);
egu ^= du;
ce = qrc_intutils_rotl64(egu, 20);
eka ^= da;
ci = qrc_intutils_rotl64(eka, 3);
eme ^= de;
co = qrc_intutils_rotl64(eme, 45);
esi ^= di;
cu = qrc_intutils_rotl64(esi, 61);
aga = ca ^ ((!ce) & ci);
age = ce ^ ((!ci) & co);
agi = ci ^ ((!co) & cu);
ago = co ^ ((!cu) & ca);
agu = cu ^ ((!ca) & ce);
ebe ^= de;
ca = qrc_intutils_rotl64(ebe, 1);
egi ^= di;
ce = qrc_intutils_rotl64(egi, 6);
eko ^= dz;
ci = qrc_intutils_rotl64(eko, 25);
emu ^= du;
co = qrc_intutils_rotl64(emu, 8);
esa ^= da;
cu = qrc_intutils_rotl64(esa, 18);
aka = ca ^ ((!ce) & ci);
ake = ce ^ ((!ci) & co);
aki = ci ^ ((!co) & cu);
ako = co ^ ((!cu) & ca);
aku = cu ^ ((!ca) & ce);
ebu ^= du;
ca = qrc_intutils_rotl64(ebu, 27);
ega ^= da;
ce = qrc_intutils_rotl64(ega, 36);
eke ^= de;
ci = qrc_intutils_rotl64(eke, 10);
emi ^= di;
co = qrc_intutils_rotl64(emi, 15);
eso ^= dz;
cu = qrc_intutils_rotl64(eso, 56);
ama = ca ^ ((!ce) & ci);
ame = ce ^ ((!ci) & co);
ami = ci ^ ((!co) & cu);
amo = co ^ ((!cu) & ca);
amu = cu ^ ((!ca) & ce);
ebi ^= di;
ca = qrc_intutils_rotl64(ebi, 62);
ego ^= dz;
ce = qrc_intutils_rotl64(ego, 55);
eku ^= du;
ci = qrc_intutils_rotl64(eku, 39);
ema ^= da;
co = qrc_intutils_rotl64(ema, 41);
ese ^= de;
cu = qrc_intutils_rotl64(ese, 2);
asa = ca ^ ((!ce) & ci);
ase = ce ^ ((!ci) & co);
asi = ci ^ ((!co) & cu);
aso = co ^ ((!cu) & ca);
asu = cu ^ ((!ca) & ce);
state[0] = aba;
state[1] = abe;
state[2] = abi;
state[3] = abo;
state[4] = abu;
state[5] = aga;
state[6] = age;
state[7] = agi;
state[8] = ago;
state[9] = agu;
state[10] = aka;
state[11] = ake;
state[12] = aki;
state[13] = ako;
state[14] = aku;
state[15] = ama;
state[16] = ame;
state[17] = ami;
state[18] = amo;
state[19] = amu;
state[20] = asa;
state[21] = ase;
state[22] = asi;
state[23] = aso;
state[24] = asu;
}
pub fn qrc_keccak_squeezeblocks(ctx: &mut QrcKeccakState, mut output: &mut [u8], mut nblocks: usize, rate: usize , rounds: usize) {
while nblocks > 0 {
qrc_keccak_permute(ctx, rounds, false);
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
qrc_intutils_copy8(output, &qrc_intutils_transform_64to8(&ctx.state), rate);
} else {
for i in 0..(rate >> 3) {
qrc_intutils_le64to8(&mut output[(size_of::<u64>() * i)..], ctx.state[i]);
}
}
output = &mut output[rate..];
nblocks -= 1;
}
}
pub fn qrc_keccak_initialize_state(ctx: &mut QrcKeccakState) {
qrc_intutils_clear64(&mut ctx.state, QRC_KECCAK_STATE_SIZE);
qrc_intutils_clear8(&mut ctx.buffer, QRC_KECCAK_STATE_BYTE_SIZE);
ctx.position = 0;
}
pub fn qrc_keccak_update(ctx: &mut QrcKeccakState, rate: usize, mut message: &[u8], mut msglen: usize, rounds: usize) {
if !message.is_empty() && msglen != 0 {
if ctx.position != 0 && ctx.position + msglen >= rate {
let rmdlen: usize = rate - ctx.position;
if rmdlen != 0 {
qrc_intutils_copy8(&mut ctx.buffer[ctx.position..], message, rmdlen);
}
keccak_fast_absorb(&mut ctx.state, &ctx.buffer, rate);
qrc_keccak_permute(ctx, rounds, false);
ctx.position = 0;
message = &message[rmdlen..];
msglen -= rmdlen;
}
while msglen >= rate {
keccak_fast_absorb(&mut ctx.state, message, rate);
qrc_keccak_permute(ctx, rounds, false);
message = &message[rate..];
msglen -= rate;
}
if msglen != 0 {
qrc_intutils_copy8(&mut ctx.buffer[ctx.position..], message, msglen);
ctx.position = ctx.position + msglen;
}
}
}
pub fn qrc_sha3_compute128(output: &mut [u8], message: &[u8], msglen: usize) {
let ctx = &mut QrcKeccakState::default();
let hash = &mut [0u8; QRC_KECCAK_128_RATE];
let rate = QrcKeccakRate::QrcKeccakRate128 as usize;
qrc_sha3_initialize(ctx);
qrc_keccak_absorb(ctx, rate, message, msglen, QRC_KECCAK_SHA3_DOMAIN_ID, QRC_KECCAK_PERMUTATION_ROUNDS);
qrc_keccak_squeezeblocks(ctx, hash, 1, rate, QRC_KECCAK_PERMUTATION_ROUNDS);
qrc_intutils_copy8(output, hash, QRC_SHA3_128_HASH_SIZE);
qrc_keccak_dispose(ctx);
}
pub fn qrc_sha3_compute256(output: &mut [u8], message: &[u8], msglen: usize) {
let ctx = &mut QrcKeccakState::default();
let hash = &mut [0u8; QRC_KECCAK_256_RATE];
let rate = QrcKeccakRate::QrcKeccakRate256 as usize;
qrc_sha3_initialize(ctx);
qrc_keccak_absorb(ctx, rate, message, msglen, QRC_KECCAK_SHA3_DOMAIN_ID, QRC_KECCAK_PERMUTATION_ROUNDS);
qrc_keccak_squeezeblocks(ctx, hash, 1, rate, QRC_KECCAK_PERMUTATION_ROUNDS);
qrc_intutils_copy8(output, hash, QRC_SHA3_256_HASH_SIZE);
qrc_keccak_dispose(ctx);
}
pub fn qrc_sha3_compute512(output: &mut [u8], message: &[u8], msglen: usize) {
let ctx = &mut QrcKeccakState::default();
let hash = &mut [0u8; QRC_KECCAK_512_RATE];
let rate = QrcKeccakRate::QrcKeccakRate512 as usize;
qrc_sha3_initialize(ctx);
qrc_keccak_absorb(ctx, rate, message, msglen, QRC_KECCAK_SHA3_DOMAIN_ID, QRC_KECCAK_PERMUTATION_ROUNDS);
qrc_keccak_squeezeblocks(ctx, hash, 1, rate, QRC_KECCAK_PERMUTATION_ROUNDS);
qrc_intutils_copy8(output, hash, QRC_SHA3_512_HASH_SIZE);
qrc_keccak_dispose(ctx);
}
pub fn qrc_sha3_finalize(ctx: &mut QrcKeccakState, rate: usize, mut output: &mut [u8]) {
let hlen = ((QRC_KECCAK_STATE_SIZE * size_of::<u64>()) - rate) / 2;
qrc_intutils_clear8(&mut ctx.buffer[ctx.position..], QRC_KECCAK_STATE_BYTE_SIZE-ctx.position);
ctx.buffer[ctx.position] = QRC_KECCAK_SHA3_DOMAIN_ID;
ctx.buffer[rate - 1] |= 128;
keccak_fast_absorb(&mut ctx.state, &ctx.buffer, rate);
qrc_keccak_permute(ctx, QRC_KECCAK_PERMUTATION_ROUNDS, false);
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
qrc_intutils_copy8(output, &qrc_intutils_transform_64to8(&ctx.state), hlen);
} else {
for i in 0..(hlen / size_of::<u64>()) {
qrc_intutils_le64to8(output, ctx.state[i]);
output = &mut output[(size_of::<u64>())..];
}
}
qrc_keccak_dispose(ctx);
}
pub fn qrc_sha3_initialize(ctx: &mut QrcKeccakState) {
qrc_keccak_initialize_state(ctx);
}
pub fn qrc_sha3_update(ctx: &mut QrcKeccakState, rate: usize, message: &[u8], msglen: usize) {
qrc_keccak_update(ctx, rate, message, msglen, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub fn qrc_shake128_compute(mut output: &mut [u8], mut outlen: usize, key: &[u8], keylen: usize) {
let nblocks = outlen / QRC_KECCAK_128_RATE;
let mut ctx: QrcKeccakState = Default::default();
let mut hash = [0u8; QRC_KECCAK_128_RATE];
let rate = QrcKeccakRate::QrcKeccakRate128 as usize;
qrc_shake_initialize(&mut ctx, rate, key, keylen);
qrc_shake_squeezeblocks(&mut ctx, rate, &mut output, nblocks);
output = &mut output[(nblocks * QRC_KECCAK_128_RATE)..];
outlen -= nblocks * QRC_KECCAK_128_RATE;
if outlen != 0 {
qrc_shake_squeezeblocks(&mut ctx, rate, &mut hash, 1);
qrc_intutils_copy8(&mut output, &hash, outlen);
}
qrc_keccak_dispose(&mut ctx);
}
pub fn qrc_shake256_compute(mut output: &mut [u8], mut outlen: usize, key: &[u8], keylen: usize) {
let nblocks = outlen / QRC_KECCAK_256_RATE;
let ctx = &mut QrcKeccakState::default();
let hash = &mut [0u8; QRC_KECCAK_256_RATE];
let rate = QrcKeccakRate::QrcKeccakRate256 as usize;
qrc_shake_initialize(ctx, rate, key, keylen);
qrc_shake_squeezeblocks(ctx, rate, output, nblocks);
output = &mut output[(nblocks * QRC_KECCAK_256_RATE)..];
outlen -= nblocks * QRC_KECCAK_256_RATE;
if outlen != 0 {
qrc_shake_squeezeblocks(ctx, rate, hash, 1);
qrc_intutils_copy8(output, hash, outlen);
}
qrc_keccak_dispose(ctx);
}
pub fn qrc_shake512_compute(mut output: &mut [u8], mut outlen: usize, key: &[u8], keylen: usize) {
let nblocks: usize = outlen / QRC_KECCAK_512_RATE;
let mut ctx: QrcKeccakState = Default::default();
let mut hash = [0u8; QRC_KECCAK_512_RATE];
let rate = QrcKeccakRate::QrcKeccakRate512 as usize;
qrc_shake_initialize(&mut ctx, rate, key, keylen);
qrc_shake_squeezeblocks(&mut ctx, rate, &mut output, nblocks);
output = &mut output[(nblocks * QRC_KECCAK_512_RATE)..];
outlen -= nblocks * QRC_KECCAK_512_RATE;
if outlen != 0 {
qrc_shake_squeezeblocks(&mut ctx, rate, &mut hash, 1);
qrc_intutils_copy8(&mut output, &hash, outlen);
}
qrc_keccak_dispose(&mut ctx);
}
pub fn qrc_shake_initialize(ctx: &mut QrcKeccakState, rate: usize, key: &[u8], keylen: usize) {
qrc_keccak_initialize_state(ctx);
qrc_keccak_absorb(ctx, rate, key, keylen, QRC_KECCAK_SHAKE_DOMAIN_ID, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub fn qrc_shake_squeezeblocks(ctx: &mut QrcKeccakState, rate: usize, output: &mut [u8], nblocks: usize) {
qrc_keccak_squeezeblocks(ctx, output, nblocks, rate, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub fn qrc_cshake128_compute(mut output: &mut [u8], mut outlen: usize, key: &[u8], keylen: usize, name: &[u8], namelen: usize, custom: &[u8], custlen: usize) {
let nblocks: usize = outlen / QRC_KECCAK_128_RATE;
let mut ctx: QrcKeccakState = Default::default();
let mut hash = [0u8; QRC_KECCAK_128_RATE];
let rate = QrcKeccakRate::QrcKeccakRate128 as usize;
if custlen + namelen != 0 {
qrc_cshake_initialize(&mut ctx, rate, key, keylen, name, namelen, custom, custlen);
} else {
qrc_shake_initialize(&mut ctx, rate, key, keylen);
}
qrc_cshake_squeezeblocks(&mut ctx, rate, &mut output, nblocks);
output = &mut output[(nblocks * QRC_KECCAK_128_RATE)..];
outlen -= nblocks * QRC_KECCAK_128_RATE;
if outlen != 0 {
qrc_cshake_squeezeblocks(&mut ctx, rate, &mut hash, 1);
qrc_intutils_copy8(output, &hash, outlen);
}
qrc_keccak_dispose(&mut ctx);
}
pub fn qrc_cshake256_compute(mut output: &mut [u8], mut outlen: usize, key: &[u8], keylen: usize, name: &[u8], namelen: usize, custom: &[u8], custlen: usize) {
let nblocks: usize = outlen / QRC_KECCAK_256_RATE;
let mut ctx: QrcKeccakState = Default::default();
let mut hash = [0u8; QRC_KECCAK_256_RATE];
let rate = QrcKeccakRate::QrcKeccakRate256 as usize;
if custlen + namelen != 0 {
qrc_cshake_initialize(&mut ctx, rate, key, keylen, name, namelen, custom, custlen);
} else {
qrc_shake_initialize(&mut ctx, rate, key, keylen);
}
qrc_cshake_squeezeblocks(&mut ctx, rate, &mut output, nblocks);
output = &mut output[(nblocks * QRC_KECCAK_256_RATE)..];
outlen -= nblocks * QRC_KECCAK_256_RATE;
if outlen != 0 {
qrc_cshake_squeezeblocks(&mut ctx, rate, &mut hash, 1);
qrc_intutils_copy8(output, &hash, outlen);
}
qrc_keccak_dispose(&mut ctx);
}
pub fn qrc_cshake512_compute(mut output: &mut [u8], mut outlen: usize, key: &[u8], keylen: usize, name: &[u8], namelen: usize, custom: &[u8], custlen: usize) {
let nblocks: usize = outlen / QRC_KECCAK_512_RATE;
let ctx = &mut QrcKeccakState::default();
let hash = &mut [0u8; QRC_KECCAK_512_RATE];
let rate = QrcKeccakRate::QrcKeccakRate512 as usize;
if custlen + namelen != 0 {
qrc_cshake_initialize(ctx, rate, key, keylen, name, namelen, custom, custlen);
} else {
qrc_shake_initialize(ctx, rate, key, keylen);
}
qrc_cshake_squeezeblocks(ctx, rate, output, nblocks);
output = &mut output[(nblocks * QRC_KECCAK_512_RATE)..];
outlen -= nblocks * QRC_KECCAK_512_RATE;
if outlen != 0 {
qrc_cshake_squeezeblocks(ctx, rate, hash, 1);
qrc_intutils_copy8(output, hash, outlen);
}
qrc_keccak_dispose(ctx);
}
pub fn qrc_cshake_initialize(ctx: &mut QrcKeccakState, rate: usize, key: &[u8], keylen: usize, name: &[u8], namelen: usize, custom: &[u8], custlen: usize) {
qrc_keccak_initialize_state(ctx);
qrc_keccak_absorb_custom(ctx, rate, custom, custlen, name, namelen, QRC_KECCAK_PERMUTATION_ROUNDS);
qrc_keccak_absorb(ctx, rate, key, keylen, QRC_KECCAK_CSHAKE_DOMAIN_ID, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub fn qrc_cshake_squeezeblocks(ctx: &mut QrcKeccakState, rate: usize, output: &mut [u8], nblocks: usize) {
qrc_keccak_squeezeblocks(ctx, output, nblocks, rate, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub fn qrc_cshake_update(ctx: &mut QrcKeccakState, rate: usize, mut key: &mut [u8], mut keylen: usize) {
while keylen >= rate {
keccak_fast_absorb(&mut ctx.state, key, keylen);
qrc_keccak_permute(ctx, QRC_KECCAK_PERMUTATION_ROUNDS, false);
keylen -= rate;
key = &mut key[rate..];
}
if keylen != 0 {
keccak_fast_absorb(&mut ctx.state, key, keylen);
qrc_keccak_permute(ctx, QRC_KECCAK_PERMUTATION_ROUNDS, false);
}
}
pub fn qrc_kmac128_compute(mut output: &mut [u8], outlen: usize, mut message: &mut [u8], msglen: usize, mut key: &mut [u8], keylen: usize, mut custom: &mut [u8], custlen: usize) {
let mut ctx: QrcKeccakState = Default::default();
let rate = QrcKeccakRate::QrcKeccakRate128 as usize;
qrc_kmac_initialize(&mut ctx, rate, &mut key, keylen, &mut custom, custlen);
qrc_kmac_update(&mut ctx, rate, &mut message, msglen);
qrc_kmac_finalize(&mut ctx, rate, &mut output, outlen);
}
pub fn qrc_kmac256_compute(output: &mut [u8], outlen: usize, message: &[u8], msglen: usize, key: &mut [u8], keylen: usize, custom: &mut [u8], custlen: usize) {
let ctx = &mut QrcKeccakState::default();
let rate = QrcKeccakRate::QrcKeccakRate256 as usize;
qrc_kmac_initialize(ctx, rate, key, keylen, custom, custlen);
qrc_kmac_update(ctx, rate, message, msglen);
qrc_kmac_finalize(ctx, rate, output, outlen);
}
pub fn qrc_kmac512_compute(output: &mut [u8], outlen: usize, message: &[u8], msglen: usize, key: &mut [u8], keylen: usize, custom: &mut [u8], custlen: usize) {
let ctx = &mut QrcKeccakState::default();
let rate = QrcKeccakRate::QrcKeccakRate512 as usize;
qrc_kmac_initialize(ctx, rate, key, keylen, custom, custlen);
qrc_kmac_update(ctx, rate, message, msglen);
qrc_kmac_finalize(ctx, rate, output, outlen);
}
pub fn qrc_kmac_finalize(ctx: &mut QrcKeccakState, rate: usize, output: &mut [u8], outlen: usize) {
qrc_keccak_finalize(ctx, rate, output, outlen, QRC_KECCAK_KMAC_DOMAIN_ID as usize, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub fn qrc_kmac_initialize(ctx: &mut QrcKeccakState, rate: usize, key: &mut [u8], keylen: usize, custom: &mut [u8], custlen: usize) {
let name: [u8; 4] = [ 0x4B, 0x4D, 0x41, 0x43 ];
qrc_keccak_absorb_key_custom(ctx, rate, key, keylen, custom, custlen, &name, 4, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub fn qrc_kmac_update(ctx: &mut QrcKeccakState, rate: usize, message: &[u8], msglen: usize) {
qrc_keccak_update(ctx, rate, message, msglen, QRC_KECCAK_PERMUTATION_ROUNDS);
}
pub const QRC_KPA_128_KEY_SIZE: usize = 16;
pub const QRC_KPA_256_KEY_SIZE: usize = 32;
pub const QRC_KPA_512_KEY_SIZE: usize = 64;
pub const QRC_KPA_ROUNDS: usize = 12;
pub const QRC_KPA_PARALLELISM: usize = 8;
#[derive(PartialEq, Clone)]
pub struct QrcKpaState {
pub state: [[u64; QRC_KECCAK_STATE_SIZE]; QRC_KPA_PARALLELISM],
pub buffer: [u8; QRC_KPA_PARALLELISM * QRC_KECCAK_STATE_BYTE_SIZE],
pub position: usize,
pub processed: usize,
pub rate: QrcKeccakRate,
}
impl Default for QrcKpaState {
fn default() -> Self {
Self {
state: [[Default::default(); QRC_KECCAK_STATE_SIZE]; QRC_KPA_PARALLELISM],
buffer: [Default::default(); QRC_KPA_PARALLELISM * QRC_KECCAK_STATE_BYTE_SIZE],
position: Default::default(),
processed: Default::default(),
rate: QrcKeccakRate::QrcKeccakRateNone,
}
}
}
pub fn qrc_kpa_finalize(ctx: &mut QrcKpaState, mut output: &mut [u8], mut outlen: usize) {
let hashlen = if ctx.rate == QrcKeccakRate::QrcKeccakRate512 {
KPA_LEAF_HASH512 } else if ctx.rate == QrcKeccakRate::QrcKeccakRate256 {
KPA_LEAF_HASH256 } else { KPA_LEAF_HASH128 };
let rate = ctx.rate as usize;
let fbuf = &mut [0u8; QRC_KPA_PARALLELISM * KPA_LEAF_HASH512];
let pstate = &mut [0u64; QRC_KECCAK_STATE_SIZE];
let prcb = &mut [0u8; 2 * size_of::<u64>()];
if ctx.position != 0 {
qrc_intutils_clear8(&mut ctx.buffer[ctx.position..], (QRC_KPA_PARALLELISM * QRC_KECCAK_STATE_BYTE_SIZE)-ctx.position);
let ctx_message = &ctx.buffer.clone();
kpa_fast_absorbx8(ctx, ctx_message);
kpa_permutex8(ctx);
}
ctx.processed += ctx.position;
for i in 0..QRC_KPA_PARALLELISM {
qrc_intutils_copy8(&mut fbuf[i * hashlen..], &qrc_intutils_transform_64to8(&ctx.state[i]), hashlen);
}
kpa_absorb_leaves(pstate, rate, fbuf, QRC_KPA_PARALLELISM * hashlen);
qrc_intutils_clear8(&mut ctx.buffer, QRC_KPA_PARALLELISM * QRC_KECCAK_STATE_BYTE_SIZE);
let mut bitlen = keccak_right_encode(prcb, outlen * 8);
bitlen += keccak_right_encode(&mut prcb[bitlen..], ctx.processed * 8);
qrc_intutils_copy8(&mut ctx.buffer, prcb, bitlen);
ctx.buffer[bitlen] = QRC_KECCAK_KPA_DOMAIN_ID;
ctx.buffer[rate - 1] |= 128;
keccak_fast_absorb(pstate, &ctx.buffer, rate);
while outlen >= rate {
kpa_squeezeblocks(pstate, &mut ctx.buffer, 1, rate);
qrc_intutils_copy8(output, &ctx.buffer, rate);
output = &mut output[rate..];
outlen -= rate;
}
if outlen > 0 {
kpa_squeezeblocks(pstate, &mut ctx.buffer, 1, rate);
qrc_intutils_copy8(output, &ctx.buffer, outlen);
}
qrc_intutils_clear8(&mut ctx.buffer, QRC_KPA_PARALLELISM * QRC_KECCAK_STATE_BYTE_SIZE);
ctx.position = 0;
ctx.processed = 0;
}
pub fn qrc_kpa_initialize(ctx: &mut QrcKpaState, key: &[u8], keylen: usize, custom: &[u8], custlen: usize) {
let tmps = &mut [0u64; QRC_KECCAK_STATE_SIZE];
let pad = &mut [0u8; QRC_KECCAK_STATE_BYTE_SIZE];
let algb = &mut [0x00, 0x00, 0x4B, 0x42, 0x41, 0xAD, 0x31, 0x32];
ctx.position = 0;
ctx.processed = 0;
ctx.rate = if keylen == QRC_KPA_128_KEY_SIZE {
QrcKeccakRate::QrcKeccakRate128 } else if keylen == QRC_KPA_256_KEY_SIZE {
QrcKeccakRate::QrcKeccakRate256 } else if keylen == QRC_KPA_512_KEY_SIZE {
QrcKeccakRate::QrcKeccakRate512 } else { QrcKeccakRate::QrcKeccakRateNone };
let rate = ctx.rate as usize;
for i in 0..QRC_KPA_PARALLELISM {
qrc_intutils_clear64(&mut ctx.state[i], QRC_KECCAK_STATE_SIZE);
}
qrc_intutils_clear8(&mut ctx.buffer, QRC_KPA_PARALLELISM * QRC_KECCAK_STATE_BYTE_SIZE);
if custlen != 0 {
let mut oft = keccak_left_encode(pad, rate);
oft += keccak_left_encode(&mut pad[oft..], custlen * 8);
for i in 0..custlen {
if oft == rate {
keccak_fast_absorb(tmps, pad, rate);
qrc_keccak_permute_p1600c(tmps, QRC_KPA_ROUNDS);
oft = 0;
}
pad[oft] = custom[i];
oft += 1;
}
if oft != 0 {
qrc_intutils_clear8(&mut pad[oft..], 200-oft);
keccak_fast_absorb(tmps, pad, rate);
qrc_keccak_permute_p1600c(tmps, QRC_KPA_ROUNDS);
}
}
if keylen != 0 {
qrc_intutils_clear8(pad, 200);
let mut oft = keccak_left_encode(pad, rate);
oft += keccak_left_encode(&mut pad[oft..], keylen * 8);
for i in 0..keylen {
if oft == rate {
keccak_fast_absorb(tmps, pad, rate);
qrc_keccak_permute_p1600c(tmps, QRC_KPA_ROUNDS);
oft = 0;
}
pad[oft] = key[i];
oft += 1;
}
if oft != 0 {
qrc_intutils_clear8(&mut pad[oft..], 200-oft);
keccak_fast_absorb(tmps, pad, rate);
qrc_keccak_permute_p1600c(tmps, QRC_KPA_ROUNDS);
}
}
for i in 0..QRC_KPA_PARALLELISM {
qrc_intutils_be16to8(algb, i as u16 + 1);
let algn = qrc_intutils_be8to64(algb);
qrc_intutils_copy64(&mut ctx.state[i], tmps, QRC_KECCAK_STATE_SIZE);
ctx.state[i][0] ^= algn;
}
kpa_permutex8(ctx);
}
pub fn qrc_kpa_update(ctx: &mut QrcKpaState, mut message: &[u8], mut msglen: usize) {
let blklen = ctx.rate as usize * QRC_KPA_PARALLELISM;
if msglen != 0 {
if ctx.position != 0 && (ctx.position + msglen >= blklen) {
let rmdlen = blklen - ctx.position;
if rmdlen != 0 {
qrc_intutils_copy8(&mut ctx.buffer[ctx.position..], message, rmdlen);
}
let ctx_message = &ctx.buffer.clone();
kpa_fast_absorbx8(ctx, ctx_message);
kpa_permutex8(ctx);
ctx.processed += ctx.rate as usize * QRC_KPA_PARALLELISM;
ctx.position = 0;
message = &message[rmdlen..];
msglen -= rmdlen;
}
while msglen >= blklen {
kpa_fast_absorbx8(ctx, message);
kpa_permutex8(ctx);
ctx.processed += ctx.rate as usize * QRC_KPA_PARALLELISM;
message = &message[blklen..];
msglen -= blklen;
}
if msglen != 0 {
qrc_intutils_copy8(&mut ctx.buffer[ctx.position..], message, msglen);
ctx.position += msglen;
}
}
}
pub fn qrc_kpa_dispose(ctx: &mut QrcKpaState) {
for i in 0..QRC_KPA_PARALLELISM {
qrc_intutils_clear64(&mut ctx.state[i], QRC_KECCAK_STATE_SIZE);
}
qrc_intutils_clear8(&mut ctx.buffer, QRC_KPA_PARALLELISM * QRC_KECCAK_STATE_BYTE_SIZE);
ctx.position = 0;
ctx.processed = 0;
ctx.rate = QrcKeccakRate::QrcKeccakRateNone;
}
const KPA_LEAF_HASH128: usize = 16;
const KPA_LEAF_HASH256: usize = 32;
const KPA_LEAF_HASH512: usize = 64;
const KECCAK_ROUND_CONSTANTS: [u64; QRC_KECCAK_PERMUTATION_MAX_ROUNDS] =
[
0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000,
0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A,
0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003,
0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A,
0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008,
0x8000000080008082, 0x800000008000800A, 0x8000000000000003, 0x8000000080000009,
0x8000000000008082, 0x0000000000008009, 0x8000000000000080, 0x0000000000008083,
0x8000000000000081, 0x0000000000000001, 0x000000000000800B, 0x8000000080008001,
0x0000000000000080, 0x8000000000008000, 0x8000000080008001, 0x0000000000000009,
0x800000008000808B, 0x0000000000000081, 0x8000000000000082, 0x000000008000008B,
0x8000000080008009, 0x8000000080000000, 0x0000000080000080, 0x0000000080008003
];
fn keccak_fast_absorb(state: &mut [u64], message: &[u8], msglen: usize) {
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
let mut state_slice = qrc_intutils_transform_64to8(state);
qrc_intutils_xor(&mut state_slice, message, msglen);
qrc_intutils_copy64(state, &qrc_intutils_transform_8to64(&state_slice), QRC_KECCAK_STATE_SIZE);
} else {
for i in 0..(msglen/size_of::<u64>()) {
state[i] ^= qrc_intutils_le8to64(&message[(size_of::<u64>() * i)..]);
}
}
}
fn keccak_left_encode(buffer: &mut [u8], value: usize) -> usize {
let mut v: usize = value;
let mut n: usize = 0;
while v != 0 && n < size_of::<usize>() {
n += 1;
v >>= 8;
}
if n == 0 {
n = 1;
}
for i in 1..=n {
buffer[i] = (value >> (8 * (n - i))) as u8;
}
buffer[0] = n as u8;
return n + 1;
}
fn keccak_right_encode(buffer: &mut [u8], value: usize) -> usize {
let mut v: usize = value;
let mut n: usize = 0;
while v != 0 && n < size_of::<usize>() {
n += 1;
v >>= 8;
}
if n == 0 {
n = 1;
}
for i in 1..=n {
buffer[i - 1] = (value >> (8 * (n - i))) as u8;
}
buffer[n] = n as u8;
return n + 1;
}
fn kpa_absorb_leaves(state: &mut [u64], rate: usize, mut input: &[u8], mut inplen: usize) {
while inplen >= rate {
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
let mut state_slice = qrc_intutils_transform_64to8(state);
qrc_intutils_xor(&mut state_slice, input, rate);
qrc_intutils_copy64(state, &qrc_intutils_transform_8to64(&state_slice), QRC_KECCAK_STATE_SIZE);
} else {
for i in 0..rate / size_of::<u64>() {
state[i] ^= qrc_intutils_le8to64(&input[size_of::<u64>() * i..]);
}
}
qrc_keccak_permute_p1600c(state, QRC_KPA_ROUNDS);
inplen -= rate;
input = &input[rate..];
}
if inplen != 0 {
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
let mut state_slice = qrc_intutils_transform_64to8(state);
qrc_intutils_xor(&mut state_slice, input, inplen);
qrc_intutils_copy64(state, &qrc_intutils_transform_8to64(&state_slice), QRC_KECCAK_STATE_SIZE);
} else {
for i in 0..inplen / size_of::<u64>() {
state[i] ^= qrc_intutils_le8to64(&input[(size_of::<u64>() * i)..]);
}
}
qrc_keccak_permute_p1600c(state, QRC_KPA_ROUNDS);
}
}
fn kpa_fast_absorbx8(ctx: &mut QrcKpaState, message: &[u8]) {
let rate = ctx.rate as usize;
for i in 0..QRC_KPA_PARALLELISM {
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
let mut state_slice = qrc_intutils_transform_64to8(&mut ctx.state[i]);
qrc_intutils_xor(&mut state_slice, &message[i * rate..], rate);
qrc_intutils_copy64(&mut ctx.state[i], &qrc_intutils_transform_8to64(&state_slice), QRC_KECCAK_STATE_SIZE);
} else {
for j in 0..rate as usize / size_of::<u64>() {
ctx.state[i][j] ^= qrc_intutils_le8to64(&message[(i * rate) + (j * size_of::<u64>())..]);
}
}
}
}
fn kpa_permutex8(ctx: &mut QrcKpaState) {
for i in 0..QRC_KPA_PARALLELISM {
qrc_keccak_permute_p1600c(&mut ctx.state[i], QRC_KPA_ROUNDS);
}
}
fn kpa_squeezeblocks(state: &mut [u64], mut output: &mut [u8], mut nblocks: usize, rate: usize) {
while nblocks > 0 {
qrc_keccak_permute_p1600c(state, QRC_KPA_ROUNDS);
if QRC_SYSTEM_IS_LITTLE_ENDIAN {
qrc_intutils_copy8(output, &qrc_intutils_transform_64to8(&state), rate);
} else {
for i in 0..(rate >> 3) {
qrc_intutils_le64to8(&mut output[size_of::<u64>() * i..], state[i]);
}
}
output = &mut output[rate..];
nblocks -= 1;
}
}