0% found this document useful (0 votes)
221 views

AES Code

The document contains VHDL code that defines functions for implementing the Rijndael cipher algorithm. It defines subtypes to represent the state, round keys, and other values used in the algorithm. It also defines functions for the byte substitution step, shift row step, mix column step, and round key generation of the Rijndael cipher. The body of the code contains an implementation of the S-box lookup function using a case statement.

Uploaded by

tejasix
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
221 views

AES Code

The document contains VHDL code that defines functions for implementing the Rijndael cipher algorithm. It defines subtypes to represent the state, round keys, and other values used in the algorithm. It also defines functions for the byte substitution step, shift row step, mix column step, and round key generation of the Rijndael cipher. The body of the code contains an implementation of the S-box lookup function using a case statement.

Uploaded by

tejasix
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 44

Aes vhdl code:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

package rijndael_package is
subtype SLV_8 is std_logic_vector(7 downto 0);
subtype STATE_TYPE is std_logic_vector(127 downto 0);
subtype SLV_128 is std_logic_vector(127 downto 0);
subtype SLV_32 is std_logic_vector(31 downto 0);
subtype round_type is integer range 0 to 10;
function SBOX_LOOKUP_FUNCT (a: SLV_8) return SLV_8;
function BYTE_SUB_FUNCT (state: STATE_TYPE) return STATE_TYPE;
function SFT_RW_FN (state1: STATE_TYPE) return STATE_TYPE;
function ISBOX_LOOKUP (a1: SLV_8) return SLV_8;
function IV_BT_SB_FcT (state2: STATE_TYPE) return STATE_TYPE;
function IV_SFT_RW_FCT (state3: STATE_TYPE) return STATE_TYPE;
function MX_CLMN_FCT (state: STATE_TYPE) return STATE_TYPE;
function MULTE_FUNCT (a: SLV_8; b: SLV_8) return SLV_8;
function INV_MX_CLMN_FCT (state: STATE_TYPE) return STATE_TYPE;
function POLY_MULTD_FUNCT (a: SLV_8; b: SLV_8) return SLV_8;
function ROUNDKEY_GEN (roundkey: STATE_TYPE; round: round_type) return STATE_TYPE;
end package rijndael_package;

package body rijndael_package is


function SBOX_LOOKUP_FUNCT(a: SLV_8) return SLV_8 is
variable temp: SLV_8;
begin
case a is
when x"00" => temp := x"63";
when x"01" => temp := x"7c";
when x"02" => temp := x"77";
when x"03" => temp := x"7b";
when x"04" => temp := x"f2";
when x"05" => temp := x"6b";
when x"06" => temp := x"6f";
when x"07" => temp := x"c5";
when x"08" => temp := x"30";
when x"09" => temp := x"01";
when x"0a" => temp := x"67";
when x"0b" => temp := x"2b";
when x"0c" => temp := x"fe";
when x"0d" => temp := x"d7";
when x"0e" => temp := x"ab";
when x"0f" => temp := x"76";
when x"10" => temp := x"ca";
when x"11" => temp := x"82";
when x"12" => temp := x"c9";
when x"13" => temp := x"7d";
when x"14" => temp := x"fa";
when x"15" => temp := x"59";
when x"16" => temp := x"47";
when x"17" => temp := x"f0";
when x"18" => temp := x"ad";
when x"19" => temp := x"d4";
when x"1a" => temp := x"a2";
when x"1b" => temp := x"af";
when x"1c" => temp := x"9c";
when x"1d" => temp := x"a4";
when x"1e" => temp := x"72";
when x"1f" => temp := x"c0";
when x"20" => temp := x"b7";
when x"21" => temp := x"fd";
when x"22" => temp := x"93";
when x"23" => temp := x"26";
when x"24" => temp := x"36";
when x"25" => temp := x"3f";
when x"26" => temp := x"f7";
when x"27" => temp := x"cc";
when x"28" => temp := x"34";
when x"29" => temp := x"a5";
when x"2a" => temp := x"e5";
when x"2b" => temp := x"f1";
when x"2c" => temp := x"71";
when x"2d" => temp := x"d8";
when x"2e" => temp := x"31";
when x"2f" => temp := x"15";
when x"30" => temp := x"04";
when x"31" => temp := x"c7";
when x"32" => temp := x"23";
when x"33" => temp := x"c3";
when x"34" => temp := x"18";
when x"35" => temp := x"96";
when x"36" => temp := x"05";
when x"37" => temp := x"9a";
when x"38" => temp := x"07";
when x"39" => temp := x"12";
when x"3a" => temp := x"80";
when x"3b" => temp := x"e2";
when x"3c" => temp := x"eb";
when x"3d" => temp := x"27";
when x"3e" => temp := x"b2";
when x"3f" => temp := x"75";
when x"40" => temp := x"09";
when x"41" => temp := x"83";
when x"42" => temp := x"2c";
when x"43" => temp := x"1a";
when x"44" => temp := x"1b";
when x"45" => temp := x"6e";
when x"46" => temp := x"5a";
when x"47" => temp := x"a0";
when x"48" => temp := x"52";
when x"49" => temp := x"3b";
when x"4a" => temp := x"d6";
when x"4b" => temp := x"b3";
when x"4c" => temp := x"29";
when x"4d" => temp := x"e3";
when x"4e" => temp := x"2f";
when x"4f" => temp := x"84";
when x"50" => temp := x"53";
when x"51" => temp := x"d1";
when x"52" => temp := x"00";
when x"53" => temp := x"ed";
when x"54" => temp := x"20";
when x"55" => temp := x"fc";
when x"56" => temp := x"b1";
when x"57" => temp := x"5b";
when x"58" => temp := x"6a";
when x"59" => temp := x"cb";
when x"5a" => temp := x"be";
when x"5b" => temp := x"39";
when x"5c" => temp := x"4a";
when x"5d" => temp := x"4c";
when x"5e" => temp := x"58";
when x"5f" => temp := x"cf";
when x"60" => temp := x"d0";
when x"61" => temp := x"ef";
when x"62" => temp := x"aa";
when x"63" => temp := x"fb";
when x"64" => temp := x"43";
when x"65" => temp := x"4d";
when x"66" => temp := x"33";
when x"67" => temp := x"85";
when x"68" => temp := x"45";
when x"69" => temp := x"f9";
when x"6a" => temp := x"02";
when x"6b" => temp := x"7f";
when x"6c" => temp := x"50";
when x"6d" => temp := x"3c";
when x"6e" => temp := x"9f";
when x"6f" => temp := x"a8";
when x"70" => temp := x"51";
when x"71" => temp := x"a3";
when x"72" => temp := x"40";
when x"73" => temp := x"8f";
when x"74" => temp := x"92";
when x"75" => temp := x"9d";
when x"76" => temp := x"38";
when x"77" => temp := x"f5";
when x"78" => temp := x"bc";
when x"79" => temp := x"b6";
when x"7a" => temp := x"da";
when x"7b" => temp := x"21";
when x"7c" => temp := x"10";
when x"7d" => temp := x"ff";
when x"7e" => temp := x"f3";
when x"7f" => temp := x"d2";
when x"80" => temp := x"cd";
when x"81" => temp := x"0c";
when x"82" => temp := x"13";
when x"83" => temp := x"ec";
when x"84" => temp := x"5f";
when x"85" => temp := x"97";
when x"86" => temp := x"44";
when x"87" => temp := x"17";
when x"88" => temp := x"c4";
when x"89" => temp := x"a7";
when x"8a" => temp := x"7e";
when x"8b" => temp := x"3d";
when x"8c" => temp := x"64";
when x"8d" => temp := x"5d";
when x"8e" => temp := x"19";
when x"8f" => temp := x"73";
when x"90" => temp := x"60";
when x"91" => temp := x"81";
when x"92" => temp := x"4f";
when x"93" => temp := x"dc";
when x"94" => temp := x"22";
when x"95" => temp := x"2a";
when x"96" => temp := x"90";
when x"97" => temp := x"88";
when x"98" => temp := x"46";
when x"99" => temp := x"ee";
when x"9a" => temp := x"b8";
when x"9b" => temp := x"14";
when x"9c" => temp := x"de";
when x"9d" => temp := x"5e";
when x"9e" => temp := x"0b";
when x"9f" => temp := x"db";
when x"a0" => temp := x"e0";
when x"a1" => temp := x"32";
when x"a2" => temp := x"3a";
when x"a3" => temp := x"0a";
when x"a4" => temp := x"49";
when x"a5" => temp := x"06";
when x"a6" => temp := x"24";
when x"a7" => temp := x"5c";
when x"a8" => temp := x"c2";
when x"a9" => temp := x"d3";
when x"aa" => temp := x"ac";
when x"ab" => temp := x"62";
when x"ac" => temp := x"91";
when x"ad" => temp := x"95";
when x"ae" => temp := x"e4";
when x"af" => temp := x"79";
when x"b0" => temp := x"e7";
when x"b1" => temp := x"c8";
when x"b2" => temp := x"37";
when x"b3" => temp := x"6d";
when x"b4" => temp := x"8d";
when x"b5" => temp := x"d5";
when x"b6" => temp := x"4e";
when x"b7" => temp := x"a9";
when x"b8" => temp := x"6c";
when x"b9" => temp := x"56";
when x"ba" => temp := x"f4";
when x"bb" => temp := x"ea";
when x"bc" => temp := x"65";
when x"bd" => temp := x"7a";
when x"be" => temp := x"ae";
when x"bf" => temp := x"08";
when x"c0" => temp := x"ba";
when x"c1" => temp := x"78";
when x"c2" => temp := x"25";
when x"c3" => temp := x"2e";
when x"c4" => temp := x"1c";
when x"c5" => temp := x"a6";
when x"c6" => temp := x"b4";
when x"c7" => temp := x"c6";
when x"c8" => temp := x"e8";
when x"c9" => temp := x"dd";
when x"ca" => temp := x"74";
when x"cb" => temp := x"1f";
when x"cc" => temp := x"4b";
when x"cd" => temp := x"bd";
when x"ce" => temp := x"8b";
when x"cf" => temp := x"8a";
when x"d0" => temp := x"70";
when x"d1" => temp := x"3e";
when x"d2" => temp := x"b5";
when x"d3" => temp := x"66";
when x"d4" => temp := x"48";
when x"d5" => temp := x"03";
when x"d6" => temp := x"f6";
when x"d7" => temp := x"0e";
when x"d8" => temp := x"61";
when x"d9" => temp := x"35";
when x"da" => temp := x"57";
when x"db" => temp := x"b9";
when x"dc" => temp := x"86";
when x"dd" => temp := x"c1";
when x"de" => temp := x"1d";
when x"df" => temp := x"9e";
when x"e0" => temp := x"e1";
when x"e1" => temp := x"f8";
when x"e2" => temp := x"98";
when x"e3" => temp := x"11";
when x"e4" => temp := x"69";
when x"e5" => temp := x"d9";
when x"e6" => temp := x"8e";
when x"e7" => temp := x"94";
when x"e8" => temp := x"9b";
when x"e9" => temp := x"1e";
when x"ea" => temp := x"87";
when x"eb" => temp := x"e9";
when x"ec" => temp := x"ce";
when x"ed" => temp := x"55";
when x"ee" => temp := x"28";
when x"ef" => temp := x"df";
when x"f0" => temp := x"8c";
when x"f1" => temp := x"a1";
when x"f2" => temp := x"89";
when x"f3" => temp := x"0d";
when x"f4" => temp := x"bf";
when x"f5" => temp := x"e6";
when x"f6" => temp := x"42";
when x"f7" => temp := x"68";
when x"f8" => temp := x"41";
when x"f9" => temp := x"99";
when x"fa" => temp := x"2d";
when x"fb" => temp := x"0f";
when x"fc" => temp := x"b0";
when x"fd" => temp := x"54";
when x"fe" => temp := x"bb";
when x"ff" => temp := x"16";
when others => null;
end case;
return temp;
end function SBOX_LOOKUP_FUNCT;

