------------------------------------------------------------
-- 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
signal SBoxedxD, RowShiftedxD : bytemat128;
signal Shift1xD, Mult3xD : bytemat128;
signal ColMixedxD : bytemat128;
begin -- rtl
-- LUT-based S-Box
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) <= SBOX(to_integer(unsigned(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;