rs_internal_state 0.1.3

This package serves as an essential building block within the `rs_shield` cryptographic library. It is focused on providing foundational functionality and infrastructure for various cryptographic operations within the larger project. While this package has been made publicly available to satisfy the dependency requirements of Rust's cargo system, its utility is predominantly realized in the context of the `rs_shield` project. Unless you are developing or maintaining a component of the `rs_shield` project, this package might offer limited direct utility. For access to a full suite of cryptographic functionalities, consider using the `rs_shield` library bundle.
Documentation
use crate::n_bit_states::GenericStateHasher;
use crate::{rotors::sha512rotor::Sha512Rotor as Rotor, DWords};
use rs_n_bit_words::{NBitWord, TSize};

#[derive(Clone, Debug, Hash, PartialEq)]
pub struct Sha512BitsState(
    pub NBitWord<u64>,
    pub NBitWord<u64>,
    pub NBitWord<u64>,
    pub NBitWord<u64>,
    pub NBitWord<u64>,
    pub NBitWord<u64>,
    pub NBitWord<u64>,
    pub NBitWord<u64>,
    pub DWords<u64>,
);

impl GenericStateHasher for Sha512BitsState {
    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) {
        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::K64);
        Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[1]).rnd(Self::K65);
        Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[2]).rnd(Self::K66);
        Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[3]).rnd(Self::K67);
        Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[4]).rnd(Self::K68);
        Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[5]).rnd(Self::K69);
        Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[6]).rnd(Self::K70);
        Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[7]).rnd(Self::K71);
        Rotor(self.0, self.1, self.2, &mut self.3, self.4, self.5, self.6, &mut self.7, self.8[8]).rnd(Self::K72);
        Rotor(self.7, self.0, self.1, &mut self.2, self.3, self.4, self.5, &mut self.6, self.8[9]).rnd(Self::K73);
        Rotor(self.6, self.7, self.0, &mut self.1, self.2, self.3, self.4, &mut self.5, self.8[10]).rnd(Self::K74);
        Rotor(self.5, self.6, self.7, &mut self.0, self.1, self.2, self.3, &mut self.4, self.8[11]).rnd(Self::K75);
        Rotor(self.4, self.5, self.6, &mut self.7, self.0, self.1, self.2, &mut self.3, self.8[12]).rnd(Self::K76);
        Rotor(self.3, self.4, self.5, &mut self.6, self.7, self.0, self.1, &mut self.2, self.8[13]).rnd(Self::K77);
        Rotor(self.2, self.3, self.4, &mut self.5, self.6, self.7, self.0, &mut self.1, self.8[14]).rnd(Self::K78);
        Rotor(self.1, self.2, self.3, &mut self.4, self.5, self.6, self.7, &mut self.0, self.8[15]).rnd(Self::K79);
    }
}

