------------------------------------------------------------
-- 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 ShiftRow 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
-- 2011-09-28 - kgf - separated architectures
entity groestl_shiftrowq 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_shiftrowq;
architecture rtl of groestl_shiftrowq is
type matrix is array (0 to n/8-1) of std_logic_vector(7 downto 0);
signal gsq : matrix;
begin
conv : for i in 0 to n/8-1 generate
gsq(n/8-i-1) <= input(8*(i+1)-1 downto 8*i);
end generate;
gen256: if n=GROESTL_DATA_SIZE_SMALL generate
output <= gsq(8) & gsq(25) & gsq(42) & gsq(59) & gsq(4) & gsq(21) & gsq(38) & gsq(55) &
gsq(16) & gsq(33) & gsq(50) & gsq(3) & gsq(12) & gsq(29) & gsq(46) & gsq(63) &
gsq(24) & gsq(41) & gsq(58) & gsq(11) & gsq(20) & gsq(37) & gsq(54) & gsq(7) &
gsq(32) & gsq(49) & gsq(2) & gsq(19) & gsq(28) & gsq(45) & gsq(62) & gsq(15) &
gsq(40) & gsq(57) & gsq(10) & gsq(27) & gsq(36) & gsq(53) & gsq(6) & gsq(23) &
gsq(48) & gsq(1) & gsq(18) & gsq(35) & gsq(44) & gsq(61) & gsq(14) & gsq(31) &
gsq(56) & gsq(9) & gsq(26) & gsq(43) & gsq(52) & gsq(5) & gsq(22) & gsq(39) &
gsq(0) & gsq(17) & gsq(34) & gsq(51) & gsq(60) & gsq(13) & gsq(30) & gsq(47);
-- gsq() & gsq() & gsq() & gsq() & gsq() & gsq() & gsq() & gsq() &
end generate;
gen512: if n=GROESTL_DATA_SIZE_BIG generate
output <= gsq(8) & gsq(25) & gsq(42) & gsq(91) & gsq(4) & gsq(21) & gsq(38) & gsq(55) &
gsq(16) & gsq(33) & gsq(50) & gsq(99) & gsq(12) & gsq(29) & gsq(46) & gsq(63) &
gsq(24) & gsq(41) & gsq(58) & gsq(107) & gsq(20) & gsq(37) & gsq(54) & gsq(71) &
gsq(32) & gsq(49) & gsq(66) & gsq(115) & gsq(28) & gsq(45) & gsq(62) & gsq(79) &
gsq(40) & gsq(57) & gsq(74) & gsq(123) & gsq(36) & gsq(53) & gsq(70) & gsq(87) &
gsq(48) & gsq(65) & gsq(82) & gsq(3) & gsq(44) & gsq(61) & gsq(78) & gsq(95) &
gsq(56) & gsq(73) & gsq(90) & gsq(11) & gsq(52) & gsq(69) & gsq(86) & gsq(103) &
gsq(64) & gsq(81) & gsq(98) & gsq(19) & gsq(60) & gsq(77) & gsq(94) & gsq(111) &
gsq(72) & gsq(89) & gsq(106) & gsq(27) & gsq(68) & gsq(85) & gsq(102) & gsq(119) &
gsq(80) & gsq(97) & gsq(114) & gsq(35) & gsq(76) & gsq(93) & gsq(110) & gsq(127) &
gsq(88) & gsq(105) & gsq(122) & gsq(43) & gsq(84) & gsq(101) & gsq(118) & gsq(7) &
gsq(96) & gsq(113) & gsq(2) & gsq(51) & gsq(92) & gsq(109) & gsq(126) & gsq(15) &
gsq(104) & gsq(121) & gsq(10) & gsq(59) & gsq(100) & gsq(117) & gsq(6) & gsq(23) &
gsq(112) & gsq(1) & gsq(18) & gsq(67) & gsq(108) & gsq(125) & gsq(14) & gsq(31) &
gsq(120) & gsq(9) & gsq(26) & gsq(75) & gsq(116) & gsq(5) & gsq(22) & gsq(39) &
gsq(0) & gsq(17) & gsq(34) & gsq(83) & gsq(124) & gsq(13) & gsq(30) & gsq(47);
end generate;
end architecture rtl;