use crate::n_bit_states::GenericStateHasher;
use crate::rotors::sha256rotor::Sha256Rotor as Rotor;
use crate::DWords;
use core::{hash::Hash, ops::AddAssign};
use rs_n_bit_words::{NBitWord, TSize};
#[derive(Clone, Debug, Hash, PartialEq)]
pub struct Sha256BitsState(
pub NBitWord<u32>,
pub NBitWord<u32>,
pub NBitWord<u32>,
pub NBitWord<u32>,
pub NBitWord<u32>,
pub NBitWord<u32>,
pub NBitWord<u32>,
pub NBitWord<u32>,
pub DWords<u32>,
);
impl GenericStateHasher for Sha256BitsState {
fn next_words(&mut self) {
self.8[0] = self.8[0] + self.8[1].gamma0() + self.8[9] + self.8[14].gamma1();
self.8[1] = self.8[1] + self.8[2].gamma0() + self.8[10] + self.8[15].gamma1();
self.8[2] = self.8[2] + self.8[3].gamma0() + self.8[11] + self.8[0].gamma1();
self.8[3] = self.8[3] + self.8[4].gamma0() + self.8[12] + self.8[1].gamma1();
self.8[4] = self.8[4] + self.8[5].gamma0() + self.8[13] + self.8[2].gamma1();
self.8[5] = self.8[5] + self.8[6].gamma0() + self.8[14] + self.8[3].gamma1();
self.8[6] = self.8[6] + self.8[7].gamma0() + self.8[15] + self.8[4].gamma1();
self.8[7] = self.8[7] + self.8[8].gamma0() + self.8[0] + self.8[5].gamma1();
self.8[8] = self.8[8] + self.8[9].gamma0() + self.8[1] + self.8[6].gamma1();
self.8[9] = self.8[9] + self.8[10].gamma0() + self.8[2] + self.8[7].gamma1();
self.8[10] = self.8[10] + self.8[11].gamma0() + self.8[3] + self.8[8].gamma1();
self.8[11] = self.8[11] + self.8[12].gamma0() + self.8[4] + self.8[9].gamma1();
self.8[12] = self.8[12] + self.8[13].gamma0() + self.8[5] + self.8[10].gamma1();
self.8[13] = self.8[13] + self.8[14].gamma0() + self.8[6] + self.8[11].gamma1();
self.8[14] = self.8[14] + self.8[15].gamma0() + self.8[7] + self.8[12].gamma1();
self.8[15] = self.8[15] + self.8[0].gamma0() + self.8[8] + self.8[13].gamma1();
}
fn block_00_15(&mut self) {
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[0]).rnd(Self::K00);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[1]).rnd(Self::K01);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[2]).rnd(Self::K02);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[3]).rnd(Self::K03);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[4]).rnd(Self::K04);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[5]).rnd(Self::K05);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[6]).rnd(Self::K06);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[7]).rnd(Self::K07);
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[8]).rnd(Self::K08);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[9]).rnd(Self::K09);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[10]).rnd(Self::K10);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[11]).rnd(Self::K11);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[12]).rnd(Self::K12);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[13]).rnd(Self::K13);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[14]).rnd(Self::K14);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[15]).rnd(Self::K15);
}
fn block_16_31(&mut self) {
self.next_words();
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[0]).rnd(Self::K16);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[1]).rnd(Self::K17);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[2]).rnd(Self::K18);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[3]).rnd(Self::K19);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[4]).rnd(Self::K20);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[5]).rnd(Self::K21);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[6]).rnd(Self::K22);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[7]).rnd(Self::K23);
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[8]).rnd(Self::K24);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[9]).rnd(Self::K25);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[10]).rnd(Self::K26);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[11]).rnd(Self::K27);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[12]).rnd(Self::K28);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[13]).rnd(Self::K29);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[14]).rnd(Self::K30);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[15]).rnd(Self::K31);
}
fn block_32_47(&mut self) {
self.next_words();
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[0]).rnd(Self::K32);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[1]).rnd(Self::K33);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[2]).rnd(Self::K34);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[3]).rnd(Self::K35);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[4]).rnd(Self::K36);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[5]).rnd(Self::K37);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[6]).rnd(Self::K38);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[7]).rnd(Self::K39);
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[8]).rnd(Self::K40);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[9]).rnd(Self::K41);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[10]).rnd(Self::K42);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[11]).rnd(Self::K43);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[12]).rnd(Self::K44);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[13]).rnd(Self::K45);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[14]).rnd(Self::K46);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[15]).rnd(Self::K47);
}
fn block_48_63(&mut self) {
self.next_words();
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[0]).rnd(Self::K48);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[1]).rnd(Self::K49);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[2]).rnd(Self::K50);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[3]).rnd(Self::K51);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[4]).rnd(Self::K52);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[5]).rnd(Self::K53);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[6]).rnd(Self::K54);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[7]).rnd(Self::K55);
Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[8]).rnd(Self::K56);
Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[9]).rnd(Self::K57);
Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[10]).rnd(Self::K58);
Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[11]).rnd(Self::K59);
Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[12]).rnd(Self::K60);
Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[13]).rnd(Self::K61);
Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[14]).rnd(Self::K62);
Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[15]).rnd(Self::K63);
}
fn block_64_79(&mut self) {}
}
impl Sha256BitsState {
const K00: u32 = 0x428A2F98;
const K01: u32 = 0x71374491;
const K02: u32 = 0xB5C0FBCF;
const K03: u32 = 0xE9B5DBA5;
const K04: u32 = 0x3956C25B;
const K05: u32 = 0x59F111F1;
const K06: u32 = 0x923F82A4;
const K07: u32 = 0xAB1C5ED5;
const K08: u32 = 0xD807AA98;
const K09: u32 = 0x12835B01;
const K10: u32 = 0x243185BE;
const K11: u32 = 0x550C7DC3;
const K12: u32 = 0x72BE5D74;
const K13: u32 = 0x80DEB1FE;
const K14: u32 = 0x9BDC06A7;
const K15: u32 = 0xC19BF174;
const K16: u32 = 0xE49B69C1;
const K17: u32 = 0xEFBE4786;
const K18: u32 = 0x0FC19DC6;
const K19: u32 = 0x240CA1CC;
const K20: u32 = 0x2DE92C6F;
const K21: u32 = 0x4A7484AA;
const K22: u32 = 0x5CB0A9DC;
const K23: u32 = 0x76F988DA;
const K24: u32 = 0x983E5152;
const K25: u32 = 0xA831C66D;
const K26: u32 = 0xB00327C8;
const K27: u32 = 0xBF597FC7;
const K28: u32 = 0xC6E00BF3;
const K29: u32 = 0xD5A79147;
const K30: u32 = 0x06CA6351;
const K31: u32 = 0x14292967;
const K32: u32 = 0x27B70A85;
const K33: u32 = 0x2E1B2138;
const K34: u32 = 0x4D2C6DFC;
const K35: u32 = 0x53380D13;
const K36: u32 = 0x650A7354;
const K37: u32 = 0x766A0ABB;
const K38: u32 = 0x81C2C92E;
const K39: u32 = 0x92722C85;
const K40: u32 = 0xA2BFE8A1;
const K41: u32 = 0xA81A664B;
const K42: u32 = 0xC24B8B70;
const K43: u32 = 0xC76C51A3;
const K44: u32 = 0xD192E819;
const K45: u32 = 0xD6990624;
const K46: u32 = 0xF40E3585;
const K47: u32 = 0x106AA070;
const K48: u32 = 0x19A4C116;
const K49: u32 = 0x1E376C08;
const K50: u32 = 0x2748774C;
const K51: u32 = 0x34B0BCB5;
const K52: u32 = 0x391C0CB3;
const K53: u32 = 0x4ED8AA4A;
const K54: u32 = 0x5B9CCA4F;
const K55: u32 = 0x682E6FF3;
const K56: u32 = 0x748F82EE;
const K57: u32 = 0x78A5636F;
const K58: u32 = 0x84C87814;
const K59: u32 = 0x8CC70208;
const K60: u32 = 0x90BEFFFA;
const K61: u32 = 0xA4506CEB;
const K62: u32 = 0xBEF9A3F7;
const K63: u32 = 0xC67178F2;
}
impl AddAssign for Sha256BitsState {
fn add_assign(&mut self, rhs: Self) {
self.0 += rhs.0;
self.1 += rhs.1;
self.2 += rhs.2;
self.3 += rhs.3;
self.4 += rhs.4;
self.5 += rhs.5;
self.6 += rhs.6;
self.7 += rhs.7;
}
}