------------------------------------------------------------ -- 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.numeric_std.all; use work.sha3_pkg.all; use work.groestl_pkg.all; -- Groestl MixBytes implemented as combinational function -- possible generics values: hs = {GROESTL_DATA_SIZE_SMALL, GROESTL_DATA_SIZE_BIG} -- they are corresponding to 256 and 512 versions respectively entity groestl_mixbytes is generic (n :integer := GROESTL_DATA_SIZE_SMALL); port( input : in std_logic_vector(n-1 downto 0); output : out std_logic_vector(n-1 downto 0)); end groestl_mixbytes; architecture groestl_mixbytes of groestl_mixbytes is signal mulx2 :std_logic_vector(n-1 downto 0); signal mulx3 :std_logic_vector(n-1 downto 0); signal mulx4 :std_logic_vector(n-1 downto 0); signal mulx5 :std_logic_vector(n-1 downto 0); signal mulx7 :std_logic_vector(n-1 downto 0); begin -- multiplication by x02 in GF(2^8) m2a_gen : for i in 0 to n/AES_SBOX_SIZE -1 generate m2a :entity work.aes_mulx02(rtl) port map (input=>input((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE)), output=>mulx2((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE))); end generate; -- multiplication by x03 in GF(2^8) m3a_gen : for i in 0 to n/AES_SBOX_SIZE -1 generate m3a :entity work.aes_mulx03(rtl) port map (input=>input((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE)), output=>mulx3((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE))); end generate; -- multiplication by x04 in GF(2^8) m4_gen : for i in 0 to n/AES_SBOX_SIZE -1 generate m4 :entity work.aes_mulx04(rtl) port map (input=>input((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE)), output=>mulx4((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE))); end generate; -- multiplication by x05 in GF(2^8) m5a_gen : for i in 0 to n/AES_SBOX_SIZE -1 generate m5a :entity work.aes_mulx05(rtl) port map (input=>input((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE)), output=>mulx5((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE))); end generate; -- multiplication by x07 in GF(2^8) m7_gen : for i in 0 to n/AES_SBOX_SIZE -1 generate m7 :entity work.aes_mulx07(rtl) port map (input=>input((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE)), output=>mulx7((i+1)*AES_SBOX_SIZE-1 downto (i*AES_SBOX_SIZE))); end generate; -- network of xors out_ls_gen: for i in 0 to n/64-1 generate output(64*i+63 downto 64*i+56) <= mulx2(64*i+63 downto 64*i+56) xor mulx2(64*i+55 downto 64*i+48) xor mulx3(64*i+47 downto 64*i+40) xor mulx4(64*i+39 downto 64*i+32) xor mulx5(64*i+31 downto 64*i+24) xor mulx3(64*i+23 downto 64*i+16) xor mulx5(64*i+15 downto 64*i+8) xor mulx7(64*i+7 downto 64*i); output(64*i+55 downto 64*i+48) <= mulx7(64*i+63 downto 64*i+56) xor mulx2(64*i+55 downto 64*i+48) xor mulx2(64*i+47 downto 64*i+40) xor mulx3(64*i+39 downto 64*i+32) xor mulx4(64*i+31 downto 64*i+24) xor mulx5(64*i+23 downto 64*i+16) xor mulx3(64*i+15 downto 64*i+8) xor mulx5(64*i+7 downto 64*i); output(64*i+47 downto 64*i+40) <= mulx5(64*i+63 downto 64*i+56) xor mulx7(64*i+55 downto 64*i+48) xor mulx2(64*i+47 downto 64*i+40) xor mulx2(64*i+39 downto 64*i+32) xor mulx3(64*i+31 downto 64*i+24) xor mulx4(64*i+23 downto 64*i+16) xor mulx5(64*i+15 downto 64*i+8) xor mulx3(64*i+7 downto 64*i); output(64*i+39 downto 64*i+32) <= mulx3(64*i+63 downto 64*i+56) xor mulx5(64*i+55 downto 64*i+48) xor mulx7(64*i+47 downto 64*i+40) xor mulx2(64*i+39 downto 64*i+32) xor mulx2(64*i+31 downto 64*i+24) xor mulx3(64*i+23 downto 64*i+16) xor mulx4(64*i+15 downto 64*i+8) xor mulx5(64*i+7 downto 64*i); output(64*i+31 downto 64*i+24) <= mulx5(64*i+63 downto 64*i+56) xor mulx3(64*i+55 downto 64*i+48) xor mulx5(64*i+47 downto 64*i+40) xor mulx7(64*i+39 downto 64*i+32) xor mulx2(64*i+31 downto 64*i+24) xor mulx2(64*i+23 downto 64*i+16) xor mulx3(64*i+15 downto 64*i+8) xor mulx4(64*i+7 downto 64*i); output(64*i+23 downto 64*i+16) <= mulx4(64*i+63 downto 64*i+56) xor mulx5(64*i+55 downto 64*i+48) xor mulx3(64*i+47 downto 64*i+40) xor mulx5(64*i+39 downto 64*i+32) xor mulx7(64*i+31 downto 64*i+24) xor mulx2(64*i+23 downto 64*i+16) xor mulx2(64*i+15 downto 64*i+8) xor mulx3(64*i+7 downto 64*i); output(64*i+15 downto 64*i+8) <= mulx3(64*i+63 downto 64*i+56) xor mulx4(64*i+55 downto 64*i+48) xor mulx5(64*i+47 downto 64*i+40) xor mulx3(64*i+39 downto 64*i+32) xor mulx5(64*i+31 downto 64*i+24) xor mulx7(64*i+23 downto 64*i+16) xor mulx2(64*i+15 downto 64*i+8) xor mulx2(64*i+7 downto 64*i); output(64*i+7 downto 64*i+0) <= mulx2(64*i+63 downto 64*i+56) xor mulx3(64*i+55 downto 64*i+48) xor mulx4(64*i+47 downto 64*i+40) xor mulx5(64*i+39 downto 64*i+32) xor mulx3(64*i+31 downto 64*i+24) xor mulx5(64*i+23 downto 64*i+16) xor mulx7(64*i+15 downto 64*i+8) xor mulx2(64*i+7 downto 64*i); end generate; end groestl_mixbytes;