------------------------------------------------------------ -- Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich -- http://www.iis.ee.ethz.ch/~sha3 ------------------------------------------------------------ library ieee; use ieee.numeric_std.all; use ieee.std_logic_1164.all; use work.shavitepkg.all; -- AES round without ARK, i.e. not using a key entity aes is port ( ClkxCI : in std_logic; RstxRBI : in std_logic; PlainxDI : in wordmat128; OutxDO : out wordmat128); end aes; architecture rtl of aes is -- Combinational S-Box component subbytes is port ( ClkxCI : in std_logic; RstxRBI : in std_logic; DxDI : in std_logic_vector(7 downto 0); DxDO : out std_logic_vector(7 downto 0)); end component; signal SBoxedxD, RowShiftedxD : bytemat128; signal Shift1xD, Mult3xD : bytemat128; signal ColMixedxD : bytemat128; begin -- rtl sboxi : for i in 3 downto 0 generate -- SBox components sboxj : for j in 3 downto 0 generate sbox : subbytes port map ( ClkxCI => ClkxCI, RstxRBI => RstxRBI, DxDI => PlainxDI(i)(8*j+7 downto 8*j), DxDO => SBoxedxD(i*4+3-j)); end generate sboxj; end generate sboxi; -- LUT-based S-Box, too big -- purpose: Calculates the S-Box of the input -- type : combinational -- inputs : PlainxDI -- outputs: SBoxedxD -- p_sbox : process (PlainxDI) -- begin -- process p_sbox -- for i in 3 downto 0 loop -- for j in 3 downto 0 loop -- SBoxedxD(i*4+3-j) PlainxDI(i)(8*j+7 downto 8*j)))); -- end loop; -- j -- end loop; -- i -- end process p_sbox; -- ShiftRows sr : for i in 3 downto 0 generate srword : for j in 3 downto 0 generate RowShiftedxD(i*4+j) <= SBoxedxD(((i+j) mod 4)*4+j); end generate srword; end generate sr; -- purpose: Calculates a bit-shifted signal needed for MixColumns -- type : combinational -- inputs : RowShiftedxD -- outputs: Shift1xD p_bitshift : process (RowShiftedxD) begin -- process p_bitshift for i in 0 to 15 loop if RowShiftedxD(i)(7) = '1' then Shift1xD(i) <= (RowShiftedxD(i)(6 downto 0) & '0') xor X"1b"; else Shift1xD(i) <= RowShiftedxD(i)(6 downto 0) & '0'; end if; end loop; end process p_bitshift; -- Calculate the Mult3xD auxiliary signal for MixColumns mult3 : for i in 0 to 15 generate Mult3xD(i) <= Shift1xD(i) xor RowShiftedxD(i); end generate mult3; -- MixColumns mc : for i in 0 to 3 generate ColMixedxD(4*i) <= Shift1xD(4*i) xor Mult3xD(4*i+1) xor RowShiftedxD(4*i+2) xor RowShiftedxD(4*i+3); ColMixedxD(4*i+1) <= RowShiftedxD(4*i) xor Shift1xD(4*i+1) xor Mult3xD(4*i+2) xor RowShiftedxD(4*i+3); ColMixedxD(4*i+2) <= RowShiftedxD(4*i) xor RowShiftedxD(4*i+1) xor Shift1xD(4*i+2) xor Mult3xD(4*i+3); ColMixedxD(4*i+3) <= Mult3xD(4*i) xor RowShiftedxD(4*i+1) xor RowShiftedxD(4*i+2) xor Shift1xD(4*i+3); end generate mc; -- Output conversion -- purpose: Calculate the output word matrix -- type : combinational -- inputs : ColMixedxD -- outputs: OutxDO p_outconv : process (ColMixedxD) begin -- process p_outconv for i in 0 to 3 loop for j in 0 to 3 loop OutxDO(i)(8*j+7 downto 8*j) <= ColMixedxD(i*4+3-j); end loop; -- j end loop; -- i end process p_outconv; end rtl;