|
|
@ -18,22 +18,37 @@ |
|
|
|
-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
|
-- ====================================================================== |
|
|
|
|
|
|
|
-- aes implementation |
|
|
|
-- key length: 128 bit -> Nk = 4 |
|
|
|
-- data width: 128 bit -> Nb = 4 |
|
|
|
-- round number Nr = 10 |
|
|
|
|
|
|
|
|
|
|
|
library ieee; |
|
|
|
use ieee.std_logic_1164.all; |
|
|
|
use ieee.numeric_std.all; |
|
|
|
use ieee.std_logic_1164.all; |
|
|
|
use ieee.numeric_std.all; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package aes_pkg is |
|
|
|
|
|
|
|
|
|
|
|
-- constants for AES128 |
|
|
|
constant c_nk : natural := 4; -- key size |
|
|
|
constant c_nb : natural := 4; -- number of bytes |
|
|
|
constant c_nr : natural := 10; -- number of rounds |
|
|
|
|
|
|
|
subtype t_rounds is natural range 0 to c_nr + 1; |
|
|
|
subtype t_key_rounds is natural range c_nk to c_nb * (c_nr + 1); |
|
|
|
|
|
|
|
type t_datatable1d is array (0 to 3) of std_logic_vector(7 downto 0); |
|
|
|
type t_datatable2d is array (0 to 3) of t_datatable1d; |
|
|
|
|
|
|
|
type t_stable1d is array (0 to 15) of std_logic_vector(7 downto 0); |
|
|
|
type t_stable2d is array (0 to 15) of t_stable1d; |
|
|
|
|
|
|
|
type t_key is array (0 to 3) of std_logic_vector(31 downto 0); |
|
|
|
|
|
|
|
constant c_sbox : t_stable2d := ( |
|
|
|
-- 0 1 2 3 4 5 6 7 8 9 A B C D E F |
|
|
|
(x"63", x"7c", x"77", x"7b", x"f2", x"6b", x"6f", x"c5", x"30", x"01", x"67", x"2b", x"fe", x"d7", x"ab", x"76"), -- 0 |
|
|
@ -85,7 +100,13 @@ package aes_pkg is |
|
|
|
|
|
|
|
function gmul (a : std_logic_vector(7 downto 0); b : std_logic_vector(7 downto 0)) return std_logic_vector; |
|
|
|
|
|
|
|
--function addroundkey (data : in std_logic_vector(127 downto 0), key ) |
|
|
|
function addroundkey (input : in t_datatable2d; key : in t_key) return t_datatable2d; |
|
|
|
|
|
|
|
function subword (input : in t_datatable1d) return t_datatable1d; |
|
|
|
|
|
|
|
function rotword (input : in t_datatable1d) return t_datatable1d; |
|
|
|
|
|
|
|
function rcon (round : in t_rounds) return t_datatable1d; |
|
|
|
|
|
|
|
|
|
|
|
end package aes_pkg; |
|
|
@ -161,23 +182,27 @@ package body aes_pkg is |
|
|
|
-- algorithmus in c taken from http://www.samiam.org/galois.html and rewritten in vhdl |
|
|
|
function gmul (a : std_logic_vector(7 downto 0); b : std_logic_vector(7 downto 0)) return std_logic_vector is |
|
|
|
variable v_a, v_b : std_logic_vector(7 downto 0); |
|
|
|
variable v_data : std_logic_vector(7 downto 0) := (others => '0'); |
|
|
|
--variable v_data : std_logic_vector(7 downto 0) := (others => '0'); |
|
|
|
variable v_hi_bit_set : std_logic := '0'; |
|
|
|
variable v_data : unsigned(15 downto 0); |
|
|
|
begin |
|
|
|
v_a := a; |
|
|
|
v_b := b; |
|
|
|
for index in 0 to 7 loop |
|
|
|
if(v_b(0) = '1') then |
|
|
|
v_data := v_data xor v_a; |
|
|
|
end if; |
|
|
|
v_hi_bit_set := a(7); |
|
|
|
v_a := v_a(6 downto 0) & '0'; |
|
|
|
if(v_hi_bit_set = '1') then |
|
|
|
v_a := v_a xor x"01"; |
|
|
|
end if; |
|
|
|
v_b := '0' & v_b(7 downto 1); |
|
|
|
end loop; |
|
|
|
return v_data; |
|
|
|
--v_a := a; |
|
|
|
--v_b := b; |
|
|
|
--for index in 0 to 7 loop |
|
|
|
-- if(v_b(0) = '1') then |
|
|
|
-- v_data := v_data xor v_a; |
|
|
|
-- end if; |
|
|
|
-- v_hi_bit_set := a(7); |
|
|
|
-- v_a := v_a(6 downto 0) & '0'; |
|
|
|
-- if(v_hi_bit_set = '1') then |
|
|
|
-- v_a := v_a xor x"01"; |
|
|
|
-- end if; |
|
|
|
-- v_b := '0' & v_b(7 downto 1); |
|
|
|
--end loop; |
|
|
|
--return v_data; |
|
|
|
v_data := unsigned(a) * unsigned(b); |
|
|
|
return std_logic_vector(v_data(7 downto 0)); |
|
|
|
--return std_logic_vector((unsigned(a) * unsigned(b)) (7 downto 0)); -- mod a'length); |
|
|
|
end function gmul; |
|
|
|
|
|
|
|
|
|
|
@ -195,4 +220,42 @@ package body aes_pkg is |
|
|
|
end function mixcolumns; |
|
|
|
|
|
|
|
|
|
|
|
function addroundkey (input : in t_datatable2d; key : in t_key) return t_datatable2d is |
|
|
|
variable v_data : t_datatable2d; |
|
|
|
variable v_key : t_datatable1d; |
|
|
|
begin |
|
|
|
for i in 0 to 2 loop |
|
|
|
v_key := (key(i)(7 downto 0), key(i)(15 downto 8), key(i)(23 downto 16), key(i)(31 downto 24)); |
|
|
|
for j in 0 to 3 loop |
|
|
|
v_data(i)(j) := input(i)(j) xor v_key(j); |
|
|
|
end loop; |
|
|
|
end loop; |
|
|
|
return v_data; |
|
|
|
end function addroundkey; |
|
|
|
|
|
|
|
|
|
|
|
function subword (input : in t_datatable1d) return t_datatable1d is |
|
|
|
variable v_data : t_datatable1d; |
|
|
|
begin |
|
|
|
for i in 0 to 3 loop |
|
|
|
v_data(i) := c_sbox(to_integer(unsigned(input(i)(7 downto 4))))(to_integer(unsigned(input(i)(3 downto 0)))); |
|
|
|
end loop; |
|
|
|
return v_data; |
|
|
|
end function subword; |
|
|
|
|
|
|
|
|
|
|
|
function rotword (input : in t_datatable1d) return t_datatable1d is |
|
|
|
begin |
|
|
|
return(input(2), input(1), input(0), input(3)); |
|
|
|
end function rotword; |
|
|
|
|
|
|
|
|
|
|
|
function rcon (round : in t_rounds) return t_datatable1d is |
|
|
|
variable v_data : std_logic_vector(15 downto 0); |
|
|
|
begin |
|
|
|
v_data := std_logic_vector(to_unsigned(2**(round-1), 15)); |
|
|
|
return(v_data(7 downto 0), x"00", x"00", x"00"); |
|
|
|
end function rcon; |
|
|
|
|
|
|
|
|
|
|
|
end package body aes_pkg; |