------------------------------------------------------------
-- Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package shabalPkg is
-----------------------------------------------------------------------------
-- Constants
-----------------------------------------------------------------------------
constant WWIDTH : integer := 32;
-- constant r : integer := 12;
constant o1 : integer := 13;
constant o2 : integer := 9;
constant o3 : integer := 6;
type blockA is array (0 to 11) of std_logic_vector (WWIDTH-1 downto 0);
type blockB is array (0 to 15) of std_logic_vector (WWIDTH-1 downto 0);
type blockW is array (0 to 1) of std_logic_vector (WWIDTH-1 downto 0);
-----------------------------------------------------------------------------
-- Initialization Vectors for Shabal-256
-----------------------------------------------------------------------------
-- first word in Ainit already in state after xor with W (+1)
constant Ainit : blockA := ((x"52F84553"), (x"E54B7999"), (x"2D8EE3EC"), (x"B9645191"),
(x"E0078B86"), (x"BB7C44C9"), (x"D2B5C1CA"), (x"B0D2EB8C"),
(x"14CE5A45"), (x"22AF50DC"), (x"EFFDBC6B"), (x"EB21B74A"));
constant Binit : blockB := ((x"B555C6EE"), (x"3E710596"), (x"A72A652F"), (x"9301515F"),
(x"DA28C1FA"), (x"696FD868"), (x"9CB6BF72"), (x"0AFE4002"),
(x"A6E03615"), (x"5138C1D4"), (x"BE216306"), (x"B38B8890"),
(x"3EA8B96B"), (x"3299ACE4"), (x"30924DD4"), (x"55CB34A5"));
constant Cinit : blockB := ((x"B405F031"), (x"C4233EBA"), (x"B3733979"), (x"C0DD9D55"),
(x"C51C28AE"), (x"A327B8E1"), (x"56C56167"), (x"ED614433"),
(x"88B59D60"), (x"60E2CEBA"), (x"758B4B8B"), (x"83E82A7F"),
(x"BC968828"), (x"E6E00BF7"), (x"BA839E55"), (x"9B491C60"));
-----------------------------------------------------------------------------
-- Permutations
-----------------------------------------------------------------------------
-- type perm is array (0 to 2, 0 to 11) of integer;
-- constant APCMATRIX : perm := ((3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14),
-- (15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
-- (11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6));
function Rotl (
DxDI : std_logic_vector(WWIDTH-1 downto 0);
SHIFT : integer)
return std_logic_vector;
-- function Ufun (
-- DxDI : std_logic_vector(WWIDTH-1 downto 0))
-- return std_logic_vector;
-- function Vfun (
-- DxDI : std_logic_vector(WWIDTH-1 downto 0))
-- return std_logic_vector;
end shabalPkg;
package body shabalPkg is
function Rotl (
DxDI : std_logic_vector(WWIDTH-1 downto 0);
SHIFT : integer)
return std_logic_vector is
variable DxDO : std_logic_vector(WWIDTH-1 downto 0);
begin
DxDO := DxDI(WWIDTH-SHIFT-1 downto 0) & DxDI(WWIDTH-1 downto WWIDTH-SHIFT);
return DxDO;
end Rotl;
-- function Ufun (
-- DxDI : std_logic_vector(WWIDTH-1 downto 0))
-- return std_logic_vector is
-- variable DxDO : std_logic_vector(WWIDTH-1 downto 0);
-- variable x, y : unsigned(WWIDTH-1 downto 0);
-- begin -- Ufun
-- x := unsigned(DxDI);
-- y := unsigned(DxDI(30 downto 0) & '0'); -- shifted input
-- DxDO := std_logic_vector(x + y);
-- -- DxDO := std_logic_vector(x + x + x);
-- return DxDO;
-- end Ufun;
-- function Vfun (
-- DxDI : std_logic_vector(WWIDTH-1 downto 0))
-- return std_logic_vector is
-- variable DxDO : std_logic_vector(WWIDTH-1 downto 0);
-- variable x, y : unsigned(WWIDTH-1 downto 0);
-- begin -- Ufun
-- x := unsigned(DxDI);
-- y := unsigned(DxDI(29 downto 0) & '0' & '0'); -- shifted input
-- DxDO := std_logic_vector(x + y);
-- -- y := x + x;
-- -- DxDO := std_logic_vector(y + y + x);
-- return DxDO;
-- end Vfun;
end package body shabalPkg;