function BYTE_SUB_FUNCT (state: STATE_TYPE) return STATE_TYPE is


variable b: STATE_TYPE;
variable temp: STATE_TYPE;
begin
b(127 downto 120) := SBOX_LOOKUP_FUNCT(state(127 downto 120));
b(119 downto 112) :=SBOX_LOOKUP_FUNCT(state(119 downto 112));
b(111 downto 104) := SBOX_LOOKUP_FUNCT(state(111 downto 104));
b(103 downto 96) := SBOX_LOOKUP_FUNCT(state(103 downto 96));
b(95 downto 88) := SBOX_LOOKUP_FUNCT(state(95 downto 88));
b(87 downto 80) := SBOX_LOOKUP_FUNCT(state(87 downto 80));
b(79 downto 72) := SBOX_LOOKUP_FUNCT(state(79 downto 72));
b(71 downto 64) := SBOX_LOOKUP_FUNCT(state(71 downto 64));
b(63 downto 56) := SBOX_LOOKUP_FUNCT(state(63 downto 56));
b(55 downto 48) := SBOX_LOOKUP_FUNCT(state(55 downto 48));
b(47 downto 40) := SBOX_LOOKUP_FUNCT(state(47 downto 40));
b(39 downto 32) := SBOX_LOOKUP_FUNCT(state(39 downto 32));
b(31 downto 24) := SBOX_LOOKUP_FUNCT(state(31 downto 24));
b(23 downto 16) := SBOX_LOOKUP_FUNCT(state(23 downto 16));
b(15 downto 8) := SBOX_LOOKUP_FUNCT(state(15 downto 8));
b(7 downto 0) := SBOX_LOOKUP_FUNCT(state(7 downto 0));
temp:=b;
return temp;
end function BYTE_SUB_FUNCT;
function SFT_RW_FN (state1: STATE_TYPE) return STATE_TYPE is
variable a: std_logic_vector(127 downto 0);
begin
a(127 downto 120) := state1(127 downto 120);
a(119 downto 112) := state1(87 downto 80);
a(111 downto 104) := state1(47 downto 40);
a(103 downto 96) := state1(7 downto 0);
a(95 downto 88) := state1(95 downto 88);
a(87 downto 80) := state1(55 downto 48);
a(79 downto 72) := state1(15 downto 8);
a(71 downto 64):= state1(103 downto 96);
a(63 downto 56) := state1(63 downto 56);
a(55 downto 48) := state1(23 downto 16);
a(47 downto 40) := state1(111 downto 104);
a(39 downto 32) := state1(71 downto 64);
a(31 downto 24) := state1(31 downto 24);
a(23 downto 16) := state1(119 downto 112);
a(15 downto 8) := state1(79 downto 72);
a(7 downto 0) := state1(39 downto 32);
return a;
end function SFT_RW_FN;

