| 
						
						
						
					 | 
				
				 | 
				
					@ -0,0 +1,121 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- ====================================================================== | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- CTR-AES | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- Copyright (C) 2020 Torsten Meissner | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					------------------------------------------------------------------------- | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- This program is free software; you can redistribute it and/or modify | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- it under the terms of the GNU General Public License as published by | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- the Free Software Foundation; either version 2 of the License, or | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- (at your option) any later version. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- This program is distributed in the hope that it will be useful, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- GNU General Public License for more details. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- You should have received a copy of the GNU General Public License | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- along with this program; if not, write to the Free Software | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					-- ====================================================================== | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					library ieee; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  use ieee.std_logic_1164.all; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  use ieee.numeric_std.all; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use work.aes_pkg.all; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					entity ctraes is | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  generic ( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    NONCE_WIDTH : natural range 64 to 96 := 96 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  port ( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    reset_i     : in  std_logic;                             -- low active async reset | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    clk_i       : in  std_logic;                             -- clock | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    start_i     : in  std_logic;                             -- start ctr | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    nonce_i     : in  std_logic_vector(0 to NONCE_WIDTH-1);  -- nonce | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    key_i       : in  std_logic_vector(0 to 127);            -- key input | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    data_i      : in  std_logic_vector(0 to 127);            -- data input | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    valid_i     : in  std_logic;                             -- input key/data valid flag | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    accept_o    : out std_logic;                             -- input accept | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    data_o      : out std_logic_vector(0 tO 127);            -- data output | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    valid_o     : out std_logic;                             -- output data valid flag | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    accept_i    : in  std_logic                              -- output accept | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					end entity ctraes; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					architecture rtl of ctraes is | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  signal s_aes_datain    : std_logic_vector(data_i'range); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  signal s_aes_dataout   : std_logic_vector(data_o'range); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  signal s_aes_key       : std_logic_vector(key_i'range); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  signal s_key           : std_logic_vector(key_i'range); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  signal s_nonce         : std_logic_vector(nonce_i'range); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  signal s_data_in       : std_logic_vector(data_i'range); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  signal s_counter       : unsigned(0 to 127-NONCE_WIDTH); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					begin | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  s_aes_key    <= key_i when start_i = '1' else s_key; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  s_aes_datain <= nonce_i & (s_counter'range => '0') when start_i = '1' else | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                  s_nonce & std_logic_vector(s_counter); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  data_o   <= s_aes_dataout xor s_data_in; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  inputreg : process (clk_i, reset_i) is | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  begin | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (reset_i = '0') then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      s_key     <= (others => '0'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      s_nonce   <= (others => '0'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      s_data_in <= (others => '0'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    elsif (rising_edge(clk_i)) then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      if (valid_i = '1' and accept_o = '1') then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        s_data_in <= data_i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (start_i = '1') then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          s_key   <= key_i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          s_nonce <= nonce_i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        end if; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      end if; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    end if; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  end process inputreg; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  counterreg : process (clk_i, reset_i) is | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  begin | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (reset_i = '0') then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      s_counter <= (others => '0'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    elsif (rising_edge(clk_i)) then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      if (valid_i = '1' and accept_o = '1' and start_i = '1') then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        s_counter <= (others => '0'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      elsif (valid_o = '1' and accept_i = '1') then | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        s_counter <= s_counter + 1; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      end if; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    end if; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  end process counterreg; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  i_aes : aes_enc | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    generic map ( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      design_type => "ITER" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    port map ( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      reset_i  => reset_i, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      clk_i    => clk_i, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      key_i    => s_aes_key, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      data_i   => s_aes_datain, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      valid_i  => valid_i, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      accept_o => accept_o, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      data_o   => s_aes_dataout, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      valid_o  => valid_o, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      accept_i => accept_i | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					end architecture rtl; |