OpenCores
URL https://opencores.org/ocsvn/camellia-vhdl/camellia-vhdl/trunk

Subversion Repositories camellia-vhdl

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 2 to Rev 3
    Reverse comparison

Rev 2 → Rev 3

/trunk/looping/sbox4.vhd
0,0 → 1,59
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 02/19/2008
-- Project Name: camellia-vhdl
-- Description: Asynchronous SBOX4
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
 
entity SBOX4 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end SBOX4;
 
architecture RTL of SBOX4 is
 
component SBOX1 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end component;
 
-- SBOX1 signals
signal s1_data_in : STD_LOGIC_VECTOR(0 to 7);
signal s1_data_out : STD_LOGIC_VECTOR(0 to 7);
 
begin
 
S1 : SBOX1
port map(s1_data_in, s1_data_out);
 
s1_data_in <= data_in(1 to 7) & data_in(0);
data_out <= s1_data_out;
 
end RTL;
/trunk/looping/control.vhd
0,0 → 1,765
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/31/2008
-- Last Update: 03/25/2008
-- Project Name: camellia-vhdl
-- Description: Control unit and key handling
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
entity control is
port (
clk : in STD_LOGIC;
reset : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (0 to 127);
key_in : in STD_LOGIC_VECTOR (0 to 255);
k_len : in STD_LOGIC_VECTOR (0 to 1);
new_key : in STD_LOGIC;
enc_dec : in STD_LOGIC;
input_rdy : in STD_LOGIC;
data_to : out STD_LOGIC_VECTOR (0 to 127); -- data to datapath
k1 : out STD_LOGIC_VECTOR (0 to 63);
k2 : out STD_LOGIC_VECTOR (0 to 63);
newdata : out STD_LOGIC;
sel : out STD_LOGIC;
pre_xor : out STD_LOGIC_VECTOR (0 to 127);
post_xor : out STD_LOGIC_VECTOR (0 to 127);
data_from : in STD_LOGIC_VECTOR (0 to 127) -- data from datapath
);
end control;
 
architecture RTL of control is
 
type STATUS is (RST,
KEYa, KEYb, KEYc, KEYd, KEYe, KEYf,
SIX1a, SIX1b, SIX1c, SIX1d, SIX1e, SIX1f,
FL1,
SIX2a, SIX2b, SIX2c, SIX2d, SIX2e, SIX2f,
FL2,
SIX3a, SIX3b, SIX3c, SIX3d, SIX3e, SIX3f,
FL3,
SIX4a, SIX4b, SIX4c, SIX4d, SIX4e, SIX4f);
signal PS, NS : STATUS;
type K1_TYPE is (SIG1, SIG2, SIG3, SIG4, SIG5, SIG6,
KL_L, KL_R, KR_L, KR_R, KA_L, KA_R, KB_L, KB_R);
signal k1_sel : K1_TYPE;
type K2_TYPE is (KL_L, KL_R, KR_L, KR_R, KA_L, KA_R, KB_L, KB_R);
signal k2_sel : K2_TYPE;
type POSTXOR_TYPE is (KL, KA, KB, ZERO);
signal postxor_sel : POSTXOR_TYPE;
type PREXOR_TYPE is (KL, KR, KA, KB, ZERO);
signal prexor_sel : PREXOR_TYPE;
 
-- keys
signal reg_kr : STD_LOGIC_VECTOR (0 to 127);
signal reg_ka : STD_LOGIC_VECTOR (0 to 127);
signal reg_kb : STD_LOGIC_VECTOR (0 to 127);
--keys shifted each step
signal reg_kl_s : STD_LOGIC_VECTOR (0 to 127);
signal reg_kr_s : STD_LOGIC_VECTOR (0 to 127);
signal reg_ka_s : STD_LOGIC_VECTOR (0 to 127);
signal reg_kb_s : STD_LOGIC_VECTOR (0 to 127);
 
-- input constant
constant KLEN_128 : STD_LOGIC_VECTOR (0 to 1) := "00";
constant KLEN_192 : STD_LOGIC_VECTOR (0 to 1) := "01";
constant KLEN_256 : STD_LOGIC_VECTOR (0 to 1) := "10";
constant ENC : STD_LOGIC := '0';
constant DEC : STD_LOGIC := '1';
constant SEL_F : STD_LOGIC := '0';
constant SEL_FL : STD_LOGIC := '1';
 
-- constant keys
constant sigma1 : STD_LOGIC_VECTOR (0 to 63) := X"A09E667F3BCC908B";
constant sigma2 : STD_LOGIC_VECTOR (0 to 63) := X"B67AE8584CAA73B2";
constant sigma3 : STD_LOGIC_VECTOR (0 to 63) := X"C6EF372FE94F82BE";
constant sigma4 : STD_LOGIC_VECTOR (0 to 63) := X"54FF53A5F1D36F1C";
constant sigma5 : STD_LOGIC_VECTOR (0 to 63) := X"10E527FADE682D1D";
constant sigma6 : STD_LOGIC_VECTOR (0 to 63) := X"B05688C2B3E6C1FD";
 
begin
 
with k1_sel select
k1 <= sigma1 when SIG1,
sigma2 when SIG2,
sigma3 when SIG3,
sigma4 when SIG4,
sigma5 when SIG5,
sigma6 when SIG6,
reg_kl_s(0 to 63) when KL_L,
reg_kl_s(64 to 127) when KL_R,
reg_kr_s(0 to 63) when KR_L,
reg_kr_s(64 to 127) when KR_R,
reg_ka_s(0 to 63) when KA_L,
reg_ka_s(64 to 127) when KA_R,
reg_kb_s(0 to 63) when KB_L,
reg_kb_s(64 to 127) when others;
with k2_sel select
k2 <= reg_kl_s(0 to 63) when KL_L,
reg_kl_s(64 to 127) when KL_R,
reg_kr_s(0 to 63) when KR_L,
reg_kr_s(64 to 127) when KR_R,
reg_ka_s(0 to 63) when KA_L,
reg_ka_s(64 to 127) when KA_R,
reg_kb_s(0 to 63) when KB_L,
reg_kb_s(64 to 127) when others;
with postxor_sel select
post_xor <= key_in(64 to 127) & key_in(0 to 63) when KL,
reg_ka_s(64 to 127) & reg_ka_s(0 to 63) when KA,
reg_kb_s(64 to 127) & reg_kb_s(0 to 63) when KB,
(others=>'0') when others;
with prexor_sel select
pre_xor <= key_in(0 to 127) when KL,
reg_kr_s when KR,
reg_ka_s when KA,
reg_kb_s when KB,
(others=>'0') when others;
 