function ISBOX_LOOKUP (a1: SLV_8) return SLV_8 is


variable temp1: SLV_8;
begin
case a1 is
when x"00" => temp1 := x"52";
when x"01" => temp1 := x"09";
when x"02" => temp1 := x"6a";
when x"03" => temp1 := x"d5";
when x"04" => temp1 := x"30";
when x"05" => temp1 := x"36";
when x"06" => temp1 := x"a5";
when x"07" => temp1 := x"38";
when x"08" => temp1 := x"bf";
when x"09" => temp1 := x"40";
when x"0a" => temp1 := x"a3";
when x"0b" => temp1 := x"9e";
when x"0c" => temp1 := x"81";
when x"0d" => temp1 := x"f3";
when x"0e" => temp1 := x"d7";
when x"0f" => temp1 := x"fb";
when x"10" => temp1 := x"7c";
when x"11" => temp1 := x"e3";
when x"12" => temp1 := x"39";
when x"13" => temp1 := x"82";
when x"14" => temp1 := x"9b";
when x"15" => temp1 := x"2f";
when x"16" => temp1 := x"ff";
when x"17" => temp1 := x"87";
when x"18" => temp1 := x"34";
when x"19" => temp1 := x"8e";
when x"1a" => temp1 := x"43";
when x"1b" => temp1 := x"44";
when x"1c" => temp1 := x"c4";
when x"1d" => temp1 := x"de";
when x"1e" => temp1 := x"e9";
when x"1f" => temp1 := x"cb";
when x"20" => temp1 := x"54";
when x"21" => temp1 := x"7b";
when x"22" => temp1 := x"94";
when x"23" => temp1 := x"32";
when x"24" => temp1 := x"a6";
when x"25" => temp1 := x"c2";
when x"26" => temp1 := x"23";
when x"27" => temp1 := x"3d";
when x"28" => temp1 := x"ee";
when x"29" => temp1 := x"4c";
when x"2a" => temp1 := x"95";
when x"2b" => temp1 := x"0b";
when x"2c" => temp1 := x"42";
when x"2d" => temp1 := x"fa";
when x"2e" => temp1 := x"c3";
when x"2f" => temp1 := x"49";
when x"30" => temp1 := x"08";
when x"31" => temp1 := x"2e";
when x"32" => temp1 := x"a1";
when x"33" => temp1 := x"66";
when x"34" => temp1 := x"28";
when x"35" => temp1 := x"d9";
when x"36" => temp1 := x"24";
when x"37" => temp1 := x"b2";
when x"38" => temp1 := x"76";
when x"39" => temp1 := x"5b";
when x"3a" => temp1 := x"a2";
when x"3b" => temp1 := x"49";
when x"3c" => temp1 := x"6d";
when x"3d" => temp1 := x"8b";
when x"3e" => temp1 := x"d1";
when x"40" => temp1 := x"72";
when x"41" => temp1 := x"f8";
when x"42" => temp1 := x"f6";
when x"43" => temp1 := x"64";
when x"44" => temp1 := x"86";
when x"45" => temp1 := x"68";
when x"46" => temp1 := x"98";
when x"47" => temp1 := x"16";
when x"48" => temp1 := x"d4";
when x"49" => temp1 := x"a4";
when x"4a" => temp1 := x"5c";
when x"4b" => temp1 := x"cc";
when x"4c" => temp1 := x"5d";
when x"4d" => temp1 := x"65";
when x"4e" => temp1 := x"b6";
when x"4f" => temp1 := x"92";
when x"50" => temp1 := x"6c";
when x"51" => temp1 := x"70";
when x"52" => temp1 := x"48";
when x"53" => temp1 := x"50";
when x"54" => temp1 := x"fd";
when x"55" => temp1 := x"ed";
when x"56" => temp1 := x"b9";
when x"57" => temp1 := x"da";
when x"58" => temp1 := x"5e";
when x"59" => temp1 := x"15";
when x"5a" => temp1 := x"46";
when x"5b" => temp1 := x"57";
when x"5c" => temp1 := x"a7";
when x"5d" => temp1 := x"8d";
when x"5e" => temp1 := x"9d";
when x"5f" => temp1 := x"84";
when x"60" => temp1 := x"90";
when x"61" => temp1 := x"d8";
when x"62" => temp1 := x"ab";
when x"63" => temp1 := x"00";
when x"64" => temp1 := x"8c";
when x"65" => temp1 := x"bc";
when x"66" => temp1 := x"d3";
when x"67" => temp1 := x"0a";
when x"68" => temp1 := x"f7";
when x"69" => temp1 := x"e4";
when x"6a" => temp1 := x"58";
when x"6b" => temp1 := x"05";
when x"6c" => temp1 := x"b8";
when x"6d" => temp1 := x"b3";
when x"6e" => temp1 := x"45";
when x"6f" => temp1 := x"06";
when x"70" => temp1 := x"d0";
when x"71" => temp1 := x"2c";
when x"72" => temp1 := x"1e";
when x"73" => temp1 := x"8f";
when x"74" => temp1 := x"ca";
when x"75" => temp1 := x"3f";
when x"76" => temp1 := x"0f";
when x"77" => temp1 := x"02";
when x"78" => temp1 := x"c1";
when x"79" => temp1 := x"af";
when x"7a" => temp1 := x"bd";
when x"7b" => temp1 := x"03";
when x"7c" => temp1 := x"01";
when x"7d" => temp1 := x"13";
when x"7e" => temp1 := x"8a";
when x"7f" => temp1 := x"6b";
when x"80" => temp1 := x"3a";
when x"81" => temp1 := x"91";
when x"82" => temp1 := x"11";
when x"83" => temp1 := x"41";
when x"84" => temp1 := x"4f";
when x"85" => temp1 := x"67";
when x"86" => temp1 := x"dc";
when x"87" => temp1 := x"ea";
when x"88" => temp1 := x"97";
when x"89" => temp1 := x"f2";
when x"8a" => temp1 := x"cf";
when x"8b" => temp1 := x"ce";
when x"8c" => temp1 := x"f0";
when x"8d" => temp1 := x"b4";
when x"8e" => temp1 := x"e6";
when x"8f" => temp1 := x"73";
when x"90" => temp1 := x"96";
when x"91" => temp1 := x"ac";
when x"92" => temp1 := x"74";
when x"93" => temp1 := x"22";
when x"94" => temp1 := x"e7";
when x"95" => temp1 := x"ad";
when x"96" => temp1 := x"35";
when x"97" => temp1 := x"85";
when x"98" => temp1 := x"e2";
when x"99" => temp1 := x"f9";
when x"9a" => temp1 := x"37";
when x"9b" => temp1 := x"e8";
when x"9c" => temp1 := x"1c";
when x"9d" => temp1 := x"75";
when x"9e" => temp1 := x"df";
when x"9f" => temp1 := x"6e";
when x"a0" => temp1 := x"47";
when x"a1" => temp1 := x"f1";
when x"a2" => temp1 := x"1a";
when x"a3" => temp1 := x"71";
when x"a4" => temp1 := x"1d";
when x"a5" => temp1 := x"29";
when x"a6" => temp1 := x"c5";
when x"a7" => temp1 := x"89";
when x"a8" => temp1 := x"6f";
when x"a9" => temp1 := x"b7";
when x"aa" => temp1 := x"62";
when x"ab" => temp1 := x"0e";
when x"ac" => temp1 := x"aa";
when x"ad" => temp1 := x"18";
when x"ae" => temp1 := x"be";
when x"af" => temp1 := x"1b";
when x"b0" => temp1 := x"fc";
when x"b1" => temp1 := x"56";
when x"b2" => temp1 := x"3e";
when x"b3" => temp1 := x"4b";
when x"b4" => temp1 := x"c6";
when x"b5" => temp1 := x"d2";
when x"b6" => temp1 := x"79";
when x"b7" => temp1 := x"20";
when x"b8" => temp1 := x"9a";
when x"b9" => temp1 := x"db";
when x"ba" => temp1 := x"c0";
when x"bb" => temp1 := x"fe";
when x"bc" => temp1 := x"78";
when x"bd" => temp1 := x"cd";
when x"be" => temp1 := x"5a";
when x"bf" => temp1 := x"f4";
when x"c0" => temp1 := x"1f";
when x"c1" => temp1 := x"dd";
when x"c2" => temp1 := x"a8";
when x"c3" => temp1 := x"33";
when x"c4" => temp1 := x"88";
when x"c5" => temp1 := x"07";
when x"c6" => temp1 := x"c7";
when x"c7" => temp1 := x"31";
when x"c8" => temp1 := x"b1";
when x"c9" => temp1 := x"12";
when x"ca" => temp1 := x"10";
when x"cb" => temp1 := x"59";
when x"cc" => temp1 := x"27";
when x"cd" => temp1 := x"80";
when x"ce" => temp1 := x"ec";
when x"cf" => temp1 := x"5f";
when x"d0" => temp1 := x"60";
when x"d1" => temp1 := x"51";
when x"d2" => temp1 := x"7f";
when x"d3" => temp1 := x"a9";
when x"d4" => temp1 := x"19";
when x"d5" => temp1 := x"b5";
when x"d6" => temp1 := x"4a";
when x"d7" => temp1 := x"0d";
when x"d8" => temp1 := x"2d";
when x"d9" => temp1 := x"e5";
when x"da" => temp1 := x"7a";
when x"db" => temp1 := x"9f";
when x"dc" => temp1 := x"93";
when x"dd" => temp1 := x"c9";
when x"de" => temp1 := x"9c";
when x"df" => temp1 := x"ef";
when x"e0" => temp1 := x"a0";
when x"e1" => temp1 := x"e0";
when x"e2" => temp1 := x"3b";
when x"e3" => temp1 := x"4d";
when x"e4" => temp1 := x"ae";
when x"e5" => temp1 := x"2a";
when x"e6" => temp1 := x"f5";
when x"e7" => temp1 := x"b0";
when x"e8" => temp1 := x"c8";
when x"e9" => temp1 := x"eb";
when x"ea" => temp1 := x"bb";
when x"eb" => temp1 := x"3c";
when x"ec" => temp1 := x"83";
when x"ed" => temp1 := x"53";
when x"ee" => temp1 := x"99";
when x"ef" => temp1 := x"61";
when x"f0" => temp1 := x"17";
when x"f1" => temp1 := x"2b";
when x"f2" => temp1 := x"04";
when x"f3" => temp1 := x"7e";
when x"f4" => temp1:= x"ba";
when x"f5" => temp1 := x"77";
when x"f6" => temp1 := x"d6";
when x"f7" => temp1 := x"26";
when x"f8" => temp1 := x"e1";
when x"f9" => temp1 := x"69";
when x"fa" => temp1 := x"14";
when x"fb" => temp1 := x"63";
when x"fc" => temp1 := x"55";
when x"fd" => temp1:= x"21";
when x"fe" => temp1 := x"0c";
when x"ff" => temp1 := x"7d";
when others => null;
end case;
return temp1;
end function ISBOX_LOOKUP;

