------------------------------------------------------------
-- 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;               -- for int conversion

entity sbox is

  port (
    InpxDI : in  std_logic_vector(7 downto 0);  -- 8 bit unsubstituted data in
    OupxDO : out std_logic_vector(7 downto 0)   -- 8 bit substituted data out
    );

end sbox;


architecture galois of sbox is

    component GF256toGF16
    port (
      inxDI   : in  std_logic_vector(7 downto 0);
      outhxDO : out std_logic_vector(3 downto 0);
      outlxDO : out std_logic_vector(3 downto 0));
  end component;

  component GF256invWolk
    port (
      InhxDI  : in  std_logic_vector(3 downto 0);
      InlxDI  : in  std_logic_vector(3 downto 0);
      OuthxDO : out std_logic_vector(3 downto 0);
      OutlxDO : out std_logic_vector(3 downto 0));
  end component;

  component GF16toGF256
    port (
      inlxDI : in  std_logic_vector(3 downto 0);
      inhxDI : in  std_logic_vector(3 downto 0);
      outxDO : out std_logic_vector(7 downto 0));
  end component;

  component GF256affine
    port (
      inXDI  : in  std_logic_vector(7 downto 0);
      outxDO : out std_logic_vector(7 downto 0));
  end component;

  component affinetrans
    port (
      InpxDI : in  std_logic_vector(7 downto 0);
      OupxDO : out std_logic_vector(7 downto 0));
  end component;

  signal ah : std_logic_vector(3 downto 0);
  signal al : std_logic_vector(3 downto 0);
  signal invl : std_logic_vector(3 downto 0);
  signal invh : std_logic_vector(3 downto 0);
  signal inv : std_logic_vector(7 downto 0);

begin  -- SBox8bitRTL

  GF256toGF16Inst: GF256toGF16
    port map (
      inxDI   => InpxDI ,
      outhxDO => ah,
      outlxDO => al);


  GF256invWolInst: GF256invWolk
    port map (
      InhxDI  => ah,
      InlxDI  => al,
      OuthxDO => invh,
      OutlxDO => invl);

  GF16toGF256Inst: GF16toGF256
    port map (
      inlxDI => invl,
      inhxDI => invh,
      outxDO => inv);

  i_affine: affinetrans
    port map (
      InpxDI  => inv,
      OupxDO => OupxDO);

end galois;

library ieee;
use ieee.std_logic_1164.all;

entity GF256toGF16 is

  port (
    inxDI : in std_logic_vector(7 downto 0);
    outhxDO : out std_logic_vector(3 downto 0);
    outlxDO : out std_logic_vector(3 downto 0));

end GF256toGF16;

architecture GF256toGF16RTL of GF256toGF16 is

  signal intermAxD : std_logic;
  signal intermBxD : std_logic;
  signal intermCxD : std_logic;

begin  -- GF256toGF16RTL

  intermAxD <= inxDI(1) xor inxDI(7);
  intermBxD <= inxDI(5) xor inxDI(7);
  intermCxD <= inxDI(4) xor inxDI(6);

  outlxDO(0) <= intermCxD xor inxDI(0) xor inxDI(5);
  outlxDO(1) <= inxDI(1) xor inxDI(2);
  outlxDO(2) <= intermAxD;
  outlxDO(3) <= inxDI(2) xor inxDI(4);

  outhxDO(0) <= intermCxD xor inxDI(5);
  outhxDO(1) <= intermAxD xor intermCxD;
  outhxDO(2) <= intermBxD xor inxDI(2) xor inxDI(3);
  outhxDO(3) <= intermBxD;

end GF256toGF16RTL;


library ieee;
use ieee.std_logic_1164.all;

entity GF16toGF256 is

  port (
    inlxDI : in  std_logic_vector(3 downto 0);
    inhxDI : in  std_logic_vector(3 downto 0);
    outxDO : out std_logic_vector(7 downto 0));

end GF16toGF256;

architecture GF16toGF256RTL of GF16toGF256 is

  signal intermAxD : std_logic;
  signal intermBxD : std_logic;

begin  -- GF16toGF256RTL

  intermAxD <= inlxDI(1) xor inhxDI(3);
  intermBxD <= inhxDI(0) xor inhxDI(1);

  outxDO(0) <= inlxDI(0) xor inhxDI(0);
  outxDO(1) <= intermBxD xor inhxDI(3);
  outxDO(2) <= intermAxD xor intermBxD;
  outxDO(3) <= intermBxD xor inlxDI(1) xor inhxDI(2);
  outxDO(4) <= intermAxD xor intermBxD xor inlxDI(3);
  outxDO(5) <= intermBxD xor inlxDI(2);
  outxDO(6) <= intermAxD xor inlxDI(2) xor inlxDI(3) xor inhxDI(0);
  outxDO(7) <= intermBxD xor inlxDI(2) xor inhxDI(3);

