------------------------------------------------------------
-- 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_unsigned.all;
use ieee.std_logic_arith.all;
use work.sha3_blake_package.all;
entity permute4xor is
generic (
h : integer := 256;
b : integer := 512;
iw : integer := 32 );
port(
clk : in std_logic;
m : in std_logic_vector(b-1 downto 0);
em : in std_logic;
round : in std_logic_vector(4 downto 0);
consout : out std_logic_vector(b/2-1 downto 0)
);
end permute4xor;
architecture muxbased of permute4xor is
type std_logic_matrix is array (15 downto 0) of std_logic_vector(iw - 1 downto 0) ;
type std_logic_half_matrix is array (7 downto 0) of std_logic_vector(iw - 1 downto 0) ;
--------------------------
function wordmatrix2halfblk (x : std_logic_half_matrix) return std_logic_vector is
variable retval : std_logic_vector(b/2-1 downto 0);
begin
for i in 0 to 7 loop
retval(iw*(i+1) - 1 downto iw*i) := x(7-i);
end loop;
return retval;
end wordmatrix2halfblk;
--------------------------
function blk2wordmatrix (x : std_logic_vector ) return std_logic_matrix is
variable retval : std_logic_matrix;
begin
for i in 0 to 15 loop
retval(15-i) := x(iw*(i+1) - 1 downto iw*i);
end loop;
return retval;
end blk2wordmatrix;
--------------------------
signal mblk : std_logic_matrix;
signal minblkprime : std_logic_half_matrix;
type block_array is array(0 to 19) of std_logic_half_matrix;
signal mblkprime : block_array;
signal round_sel : std_logic_vector(4 downto 0);
signal mprime_tmp, consprime_tmp, consout_tmp : std_logic_half_matrix;
function get_halfmatrixzero return std_logic_half_matrix is
variable ret : std_logic_half_matrix;
begin
for i in 0 to 7 loop
ret(0) := (others => '0');
end loop;
return ret;
end function get_halfmatrixzero;
constant zero : std_logic_half_matrix := get_halfmatrixzero;
--------------------------
constant consin : std_logic_vector(b-1 downto 0) := get_cons( h, b, iw );
function get_cp ( gsize : integer; iw : integer ) return block_array is
variable cblk : std_logic_matrix;
variable cpblk : block_array;
begin
for i in 0 to 15 loop
cblk(15-i) := consin(iw*(i+1) - 1 downto iw*i);
end loop;
for i in 0 to 9 loop
for j in 0 to 16/(8/gsize)-1 loop
cpblk(2*i)(j) := cblk( permute_array( i, j ) );
cpblk(2*i+1)(j) := cblk( permute_array( i, j+8 ) );
end loop;
end loop;
return cpblk;
end function get_cp;
------------------------------
constant consblkprime : block_array := get_cp( 4, iw );
begin
mblk <= blk2wordmatrix( m );
ret1_gen : for i in 0 to 9 generate
ret2_gen : for j in 0 to 7 generate
mblkprime(2*i)(j) <= mblk( permute_array( i, j ) );
mblkprime(2*i+1)(j) <= mblk( permute_array( i, j+8 ) );
end generate;
end generate;
-- round_sel when em = '1' else round;
-- with round_sel select
-- mprime_tmp when "00000",
-- mblkprime(2) when "00001",
-- mblkprime(3) when "00010",
-- mblkprime(4) when "00011",
-- mblkprime(5) when "00100",
-- mblkprime(6) when "00101",
-- mblkprime(7) when "00110",
-- mblkprime(8) when "00111",
-- mblkprime(9) when "01000",
-- mblkprime(10) when "01001",
-- mblkprime(11) when "01010",
-- mblkprime(12) when "01011",
-- mblkprime(13) when "01100",
-- mblkprime(14) when "01101",
-- mblkprime(15) when "01110",
-- mblkprime(16) when "01111",
-- mblkprime(17) when "10000",
-- mblkprime(18) when "10001",
-- mblkprime(19) when "10010",
-- mblkprime(0) when "10011",
-- mblkprime(1) when "10100",
-- mblkprime(2) when "10101",
-- mblkprime(3) when "10110",
-- mblkprime(4) when "10111",
-- mblkprime(5) when "11000",
-- mblkprime(6) when "11001",
-- mblkprime(7) when "11010",
-- mblkprime(8) when "11011",
-- mblkprime(9) when "11100",
-- mblkprime(10) when "11101",
-- mblkprime(11) when "11110",
-- mblkprime(12) when "11111",
-- zero when others ;
--
-- with round_sel select
-- consprime_tmp when "00000",
-- consblkprime(2) when "00001",
-- consblkprime(3) when "00010",
-- consblkprime(4) when "00011",
-- consblkprime(5) when "00100",
-- consblkprime(6) when "00101",
-- consblkprime(7) when "00110",
-- consblkprime(8) when "00111",
-- consblkprime(9) when "01000",
-- consblkprime(10) when "01001",
-- consblkprime(11) when "01010",
-- consblkprime(12) when "01011",
-- consblkprime(13) when "01100",
-- consblkprime(14) when "01101",
-- consblkprime(15) when "01110",
-- consblkprime(16) when "01111",
-- consblkprime(17) when "10000",
-- consblkprime(18) when "10001",
-- consblkprime(19) when "10010",
-- consblkprime(0) when "10011",
-- consblkprime(1) when "10100",
-- consblkprime(2) when "10101",
-- consblkprime(3) when "10110",
-- consblkprime(4) when "10111",
-- consblkprime(5) when "11000",
-- consblkprime(6) when "11001",
-- consblkprime(7) when "11010",
-- consblkprime(8) when "11011",
-- consblkprime(9) when "11100",
-- consblkprime(10) when "11101",
-- consblkprime(11) when "11110",
-- consblkprime(12) when "11111",
-- zero when others ;
with round select
mprime_tmp <= mblkprime( 0) when "00000",
mblkprime( 1) when "00001",
mblkprime( 2) when "00010",
mblkprime( 3) when "00011",
mblkprime( 4) when "00100",
mblkprime( 5) when "00101",
mblkprime( 6) when "00110",
mblkprime( 7) when "00111",
mblkprime( 8) when "01000",
mblkprime( 9) when "01001",
mblkprime(10) when "01010",
mblkprime(11) when "01011",
mblkprime(12) when "01100",
mblkprime(13) when "01101",
mblkprime(14) when "01110",
mblkprime(15) when "01111",
mblkprime(16) when "10000",
mblkprime(17) when "10001",
mblkprime(18) when "10010",
mblkprime(19) when "10011",
mblkprime( 0) when "10100",
mblkprime( 1) when "10101",
mblkprime( 2) when "10110",
mblkprime( 3) when "10111",
mblkprime( 4) when "11000",
mblkprime( 5) when "11001",
mblkprime( 6) when "11010",
mblkprime( 7) when "11011",
mblkprime( 8) when "11100",
mblkprime( 9) when "11101",
mblkprime(10) when "11110",
mblkprime(11) when "11111",
zero when others;
with round select
consprime_tmp <= consblkprime( 0) when "00000",
consblkprime( 1) when "00001",
consblkprime( 2) when "00010",
consblkprime( 3) when "00011",
consblkprime( 4) when "00100",
consblkprime( 5) when "00101",
consblkprime( 6) when "00110",
consblkprime( 7) when "00111",
consblkprime( 8) when "01000",
consblkprime( 9) when "01001",
consblkprime(10) when "01010",
consblkprime(11) when "01011",
consblkprime(12) when "01100",
consblkprime(13) when "01101",
consblkprime(14) when "01110",
consblkprime(15) when "01111",
consblkprime(16) when "10000",
consblkprime(17) when "10001",
consblkprime(18) when "10010",
consblkprime(19) when "10011",
consblkprime( 0) when "10100",
consblkprime( 1) when "10101",
consblkprime( 2) when "10110",
consblkprime( 3) when "10111",
consblkprime( 4) when "11000",
consblkprime( 5) when "11001",
consblkprime( 6) when "11010",
consblkprime( 7) when "11011",
consblkprime( 8) when "11100",
consblkprime( 9) when "11101",
consblkprime(10) when "11110",
consblkprime(11) when "11111",
zero when others ;
output_gen : for i in 0 to 3 generate
consout_tmp(i*2) <= mprime_tmp(i*2) xor consprime_tmp(i*2+1);
consout_tmp(i*2+1) <= mprime_tmp(i*2+1) xor consprime_tmp(i*2);
end generate;
consout <= wordmatrix2halfblk( consout_tmp );
end muxbased;