function IV_BT_SB_FCT (state2: STATE_TYPE) return STATE_TYPE is


variable b1: STATE_TYPE;
variable temp2: STATE_TYPE;
begin
b1(127 downto 120) := ISBOX_LOOKUP(state2(127 downto 120));
b1(119 downto 112) := ISBOX_LOOKUP(state2(119 downto 112));
b1(111 downto 104) := ISBOX_LOOKUP(state2(111 downto 104));
b1(103 downto 96) := ISBOX_LOOKUP(state2(103 downto 96));
b1(95 downto 88) := ISBOX_LOOKUP(state2(95 downto 88));
b1(87 downto 80) := ISBOX_LOOKUP(state2(87 downto 80));
b1(79 downto 72) := ISBOX_LOOKUP (state2(79 downto 72));
b1(71 downto 64) := ISBOX_LOOKUP(state2(71 downto 64));
b1(63 downto 56) := ISBOX_LOOKUP(state2(63 downto 56));
b1(55 downto 48) := ISBOX_LOOKUP(state2(55 downto 48));
b1(39 downto 32) := ISBOX_LOOKUP( state2(47 downto 40));
b1(31 downto 24) := ISBOX_LOOKUP(state2(31 downto 24));
b1(23 downto 16) := ISBOX_LOOKUP(state2(39 downto 32));
b1(47 downto 40) := ISBOX_LOOKUP(state2(23 downto 16));
b1(15 downto 8) := ISBOX_LOOKUP(state2(15 downto 8));
b1(7 downto 0) := ISBOX_LOOKUP(state2(7 downto 0));
temp2:=b1;
return temp2;
end function IV_BT_SB_FCT;

function IV_SFT_RW_FCT (state3: STATE_TYPE) return STATE_TYPE is