end GF16toGF256RTL;

library ieee;
use ieee.std_logic_1164.all;

entity GF256invWolk is

  port (
    InhxDI  : in  std_logic_vector(3 downto 0);
    InlxDI  : in  std_logic_vector(3 downto 0);
    OuthxDO : out std_logic_vector(3 downto 0);
    OutlxDO : out std_logic_vector(3 downto 0));

end GF256invWolk;

architecture GF256invWolkRTL of GF256invWolk is

  component GF16sqr
    port (
      inxDI  : in  std_logic_vector(3 downto 0);
      outxDO : out std_logic_vector(3 downto 0));
  end component;

  component GF16mul_e
    port (
      inAxDI : in  std_logic_vector(3 downto 0);
      outxDO : out std_logic_vector(3 downto 0));
  end component;

  component GF16mul
    port (
      MulAxDI : in  std_logic_vector(3 downto 0);
      MulBxDI : in  std_logic_vector(3 downto 0);
      ProCxDO : out std_logic_vector(3 downto 0));
  end component;

  component GF16inv
    port (
      inxDI  : in  std_logic_vector(3 downto 0);
      outxDO : out std_logic_vector(3 downto 0));
  end component;

  signal ah  : std_logic_vector(3 downto 0);
  signal al  : std_logic_vector(3 downto 0);
  signal ah0 : std_logic_vector(3 downto 0);
  signal al0 : std_logic_vector(3 downto 0);
  signal ah1 : std_logic_vector(3 downto 0);
  signal a0  : std_logic_vector(3 downto 0);
  signal a1  : std_logic_vector(3 downto 0);
  signal a2  : std_logic_vector(3 downto 0);
  signal a3  : std_logic_vector(3 downto 0);
  signal a4  : std_logic_vector(3 downto 0);
  signal a5  : std_logic_vector(3 downto 0);
  signal a6  : std_logic_vector(3 downto 0);

begin  -- GF256invWolkRTL

    ah <= InhxDI;
    al <= InlxDI;

    GF16sqr0Inst: GF16sqr
    port map (
      inxDI  => ah,
      outxDO => ah0);

  GF16sqr1Inst: GF16sqr
    port map (
      inxDI  => al,
      outxDO => al0);

  GF16mul_eInst: GF16mul_e
    port map (
      inAxDI => ah0,
      outxDO => ah1);

  a0 <= ah1 xor al0;

  GF16mul0Inst: GF16mul
    port map (
      MulAxDI => ah,
      MulBxDI => al,
      ProCxDO => a1);

  a2 <= a0 xor a1;

  GF16invInst: GF16inv
    port map (
      inxDI  => a2,
      outxDO => a3);
  GF16mul1Inst: GF16mul
    port map (
      MulAxDI => ah,
      MulBxDI => a3,
      ProCxDO => a4);

  a5 <= ah xor al;

  GF16mul2Inst: GF16mul
    port map (
      MulAxDI => a3,
      MulBxDI => a5,
      ProCxDO => a6);

    OuthxDO <= a4;
    OutlxDO <= a6;


end GF256invWolkRTL;

library ieee;
use ieee.std_logic_1164.all;

entity GF16sqr is

  port (
    inxDI  : in  std_logic_vector(3 downto 0);
    outxDO : out std_logic_vector(3 downto 0));

end GF16sqr;

architecture GF16sqrRTL of GF16sqr is

begin  -- GF16sqrRTL

  outxDO(0) <= inxDI(0) xor inxDI(2);
  outxDO(1) <= inxDI(2);
  outxDO(2) <= inxDI(1) xor inxDI(3);
  outxDO(3) <= inxDI(3);

end GF16sqrRTL;

library ieee;
use ieee.std_logic_1164.all;

entity GF16mul_e is

  port (
    inAxDI : in  std_logic_vector(3 downto 0);
    outxDO : out std_logic_vector(3 downto 0));

end GF16mul_e;

architecture GF16mul_eRTL of GF16mul_e is

begin  -- GF16mul_eRTL

  outxDO(0) <= inAxDI(1) xor inAxDI(2) xor inAxDI(3);
  outxDO(1) <= inAxDI(0) xor inAxDI(1);
  outxDO(2) <= inAxDI(0) xor inAxDI(1) xor inAxDI(2);
  outxDO(3) <= inAxDI(0) xor inAxDI(1) xor inAxDI(2) xor inAxDI(3);

end GF16mul_eRTL;

library ieee;
use ieee.std_logic_1164.all;

entity GF16mul is

  port (
    MulAxDI : in  std_logic_vector(3 downto 0);
    MulBxDI : in  std_logic_vector(3 downto 0);
    ProCxDO : out std_logic_vector(3 downto 0));

end GF16mul;