REGISTERS_UPDATE : process(PS)
variable coming_from_key : STD_LOGIC;
begin
case PS is
when RST =>
reg_kr <= (others=>'0');
reg_ka <= (others=>'0');
reg_kb <= (others=>'0');
reg_kl_s <= (others=>'0');
reg_kr_s <= (others=>'0');
reg_ka_s <= (others=>'0');
reg_kb_s <= (others=>'0');
coming_from_key := '0';
when KEYa =>
coming_from_key := '1';
reg_kl_s <= key_in(0 to 127); -- kl
case k_len is
when KLEN_192 =>
reg_kr <= key_in(128 to 191) & not (key_in(128 to 191));
reg_kr_s <= key_in(128 to 191) & not (key_in(128 to 191));
when KLEN_256 =>
reg_kr <= key_in(128 to 255);
reg_kr_s <= key_in(128 to 255);
when others =>
reg_kr <= (others=>'0');
reg_kr_s <= (others=>'0');
end case;
k1_sel <= SIG1;
when KEYb =>
k1_sel <= SIG2;
when KEYc =>
k1_sel <= SIG3;
when KEYd =>
k1_sel <= SIG4;
when KEYe =>
reg_ka <= data_from;
reg_ka_s <= data_from;
k1_sel <= SIG5;
when KEYf =>
k1_sel <= SIG6;
when SIX1a =>
if (enc_dec = ENC) then
if (coming_from_key = '1') then
if (k_len = KLEN_128) then
reg_ka <= data_from;
reg_ka_s <= data_from;
else
reg_kb <= data_from;
reg_kb_s <= data_from;
end if;
else
reg_ka_s <= reg_ka;
reg_kb_s <= reg_kb;
reg_kl_s <= key_in(0 to 127); --kl
reg_kr_s <= reg_kr;
end if;
if (k_len = KLEN_128) then
k1_sel <= KA_L;
else
k1_sel <= KB_L;
end if;
else -- DEC
if (coming_from_key = '1') then
if (k_len = KLEN_128) then
reg_ka <= data_from;
reg_ka_s <= data_from(111 to 127) & data_from(0 to 110); -- >>> 17
else
reg_kb <= data_from;
reg_kb_s <= data_from(111 to 127) & data_from(0 to 110); -- >>> 17
reg_ka_s <= reg_ka_s(111 to 127) & reg_ka_s(0 to 110); -- >>> 17
reg_kr_s <= reg_kr_s(111 to 127) & reg_kr_s(0 to 110); -- >>> 17
end if;
reg_kl_s <= reg_kl_s(111 to 127) & reg_kl_s(0 to 110); -- >>> 17
else
reg_ka_s <= reg_ka(111 to 127) & reg_ka(0 to 110); -- >>> 17
reg_kb_s <= reg_kb(111 to 127) & reg_kb(0 to 110); -- >>> 17
reg_kl_s <= key_in(111 to 127) & key_in(0 to 110); --kl >>> 17
reg_kr_s <= reg_kr(111 to 127) & reg_kr(0 to 110); -- >>> 17
end if;
k1_sel <= KL_R;
end if;
when SIX1b =>
coming_from_key := '0';
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KA_R;
else
k1_sel <= KB_R;
end if;
else -- DEC
k1_sel <= KL_L; -- for each value of k_len
end if;
when SIX1c =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KL_L;
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
else
k1_sel <= KR_L;
reg_kr_s <= reg_kr_s(15 to 127) & reg_kr_s(0 to 14); -- <<< 15
end if;
else -- DEC
reg_ka_s <= reg_ka_s(111 to 127) & reg_ka_s(0 to 110); -- >>> 17
k1_sel <= KA_R; -- for each value of k_len
end if;
when SIX1d =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KL_R;
else
k1_sel <= KR_R;
end if;
else -- DEC
k1_sel <= KA_L; -- for each value of k_len
end if;
when SIX1e =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
else
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
end if;
k1_sel <= KA_L;
else -- DEC
if (k_len = KLEN_128) then
reg_kl_s <= reg_kl_s(111 to 127) & reg_kl_s(0 to 110); -- >>> 17
k1_sel <= KL_R;
else
reg_kr_s <= reg_kr_s(111 to 127) & reg_kr_s(0 to 110); -- >>> 17
k1_sel <= KR_R;
end if;
end if;
when SIX1f =>
if (enc_dec = ENC) then
k1_sel <= KA_R;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KL_L;
else
k1_sel <= KR_L;
end if;
end if;
when FL1 =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KA_L;
k2_sel <= KA_R;
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
else
k1_sel <= KR_L;
k2_sel <= KR_R;
reg_kb_s <= reg_kb_s(15 to 127) & reg_kb_s(0 to 14); -- <<< 15
reg_kr_s <= reg_kr_s(15 to 127) & reg_kr_s(0 to 14); -- <<< 15
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KL_R;
k2_sel <= KL_L;
else
k1_sel <= KA_R;
k2_sel <= KA_L;
end if;
reg_ka_s <= reg_ka_s(111 to 127) & reg_ka_s(0 to 110); -- >>> 17
reg_kl_s <= reg_kl_s(111 to 127) & reg_kl_s(0 to 110); -- >>> 17
end if;
when SIX2a =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KL_L;
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
else
k1_sel <= KB_L;
reg_kb_s <= reg_kb_s(15 to 127) & reg_kb_s(0 to 14); -- <<< 15
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_R;
reg_ka_s <= reg_ka_s(111 to 127) & reg_ka_s(0 to 110); -- >>> 17
else
k1_sel <= KL_R;
reg_kb_s <= reg_kb_s(111 to 127) & reg_kb_s(0 to 110); -- >>> 17
reg_kl_s <= reg_kl_s(111 to 127) & reg_kl_s(0 to 110); -- >>> 17
end if;
end if;
when SIX2b =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KL_R;
else
k1_sel <= KB_R;
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_L;
else
k1_sel <= KL_L;
reg_kb_s <= reg_kb_s(111 to 127) & reg_kb_s(0 to 110); -- >>> 17
end if;
end if;
when SIX2c =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KA_L;
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
else
k1_sel <= KL_L;
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KL_R;
reg_kl_s <= reg_kl_s(111 to 127) & reg_kl_s(0 to 110); -- >>> 17
else
k1_sel <= KB_R;
reg_kb_s <= reg_kb_s(111 to 127) & reg_kb_s(0 to 110); -- >>> 17
end if;
end if;
when SIX2d =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
else
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
end if;
k1_sel <= KL_R;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_L;
reg_ka_s <= reg_ka_s(113 to 127) & reg_ka_s(0 to 112); -- >>> 15
else
k1_sel <= KB_L;
reg_kr_s <= reg_kr_s(111 to 127) & reg_kr_s(0 to 110); -- >>> 17
end if;
end if;
when SIX2e =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
else
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
end if;
k1_sel <= KA_L;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KL_R;
reg_kl_s <= reg_kl_s(113 to 127) & reg_kl_s(0 to 112); -- >>> 15
else
k1_sel <= KR_R;
reg_kr_s <= reg_kr_s(111 to 127) & reg_kr_s(0 to 110); -- >>> 17
end if;
end if;
when SIX2f =>
if (enc_dec = ENC) then
k1_sel <= KA_R;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KL_L;
else
k1_sel <= KR_L;
end if;
end if;
when FL2 =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
reg_kl_s <= reg_kl_s(17 to 127) & reg_kl_s(0 to 16); -- <<< 17
else
reg_kr_s <= reg_kr_s(15 to 127) & reg_kr_s(0 to 14); -- <<< 15
reg_kl_s <= reg_kl_s(15 to 127) & reg_kl_s(0 to 14); -- <<< 15
end if;
k1_sel <= KL_L;
k2_sel <= KL_R;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_R;
k2_sel <= KA_L;
reg_ka_s <= reg_ka_s(113 to 127) & reg_ka_s(0 to 112); -- >>> 15
else
k1_sel <= KL_R;
k2_sel <= KL_L;
reg_ka_s <= reg_ka_s(111 to 127) & reg_ka_s(0 to 110); -- >>> 17
reg_kl_s <= reg_kl_s(111 to 127) & reg_kl_s(0 to 110); -- >>> 17
end if;
end if;
when SIX3a =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KL_L;
reg_kl_s <= reg_kl_s(17 to 127) & reg_kl_s(0 to 16); -- <<< 17
else
k1_sel <= KR_L;
reg_kr_s <= reg_kr_s(15 to 127) & reg_kr_s(0 to 14); -- <<< 15
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_R;
else
k1_sel <= KA_R;
end if;
reg_ka_s <= reg_ka_s(113 to 127) & reg_ka_s(0 to 112); -- >>> 15
end if;
when SIX3b =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KL_R;
reg_ka_s <= reg_ka_s(17 to 127) & reg_ka_s(0 to 16); -- <<< 17
else
k1_sel <= KR_R;
reg_kb_s <= reg_kb_s(15 to 127) & reg_kb_s(0 to 14); -- <<< 15
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_L;
reg_kl_s <= reg_kl_s(113 to 127) & reg_kl_s(0 to 112); -- >>> 15
else
k1_sel <= KA_L;
end if;
end if;
when SIX3c =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KA_L;
reg_ka_s <= reg_ka_s(17 to 127) & reg_ka_s(0 to 16); -- <<< 17
else
k1_sel <= KB_L;
reg_kb_s <= reg_kb_s(15 to 127) & reg_kb_s(0 to 14); -- <<< 15
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KL_R;
else
k1_sel <= KL_R;
end if;
reg_kl_s <= reg_kl_s(113 to 127) & reg_kl_s(0 to 112); -- >>> 15
end if;
when SIX3d =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
k1_sel <= KA_R;
else
k1_sel <= KB_R;
end if;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KL_L;
else
k1_sel <= KL_L;
reg_kb_s <= reg_kb_s(113 to 127) & reg_kb_s(0 to 112); -- >>> 15
end if;
end if;
when SIX3e =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
reg_kl_s <= reg_kl_s(17 to 127) & reg_kl_s(0 to 16); -- <<< 17
else
reg_kl_s <= reg_kl_s(17 to 127) & reg_kl_s(0 to 16); -- <<< 17
end if;
k1_sel <= KL_L;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_R;
reg_ka_s <= reg_ka_s(113 to 127) & reg_ka_s(0 to 112); -- >>> 15
else
k1_sel <= KB_R;
reg_kb_s <= reg_kb_s(113 to 127) & reg_kb_s(0 to 112); -- >>> 15
end if;
end if;
when SIX3f =>
if (enc_dec = ENC) then
if (k_len = KLEN_128) then
reg_ka_s <= reg_ka_s(17 to 127) & reg_ka_s(0 to 16); -- <<< 17
else
reg_ka_s <= reg_ka_s(15 to 127) & reg_ka_s(0 to 14); -- <<< 15
end if;
k1_sel <= KL_R;
else -- DEC
if (k_len = KLEN_128) then
k1_sel <= KA_L;
reg_kl_s <= reg_kl_s(113 to 127) & reg_kl_s(0 to 112); -- >>> 15
else
k1_sel <= KB_L;
reg_kr_s <= reg_kr_s(113 to 127) & reg_kr_s(0 to 112); -- >>> 15
end if;
end if;
when FL3 =>
if (enc_dec = ENC) then
k1_sel <= KA_L;
k2_sel <= KA_R;
reg_kr_s <= reg_kr_s(17 to 127) & reg_kr_s(0 to 16); -- <<< 17
reg_ka_s <= reg_ka_s(17 to 127) & reg_ka_s(0 to 16); -- <<< 17
else -- DEC
k1_sel <= KR_R;
k2_sel <= KR_L;
reg_ka_s <= reg_ka_s(113 to 127) & reg_ka_s(0 to 112); -- >>> 15
reg_kr_s <= reg_kr_s(113 to 127) & reg_kr_s(0 to 112); -- >>> 15
end if;
when SIX4a =>
if (enc_dec = ENC) then
k1_sel <= KR_L;
reg_kr_s <= reg_kr_s(17 to 127) & reg_kr_s(0 to 16); -- <<< 17
else -- DEC
k1_sel <= KA_R;
reg_ka_s <= reg_ka_s(113 to 127) & reg_ka_s(0 to 112); -- >>> 15
end if;
when SIX4b =>
if (enc_dec = ENC) then
k1_sel <= KR_R;
else -- DEC
k1_sel <= KA_L;
end if;
when SIX4c =>
if (enc_dec = ENC) then
k1_sel <= KA_L;
reg_ka_s <= reg_ka_s(17 to 127) & reg_ka_s(0 to 16); -- <<< 17
else -- DEC
k1_sel <= KR_R;
reg_kr_s <= reg_kr_s(113 to 127) & reg_kr_s(0 to 112); -- >>> 15
end if;
when SIX4d =>
if (enc_dec = ENC) then
k1_sel <= KA_R;
reg_kl_s <= reg_kl_s(17 to 127) & reg_kl_s(0 to 16); -- <<< 17
reg_kb_s <= reg_kb_s(17 to 127) & reg_kb_s(0 to 16); -- <<< 17
else -- DEC
k1_sel <= KR_L;
reg_kb_s <= reg_kb_s(113 to 127) & reg_kb_s(0 to 112); -- >>> 15
reg_kl_s <= reg_kl_s(113 to 127) & reg_kl_s(0 to 112); -- >>> 15
end if;
when SIX4e =>
if (enc_dec = ENC) then
k1_sel <= KL_L;
reg_kl_s <= reg_kl_s(17 to 127) & reg_kl_s(0 to 16); -- <<< 17
reg_kb_s <= reg_kb_s(17 to 127) & reg_kb_s(0 to 16); -- <<< 17
else -- DEC
k1_sel <= KB_R;
reg_kb_s <= reg_kb_s(113 to 127) & reg_kb_s(0 to 112); -- >>> 15
reg_kl_s <= reg_kl_s(113 to 127) & reg_kl_s(0 to 112); -- >>> 15
end if;
when SIX4f =>
if (enc_dec = ENC) then
k1_sel <= KL_R;
reg_kb_s <= reg_kb_s(17 to 127) & reg_kb_s(0 to 16); -- <<< 17
else -- DEC
k1_sel <= KB_L;
reg_kl_s <= reg_kl_s(113 to 127) & reg_kl_s(0 to 112); -- >>> 15
end if;
end case;
 