variable a: STATE_TYPE;
begin
a(127 downto 120) := state3(127 downto 120);
a(119 downto 112) := state3(23 downto 16);
a(111 downto 104) := state3(47 downto 40);
a(103 downto 96) := state3(71 downto 64);
a(95 downto 88) := state3(95 downto 88);
a(87 downto 80) := state3(119 downto 112);
a(79 downto 72) := state3(15 downto 8);
a(71 downto 64) := state3(39 downto 32);
a(63 downto 56) := state3(63 downto 56);
a(55 downto 48) := state3(87 downto 80);
a(47 downto 40) := state3(111 downto 104);
a(39 downto 32) := state3(7 downto 0);
a(31 downto 24) := state3(31 downto 24);
a(23 downto 16) := state3(55 downto 48);
a(15 downto 8) := state3(79 downto 72);
a(7 downto 0) := state3(103 downto 96);
return a;
end function IV_SFT_RW_FCT;
function MX_CLMN_FCT (state: STATE_TYPE) return STATE_TYPE is
variable t0: SLV_8;
variable t1: SLV_8;
variable t2: SLV_8;
variable t3: SLV_8;
variable t4: SLV_8;
variable t5: SLV_8;
variable t6: SLV_8;
variable t7: SLV_8;
variable t8: SLV_8;
variable t9: SLV_8;
variable t10: SLV_8;
variable t11: SLV_8;
variable t12: SLV_8;
variable t13: SLV_8;
variable t14: SLV_8;
variable t15: SLV_8;
variable DATAOUT: SLV_128;
variable temp: SLV_128;
begin
t0 := state(127 downto 120);
t1 := state(119 downto 112);
t2 := state(111 downto 104);
t3 := state(103 downto 96);
t4 := state(95 downto 88);
t5 := state(87 downto 80);
t6 := state(79 downto 72);
t7:= state(71 downto 64);
t8 := state(63 downto 56);
t9 := state(55 downto 48);
t10 := state(47 downto 40);
t11 := state(39 downto 32);
t12 := state(31 downto 24);
t13 := state(23 downto 16);
t14 := state(15 downto 8);
t15 := state(7 downto 0);
DATAOUT(127 downto 120) := MULTE_FUNCT("00000010", t0) xor MULTE_FUNCT("00000011", t1) xor t2 xor t3;
DATAOUT(119 downto 112) := t0 xor MULTE_FUNCT("00000010", t1) xor MULTE_FUNCT("00000011", t2) xor t3;
DATAOUT(111 downto 104) := MULTE_FUNCT("00000010" , t2) xor MULTE_FUNCT("00000011", t3) xor t0 xor t1;
DATAOUT(103 downto 96) := MULTE_FUNCT("00000011" , t0) xor MULTE_FUNCT("00000010", t3) xor t1 xor t2;
DATAOUT(95 downto 88) := MULTE_FUNCT("00000010" , t4) xor MULTE_FUNCT("00000011", t5) xor t6 xor t7;
DATAOUT(87 downto 80) := MULTE_FUNCT("00000010" , t5) xor MULTE_FUNCT("00000011" , t6) xor t4 xor t7;
DATAOUT(79 downto 72) := MULTE_FUNCT("00000010" , t6) xor MULTE_FUNCT("00000011", t7) xor t4 xor t5;
DATAOUT(71 downto 64) := MULTE_FUNCT("00000011" , t4) xor MULTE_FUNCT("00000010", t7) xor t5 xor t6;
DATAOUT(63 downto 56) := MULTE_FUNCT("00000010", t8) xor MULTE_FUNCT("00000011", t9) xor t10 xor t11;
DATAOUT(55 downto 48) := MULTE_FUNCT("00000010", t9) xor MULTE_FUNCT("00000011", t10) xor t8 xor t11;
DATAOUT(47 downto 40) := MULTE_FUNCT("00000010", t10) xor MULTE_FUNCT("00000011", t11) xor t8 xor t9;
DATAOUT(39 downto 32) :=MULTE_FUNCT("00000011", t8) xor MULTE_FUNCT("00000010", t11) xor t9 xor t10;
DATAOUT(31 downto 24) := MULTE_FUNCT("00000010", t12) xor MULTE_FUNCT("00000011", t13) xor t14 xor t15;
DATAOUT(23 downto 16) := MULTE_FUNCT("00000010",t13) xor MULTE_FUNCT("00000011",t14) xor t12 xor t15;
DATAOUT(15 downto 8) := MULTE_FUNCT("00000010", t14) xor MULTE_FUNCT("00000011", t15) xor t12 xor t13;
DATAOUT(7 downto 0) := MULTE_FUNCT("00000011", t12) xor MULTE_FUNCT("00000010", t15) xor t13 xor t14;
temp:=DATAOUT;
return temp;
end function MX_CLMN_FCT;

function MULTE_FUNCT (a: SLV_8; b : SLV_8 ) return SLV_8 is


variable temp : SLV_8;
variable temp1 : SLV_8;
variable temp2 : SLV_8;
variable temp3 : SLV_8;
variable and_mask : SLV_8;
begin
and_mask := b(7) & b(7) & b(7) & b(7) & b(7) & b(7) & b(7) & b(7);
case a(3 downto 0) is
when "0001" => temp := b;
when "0010" =>temp := b(6 downto 0) & '0' xor (("00011011") and and_mask);
when "0011"=> temp := b(6 downto 0) & '0' xor (("00011011") and and_mask) xor b;
when others => temp := (others => '0');
end case;
return temp;
end function MULTE_FUNCT;

function INV_MX_CLMN_FCT (state: STATE_TYPE) return


STATE_TYPE is
variable t0: SLV_8;
variable t1: SLV_8;
variable t2: SLV_8;
variable t3: SLV_8;
variable t4: SLV_8;
variable t5: SLV_8;
variable t6: SLV_8;
variable t7: SLV_8;
variable t8: SLV_8;
variable t9: SLV_8;
variable t10: SLV_8;
variable t11: SLV_8;
variable t12: SLV_8;
variable t13: SLV_8;
variable t14: SLV_8;
variable t15: SLV_8;
variable b: STATE_TYPE;
variable temp: STATE_TYPE;
begin
t0 := state(127 downto 120);
t1 := state(119 downto 112);
t2 := state(111 downto 104);
t3 := state(103 downto 96);
t4 := state(95 downto 88);
t5 := state(87 downto 80);
t6 := state(79 downto 72);
t7 := state(71 downto 64);
t8 := state(63 downto 56);
t9 := state(55 downto 48);
t10 := state(47 downto 40);
t11 := state(39 downto 32);
t12 := state(31 downto 24);
t13 := state(23 downto 16);
t14 := state(15 downto 8);
t15 := state(7 downto 0);
b(127 downto 120) := POLY_MULTD_FUNCT("00001110", t0) xor
POLY_MULTD_FUNCT("00001011", t1) xor
POLY_MULTD_FUNCT("00001101", t2) xor
POLY_MULTD_FUNCT("00001001", t3);
b(119 downto 112) := POLY_MULTD_FUNCT("00001001", t0) xor
POLY_MULTD_FUNCT("00001110", t1) xor
POLY_MULTD_FUNCT("00001011", t2) xor
POLY_MULTD_FUNCT("00001101", t3);
b(111 downto 104) := POLY_MULTD_FUNCT("00001101", t0) xor
POLY_MULTD_FUNCT("00001001", t1) xor
POLY_MULTD_FUNCT("00001110", t2) xor
POLY_MULTD_FUNCT("00001011", t3);
b(103 downto 96) := POLY_MULTD_FUNCT("00001011", t0) xor
POLY_MULTD_FUNCT("00001101", t1) xor
POLY_MULTD_FUNCT("00001001", t2) xor
POLY_MULTD_FUNCT("00001110", t3);
b(95 downto 88) := POLY_MULTD_FUNCT("00001110", t4) xor
POLY_MULTD_FUNCT("00001011", t5) xor
POLY_MULTD_FUNCT("00001101", t6) xor
POLY_MULTD_FUNCT("00001001", t7) ;
b(87 downto 80) := POLY_MULTD_FUNCT("00001001", t4) xor
POLY_MULTD_FUNCT("00001110", t5) xor
POLY_MULTD_FUNCT("00001011", t6) xor
POLY_MULTD_FUNCT("00001101", t7);
b(79 downto 72) := POLY_MULTD_FUNCT("00001101", t4) xor
POLY_MULTD_FUNCT("00001001", t5) xor
POLY_MULTD_FUNCT("00001110", t6) xor
POLY_MULTD_FUNCT("00001011", t7);
b(71 downto 64) := POLY_MULTD_FUNCT("00001011", t4) xor
POLY_MULTD_FUNCT("00001101", t5) xor
POLY_MULTD_FUNCT("00001001", t6) xor
POLY_MULTD_FUNCT("00001110", t7);
b(63 downto 56) := POLY_MULTD_FUNCT("00001110", t8) xor
POLY_MULTD_FUNCT("00001011", t9) xor
POLY_MULTD_FUNCT("00001101", t10) xor
POLY_MULTD_FUNCT("00001001", t11) ;
b(55 downto 48) := POLY_MULTD_FUNCT("00001001", t8) xor
POLY_MULTD_FUNCT("00001110", t9) xor
POLY_MULTD_FUNCT("00001011", t10) xor
POLY_MULTD_FUNCT("00001101", t11);
b(47 downto 40) := POLY_MULTD_FUNCT("00001101", t8) xor
POLY_MULTD_FUNCT("00001001", t9) xor
POLY_MULTD_FUNCT("00001110", t10) xor
POLY_MULTD_FUNCT("00001011", t11);
b(39 downto 32) := POLY_MULTD_FUNCT("00001011", t8) xor
POLY_MULTD_FUNCT("00001101", t9) xor
POLY_MULTD_FUNCT("00001001", t10) xor
POLY_MULTD_FUNCT("00001110", t11);
b(31 downto 24) := POLY_MULTD_FUNCT("00001110", t12) xor
POLY_MULTD_FUNCT("00001011", t13) xor
POLY_MULTD_FUNCT("00001101", t14) xor
POLY_MULTD_FUNCT("00001001", t15);
b(23 downto 16) := POLY_MULTD_FUNCT("00001001", t12) xor
POLY_MULTD_FUNCT("00001110", t13) xor
POLY_MULTD_FUNCT("00001011", t14) xor
POLY_MULTD_FUNCT("00001101", t15);
b(15 downto 8) := POLY_MULTD_FUNCT("00001101", t12) xor
POLY_MULTD_FUNCT("00001001", t13) xor
POLY_MULTD_FUNCT("00001110", t14) xor
POLY_MULTD_FUNCT("00001011", t15);
b(7 downto 0) := POLY_MULTD_FUNCT("00001011", t12) xor
POLY_MULTD_FUNCT("00001101", t13) xor
POLY_MULTD_FUNCT("00001001", t14) xor
POLY_MULTD_FUNCT("00001110", t15);
temp:=b;
return temp;
end function INV_MX_CLMN_FCT;

