------------------------------------------------------------ -- Copyright: 2011 George Mason University, Virginia USA -- http://www.iis.ee.ethz.ch/~sha3 ------------------------------------------------------------ -- ===================================================================== -- Copyright © 2010-2011 by Cryptographic Engineering Research Group (CERG), -- ECE Department, George Mason University -- Fairfax, VA, U.S.A. -- ===================================================================== library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use work.sha3_pkg.all; use work.keccak_pkg.all; -- implementation of Keccak round: there are two basic architectures of Keccak function -- Guido Bertoni implementation of Keccak round - streightforward -- Marcin Rogawski implementation of Keccak round - based on C implementation -- Marcin Rogawski implementation is smaller and faster on Altera (Stratix II-IV, Cyclone II-IV) -- and Xilinx (Virtex 4-6, Spartan 3 and 6) devices than Guido Bertoni implementation entity keccak_round is port ( rin : in std_logic_vector(KECCAK_STATE-1 downto 0); rc : in std_logic_vector(63 downto 0); rout : out std_logic_vector(KECCAK_STATE-1 downto 0)); end keccak_round; architecture mrogawski_round of keccak_round is signal Aba, Abe, Abi, Abo, Abu: std_logic_vector(63 downto 0); signal Aga, Age, Agi, Ago, Agu: std_logic_vector(63 downto 0); signal Aka, Ake, Aki, Ako, Aku: std_logic_vector(63 downto 0); signal Ama, Ame, Ami, Amo, Amu: std_logic_vector(63 downto 0); signal Asa, Ase, Asi, Aso, Asu: std_logic_vector(63 downto 0); signal Aba_wire, Abe_wire, Abi_wire, Abo_wire, Abu_wire: std_logic_vector(63 downto 0); signal Aga_wire, Age_wire, Agi_wire, Ago_wire, Agu_wire: std_logic_vector(63 downto 0); signal Aka_wire, Ake_wire, Aki_wire, Ako_wire, Aku_wire: std_logic_vector(63 downto 0); signal Ama_wire, Ame_wire, Ami_wire, Amo_wire, Amu_wire: std_logic_vector(63 downto 0); signal Asa_wire, Ase_wire, Asi_wire, Aso_wire, Asu_wire: std_logic_vector(63 downto 0); signal Bba, Bbe, Bbi, Bbo, Bbu: std_logic_vector(63 downto 0); signal Bga, Bge, Bgi, Bgo, Bgu: std_logic_vector(63 downto 0); signal Bka, Bke, Bki, Bko, Bku: std_logic_vector(63 downto 0); signal Bma, Bme, Bmi, Bmo, Bmu: std_logic_vector(63 downto 0); signal Bsa, Bse, Bsi, Bso, Bsu: std_logic_vector(63 downto 0); signal Ca, Ce, Ci, Co, Cu: std_logic_vector(63 downto 0); signal Da, De, Di, Do, Du: std_logic_vector(63 downto 0); signal Eba, Ebe, Ebi, Ebo, Ebu ,Eba_wire: std_logic_vector(63 downto 0); signal Ega, Ege, Egi, Ego, Egu: std_logic_vector(63 downto 0); signal Eka, Eke, Eki, Eko, Eku: std_logic_vector(63 downto 0); signal Ema, Eme, Emi, Emo, Emu: std_logic_vector(63 downto 0); signal Esa, Ese, Esi, Eso, Esu: std_logic_vector(63 downto 0); begin Aba <= rin(1599 downto 1536); Abe <= rin(1535 downto 1472); Abi <= rin(1471 downto 1408); Abo <= rin(1407 downto 1344); Abu <= rin(1343 downto 1280); Aga <= rin(1279 downto 1216); Age <= rin(1215 downto 1152); Agi <= rin(1151 downto 1088); Ago <= rin(1087 downto 1024); Agu <= rin(1023 downto 960); Aka <= rin(959 downto 896); Ake <= rin(895 downto 832); Aki <= rin(831 downto 768); Ako <= rin(767 downto 704); Aku <= rin(703 downto 640); Ama <= rin(639 downto 576); Ame <= rin(575 downto 512); Ami <= rin(511 downto 448); Amo <= rin(447 downto 384); Amu <= rin(383 downto 320); Asa <= rin(319 downto 256); Ase <= rin(255 downto 192); Asi <= rin(191 downto 128); Aso <= rin(127 downto 64); Asu <= rin(63 downto 0); Ca <= Aba xor Aga xor Aka xor Ama xor Asa; Ce <= Abe xor Age xor Ake xor Ame xor Ase; Ci <= Abi xor Agi xor Aki xor Ami xor Asi; Co <= Abo xor Ago xor Ako xor Amo xor Aso; Cu <= Abu xor Agu xor Aku xor Amu xor Asu; Da <= Cu xor rolx(Ce, 1); De <= Ca xor rolx(Ci, 1); Di <= Ce xor rolx(Co, 1); Do <= Ci xor rolx(Cu, 1); Du <= Co xor rolx(Ca, 1); Aba_wire <= Aba xor Da; Bba <= Aba_wire; Age_wire <= Age xor De; Bbe <= rolx(Age_wire, 44); Aki_wire <= Aki xor Di; Bbi <= rolx(Aki_wire, 43); Eba_wire <= Bba xor ((not Bbe) and Bbi); Eba <= Eba_wire xor rc; Amo_wire <= Amo xor Do; Bbo <= rolx(Amo_wire, 21); Ebe <= Bbe xor ((not Bbi) and Bbo); Asu_wire <= Asu xor Du; Bbu <= rolx(Asu_wire, 14); Ebi <= Bbi xor ((not Bbo) and Bbu); Ebo <= Bbo xor ((not Bbu) and Bba); Ebu <= Bbu xor ((not Bba) and Bbe); Abo_wire <= Abo xor Do; Bga <= rolx(Abo_wire, 28); Agu_wire <= Agu xor Du; Bge <= rolx(Agu_wire, 20); Aka_wire <= Aka xor Da; Bgi <= rolx(Aka_wire, 3); Ega <= Bga xor ((not Bge)and Bgi); Ame_wire <= Ame xor De; Bgo <= rolx(Ame_wire, 45); Ege <= Bge xor ((not Bgi)and Bgo); Asi_wire <= Asi xor Di; Bgu <= rolx(Asi_wire, 61); Egi <= Bgi xor ((not Bgo)and Bgu); Ego <= Bgo xor ((not Bgu)and Bga); Egu <= Bgu xor ((not Bga)and Bge); Abe_wire <= Abe xor De; Bka <= rolx(Abe_wire, 1); Agi_wire <= Agi xor Di; Bke <= rolx(Agi_wire, 6); Ako_wire <= Ako xor Do; Bki <= rolx(Ako_wire, 25); Eka <= Bka xor ((not Bke)and Bki); Amu_wire <= Amu xor Du; Bko <= rolx(Amu_wire, 8); Eke <= Bke xor ((not Bki) and Bko); Asa_wire <= Asa xor Da; Bku <= rolx(Asa_wire, 18); Eki <= Bki xor ((not Bko)and Bku); Eko <= Bko xor ((not Bku)and Bka); Eku <= Bku xor ((not Bka)and Bke); Abu_wire <= Abu xor Du; Bma <= rolx(Abu_wire, 27); Aga_wire <= Aga xor Da; Bme <= rolx(Aga_wire, 36); Ake_wire <= Ake xor De; Bmi <= rolx(Ake_wire, 10); Ema <= Bma xor ((not Bme)and Bmi); Ami_wire <= Ami xor Di; Bmo <= rolx(Ami_wire, 15); Eme <= Bme xor ((not Bmi)and Bmo); Aso_wire <= Aso xor Do; Bmu <= rolx(Aso_wire, 56); Emi <= Bmi xor ((not Bmo)and Bmu); Emo <= Bmo xor ((not Bmu)and Bma); Emu <= Bmu xor ((not Bma)and Bme); Abi_wire <= Abi xor Di; Bsa <= rolx(Abi_wire, 62); Ago_wire <= Ago xor Do; Bse <= rolx(Ago_wire, 55); Aku_wire <= Aku xor Du; Bsi <= rolx(Aku_wire, 39); Esa <= Bsa xor ((not Bse)and Bsi); Ama_wire <= Ama xor Da; Bso <= rolx(Ama_wire, 41); Ese <= Bse xor ((not Bsi)and Bso); Ase_wire <= Ase xor De; Bsu <= rolx(Ase_wire, 2); Esi <= Bsi xor ((not Bso) and Bsu); Eso <= Bso xor ((not Bsu)and Bsa); Esu <= Bsu xor ((not Bsa)and Bse); rout(1599 downto 1536) <= Eba; rout(1535 downto 1472) <= Ebe; rout(1471 downto 1408) <= Ebi; rout(1407 downto 1344)<= Ebo; rout(1343 downto 1280)<= Ebu; rout(1279 downto 1216)<= Ega; rout(1215 downto 1152)<= Ege; rout(1151 downto 1088)<= Egi; rout(1087 downto 1024)<= Ego; rout(1023 downto 960)<= Egu; rout(959 downto 896)<= Eka; rout(895 downto 832)<= Eke; rout(831 downto 768)<= Eki; rout(767 downto 704)<= Eko; rout(703 downto 640)<= Eku; rout(639 downto 576)<= Ema; rout(575 downto 512)<= Eme; rout(511 downto 448)<= Emi; rout(447 downto 384)<= Emo; rout(383 downto 320)<= Emu; rout(319 downto 256)<= Esa; rout(255 downto 192)<= Ese; rout(191 downto 128)<= Esi; rout(127 downto 64)<= Eso; rout(63 downto 0)<= Esu; end;