if (PS = KEYa) then
data_to <= key_in(0 to 127); --kl
else
data_to <= data_in;
end if;
 
case PS is
when KEYc =>
prexor_sel <= KL;
when KEYa | KEYe =>
prexor_sel <= KR;
when SIX1a =>
if (enc_dec = ENC) then
prexor_sel <= KL;
else
if (k_len = KLEN_128) then
prexor_sel <= KA;
else
prexor_sel <= KB;
end if;
end if;
when others =>
prexor_sel <= ZERO;
end case;
 
case PS is
when SIX3f =>
if (k_len = KLEN_128) then
if (enc_dec = ENC) then
postxor_sel <= KA;
else
postxor_sel <= KL;
end if;
else
postxor_sel <= ZERO;
end if;
when SIX4f =>
if (enc_dec = ENC) then
postxor_sel <= KB;
else
postxor_sel <= KL;
end if;
when others =>
postxor_sel <= ZERO;
end case;
 
if (PS = SIX1a or PS = KEYa) then
newdata <= '1';
else
newdata <= '0';
end if;
 
if (PS = FL1 or PS = FL2 or PS = FL3) then
sel <= SEL_FL;
else
sel <= SEL_F;
end if;
 
end process;
 
STATE_UPDATE: process (clk)
begin
 