function POLY_MULTD_FUNCT (a: SLV_8; b: SLV_8) return SLV_8 is


variable temp: SLV_8;
variable temp1: SLV_8;
variable temp2: SLV_8;
variable temp3: SLV_8;
variable and_mask: SLV_8;
begin
and_mask := b(7) & b(7) & b(7) & b(7) & b(7) & b(7) & b(7) & b(7);
case a(3 downto 0) is
when "1001"=> temp1 := b(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7);
temp2 := temp1(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7);
temp3 := temp2(6 downto 0) & '0' xor (("00011011") and and_mask);
temp := temp3 xor b;
when "1011"=> temp1 := b(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7);
temp2 := temp1(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7);
temp3 := temp2(6 downto 0) & '0' xor (("00011011") and and_mask);
temp := temp1 xor temp3 xor b;
when "1101" => temp1 := b(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7);
temp2 := temp1(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7);
temp3 := temp2(6 downto 0) & '0' xor (("00011011") and and_mask);
temp := temp2 xor temp3 xor b;
when "1110"=> temp1 := b(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7) & temp1(7);
temp2 := temp1(6 downto 0) & '0' xor (("00011011") and and_mask);
and_mask := temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7) & temp2(7);
temp3 := temp2(6 downto 0) & '0' xor (("00011011") and and_mask);
temp := temp1 xor temp2 xor temp3;
when others => temp := (others => '0');
end case;
return temp;
end function POLY_MULTD_FUNCT;

function ROUNDKEY_GEN (roundkey: STATE_TYPE; round: round_type) return STATE_TYPE is


variable b: STATE_TYPE;
variable b0:SLV_8;
variable b1:SLV_8;
variable b2:SLV_8;
variable b3:SLV_8;
begin
b0 := roundkey(31 downto 24);
b1 := roundkey(23 downto 16);
b2 := roundkey(15 downto 8);
b3 := roundkey(7 downto 0);
case round is
when 1 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00000001" xor roundkey(127 downto 120);
b(119 downto 112) := SBOX_LOOKUP_FUNCT(b2)xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 2 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00000010" xor roundkey(127 downto 120);
b(119 downto 112):= SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) :=SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 3 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00000100" xor roundkey(127 downto 120);
b(119 downto 112):= SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 4 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00001000" xor roundkey(127 downto 120);
b(119 downto 112) := SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 5 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00010000" xor roundkey(127 downto 120);
b(119 downto 112) := SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 6 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00100000" xor roundkey(127 downto 120);
b(119 downto 112) := SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 7 =>b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "01000000" xor roundkey(127 downto 120) ;
b(119 downto 112):= SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 8 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "10000000" xor roundkey(127 downto 120) ;
b(119 downto 112) := SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 9 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00011011" xor roundkey(127 downto 120);
b(119 downto 112):= SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when 10 => b(127 downto 120) := SBOX_LOOKUP_FUNCT(b1) xor "00110110" xor roundkey(127 downto 120);
b(119 downto 112) := SBOX_LOOKUP_FUNCT(b2) xor roundkey(119 downto 112);
b(111 downto 104) := SBOX_LOOKUP_FUNCT(b3) xor roundkey(111 downto 104);
b(103 downto 96) := SBOX_LOOKUP_FUNCT(b0) xor roundkey(103 downto 96);
b(95 downto 64) := b(127 downto 96) xor roundkey(95 downto 64);
b(63 downto 32) := b(95 downto 64) xor roundkey(63 downto 32);
b(31 downto 0) := b(63 downto 32) xor roundkey(31 downto 0);
when others => null;
end case;
return b;
end function ROUNDKEY_GEN;
end package body rijndael_package;

