------------------------------------------------------------
-- 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.hamsipkg.all;
entity hamsi is
port (
ClkxCI : in std_logic;
RstxRBI : in std_logic;
FinBlockxSI : in std_logic;
INENxEI : in std_logic;
OUTENxEO : out std_logic;
DxDI : in std_logic_vector(31 downto 0);
DxDO : out std_logic_vector(HWIDTH-1 downto 0));
end hamsi;
architecture rtl of hamsi is
component controller
port (
ClkxCI : in std_logic;
RstxRBI : in std_logic;
FinBlockxSI : in std_logic;
INENxEI : in std_logic;
OUTENxEO : out std_logic;
TruncENxEO : out std_logic;
LastIterxSO : out std_logic;
PermInputSelxSO : out std_logic;
ChainValSelxSO : out std_logic;
RcntxDO : out unsigned(2 downto 0);
CntxDO : out unsigned(2 downto 0));
end component;
component diff256
port (
AxDI : in std_logic_vector(31 downto 0);
BxDI : in std_logic_vector(31 downto 0);
CxDI : in std_logic_vector(31 downto 0);
DxDI : in std_logic_vector(31 downto 0);
AxDO : out std_logic_vector(31 downto 0);
BxDO : out std_logic_vector(31 downto 0);
CxDO : out std_logic_vector(31 downto 0);
DxDO : out std_logic_vector(31 downto 0));
end component;
component subst256
port (
AxDI : in std_logic_vector(31 downto 0);
BxDI : in std_logic_vector(31 downto 0);
CxDI : in std_logic_vector(31 downto 0);
DxDI : in std_logic_vector(31 downto 0);
AxDO : out std_logic_vector(31 downto 0);
BxDO : out std_logic_vector(31 downto 0);
CxDO : out std_logic_vector(31 downto 0);
DxDO : out std_logic_vector(31 downto 0));
end component;
signal PermInputSelxS : std_logic;
signal LastIterxS : std_logic;
signal ChainValSelxS : std_logic;
signal InChainvalxD : halfstate;
signal OutChainValxD : halfstate;
signal OldChainValxD : halfstate;
signal SBOXOutxD : sbox;
signal SBOXxDN, SBOXxDP : sbox;
signal SBOXxD : sbox;
signal SBOXOutAlphaxD : sbox;
signal SBOXInDiffxD : sboxrow;
signal SBOXOutDiffxD : sboxrow;
signal RcntxD : unsigned(2 downto 0);
signal CntxD : unsigned(2 downto 0);
signal SBOXOutXorCntxD : sbox;
signal SBOXOutSubstxD : sboxrow;
signal SBOXInSubstxD : sboxrow;
signal DINxD : data;
-- signal T1xD, T2xD, T3xD, T4xD, T5xD, T6xD, T7xD : sboxrow;
-- signal TxD : std_logic_vector(31 downto 0);
signal Td01xD, Td02xD, Td03xD, Td04xD, Td05xD, Td06xD, Td07xD, Td08xD : std_logic_vector(31 downto 0);
signal Td11xD, Td12xD, Td13xD, Td14xD, Td15xD, Td16xD, Td17xD, Td18xD : std_logic_vector(31 downto 0);
signal Td21xD, Td22xD, Td23xD, Td24xD, Td25xD, Td26xD, Td27xD, Td28xD : std_logic_vector(31 downto 0);
signal Td31xD, Td32xD, Td33xD, Td34xD, Td35xD, Td36xD, Td37xD, Td38xD : std_logic_vector(31 downto 0);
signal TruncENxE : std_logic;
signal TT0xD, TT1xD, TT2xD, TT3xD : std_logic_vector(255 downto 0);
begin -- rtl
p_inputstruct: for i in 0 to 3 generate
DINxD(i) <= DxDI((4-i)*8-1 downto (3-i)*8);
end generate p_inputstruct;
u_controller : controller
port map (
ClkxCI => ClkxCI,
RstxRBI => RstxRBI,
FinBlockxSI => FinBlockxSI,
INENxEI => INENxEI,
OUTENxEO => OUTENxEO,
TruncENxEO => TruncENxE,
PermInputSelxSO => PermInputSelxS,
LastIterxSO => LastIterxS,
ChainValSelxSO => ChainValSelxS,
RcntxDO => RcntxD,
CntxDO => CntxD);
u_diff256_0: diff256
port map (
AxDI => SBOXInDiffxD(0),
BxDI => SBOXInDiffxD(1),
CxDI => SBOXInDiffxD(2),
DxDI => SBOXInDiffxD(3),
AxDO => SBOXOutDiffxD(0),
BxDO => SBOXOutDiffxD(1),
CxDO => SBOXOutDiffxD(2),
DxDO => SBOXOutDiffxD(3));
u_subst256_0: subst256
port map (
AxDI => SBOXInSubstxD(0),
BxDI => SBOXInSubstxD(1),
CxDI => SBOXInSubstxD(2),
DxDI => SBOXInSubstxD(3),
AxDO => SBOXOutSubstxD(0),
BxDO => SBOXOutSubstxD(1),
CxDO => SBOXOutSubstxD(2),
DxDO => SBOXOutSubstxD(3));
-- Expansion and Concatenation
-----------------------------------------------------------------------------
TT0xD <= T256(0, to_integer(unsigned(DINxD(0))));
TT1xD <= T256(1, to_integer(unsigned(DINxD(1))));
TT2xD <= T256(2, to_integer(unsigned(DINxD(2))));
TT3xD <= T256(3, to_integer(unsigned(DINxD(3))));
SBOXxD(0,0) <= TT0xD(255 downto 224) xor TT1xD(255 downto 224) xor TT2xD(255 downto 224) xor TT3xD(255 downto 224);
SBOXxD(0,1) <= TT0xD(223 downto 192) xor TT1xD(223 downto 192) xor TT2xD(223 downto 192) xor TT3xD(223 downto 192);
SBOXxD(1,2) <= TT0xD(191 downto 160) xor TT1xD(191 downto 160) xor TT2xD(191 downto 160) xor TT3xD(191 downto 160);
SBOXxD(1,3) <= TT0xD(159 downto 128) xor TT1xD(159 downto 128) xor TT2xD(159 downto 128) xor TT3xD(159 downto 128);
SBOXxD(2,0) <= TT0xD(127 downto 96) xor TT1xD(127 downto 96) xor TT2xD(127 downto 96) xor TT3xD(127 downto 96);
SBOXxD(2,1) <= TT0xD( 95 downto 64) xor TT1xD( 95 downto 64) xor TT2xD( 95 downto 64) xor TT3xD( 95 downto 64);
SBOXxD(3,2) <= TT0xD( 63 downto 32) xor TT1xD( 63 downto 32) xor TT2xD( 63 downto 32) xor TT3xD( 63 downto 32);
SBOXxD(3,3) <= TT0xD( 31 downto 0) xor TT1xD( 31 downto 0) xor TT2xD( 31 downto 0) xor TT3xD( 31 downto 0);
SBOXxD(0, 2) <= InChainValxD(0);
SBOXxD(0, 3) <= InChainValxD(1);
SBOXxD(1, 0) <= InChainValxD(2);
SBOXxD(1, 1) <= InChainValxD(3);
SBOXxD(2, 2) <= InChainValxD(4);
SBOXxD(2, 3) <= InChainValxD(5);
SBOXxD(3, 0) <= InChainValxD(6);
SBOXxD(3, 1) <= InChainValxD(7);
-- Permutation
-----------------------------------------------------------------------------
p_permutation : process (CntxD, LastIterxS, RcntxD, SBOXxDP)
variable LASTITER : integer := 0;
variable IndAlg : integer;
begin -- process p_round
-- Addition of Constant and Counter
if LastIterxS = '1' then
LASTITER := 1;
else
LASTITER := 0;
end if;
IndAlg := to_integer(CntxD);
case IndAlg is
when 0 => SBOXOutXorCntxD(0, 0) <= SBOXxDP(0, 0) xor ALPHA(LASTITER, 0, 0);
SBOXOutXorCntxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutXorCntxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutXorCntxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutXorCntxD(1, 0) <= SBOXxDP(1, 0) xor ALPHA(LASTITER, 1, 0);
SBOXOutXorCntxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutXorCntxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutXorCntxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutXorCntxD(2, 0) <= SBOXxDP(2, 0) xor ALPHA(LASTITER, 2, 0);
SBOXOutXorCntxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutXorCntxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutXorCntxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutXorCntxD(3, 0) <= SBOXxDP(3, 0) xor ALPHA(LASTITER, 3, 0);
SBOXOutXorCntxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutXorCntxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutXorCntxD(3, 3) <= SBOXxDP(3, 3);
when 1 => SBOXOutXorCntxD(0, 0) <= SBOXxDP(0, 0);
-- TxD SBOXxDP(0, 1) xor ALPHA(LASTITER, 0, 1);
-- SBOXOutXorCntxD(0, 1) TxD;
-- SBOXOutXorCntxD(0, 1)(2 downto 0) TxD(2 downto 0) xor std_logic_vector(RcntxD);
SBOXOutXorCntxD(0, 1) <= SBOXxDP(0, 1) xor ALPHA(LASTITER, 0, 1) xor ("00000000000000000000000000000" & std_logic_vector(RcntxD));
SBOXOutXorCntxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutXorCntxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutXorCntxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutXorCntxD(1, 1) <= SBOXxDP(1, 1) xor ALPHA(LASTITER, 1, 1);
SBOXOutXorCntxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutXorCntxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutXorCntxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutXorCntxD(2, 1) <= SBOXxDP(2, 1) xor ALPHA(LASTITER, 2, 1);
SBOXOutXorCntxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutXorCntxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutXorCntxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutXorCntxD(3, 1) <= SBOXxDP(3, 1) xor ALPHA(LASTITER, 3, 1);
SBOXOutXorCntxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutXorCntxD(3, 3) <= SBOXxDP(3, 3);
when 2 => SBOXOutXorCntxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutXorCntxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutXorCntxD(0, 2) <= SBOXxDP(0, 2) xor ALPHA(LASTITER, 0, 2);
SBOXOutXorCntxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutXorCntxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutXorCntxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutXorCntxD(1, 2) <= SBOXxDP(1, 2) xor ALPHA(LASTITER, 1, 2);
SBOXOutXorCntxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutXorCntxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutXorCntxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutXorCntxD(2, 2) <= SBOXxDP(2, 2) xor ALPHA(LASTITER, 2, 2);
SBOXOutXorCntxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutXorCntxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutXorCntxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutXorCntxD(3, 2) <= SBOXxDP(3, 2) xor ALPHA(LASTITER, 3, 2);
SBOXOutXorCntxD(3, 3) <= SBOXxDP(3, 3);
when 3 => SBOXOutXorCntxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutXorCntxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutXorCntxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutXorCntxD(0, 3) <= SBOXxDP(0, 3) xor ALPHA(LASTITER, 0, 3);
SBOXOutXorCntxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutXorCntxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutXorCntxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutXorCntxD(1, 3) <= SBOXxDP(1, 3) xor ALPHA(LASTITER, 1, 3);
SBOXOutXorCntxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutXorCntxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutXorCntxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutXorCntxD(2, 3) <= SBOXxDP(2, 3) xor ALPHA(LASTITER, 2, 3);
SBOXOutXorCntxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutXorCntxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutXorCntxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutXorCntxD(3, 3) <= SBOXxDP(3, 3) xor ALPHA(LASTITER, 3, 3);
when others => SBOXOutXorCntxD <= (others => (others => (others => '0')));
end case;
end process p_permutation;
subst : process (CntxD, SBOXOutDiffxD, SBOXOutSubstxD, SBOXxDP)
variable IndAlg : integer;
begin
IndAlg := to_integer(CntxD);
case IndAlg is
when 0 => SBOXOutxD(0, 0) <= SBOXOutSubstxD(0);
SBOXOutxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutxD(1, 0) <= SBOXOutSubstxD(1);
SBOXOutxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutxD(2, 0) <= SBOXOutSubstxD(2);
SBOXOutxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutxD(3, 0) <= SBOXOutSubstxD(3);
SBOXOutxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutxD(3, 3) <= SBOXxDP(3, 3);
when 1 => SBOXOutxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutxD(0, 1) <= SBOXOutSubstxD(0);
SBOXOutxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutxD(1, 1) <= SBOXOutSubstxD(1);
SBOXOutxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutxD(2, 1) <= SBOXOutSubstxD(2);
SBOXOutxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutxD(3, 1) <= SBOXOutSubstxD(3);
SBOXOutxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutxD(3, 3) <= SBOXxDP(3, 3);
when 2 => SBOXOutxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutxD(0, 2) <= SBOXOutSubstxD(0);
SBOXOutxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutxD(1, 2) <= SBOXOutSubstxD(1);
SBOXOutxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutxD(2, 2) <= SBOXOutSubstxD(2);
SBOXOutxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutxD(3, 2) <= SBOXOutSubstxD(3);
SBOXOutxD(3, 3) <= SBOXxDP(3, 3);
when 3 => SBOXOutxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutxD(0, 3) <= SBOXOutSubstxD(0);
SBOXOutxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutxD(1, 3) <= SBOXOutSubstxD(1);
SBOXOutxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutxD(2, 3) <= SBOXOutSubstxD(2);
SBOXOutxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutxD(3, 3) <= SBOXOutSubstxD(3);
when 4 => SBOXOutxD(0, 0) <= SBOXOutDiffxD(0);
SBOXOutxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutxD(1, 1) <= SBOXOutDiffxD(1);
SBOXOutxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutxD(2, 2) <= SBOXOutDiffxD(2);
SBOXOutxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutxD(3, 3) <= SBOXOutDiffxD(3);
when 5 => SBOXOutxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutxD(0, 1) <= SBOXOutDiffxD(0);
SBOXOutxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutxD(1, 2) <= SBOXOutDiffxD(1);
SBOXOutxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutxD(2, 3) <= SBOXOutDiffxD(2);
SBOXOutxD(3, 0) <= SBOXOutDiffxD(3);
SBOXOutxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutxD(3, 3) <= SBOXxDP(3, 3);
when 6 => SBOXOutxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutxD(0, 2) <= SBOXOutDiffxD(0);
SBOXOutxD(0, 3) <= SBOXxDP(0, 3);
SBOXOutxD(1, 0) <= SBOXxDP(1, 0);
SBOXOutxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutxD(1, 3) <= SBOXOutDiffxD(1);
SBOXOutxD(2, 0) <= SBOXOutDiffxD(2);
SBOXOutxD(2, 1) <= SBOXxDP(2, 1);
SBOXOutxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutxD(3, 1) <= SBOXOutDiffxD(3);
SBOXOutxD(3, 2) <= SBOXxDP(3, 2);
SBOXOutxD(3, 3) <= SBOXxDP(3, 3);
when 7 => SBOXOutxD(0, 0) <= SBOXxDP(0, 0);
SBOXOutxD(0, 1) <= SBOXxDP(0, 1);
SBOXOutxD(0, 2) <= SBOXxDP(0, 2);
SBOXOutxD(0, 3) <= SBOXOutDiffxD(0);
SBOXOutxD(1, 0) <= SBOXOutDiffxD(1);
SBOXOutxD(1, 1) <= SBOXxDP(1, 1);
SBOXOutxD(1, 2) <= SBOXxDP(1, 2);
SBOXOutxD(1, 3) <= SBOXxDP(1, 3);
SBOXOutxD(2, 0) <= SBOXxDP(2, 0);
SBOXOutxD(2, 1) <= SBOXOutDiffxD(2);
SBOXOutxD(2, 2) <= SBOXxDP(2, 2);
SBOXOutxD(2, 3) <= SBOXxDP(2, 3);
SBOXOutxD(3, 0) <= SBOXxDP(3, 0);
SBOXOutxD(3, 1) <= SBOXxDP(3, 1);
SBOXOutxD(3, 2) <= SBOXOutDiffxD(3);
SBOXOutxD(3, 3) <= SBOXxDP(3, 3);
when others => SBOXOutxD <= (others => (others => (others => '0')));
end case;
end process subst;
-- Diffusion
-----------------------------------------------------------------------------
diffin : process (CntxD, SBOXOutXorCntxD, SBOXxDP)
variable IndAlg : integer;
begin
IndAlg := to_integer(CntxD);
case IndAlg is
when 0 => SBOXInSubstxD(0) <= SBOXOutXorCntxD(0, 0);
SBOXInSubstxD(1) <= SBOXOutXorCntxD(1, 0);
SBOXInSubstxD(2) <= SBOXOutXorCntxD(2, 0);
SBOXInSubstxD(3) <= SBOXOutXorCntxD(3, 0);
SBOXInDiffxD <= (others => (others => '0'));
when 1 => SBOXInSubstxD(0) <= SBOXOutXorCntxD(0, 1);
SBOXInSubstxD(1) <= SBOXOutXorCntxD(1, 1);
SBOXInSubstxD(2) <= SBOXOutXorCntxD(2, 1);
SBOXInSubstxD(3) <= SBOXOutXorCntxD(3, 1);
SBOXInDiffxD <= (others => (others => '0'));
when 2 => SBOXInSubstxD(0) <= SBOXOutXorCntxD(0, 2);
SBOXInSubstxD(1) <= SBOXOutXorCntxD(1, 2);
SBOXInSubstxD(2) <= SBOXOutXorCntxD(2, 2);
SBOXInSubstxD(3) <= SBOXOutXorCntxD(3, 2);
SBOXInDiffxD <= (others => (others => '0'));
when 3 => SBOXInSubstxD(0) <= SBOXOutXorCntxD(0, 3);
SBOXInSubstxD(1) <= SBOXOutXorCntxD(1, 3);
SBOXInSubstxD(2) <= SBOXOutXorCntxD(2, 3);
SBOXInSubstxD(3) <= SBOXOutXorCntxD(3, 3);
SBOXInDiffxD <= (others => (others => '0'));
when 4 => SBOXInDiffxD(0) <= SBOXxDP(0, 0);
SBOXInDiffxD(1) <= SBOXxDP(1, 1);
SBOXInDiffxD(2) <= SBOXxDP(2, 2);
SBOXInDiffxD(3) <= SBOXxDP(3, 3);
SBOXInSubstxD <= (others => (others => '0'));
when 5 => SBOXInDiffxD(0) <= SBOXxDP(0, 1);
SBOXInDiffxD(1) <= SBOXxDP(1, 2);
SBOXInDiffxD(2) <= SBOXxDP(2, 3);
SBOXInDiffxD(3) <= SBOXxDP(3, 0);
SBOXInSubstxD <= (others => (others => '0'));
when 6 => SBOXInDiffxD(0) <= SBOXxDP(0, 2);
SBOXInDiffxD(1) <= SBOXxDP(1, 3);
SBOXInDiffxD(2) <= SBOXxDP(2, 0);
SBOXInDiffxD(3) <= SBOXxDP(3, 1);
SBOXInSubstxD <= (others => (others => '0'));
when 7 => SBOXInDiffxD(0) <= SBOXxDP(0, 3);
SBOXInDiffxD(1) <= SBOXxDP(1, 0);
SBOXInDiffxD(2) <= SBOXxDP(2, 1);
SBOXInDiffxD(3) <= SBOXxDP(3, 2);
SBOXInSubstxD <= (others => (others => '0'));
when others => SBOXInDiffxD <= (others => (others => '0'));
SBOXInSubstxD <= (others => (others => '0'));
end case;
end process diffin;
-- Truncation
-------------------------------------------------------------------------------
p_truncation: process (OldChainValxD, SBOXOutxD, TruncENxE)
variable CHAINVAL : halfstate;
begin -- process p_truncation
if TruncENxE = '1' then
for i in 0 to ArrLen-1 loop
OutChainValxD(i) <= OldChainValxD(i) xor SBOXOutxD(0, i);
OutChainValxD(i+4) <= OldChainValxD(i+ArrLen) xor SBOXOutxD(2, i);
end loop; -- i
else
for i in 0 to 7 loop
OutChainValxD(i) <= OldChainValxD(i);
end loop; -- i
end if;
end process p_truncation;
-- Chain value select
-----------------------------------------------------------------------------
InChainValxD <= IV256 when ChainValSelxS = '0' else OutChainValxD;
-- Permutation chain value select
-----------------------------------------------------------------------------
SBOXxDN <= SBOXxD when PermInputSelxS = '0' else SBOXOutxD;
-- Output Unform
-----------------------------------------------------------------------------
p_outext: for i in 0 to 7 generate
DxDO((HWIDTH/8)*(8-i)-1 downto (HWIDTH/8)*(8-i)-32) <= OutChainValxD(i)(31 downto 0);
end generate p_outext;
-- Memory
-----------------------------------------------------------------------------
p_mem : process (ClkxCI, RstxRBI)
begin -- process p_mem
if RstxRBI = '0' then -- asynchronous reset (active low)
SBOXxDP <= (others => (others => (others => '0')));
OldChainValxD <= (others => (others => '0'));
elsif ClkxCI'event and ClkxCI = '1' then -- rising clock edge
SBOXxDP <= SBOXxDN;
OldChainValxD <= InChainValxD;
end if;
end process p_mem;
end rtl;