if (clk'event and clk = '1') then
 
if (reset = '1') then
PS <= RST;
else
PS <= NS;
end if;
end if;
end process;
NEXT_STATE: process (PS, input_rdy, new_key)
begin
case PS is
when RST =>
NS <= KEYa;
when KEYa =>
if(input_rdy = '1') then
NS <= KEYb;
else
NS <= KEYa;
end if;
when KEYb =>
NS <= KEYc;
when KEYc =>
NS <= KEYd;
when KEYd =>
if (k_len = KLEN_128) then
NS <= SIX1a;
else
NS <= KEYe;
end if;
when KEYe =>
NS <= KEYf;
when KEYf =>
NS <= SIX1a;
when SIX1a =>
if(input_rdy = '1') then
NS <= SIX1b;
else
NS <= SIX1a;
end if;
when SIX1b =>
NS <= SIX1c;
when SIX1c =>
NS <= SIX1d;
when SIX1d =>
NS <= SIX1e;
when SIX1e =>
NS <= SIX1f;
when SIX1f =>
NS <= FL1;
when FL1 =>
NS <= SIX2a;
when SIX2a =>
NS <= SIX2b;
when SIX2b =>
NS <= SIX2c;
when SIX2c =>
NS <= SIX2d;
when SIX2d =>
NS <= SIX2e;
when SIX2e =>
NS <= SIX2f;
when SIX2f =>
NS <= FL2;
when FL2 =>
NS <= SIX3a;
when SIX3a =>
NS <= SIX3b;
when SIX3b =>
NS <= SIX3c;
when SIX3c =>
NS <= SIX3d;
when SIX3d =>
NS <= SIX3e;
when SIX3e =>
NS <= SIX3f;
when SIX3f =>
if (k_len = KLEN_128) then
if (new_key = '1') then
NS <= KEYa;
else
NS <= SIX1a;
end if;
else
NS <= FL3;
end if;
when FL3 =>
NS <= SIX4a;
when SIX4a =>
NS <= SIX4b;
when SIX4b =>
NS <= SIX4c;
when SIX4c =>
NS <= SIX4d;
when SIX4d =>
NS <= SIX4e;
when SIX4e =>
NS <= SIX4f;
when SIX4f =>
if (new_key = '1') then
NS <= KEYa;
else
NS <= SIX1a;
end if;
when others =>
NS <= RST;
end case;
end process;
 
end RTL;
/trunk/looping/fl.vhd
0,0 → 1,73
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 02/21/2008
-- Project Name: camellia-vhdl
-- Description: Asynchronous FL and FL^-1 functions
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
 
entity FL is
port(
fl_in : in STD_LOGIC_VECTOR (0 to 63);
fli_in : in STD_LOGIC_VECTOR (0 to 63);
fl_k : in STD_LOGIC_VECTOR (0 to 63);
fli_k : in STD_LOGIC_VECTOR (0 to 63);
fl_out : out STD_LOGIC_VECTOR (0 to 63);
fli_out : out STD_LOGIC_VECTOR (0 to 63)
);
end FL;
 
architecture RTL of FL is
 
signal fl_a1 : STD_LOGIC_VECTOR (0 to 31);
signal fl_a2 : STD_LOGIC_VECTOR (0 to 31);
signal fl_b1 : STD_LOGIC_VECTOR (0 to 31);
signal fl_b2 : STD_LOGIC_VECTOR (0 to 31);
signal fli_a1 : STD_LOGIC_VECTOR (0 to 31);
signal fli_a2 : STD_LOGIC_VECTOR (0 to 31);
signal fli_b1 : STD_LOGIC_VECTOR (0 to 31);
signal fli_b2 : STD_LOGIC_VECTOR (0 to 31);
 
begin
 
--FL function
fl_a1 <= fl_in(0 to 31) and fl_k(0 to 31);
fl_a2 <= (fl_a1(1 to 31) & fl_a1(0)) xor fl_in(32 to 63);
 
fl_b1 <= fl_a2 or fl_k(32 to 63);
fl_b2 <= fl_in(0 to 31) xor fl_b1;
 
fl_out <= fl_b2 & fl_a2;
 
--FL^-1 function
fli_a1 <= fli_in(32 to 63) or fli_k(32 to 63);
fli_a2 <= fli_in(0 to 31) xor fli_a1;
 
fli_b1 <= fli_a2 and fli_k(0 to 31);
fli_b2 <= (fli_b1(1 to 31) & fli_b1(0)) xor fli_in(32 to 63);
 
fli_out <= fli_a2 & fli_b2;
 
end RTL;
/trunk/looping/f.vhd
0,0 → 1,131
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 01/22/2008
-- Project Name: camellia-vhdl
-- Description: Asynchronous F function
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
entity F is
port (
x : in STD_LOGIC_VECTOR (0 to 63);
k : in STD_LOGIC_VECTOR (0 to 63);
z : out STD_LOGIC_VECTOR (0 to 63)
);
end F;
 
architecture RTL of F is
 
-- S-BOX
component SBOX1 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end component;
component SBOX2 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end component;
component SBOX3 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end component;
component SBOX4 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end component;
 
 
signal y : STD_LOGIC_VECTOR (0 to 63);
signal y1, y2, y3, y4, y5, y6, y7, y8 : STD_LOGIC_VECTOR (0 to 7);
 
signal so1, so2, so3, so4, so5, so6, so7, so8 : STD_LOGIC_VECTOR (0 to 7);
 
signal pa1, pa2, pa3, pa4, pa5, pa6, pa7, pa8 : STD_LOGIC_VECTOR (0 to 7);
 
signal pb1, pb2, pb3, pb4, pb5, pb6, pb7, pb8 : STD_LOGIC_VECTOR (0 to 7);
 
begin
 
y <= x xor k;
 
y8 <= y(56 to 63);
y7 <= y(48 to 55);
y6 <= y(40 to 47);
y5 <= y(32 to 39);
y4 <= y(24 to 31);
y3 <= y(16 to 23);
y2 <= y(8 to 15);
y1 <= y(0 to 7);
 
 
-- S-FUNCTION
S1a : SBOX1
port map(y8, so8);
S1b : SBOX1
port map(y1, so1);
S2a : SBOX2
port map(y5, so5);
S2b : SBOX2
port map(y2, so2);
S3a : SBOX3
port map(y6, so6);
S3b : SBOX3
port map(y3, so3);
S4a : SBOX4
port map(y7, so7);
S4b : SBOX4
port map(y4, so4);
 
-- P-FUNCTION
pa8 <= so8 xor pa2;
pa7 <= so7 xor pa1;
pa6 <= so6 xor pa4;
pa5 <= so5 xor pa3;
pa4 <= so4 xor so5;
pa3 <= so3 xor so8;
pa2 <= so2 xor so7;
pa1 <= so1 xor so6;
 
pb8 <= pa8 xor pb3;
pb7 <= pa7 xor pb2;
pb6 <= pa6 xor pb1;
pb5 <= pa5 xor pb4;
pb4 <= pa4 xor pa7;
pb3 <= pa3 xor pa6;
pb2 <= pa2 xor pa5;
pb1 <= pa1 xor pa8;
 
 
z <= pb5 & pb6 & pb7 & pb8 & pb1 & pb2 & pb3 & pb4;
 
 
end RTL;
/trunk/looping/datapath.vhd
0,0 → 1,148
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 03/04/2008
-- Project Name: camellia-vhdl
-- Description: Datapath
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
entity datapath is
port (
clk : in STD_LOGIC;
reset : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (0 to 127);
k1 : in STD_LOGIC_VECTOR (0 to 63);
k2 : in STD_LOGIC_VECTOR (0 to 63);
newdata : in STD_LOGIC;
sel : in STD_LOGIC; -- 0 if F, 1 if FL
pre_xor : in STD_LOGIC_VECTOR (0 to 127);
post_xor : in STD_LOGIC_VECTOR (0 to 127);
data_out : out STD_LOGIC_VECTOR (0 to 127)
);
end datapath;
 
architecture RTL of datapath is
 
component F is
port (
x : in STD_LOGIC_VECTOR (0 to 63);
k : in STD_LOGIC_VECTOR (0 to 63);
z : out STD_LOGIC_VECTOR (0 to 63)
);
end component;
 
component FL is
port(
fl_in : in STD_LOGIC_VECTOR (0 to 63);
fli_in : in STD_LOGIC_VECTOR (0 to 63);
fl_k : in STD_LOGIC_VECTOR (0 to 63);
fli_k : in STD_LOGIC_VECTOR (0 to 63);
fl_out : out STD_LOGIC_VECTOR (0 to 63);
fli_out : out STD_LOGIC_VECTOR (0 to 63)
);
end component;
 
signal f_in : STD_LOGIC_VECTOR (0 to 63);
signal f_k : STD_LOGIC_VECTOR (0 to 63);
signal f_out : STD_LOGIC_VECTOR (0 to 63);
signal fl_in : STD_LOGIC_VECTOR (0 to 63);
signal fl_k : STD_LOGIC_VECTOR (0 to 63);
signal fl_out : STD_LOGIC_VECTOR (0 to 63);
signal fli_in : STD_LOGIC_VECTOR (0 to 63);
signal fli_k : STD_LOGIC_VECTOR (0 to 63);
signal fli_out : STD_LOGIC_VECTOR (0 to 63);
 
signal data_in_sx : STD_LOGIC_VECTOR (0 to 63);
signal data_in_dx : STD_LOGIC_VECTOR (0 to 63);
signal pre_xor_sx : STD_LOGIC_VECTOR (0 to 63);
signal pre_xor_dx : STD_LOGIC_VECTOR (0 to 63);
 
signal mux1 : STD_LOGIC_VECTOR (0 to 63);
signal mux1_pxor : STD_LOGIC_VECTOR (0 to 63);
signal mux2 : STD_LOGIC_VECTOR (0 to 63);
signal mux2_pxor : STD_LOGIC_VECTOR (0 to 63);
signal f_out_xor : STD_LOGIC_VECTOR (0 to 63);
 
signal reg_fl_out : STD_LOGIC_VECTOR (0 to 63);
signal reg_fli_out : STD_LOGIC_VECTOR (0 to 63);
signal reg_f_out_xor : STD_LOGIC_VECTOR (0 to 63);
signal reg_mux2_pxor : STD_LOGIC_VECTOR (0 to 63);
signal reg_sel : STD_LOGIC;
 
constant SEL_F : STD_LOGIC := '0';
constant SEL_FL : STD_LOGIC := '1';
 
begin
 
F1 : F
port map(f_in, f_k, f_out);
 
FL1 : FL
port map(fl_in, fli_in, fl_k, fli_k, fl_out, fli_out);
 
 
data_in_sx <= data_in(0 to 63);
data_in_dx <= data_in(64 to 127);
pre_xor_sx <= pre_xor(0 to 63);
pre_xor_dx <= pre_xor(64 to 127);
f_in <= mux2_pxor;
f_k <= k1;
fl_in <= reg_f_out_xor;
fl_k <= k1;
fli_in <= reg_mux2_pxor;
fli_k <= k2;
f_out_xor <= f_out xor mux1_pxor;
 
mux1 <= reg_fli_out when newdata='0' and reg_sel=SEL_FL else
reg_mux2_pxor when newdata='0' and reg_sel=SEL_F else
data_in_dx;
mux2 <= reg_fl_out when newdata='0' and reg_sel=SEL_FL else
reg_f_out_xor when newdata='0' and reg_sel=SEL_F else
data_in_sx;
 
mux1_pxor <= mux1 xor pre_xor_dx;
mux2_pxor <= mux2 xor pre_xor_sx;
 
data_out <= (f_out_xor & mux2_pxor) xor post_xor;
 
REGISTERS: process(clk, reset)
begin
 
if (reset = '1') then
reg_fl_out <= (others=>'0');
reg_fli_out <= (others=>'0');
reg_f_out_xor <= (others=>'0');
reg_mux2_pxor <= (others=>'0');
reg_sel <= SEL_F;
elsif (clk'event and clk='1') then
reg_fl_out <= fl_out;
reg_fli_out <= fli_out;
reg_f_out_xor <= f_out_xor;
reg_mux2_pxor <= mux2_pxor;
reg_sel <= sel;
end if;
 
end process;
 
end RTL;
/trunk/looping/camellia.vhd
0,0 → 1,146
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 02/01/2008
-- Last Update: 03/06/2008
-- Project Name: camellia-vhdl
-- Description: Looping version of Camellia
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
entity camellia is
port (
clk : in STD_LOGIC;
reset : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (0 to 127);
key : in STD_LOGIC_VECTOR (0 to 255);
k_len : in STD_LOGIC_VECTOR (0 to 1);
new_key : in STD_LOGIC;
enc_dec : in STD_LOGIC;
input_rdy : in STD_LOGIC;
data_out : out STD_LOGIC_VECTOR (0 to 127)
);
end camellia;
 
architecture RTL of camellia is
 
signal s_clk : STD_LOGIC;
signal s_reset : STD_LOGIC;
signal s_data_in : STD_LOGIC_VECTOR (0 to 127);
signal s_key_in : STD_LOGIC_VECTOR (0 to 255);
signal s_k_len : STD_LOGIC_VECTOR (0 to 1);
signal s_new_key : STD_LOGIC;
signal s_enc_dec : STD_LOGIC;
signal s_input_rdy : STD_LOGIC;
signal s_nxt_input : STD_LOGIC;
signal s_data_to : STD_LOGIC_VECTOR (0 to 127);
signal s_k1 : STD_LOGIC_VECTOR (0 to 63);
signal s_k2 : STD_LOGIC_VECTOR (0 to 63);
signal s_newdata : STD_LOGIC;
signal s_sel : STD_LOGIC;
signal s_pre_xor : STD_LOGIC_VECTOR (0 to 127);
signal s_post_xor : STD_LOGIC_VECTOR (0 to 127);
signal s_data_from : STD_LOGIC_VECTOR (0 to 127);
 
component datapath is
port (
clk : in STD_LOGIC;
reset : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (0 to 127);
k1 : in STD_LOGIC_VECTOR (0 to 63);
k2 : in STD_LOGIC_VECTOR (0 to 63);
newdata : in STD_LOGIC;
sel : in STD_LOGIC;
pre_xor : in STD_LOGIC_VECTOR (0 to 127);
post_xor : in STD_LOGIC_VECTOR (0 to 127);
data_out : out STD_LOGIC_VECTOR (0 to 127)
);
end component;
 
component control is
port (
clk : in STD_LOGIC;
reset : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (0 to 127);
key_in : in STD_LOGIC_VECTOR (0 to 255);
k_len : in STD_LOGIC_VECTOR (0 to 1);
new_key : in STD_LOGIC;
enc_dec : in STD_LOGIC;
input_rdy : in STD_LOGIC;
data_to : out STD_LOGIC_VECTOR (0 to 127);
k1 : out STD_LOGIC_VECTOR (0 to 63);
k2 : out STD_LOGIC_VECTOR (0 to 63);
newdata : out STD_LOGIC;
sel : out STD_LOGIC;
pre_xor : out STD_LOGIC_VECTOR (0 to 127);
post_xor : out STD_LOGIC_VECTOR (0 to 127);
data_from : in STD_LOGIC_VECTOR (0 to 127)
);
end component;
 
begin
 
DP : datapath
port map(
clk => s_clk,
reset => s_reset,
data_in => s_data_to,
k1 => s_k1,
k2 => s_k2,
newdata => s_newdata,
sel => s_sel,
pre_xor => s_pre_xor,
post_xor => s_post_xor,
data_out => s_data_from
);
 
CTRL : control
port map(
clk => s_clk,
reset => s_reset,
data_in => s_data_in,
key_in => s_key_in,
k_len => s_k_len,
new_key => s_new_key,
enc_dec => s_enc_dec,
input_rdy => s_input_rdy,
data_to => s_data_to,
k1 => s_k1,
k2 => s_k2,
newdata => s_newdata,
sel => s_sel,
pre_xor => s_pre_xor,
post_xor => s_post_xor,
data_from => s_data_from
);
 
s_clk <= clk;
s_reset <= reset;
s_data_in <= data_in;
s_key_in <= key;
s_k_len <= k_len;
s_new_key <= new_key;
s_enc_dec <= enc_dec;
s_input_rdy <= input_rdy;
data_out <= s_data_from(64 to 127) & s_data_from(0 to 63);
 
end RTL;
/trunk/looping/f_tb.vhd
0,0 → 1,71
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 02/25/2008
-- Project Name: camellia-vhdl
-- Description: VHDL Test Bench for module F
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
entity f_tb is
end f_tb;
 
ARCHITECTURE behavior of f_tb is
 
-- Component Declaration for the Unit Under Test (UUT)
component F
port (
x : in STD_LOGIC_VECTOR (0 to 63);
k : in STD_LOGIC_VECTOR (0 to 63);
z : out STD_LOGIC_VECTOR (0 to 63)
);
end component;
 
--Inputs
signal x : STD_LOGIC_VECTOR(0 to 63) := (others=>'0');
signal k : STD_LOGIC_VECTOR(0 to 63) := (others=>'0');
 
--Outputs
signal z : STD_LOGIC_VECTOR(0 to 63);
 
begin
 
-- Instantiate the Unit Under Test (UUT)
uut: F port map(
x => x,
k => k,
z => z
);
 
tb : process
begin
x <= X"0123456789abcdef";
k <= X"a09e667f3bcc908b";
wait for 10 ns;
x <= X"0000000000000000";
k <= X"0000000000000000";
wait;
end process;
 
 
end;
/trunk/looping/f_tb.do
0,0 → 1,10
vcom -quiet sbox1.vhd
vcom -quiet sbox2.vhd
vcom -quiet sbox3.vhd
vcom -quiet sbox4.vhd
vcom -quiet f.vhd
vcom -quiet f_tb.vhd
vsim f_tb
view wave
add wave -HEX /uut/*
run 50 ns
/trunk/looping/camellia_tb.vhd
0,0 → 1,103
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 02/19/2008
-- Last Update: 03/06/2008
-- Project Name: camellia-vhdl
-- Description: VHDL Test Bench for module camellia
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
entity camellia_tb is
 
end camellia_tb;
 
architecture RTL of camellia_tb is
 
component camellia is
port (
clk : in STD_LOGIC;
reset : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR (0 to 127);
key : in STD_LOGIC_VECTOR (0 to 255);
k_len : in STD_LOGIC_VECTOR (0 to 1);
new_key : in STD_LOGIC;
enc_dec : in STD_LOGIC;
input_rdy : in STD_LOGIC;
data_out : out STD_LOGIC_VECTOR (0 to 127)
);
end component;
 
signal clk : STD_LOGIC;
signal reset : STD_LOGIC;
signal data_in : STD_LOGIC_VECTOR (0 to 127);
signal key : STD_LOGIC_VECTOR (0 to 255);
signal k_len : STD_LOGIC_VECTOR (0 to 1);
signal new_key : STD_LOGIC;
signal enc_dec : STD_LOGIC;
signal input_rdy : STD_LOGIC;
signal data_out : STD_LOGIC_VECTOR (0 to 127);
 
-- constants
constant KLEN_128 : STD_LOGIC_VECTOR (0 to 1) := "00";
constant KLEN_192 : STD_LOGIC_VECTOR (0 to 1) := "01";
constant KLEN_256 : STD_LOGIC_VECTOR (0 to 1) := "10";
constant ENC : STD_LOGIC := '0';
constant DEC : STD_LOGIC := '1';
constant CLK_PERIOD : TIME := 20 ns;
 
begin
 
uut : camellia
port map(clk, reset, data_in, key, k_len, new_key,
enc_dec, input_rdy, data_out);
 
tb : process
begin
reset <= '1';
wait for 15 ns;
reset <= '0';
data_in <= X"0123456789abcdeffedcba9876543210";
key <= X"0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff";
k_len <= KLEN_128;
new_key <= '1';
enc_dec <= '0';
input_rdy <= '1';
wait for 494 ns;
data_in <= X"67673138549669730857065648eabe43";
key <= X"0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff";
k_len <= KLEN_128;
new_key <= '0';
enc_dec <= '1';
input_rdy <= '1';
wait;
end process;
 
clk_gen : process
begin
clk <= '0';
wait for CLK_PERIOD / 2;
clk <= '1';
wait for CLK_PERIOD / 2;
end process;
 
end RTL;
/trunk/looping/sbox1.vhd
0,0 → 1,300
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 01/22/2008
-- Project Name: camellia-vhdl
-- Description: Asynchronous SBOX1
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
 
 
entity SBOX1 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end SBOX1;
 
architecture RTL of SBOX1 is
begin
 
with data_in select
data_out <= X"70" when X"00",
X"82" when X"01",
X"2C" when X"02",
X"EC" when X"03",
X"B3" when X"04",
X"27" when X"05",
X"C0" when X"06",
X"E5" when X"07",
X"E4" when X"08",
X"85" when X"09",
X"57" when X"0A",
X"35" when X"0B",
X"EA" when X"0C",
X"0C" when X"0D",
X"AE" when X"0E",
X"41" when X"0F",
X"23" when X"10",
X"EF" when X"11",
X"6B" when X"12",
X"93" when X"13",
X"45" when X"14",
X"19" when X"15",
X"A5" when X"16",
X"21" when X"17",
X"ED" when X"18",
X"0E" when X"19",
X"4F" when X"1A",
X"4E" when X"1B",
X"1D" when X"1C",
X"65" when X"1D",
X"92" when X"1E",
X"BD" when X"1F",
X"86" when X"20",
X"B8" when X"21",
X"AF" when X"22",
X"8F" when X"23",
X"7C" when X"24",
X"EB" when X"25",
X"1F" when X"26",
X"CE" when X"27",
X"3E" when X"28",
X"30" when X"29",
X"DC" when X"2A",
X"5F" when X"2B",
X"5E" when X"2C",
X"C5" when X"2D",
X"0B" when X"2E",
X"1A" when X"2F",
X"A6" when X"30",
X"E1" when X"31",
X"39" when X"32",
X"CA" when X"33",
X"D5" when X"34",
X"47" when X"35",
X"5D" when X"36",
X"3D" when X"37",
X"D9" when X"38",
X"01" when X"39",
X"5A" when X"3A",
X"D6" when X"3B",
X"51" when X"3C",
X"56" when X"3D",
X"6C" when X"3E",
X"4D" when X"3F",
X"8B" when X"40",
X"0D" when X"41",
X"9A" when X"42",
X"66" when X"43",
X"FB" when X"44",
X"CC" when X"45",
X"B0" when X"46",
X"2D" when X"47",
X"74" when X"48",
X"12" when X"49",
X"2B" when X"4A",
X"20" when X"4B",
X"F0" when X"4C",
X"B1" when X"4D",
X"84" when X"4E",
X"99" when X"4F",
X"DF" when X"50",
X"4C" when X"51",
X"CB" when X"52",
X"C2" when X"53",
X"34" when X"54",
X"7E" when X"55",
X"76" when X"56",
X"05" when X"57",
X"6D" when X"58",
X"B7" when X"59",
X"A9" when X"5A",
X"31" when X"5B",
X"D1" when X"5C",
X"17" when X"5D",
X"04" when X"5E",
X"D7" when X"5F",
X"14" when X"60",
X"58" when X"61",
X"3A" when X"62",
X"61" when X"63",
X"DE" when X"64",
X"1B" when X"65",
X"11" when X"66",
X"1C" when X"67",
X"32" when X"68",
X"0F" when X"69",
X"9C" when X"6A",
X"16" when X"6B",
X"53" when X"6C",
X"18" when X"6D",
X"F2" when X"6E",
X"22" when X"6F",
X"FE" when X"70",
X"44" when X"71",
X"CF" when X"72",
X"B2" when X"73",
X"C3" when X"74",
X"B5" when X"75",
X"7A" when X"76",
X"91" when X"77",
X"24" when X"78",
X"08" when X"79",
X"E8" when X"7A",
X"A8" when X"7B",
X"60" when X"7C",
X"FC" when X"7D",
X"69" when X"7E",
X"50" when X"7F",
X"AA" when X"80",
X"D0" when X"81",
X"A0" when X"82",
X"7D" when X"83",
X"A1" when X"84",
X"89" when X"85",
X"62" when X"86",
X"97" when X"87",
X"54" when X"88",
X"5B" when X"89",
X"1E" when X"8A",
X"95" when X"8B",
X"E0" when X"8C",
X"FF" when X"8D",
X"64" when X"8E",
X"D2" when X"8F",
X"10" when X"90",
X"C4" when X"91",
X"00" when X"92",
X"48" when X"93",
X"A3" when X"94",
X"F7" when X"95",
X"75" when X"96",
X"DB" when X"97",
X"8A" when X"98",
X"03" when X"99",
X"E6" when X"9A",
X"DA" when X"9B",
X"09" when X"9C",
X"3F" when X"9D",
X"DD" when X"9E",
X"94" when X"9F",
X"87" when X"A0",
X"5C" when X"A1",
X"83" when X"A2",
X"02" when X"A3",
X"CD" when X"A4",
X"4A" when X"A5",
X"90" when X"A6",
X"33" when X"A7",
X"73" when X"A8",
X"67" when X"A9",
X"F6" when X"AA",
X"F3" when X"AB",
X"9D" when X"AC",
X"7F" when X"AD",
X"BF" when X"AE",
X"E2" when X"AF",
X"52" when X"B0",
X"9B" when X"B1",
X"D8" when X"B2",
X"26" when X"B3",
X"C8" when X"B4",
X"37" when X"B5",
X"C6" when X"B6",
X"3B" when X"B7",
X"81" when X"B8",
X"96" when X"B9",
X"6F" when X"BA",
X"4B" when X"BB",
X"13" when X"BC",
X"BE" when X"BD",
X"63" when X"BE",
X"2E" when X"BF",
X"E9" when X"C0",
X"79" when X"C1",
X"A7" when X"C2",
X"8C" when X"C3",
X"9F" when X"C4",
X"6E" when X"C5",
X"BC" when X"C6",
X"8E" when X"C7",
X"29" when X"C8",
X"F5" when X"C9",
X"F9" when X"CA",
X"B6" when X"CB",
X"2F" when X"CC",
X"FD" when X"CD",
X"B4" when X"CE",
X"59" when X"CF",
X"78" when X"D0",
X"98" when X"D1",
X"06" when X"D2",
X"6A" when X"D3",
X"E7" when X"D4",
X"46" when X"D5",
X"71" when X"D6",
X"BA" when X"D7",
X"D4" when X"D8",
X"25" when X"D9",
X"AB" when X"DA",
X"42" when X"DB",
X"88" when X"DC",
X"A2" when X"DD",
X"8D" when X"DE",
X"FA" when X"DF",
X"72" when X"E0",
X"07" when X"E1",
X"B9" when X"E2",
X"55" when X"E3",
X"F8" when X"E4",
X"EE" when X"E5",
X"AC" when X"E6",
X"0A" when X"E7",
X"36" when X"E8",
X"49" when X"E9",
X"2A" when X"EA",
X"68" when X"EB",
X"3C" when X"EC",
X"38" when X"ED",
X"F1" when X"EE",
X"A4" when X"EF",
X"40" when X"F0",
X"28" when X"F1",
X"D3" when X"F2",
X"7B" when X"F3",
X"BB" when X"F4",
X"C9" when X"F5",
X"43" when X"F6",
X"C1" when X"F7",
X"15" when X"F8",
X"E3" when X"F9",
X"AD" when X"FA",
X"F4" when X"FB",
X"77" when X"FC",
X"C7" when X"FD",
X"80" when X"FE",
X"9E" when X"FF",
"--------" when others;
 
end RTL;
/trunk/looping/camellia_tb.do
0,0 → 1,28
vcom -quiet sbox1.vhd
vcom -quiet sbox2.vhd
vcom -quiet sbox3.vhd
vcom -quiet sbox4.vhd
vcom -quiet f.vhd
vcom -quiet fl.vhd
vcom -quiet datapath.vhd
vcom -quiet control.vhd
vcom -quiet camellia.vhd
vcom -quiet camellia_tb.vhd
vsim camellia_tb
view wave
add wave -divider "camellia"
add wave -HEX -ports /uut/*
add wave -divider "control"
add wave -HEX -ports /uut/CTRL/*
add wave /uut/CTRL/PS
add wave -divider "keys"
add wave -HEX /uut/CTRL/reg_kr
add wave -HEX /uut/CTRL/reg_ka
add wave -HEX /uut/CTRL/reg_kb
add wave -HEX /uut/CTRL/reg_kl_s
add wave -HEX /uut/CTRL/reg_kr_s
add wave -HEX /uut/CTRL/reg_ka_s
add wave -HEX /uut/CTRL/reg_kb_s
add wave -divider "datapath"
add wave -HEX -ports /uut/DP/*
run 1400 ns
/trunk/looping/sbox2.vhd
0,0 → 1,59
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 01/22/2008
-- Project Name: camellia-vhdl
-- Description: Asynchronous SBOX2
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
 
entity SBOX2 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end SBOX2;
 
architecture RTL of SBOX2 is
 
component SBOX1 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end component;
 
-- SBOX1 signals
signal s1_data_in : STD_LOGIC_VECTOR(0 to 7);
signal s1_data_out : STD_LOGIC_VECTOR(0 to 7);
 
begin
 
S1 : SBOX1
port map(s1_data_in, s1_data_out);
 
s1_data_in <= data_in;
data_out <= s1_data_out(1 to 7) & s1_data_out(0);
 
end RTL;
/trunk/looping/sbox3.vhd
0,0 → 1,59
 
--------------------------------------------------------------------------------
-- Designer: Paolo Fulgoni <pfulgoni@opencores.org>
--
-- Create Date: 01/22/2008
-- Last Update: 01/22/2008
-- Project Name: camellia-vhdl
-- Description: Asynchronous SBOX3
--
-- Copyright (C) 2008 Paolo Fulgoni
-- This file is part of camellia-vhdl.
-- camellia-vhdl 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 3 of the License, or
-- (at your option) any later version.
-- camellia-vhdl 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, see <http://www.gnu.org/licenses/>.
--
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
-- Mitsubishi Electric researchers.
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
--------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
 
 
entity SBOX3 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end SBOX3;
 
architecture RTL of SBOX3 is
 
component SBOX1 is
port (
data_in : IN STD_LOGIC_VECTOR(0 to 7);
data_out : OUT STD_LOGIC_VECTOR(0 to 7)
);
end component;
 
-- SBOX1 signals
signal s1_data_in : STD_LOGIC_VECTOR(0 to 7);
signal s1_data_out : STD_LOGIC_VECTOR(0 to 7);
 
begin
 
S1 : SBOX1
port map(s1_data_in, s1_data_out);
 
s1_data_in <= data_in;
data_out <= s1_data_out(7) & s1_data_out(0 to 6);
 
end RTL;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.