Byte sub transformation:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.rijndael_package.all;
entity byte_sub is
Port ( STATE : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
b : out STD_LOGIC_VECTOR (127 downto 0));
end byte_sub;
architecture aes_top_RTL of byte_sub is
begin
process(clk)
begin
if( rst='1') then
b<=(others=>'0');
elsif(clk='1' and clk'event)
then
b<=BYTE_SUB_FUNCT(STATE);
END IF;
END process;
end aes_top_RTL;

shift row transformation:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE work.rijndael_package.all;
entity SFT_RW is
Port ( state1 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end SFT_RW;
architecture aes_top_RTL of SFT_RW is
begin
process(clk,rst,state1)
begin
if(rst='1') then DATAOUT<=(OTHERS=>'0');
ELSIF (clk='1' and clk'event) then
DATAOUT<= SFT_RW_FN(state1);
end if;
end process;
end aes_top_RTL;

mixcolumn transformation:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.rijndael_package.all;
entity mx_clmn is
Port ( state4 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end mx_clmn;
architecture aes_top_RTL of mx_clmn is
begin
PROCESS(clk)
begin
if(rst='1') then DATAOUT<=(others=>'0');
elsif(clk='1' and clk'event) then
DATAOUT<=MX_CLMN_FCT(state4);
end if;
end process;
end aes_top_RTL;

add round key:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity addrnd_key is
Port ( datain : in STD_LOGIC_VECTOR (127 downto 0);
rndkey : in STD_LOGIC_VECTOR (127 downto 0);
dataout : out STD_LOGIC_VECTOR (127 downto 0));
end addrnd_key;
architecture aes_top_RTL of addrnd_key is
begin
process(datain,rndkey)
begin
dataout<=datain xor rndkey;
end process;
end aes_top_RTL;

key expantion:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.rijndael_package.all;
entity key_gen is
Port ( key : in STD_LOGIC_VECTOR (127 downto 0);
ROUND : in round_type;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end key_gen;
architecture aes_top_RTL of key_gen is
begin
process(key,ROUND)
begin
DATAOUT<=ROUNDKEY_GEN(key,ROUND);
END PROCESS;
end aes_top_RTL;

inverse byte sub:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.rijndael_package.all;
entity iv_bt_sb is
Port ( state2 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
b2 : out STD_LOGIC_VECTOR (127 downto 0));
end iv_bt_sb;
architecture top_aes_RTL of iv_bt_sb is
begin
process(clk,state2,rst)
begin
if(rst='1') then
b2<=( others=>'0');
elsif( clk'event and clk='1') then
b2<=IV_BT_SB_FCT(state2);
end if;
end process;
end top_aes_RTL;

inverse shift row transformation:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.rijndael_package.all;
entity iv_st_rw is
Port ( state3 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end iv_st_rw;
architecture aes_top_RTL of iv_st_rw is
begin
process(clk,rst,state3)
begin
if(rst='1') then DATAOUT<=(OTHERS=>'0');
elsif(clk='1' and clk'event) then
DATAOUT<=IV_SFT_RW_FCT( state3);
end if;
end process;
end aes_top_RTL;

inverse mix column transformation:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE work.rijndael_package.all;
entity inv_mx_clmn is
Port ( state : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end inv_mx_clmn;
architecture aes_top_RTL of inv_mx_clmn is
begin
process(clk,rst,state)
begin
if(rst='1') then DATAOUT<=(OTHERS=>'0');
ELSIF( clk='1' and clk'event)
then
DATAOUT<= INV_MX_CLMN_FCT(state);
end if;
end process;
end aes_top_RTL;

encryption program:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.rijndael_package.all;
entity encryp is
Port ( DATAIN : in STD_LOGIC_VECTOR (127 downto 0);
rndkey: in std_logic_vector(127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end encryp;
architecture structural of encryp is
signal s0: std_logic_vector(127 downto 0);
signal s1: std_logic_vector(127 downto 0);
signal s2: std_logic_vector(127 downto 0);
signal s3: std_logic_vector(127 downto 0);
signal s4: std_logic_vector(127 downto 0);
signal s5: std_logic_vector(127 downto 0);
signal s6: std_logic_vector(127 downto 0);
signal s7: std_logic_vector(127 downto 0);
signal s8: std_logic_vector(127 downto 0);
signal s9: std_logic_vector(127 downto 0);
signal s10: std_logic_vector(127 downto 0);
signal s11: std_logic_vector(127 downto 0);
signal s12: std_logic_vector(127 downto 0);
signal s13: std_logic_vector(127 downto 0);
signal s14: std_logic_vector(127 downto 0);
signal s15: std_logic_vector(127 downto 0);
signal s16: std_logic_vector(127 downto 0);
signal s17: std_logic_vector(127 downto 0);
signal s18: std_logic_vector(127 downto 0);
signal s19: std_logic_vector(127 downto 0);
signal s20: std_logic_vector(127 downto 0);
signal s21: std_logic_vector(127 downto 0);
signal s22: std_logic_vector(127 downto 0);
signal s23: std_logic_vector(127 downto 0);
signal s24: std_logic_vector(127 downto 0);
signal s25: std_logic_vector(127 downto 0);
signal s26: std_logic_vector(127 downto 0);
signal s27: std_logic_vector(127 downto 0);
signal s28: std_logic_vector(127 downto 0);
signal s29: std_logic_vector(127 downto 0);
signal s30: std_logic_vector(127 downto 0);
signal s31: std_logic_vector(127 downto 0);
signal s32: std_logic_vector(127 downto 0);
signal s33: std_logic_vector(127 downto 0);
signal s34: std_logic_vector(127 downto 0);
signal s35: std_logic_vector(127 downto 0);
signal s36: std_logic_vector(127 downto 0);
signal s37: std_logic_vector(127 downto 0);
signal s38: std_logic_vector(127 downto 0);

signal k1: std_logic_vector(127 downto 0);


signal k2: std_logic_vector(127 downto 0);
signal k3: std_logic_vector(127 downto 0);
signal k4: std_logic_vector(127 downto 0);
signal k5: std_logic_vector(127 downto 0);
signal k6: std_logic_vector(127 downto 0);
signal k7: std_logic_vector(127 downto 0);
signal k8: std_logic_vector(127 downto 0);
signal k9: std_logic_vector(127 downto 0);
signal k10: std_logic_vector(127 downto 0);

component byte_sub is
Port ( state : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
b : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component SFT_RW is
Port ( state1 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component mx_clmn is
Port ( state4 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component addrnd_key is
Port ( datain : in STD_LOGIC_VECTOR (127 downto 0);
rndkey : in STD_LOGIC_VECTOR (127 downto 0);
dataout : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component key_gen is
Port ( key : in STD_LOGIC_VECTOR (127 downto 0);
ROUND : in round_type;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end component;
begin
V0:key_gen port map(rndkey,1,k1);
V1:key_gen port map(k1,2,k2);
V2:key_gen port map(k2,3,k3);
V3:key_gen port map(k3,4,k4);
V4:key_gen port map(k4,5,k5);
V5:key_gen port map(k5,6,k6);
V6:key_gen port map(k6,7,k7);
V7:key_gen port map(k7,8,k8);
V8:key_gen port map(k8,9,k9);
V9:key_gen port map(k9,10,k10);
U0: addrnd_key port map(DATAIN,rndkey,s0);
--rnd1
U1: byte_sub port map(s0,clk,rst,s1);
U2: SFT_RW port map(s1,clk,rst,s2);
U3: mx_clmn port map(s2,clk,rst,s3);
U4: addrnd_key port map(s3,k1,s4);
--rnd2
U5: byte_sub port map(s4,clk,rst,s5);
U6: SFT_RW port map(s5,clk,rst,s6);
U7: mx_clmn port map(s6,clk,rst,s7);
U8: addrnd_key port map(s7,k2,s8);
--rnd3
U9: byte_sub port map(s8,clk,rst,s9);
U10: SFT_RW port map(s9,clk,rst,s10);
U11: mx_clmn port map(s10,clk,rst,s11);
U12: addrnd_key port map(s11,k3,s12);
--rnd4
U13: byte_sub port map(s12,clk,rst,s13);
U14: SFT_RW port map(s13,clk,rst,s14);
U15: mx_clmn port map(s14,clk,rst,s15);
U16: addrnd_key port map(s15,k4,s16);
--rnd5
U17: byte_sub port map(s16,clk,rst,s17);
U18: SFT_RW port map(s17,clk,rst,s18);
U19: mx_clmn port map(s18,clk,rst,s19);
U20: addrnd_key port map(s19,k5,s20);
--rnd6
U21: byte_sub port map(s20,clk,rst,s21);
U22: SFT_RW port map(s21,clk,rst,s22);
U23: mx_clmn port map(s22,clk,rst,s23);
U24: addrnd_key port map(s23,k6,s24);
--rnd7
U25: byte_sub port map(s24,clk,rst,s25);
U26: SFT_RW port map(s25,clk,rst,s26);
U27: mx_clmn port map(s26,clk,rst,s27);
U28: addrnd_key port map(s27,k7,s28);
--rnd8
U29: byte_sub port map(s28,clk,rst,s29);
U30: SFT_RW port map(s29,clk,rst,s30);
U31: mx_clmn port map(s30,clk,rst,s31);
U32: addrnd_key port map(s31,k8,s32);
--rnd9
U33: byte_sub port map(s32,clk,rst,s33);
U34: SFT_RW port map(s33,clk,rst,s34);
U35: mx_clmn port map(s34,clk,rst,s35);
U36: addrnd_key port map(s35,k9,s36);
--rnd10
U37: byte_sub port map(s36,clk,rst,s37);
U38: SFT_RW port map(s37,clk,rst,s38);
U39: addrnd_key port map(s38,k10,DATAOUT);
end structural;

decryption program:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.rijndael_package.all;
entity dcryption is
Port ( datain : in STD_LOGIC_VECTOR (127 downto 0);
rndkey:in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
dataout : out STD_LOGIC_VECTOR (127 downto 0));
end dcryption;
architecture structural of dcryption is
signal s0: std_logic_vector(127 downto 0);
signal s1: std_logic_vector(127 downto 0);
signal s2: std_logic_vector(127 downto 0);
signal s3: std_logic_vector(127 downto 0);
signal s4: std_logic_vector(127 downto 0);
signal s5: std_logic_vector(127 downto 0);
signal s6: std_logic_vector(127 downto 0);
signal s7: std_logic_vector(127 downto 0);
signal s8: std_logic_vector(127 downto 0);
signal s9: std_logic_vector(127 downto 0);
signal s10: std_logic_vector(127 downto 0);
signal s11: std_logic_vector(127 downto 0);
signal s12: std_logic_vector(127 downto 0);
signal s13: std_logic_vector(127 downto 0);
signal s14: std_logic_vector(127 downto 0);
signal s15: std_logic_vector(127 downto 0);
signal s16: std_logic_vector(127 downto 0);
signal s17: std_logic_vector(127 downto 0);
signal s18: std_logic_vector(127 downto 0);
signal s19: std_logic_vector(127 downto 0);
signal s20: std_logic_vector(127 downto 0);
signal s21: std_logic_vector(127 downto 0);
signal s22: std_logic_vector(127 downto 0);
signal s23: std_logic_vector(127 downto 0);
signal s24: std_logic_vector(127 downto 0);
signal s25: std_logic_vector(127 downto 0);
signal s26: std_logic_vector(127 downto 0);
signal s27: std_logic_vector(127 downto 0);
signal s28: std_logic_vector(127 downto 0);
signal s29: std_logic_vector(127 downto 0);
signal s30: std_logic_vector(127 downto 0);
signal s31: std_logic_vector(127 downto 0);
signal s32: std_logic_vector(127 downto 0);
signal s33: std_logic_vector(127 downto 0);
signal s34: std_logic_vector(127 downto 0);
signal s35: std_logic_vector(127 downto 0);
signal s36: std_logic_vector(127 downto 0);
signal s37: std_logic_vector(127 downto 0);
signal s38: std_logic_vector(127 downto 0);

signal k1: std_logic_vector(127 downto 0);


signal k2: std_logic_vector(127 downto 0);
signal k3: std_logic_vector(127 downto 0);
signal k4: std_logic_vector(127 downto 0);
signal k5: std_logic_vector(127 downto 0);
signal k6: std_logic_vector(127 downto 0);
signal k7: std_logic_vector(127 downto 0);
signal k8: std_logic_vector(127 downto 0);
signal k9: std_logic_vector(127 downto 0);
signal k10: std_logic_vector(127 downto 0);
component iv_bt_sb is
Port ( state2 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
b2 : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component iv_st_rw is
Port ( state3 : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component inv_mx_clmn is
Port ( state : in STD_LOGIC_VECTOR (127 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component addrnd_key is
Port ( datain : in STD_LOGIC_VECTOR (127 downto 0);
rndkey : in STD_LOGIC_VECTOR (127 downto 0);
dataout : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component key_gen is
Port ( key : in STD_LOGIC_VECTOR (127 downto 0);
ROUND : in round_type;
DATAOUT : out STD_LOGIC_VECTOR (127 downto 0));
end component;
component ikey is
Port ( state : in STD_LOGIC_VECTOR (127 downto 0);
dataout : out STD_LOGIC_VECTOR (127 downto 0));
end component;
begin
V0:key_gen port map(rndkey,1,k1);
V1:key_gen port map(k1,2,k2);
V2:key_gen port map(k2,3,k3);
V3:key_gen port map(k3,4,k4);
V4:key_gen port map(k4,5,k5);
V5:key_gen port map(k5,6,k6);
V6:key_gen port map(k6,7,k7);
V7:key_gen port map(k7,8,k8);
V8:key_gen port map(k8,9,k9);
V9:key_gen port map(k9,10,k10);
U0:addrnd_key port map(datain,k10,s0);
--rnd9
U1:iv_st_rw port map(s0,clk,rst,s1);
U2:iv_bt_sb port map(s1,clk,rst,s2);
U3:addrnd_key port map(s2,k9,s3);
U4:inv_mx_clmn port map(s3,clk,rst,s4);
--rnd8
U5:iv_st_rw port map(s4,clk,rst,s5);
U6:iv_bt_sb port map(s5,clk,rst,s6);
U7:addrnd_key port map(s6,k8,s7);
U8:inv_mx_clmn port map(s7,clk,rst,s8);
--rnd7
U9:iv_st_rw port map(s8,clk,rst,s9);
U10:iv_bt_sb port map(s9,clk,rst,s10);
U11:addrnd_key port map(s10,k7,s11);
U12:inv_mx_clmn port map(s11,clk,rst,s12);
--rnd6
U13:iv_st_rw port map(s12,clk,rst,s13);
U14:iv_bt_sb port map(s13,clk,rst,s14);
U15:addrnd_key port map(s14,k6,s15);
U16:inv_mx_clmn port map(s15,clk,rst,s16);
--rnd5
U17:iv_st_rw port map(s16,clk,rst,s17);
U18:iv_bt_sb port map(s17,clk,rst,s18);
U19:addrnd_key port map(s18,k5,s19);
U20:inv_mx_clmn port map(s19,clk,rst,s20);
--rnd4
U21:iv_st_rw port map(s20,clk,rst,s21);
U22:iv_bt_sb port map(s21,clk,rst,s22);
U23:addrnd_key port map(s22,k4,s23);
U24:inv_mx_clmn port map(s23,clk,rst,s24);
--rnd3
U25:iv_st_rw port map(s24,clk,rst,s25);
U26:iv_bt_sb port map(s25,clk,rst,s26);
U27:addrnd_key port map(s26,k3,s27);
U28:inv_mx_clmn port map(s27,clk,rst,s28);
--rnd2
U29:iv_st_rw port map(s28,clk,rst,s29);
U30:iv_bt_sb port map(s29,clk,rst,s30);
U31:addrnd_key port map(s30,k2,s31);
U32:inv_mx_clmn port map(s31,clk,rst,s32);
--rnd1
U33:iv_st_rw port map(s32,clk,rst,s33);
U34:iv_bt_sb port map(s33,clk,rst,s34);
U35:addrnd_key port map(s34,k1,s35);
U36:inv_mx_clmn port map(s35,clk,rst,s36);
--rnd0
U37:iv_st_rw port map(s36,clk,rst,s37);
U38:iv_bt_sb port map(s37,clk,rst,s38);
U39:addrnd_key port map(s38,rndkey,dataout);
end structural;

You might also like