architecture GF16mulRTL of GF16mul is

  signal IntermAxD : std_logic;
  signal IntermBxD : std_logic;
  signal IntermCxD : std_logic;

begin  -- GF16mulRTL

  IntermAxD <= MulAxDI(0) xor MulAxDI(3);
  IntermBxD <= MulAxDI(2) xor MulAxDI(3);
  IntermCxD <= MulAxDI(1) xor MulAxDI(2);

  ProCxDO(0) <= ((MulAxDI(0) and MulBxDI(0)) xor (MulAxDI(3) and MulBxDI(1)) xor
                 (MulAxDI(2) and MulBxDI(2)) xor (MulAxDI(1) and MulBxDI(3)));

  ProCxDO(1) <= ((MulAxDI(1) and MulBxDI(0)) xor (IntermAxD and MulBxDI(1)) xor
                 (IntermBxD  and MulBxDI(2)) xor (IntermCxD and MulBxDI(3)));

  ProCxDO(2) <= ((MulAxDI(2) and MulBxDI(0)) xor (MulAxDI(1) and MulBxDI(1)) xor
                 (IntermAxD  and MulBxDI(2)) xor (IntermBxD  and MulBxDI(3)));

  ProCxDO(3) <= ((MulAxDI(3) and MulBxDI(0)) xor (MulAxDI(2) and MulBxDI(1)) xor
                 (MulAxDI(1) and MulBxDI(2)) xor (IntermAxD  and MulBxDI(3)));

end GF16mulRTL;

library ieee;
use ieee.std_logic_1164.all;

entity GF16inv is

  port (
    inxDI  : in  std_logic_vector(3 downto 0);
    outxDO : out std_logic_vector(3 downto 0));

end GF16inv;

architecture GF16invRTL of GF16inv is

  signal intermAxD : std_logic;
  signal intermBxD : std_logic;
  signal intermCxD : std_logic;
  signal intermDxD : std_logic;
  signal intermExD : std_logic;
  signal intermFxD : std_logic;


begin  -- GF16invRTL

  intermAxD <= inxDI(1) xor inxDI(2) xor inxDI(3) xor (inxDI(1) and inxDI(2) and inxDI(3));
  intermBxD <= inxDI(0) and inxDI(1);
  intermCxD <= inxDI(0) and inxDI(2);
  intermDxD <= inxDI(0) and inxDI(3);
  intermExD <= inxDI(1) and inxDI(3);
  intermFxD <= inxDI(1) and inxDI(2);

  outxDO(0) <= intermAxD xor inxDI(0) xor intermCxD xor intermFxD xor (inxDI(0) and inxDI(1) and inxDI(2));
  outxDO(1) <= intermBxD xor intermCxD xor intermFxD xor inxDI(3) xor intermExD xor (inxDI(0) and inxDI(1) and inxDI(3));
  outxDO(2) <= intermBxD xor inxDI(2) xor intermCxD xor inxDI(3) xor intermDxD xor (inxDI(0) and inxDI(2) and inxDI(3));
  outxDO(3) <= intermAxD xor intermDxD xor intermExD xor (inxDI(2) and inxDI(3));

end GF16invRTL;

library ieee;
use ieee.std_logic_1164.all;

entity affinetrans is

  port (
    InpxDI : in  std_logic_vector(7 downto 0);
    OupxDO : out std_logic_vector(7 downto 0)
    );

end affinetrans;


architecture structural of affinetrans is

  signal InpIxD : std_logic_vector(7 downto 0);

begin

  InpIxD(0) <= InpxDI(0) xor InpxDI(4) xor InpxDI(5) xor InpxDI(6) xor InpxDI(7);
  InpIxD(1) <= InpxDI(0) xor InpxDI(1) xor InpxDI(5) xor InpxDI(6) xor InpxDI(7);
  InpIxD(2) <= InpxDI(0) xor InpxDI(1) xor InpxDI(2) xor InpxDI(6) xor InpxDI(7);
  InpIxD(3) <= InpxDI(0) xor InpxDI(1) xor InpxDI(2) xor InpxDI(3) xor InpxDI(7);
  InpIxD(4) <= InpxDI(0) xor InpxDI(1) xor InpxDI(2) xor InpxDI(3) xor InpxDI(4);
  InpIxD(5) <= InpxDI(1) xor InpxDI(2) xor InpxDI(3) xor InpxDI(4) xor InpxDI(5);
  InpIxD(6) <= InpxDI(2) xor InpxDI(3) xor InpxDI(4) xor InpxDI(5) xor InpxDI(6);
  InpIxD(7) <= InpxDI(3) xor InpxDI(4) xor InpxDI(5) xor InpxDI(6) xor InpxDI(7);

  OupxDO <= InpIxD xor "01100011";

end structural;

Generated on Fri Sep 24 10:39:12 CEST 2010
Home