impl Sha512BitsState {
    // SHA-384, SHA-512, SHA-512/224, SHA-512/256 constants
    pub const K00: u64 = 0x428A2F98D728AE22;
    pub const K01: u64 = 0x7137449123EF65CD;
    pub const K02: u64 = 0xB5C0FBCFEC4D3B2F;
    pub const K03: u64 = 0xE9B5DBA58189DBBC;
    pub const K04: u64 = 0x3956C25BF348B538;
    pub const K05: u64 = 0x59F111F1B605D019;
    pub const K06: u64 = 0x923F82A4AF194F9B;
    pub const K07: u64 = 0xAB1C5ED5DA6D8118;
    pub const K08: u64 = 0xD807AA98A3030242;
    pub const K09: u64 = 0x12835B0145706FBE;
    pub const K10: u64 = 0x243185BE4EE4B28C;
    pub const K11: u64 = 0x550C7DC3D5FFB4E2;
    pub const K12: u64 = 0x72BE5D74F27B896F;
    pub const K13: u64 = 0x80DEB1FE3B1696B1;
    pub const K14: u64 = 0x9BDC06A725C71235;
    pub const K15: u64 = 0xC19BF174CF692694;
    pub const K16: u64 = 0xE49B69C19EF14AD2;
    pub const K17: u64 = 0xEFBE4786384F25E3;
    pub const K18: u64 = 0x0FC19DC68B8CD5B5;
    pub const K19: u64 = 0x240CA1CC77AC9C65;
    pub const K20: u64 = 0x2DE92C6F592B0275;
    pub const K21: u64 = 0x4A7484AA6EA6E483;
    pub const K22: u64 = 0x5CB0A9DCBD41FBD4;
    pub const K23: u64 = 0x76F988DA831153B5;
    pub const K24: u64 = 0x983E5152EE66DFAB;
    pub const K25: u64 = 0xA831C66D2DB43210;
    pub const K26: u64 = 0xB00327C898FB213F;
    pub const K27: u64 = 0xBF597FC7BEEF0EE4;
    pub const K28: u64 = 0xC6E00BF33DA88FC2;
    pub const K29: u64 = 0xD5A79147930AA725;
    pub const K30: u64 = 0x06CA6351E003826F;
    pub const K31: u64 = 0x142929670A0E6E70;
    pub const K32: u64 = 0x27B70A8546D22FFC;
    pub const K33: u64 = 0x2E1B21385C26C926;
    pub const K34: u64 = 0x4D2C6DFC5AC42AED;
    pub const K35: u64 = 0x53380D139D95B3DF;
    pub const K36: u64 = 0x650A73548BAF63DE;
    pub const K37: u64 = 0x766A0ABB3C77B2A8;
    pub const K38: u64 = 0x81C2C92E47EDAEE6;
    pub const K39: u64 = 0x92722C851482353B;
    pub const K40: u64 = 0xA2BFE8A14CF10364;
    pub const K41: u64 = 0xA81A664BBC423001;
    pub const K42: u64 = 0xC24B8B70D0F89791;
    pub const K43: u64 = 0xC76C51A30654BE30;
    pub const K44: u64 = 0xD192E819D6EF5218;
    pub const K45: u64 = 0xD69906245565A910;
    pub const K46: u64 = 0xF40E35855771202A;
    pub const K47: u64 = 0x106AA07032BBD1B8;
    pub const K48: u64 = 0x19A4C116B8D2D0C8;
    pub const K49: u64 = 0x1E376C085141AB53;
    pub const K50: u64 = 0x2748774CDF8EEB99;
    pub const K51: u64 = 0x34B0BCB5E19B48A8;
    pub const K52: u64 = 0x391C0CB3C5C95A63;
    pub const K53: u64 = 0x4ED8AA4AE3418ACB;
    pub const K54: u64 = 0x5B9CCA4F7763E373;
    pub const K55: u64 = 0x682E6FF3D6B2B8A3;
    pub const K56: u64 = 0x748F82EE5DEFB2FC;
    pub const K57: u64 = 0x78A5636F43172F60;
    pub const K58: u64 = 0x84C87814A1F0AB72;
    pub const K59: u64 = 0x8CC702081A6439EC;
    pub const K60: u64 = 0x90BEFFFA23631E28;
    pub const K61: u64 = 0xA4506CEBDE82BDE9;
    pub const K62: u64 = 0xBEF9A3F7B2C67915;
    pub const K63: u64 = 0xC67178F2E372532B;
    pub const K64: u64 = 0xCA273ECEEA26619C;
    pub const K65: u64 = 0xD186B8C721C0C207;
    pub const K66: u64 = 0xEADA7DD6CDE0EB1E;
    pub const K67: u64 = 0xF57D4F7FEE6ED178;
    pub const K68: u64 = 0x06F067AA72176FBA;
    pub const K69: u64 = 0x0A637DC5A2C898A6;
    pub const K70: u64 = 0x113F9804BEF90DAE;
    pub const K71: u64 = 0x1B710B35131C471B;
    pub const K72: u64 = 0x28DB77F523047D84;
    pub const K73: u64 = 0x32CAAB7B40C72493;
    pub const K74: u64 = 0x3C9EBE0A15C9BEBC;
    pub const K75: u64 = 0x431D67C49C100D4C;
    pub const K76: u64 = 0x4CC5D4BECB3E42B6;
    pub const K77: u64 = 0x597F299CFC657E2A;
    pub const K78: u64 = 0x5FCB6FAB3AD6FAEC;
    pub const K79: u64 = 0x6C44198C4A475817;
}