📄 aes_package.vhd
字号:
when "11101101" => inv_data := X"53";
when "11101110" => inv_data := X"99";
when "11101111" => inv_data := X"61";
when "11110000" => inv_data := X"17";
when "11110001" => inv_data := X"2b";
when "11110010" => inv_data := X"04";
when "11110011" => inv_data := X"7e";
when "11110100" => inv_data := X"ba";
when "11110101" => inv_data := X"77";
when "11110110" => inv_data := X"d6";
when "11110111" => inv_data := X"26";
when "11111000" => inv_data := X"e1";
when "11111001" => inv_data := X"69";
when "11111010" => inv_data := X"14";
when "11111011" => inv_data := X"63";
when "11111100" => inv_data := X"55";
when "11111101" => inv_data := X"21";
when "11111110" => inv_data := X"0c";
when "11111111" => inv_data := X"7d";
when others => null;
end case;
inv_data_stdlogic := to_StdLogicVector(inv_data);
return inv_data_stdlogic;
end function inv_sbox_val;
function col_transform(p: state_array_type) return std_logic_vector is
variable result: std_logic_vector(7 downto 0);
variable m,n: std_logic_vector(7 downto 0);
begin
if(p(0)(7) = '1') then
m := (p(0)(6 downto 0) & '0') xor "00011011";
else
m := (p(0)(6 downto 0) & '0');
end if;
if(p(1)(7) = '1') then
n := (p(1)(6 downto 0) & '0') xor "00011011" xor p(1);
else
n := (p(1)(6 downto 0) & '0') xor p(1);
end if;
result := m xor n xor p(2) xor p(3);
return result;
end function col_transform;
function col_inv_transform(s: state_array_type) return std_logic_vector is
variable result: std_logic_vector(7 downto 0);
variable sub0,sub1,sub2,sub3: std_logic_vector(7 downto 0);
variable x0,y0,z0: std_logic_vector(7 downto 0);
variable x1,y1,z1: std_logic_vector(7 downto 0);
variable x2,y2,z2: std_logic_vector(7 downto 0);
variable x3,y3,z3: std_logic_vector(7 downto 0);
begin
if(s(0)(7) = '1') then
x0 := (s(0)(6 downto 0) & '0') xor "00011011";
else
x0 := (s(0)(6 downto 0) & '0');
end if;
if(x0(7) = '1') then
y0 := (x0(6 downto 0) & '0') xor "00011011";
else
y0 := (x0(6 downto 0) & '0');
end if;
if(y0(7) = '1') then
z0 := (y0(6 downto 0) & '0') xor "00011011";
else
z0 := (y0(6 downto 0) & '0');
end if;
sub0 := (x0 xor y0 xor z0);----------
if(s(1)(7) = '1') then
x1 := (s(1)(6 downto 0) & '0') xor "00011011";
else
x1 := (s(1)(6 downto 0) & '0');
end if;
if(x1(7) = '1') then
y1 := (x1(6 downto 0) & '0') xor "00011011";
else
y1 := (x1(6 downto 0) & '0');
end if;
if(y1(7) = '1') then
z1 := (y1(6 downto 0) & '0') xor "00011011";
else
z1 := (y1(6 downto 0) & '0');
end if;
sub1 := (x1 xor z1 xor s(1));----------
if(s(2)(7) = '1') then
x2 := (s(2)(6 downto 0) & '0') xor "00011011";
else
x2 := (s(2)(6 downto 0) & '0');
end if;
if(x2(7) = '1') then
y2 := (x2(6 downto 0) & '0') xor "00011011";
else
y2 := (x2(6 downto 0) & '0');
end if;
if(y2(7) = '1') then
z2 := (y2(6 downto 0) & '0') xor "00011011";
else
z2 := (y2(6 downto 0) & '0');
end if;
sub2 := (y2 xor z2 xor s(2));----------
if(s(3)(7) = '1') then
x3 := (s(3)(6 downto 0) & '0') xor "00011011";
else
x3 := (s(3)(6 downto 0) & '0');
end if;
if(x3(7) = '1') then
y3 := (x3(6 downto 0) & '0') xor "00011011";
else
y3 := (x3(6 downto 0) & '0');
end if;
if(y3(7) = '1') then
z3 := (y3(6 downto 0) & '0') xor "00011011";
else
z3 := (y3(6 downto 0) & '0');
end if;
sub3 := (z3 xor s(3));----------
result := sub0 xor sub1 xor sub2 xor sub3;
return result;
end function col_inv_transform;
-- combo logic for mix columns
function mix_cols_routine
(
a_r0 :state_array_type;
a_r1 :state_array_type;
a_r2 :state_array_type;
a_r3 :state_array_type;
mode :std_logic
)
return std_logic_vector is
variable b : std_logic_vector(0 to 127);
variable b0 : state_array_type;
variable b1 : state_array_type;
variable b2 : state_array_type;
variable b3 : state_array_type;
-------------------------------------------------
variable b_0_0 : std_logic_vector(7 downto 0);
variable s_0_0 : state_array_type;
--------------------------------------------------
variable b_0_1 : std_logic_vector(7 downto 0);
variable s_0_1 : state_array_type;
--------------------------------------------------
variable b_0_2 : std_logic_vector(7 downto 0);
variable s_0_2 : state_array_type;
----------------------------------------------
variable b_0_3 : std_logic_vector(7 downto 0);
variable s_0_3 : state_array_type;
----------------------------------------------
variable b_1_0 : std_logic_vector(7 downto 0);
variable s_1_0 : state_array_type;
----------------------------------------------
variable b_1_1 : std_logic_vector(7 downto 0);
variable s_1_1 : state_array_type;
----------------------------------------------
variable b_1_2 : std_logic_vector(7 downto 0);
variable s_1_2 : state_array_type;
----------------------------------------------
variable b_1_3 : std_logic_vector(7 downto 0);
variable s_1_3 : state_array_type;
----------------------------------------------
variable b_2_0 : std_logic_vector(7 downto 0);
variable s_2_0 : state_array_type;
----------------------------------------------
variable b_2_1 : std_logic_vector(7 downto 0);
variable s_2_1 : state_array_type;
----------------------------------------------
variable b_2_2 : std_logic_vector(7 downto 0);
variable s_2_2 : state_array_type;
----------------------------------------------
variable b_2_3 : std_logic_vector(7 downto 0);
variable s_2_3 : state_array_type;
----------------------------------------------
variable b_3_0 : std_logic_vector(7 downto 0);
variable s_3_0 : state_array_type;
----------------------------------------------
variable b_3_1 : std_logic_vector(7 downto 0);
variable s_3_1 : state_array_type;
----------------------------------------------
variable b_3_2 : std_logic_vector(7 downto 0);
variable s_3_2 : state_array_type;
----------------------------------------------
variable b_3_3 : std_logic_vector(7 downto 0);
variable s_3_3 : state_array_type;
--------------------------------------------------
begin
if(mode = '1') then
s_0_0 := a_r0;
b_0_0 := col_transform(s_0_0);
------------------------------------------------------
s_0_1 := a_r1;
b_0_1 := col_transform(s_0_1);
------------------------------------------------------
s_0_2 := a_r2;
b_0_2 := col_transform(s_0_2);
------------------------------------------------------
s_0_3 := a_r3;
b_0_3 := col_transform(s_0_3);
--****************************************************************
s_1_0 := (a_r0(1),a_r0(2),a_r0(3),a_r0(0));
b_1_0 := col_transform(s_1_0);
------------------------------------------------------
s_1_1 := (a_r1(1),a_r1(2),a_r1(3),a_r1(0));
b_1_1 := col_transform(s_1_1);
------------------------------------------------------
s_1_2 := (a_r2(1),a_r2(2),a_r2(3),a_r2(0));
b_1_2 := col_transform(s_1_2);
------------------------------------------------------
s_1_3 := (a_r3(1),a_r3(2),a_r3(3),a_r3(0));
b_1_3 := col_transform(s_1_3);
--****************************************************************
s_2_0 := (a_r0(2),a_r0(3),a_r0(0),a_r0(1));
b_2_0 := col_transform(s_2_0);
------------------------------------------------------
s_2_1 := (a_r1(2),a_r1(3),a_r1(0),a_r1(1));
b_2_1 := col_transform(s_2_1);
------------------------------------------------------
s_2_2 := (a_r2(2),a_r2(3),a_r2(0),a_r2(1));
b_2_2 := col_transform(s_2_2);
------------------------------------------------------
s_2_3 := (a_r3(2),a_r3(3),a_r3(0),a_r3(1));
b_2_3 := col_transform(s_2_3);
--****************************************************************
s_3_0 := (a_r0(3),a_r0(0),a_r0(1),a_r0(2));
b_3_0 := col_transform(s_3_0);
------------------------------------------------------
s_3_1 := (a_r1(3),a_r1(0),a_r1(1),a_r1(2));
b_3_1 := col_transform(s_3_1);
------------------------------------------------------
s_3_2 := (a_r2(3),a_r2(0),a_r2(1),a_r2(2));
b_3_2 := col_transform(s_3_2);
------------------------------------------------------
s_3_3 := (a_r3(3),a_r3(0),a_r3(1),a_r3(2));
b_3_3 := col_transform(s_3_3);
--****************************************************************
else
s_0_0 := a_r0;
b_0_0 := col_inv_transform(s_0_0);
------------------------------------------------------
s_0_1 := a_r1;
b_0_1 := col_inv_transform(s_0_1);
------------------------------------------------------
s_0_2 := a_r2;
b_0_2 := col_inv_transform(s_0_2);
------------------------------------------------------
s_0_3 := a_r3;
b_0_3 := col_inv_transform(s_0_3);
--****************************************************************
s_1_0 := (a_r0(1),a_r0(2),a_r0(3),a_r0(0));
b_1_0 := col_inv_transform(s_1_0);
------------------------------------------------------
s_1_1 := (a_r1(1),a_r1(2),a_r1(3),a_r1(0));
b_1_1 := col_inv_transform(s_1_1);
------------------------------------------------------
s_1_2 := (a_r2(1),a_r2(2),a_r2(3),a_r2(0));
b_1_2 := col_inv_transform(s_1_2);
------------------------------------------------------
s_1_3 := (a_r3(1),a_r3(2),a_r3(3),a_r3(0));
b_1_3 := col_inv_transform(s_1_3);
--****************************************************************
s_2_0 := (a_r0(2),a_r0(3),a_r0(0),a_r0(1));
b_2_0 := col_inv_transform(s_2_0);
------------------------------------------------------
s_2_1 := (a_r1(2),a_r1(3),a_r1(0),a_r1(1));
b_2_1 := col_inv_transform(s_2_1);
------------------------------------------------------
s_2_2 := (a_r2(2),a_r2(3),a_r2(0),a_r2(1));
b_2_2 := col_inv_transform(s_2_2);
------------------------------------------------------
s_2_3 := (a_r3(2),a_r3(3),a_r3(0),a_r3(1));
b_2_3 := col_inv_transform(s_2_3);
--****************************************************************
s_3_0 := (a_r0(3),a_r0(0),a_r0(1),a_r0(2));
b_3_0 := col_inv_transform(s_3_0);
------------------------------------------------------
s_3_1 := (a_r1(3),a_r1(0),a_r1(1),a_r1(2));
b_3_1 := col_inv_transform(s_3_1);
------------------------------------------------------
s_3_2 := (a_r2(3),a_r2(0),a_r2(1),a_r2(2));
b_3_2 := col_inv_transform(s_3_2);
------------------------------------------------------
s_3_3 := (a_r3(3),a_r3(0),a_r3(1),a_r3(2));
b_3_3 := col_inv_transform(s_3_3);
--****************************************************************
end if;
b := (b_0_0 & b_1_0 & b_2_0 & b_3_0 & b_0_1 & b_1_1 & b_2_1 & b_3_1 &
b_0_2 & b_1_2 & b_2_2 & b_3_2 & b_0_3 & b_1_3 & b_2_3 & b_3_3);
return b;
end function mix_cols_routine;
end package body aes_package;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -