blob: f04509f754910b304f1211112d41d48912c3098b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
-- Implementation of the Lilliput-TBC tweakable block cipher by the
-- Lilliput-AE team, hereby denoted as "the implementer".
--
-- For more information, feedback or questions, refer to our website:
-- https://paclido.fr/lilliput-ae
--
-- To the extent possible under law, the implementer has waived all copyright
-- and related or neighboring rights to the source code in this file.
-- http://creativecommons.org/publicdomain/zero/1.0/
library IEEE;
library work;
use IEEE.numeric_std.ALL;
use IEEE.STD_LOGIC_1164.ALL;
use work.crypt_pack.ALL;
entity roundexe_liliput is
port (
clock_i : in std_logic;
reset_i : in std_logic;
data_i : in bit_data; --donnée d'entrée lors du premier Round
keyb_i : in bit_key;
tweak_i : in bit_tweak;
invert_i : in std_logic;
round_number_i : in std_logic_vector(7 downto 0);
permut_valid_i : in std_logic; --permet de savoir si on fait la permutation à la fin
mux_keyschdule_i : in std_logic;
mux_chiffrement_i : in std_logic;
data_out_valid_i : in std_logic;
data_out_valid_o : out std_logic;
decrypt_i : in std_logic;
data_o : out bit_data
);
end roundexe_liliput;
architecture roundexe_liliput_arch of roundexe_liliput is
component chiffrement
port(
chiffrement_i : in type_state;
permutation_i : in std_logic;
round_key_i : in type_key;
chiffrement_o : out type_state
);
end component;
component key_schedule_liliput
port (
key_i : in type_tweak_key_array;
round_number : in std_logic_vector(7 downto 0);
key_o : out type_tweak_key_array;
round_key_o : out type_key
);
end component;
signal data_i_s : type_state;
signal chiffrement_o_s : type_state;
signal mux_1_s : type_state;
signal mux_2_s : type_tweak_key_array;
signal state_o_s : type_state;
signal state_tk_o_s : type_tweak_key_array;
signal round_key_o_s : type_key;
signal state_round_key_s : type_key;
signal tweak_key_i : bit_tweak_key := (others => '0');
signal tk_s : type_tweak_key_array;
signal tk_o_s : type_tweak_key_array;
signal data_out_valid_s : std_logic;
begin
convertion_ligne : for i in 0 to 3 generate
convertion_colonne : for j in 0 to 3 generate
data_i_s(i)(j) <= data_i((7+(8*(4*i+j)))downto((8*(4*i+j))));
data_o(7+(8*(4*i+j)) downto (8*(4*i+j))) <= state_o_s(i)(j) when data_out_valid_s = '1' else X"00";
end generate;
end generate;
data_out_valid_o <= data_out_valid_s;
reg_roundkey : process(reset_i, clock_i)
begin
if(reset_i = '0') then
state_round_key_s <= (others => (others => (others => '0')));
state_tk_o_s <= (others => (others => (others => '0')));
state_o_s <= (others => (others => (others => '0')));
data_out_valid_s <= '0';
elsif(clock_i'event and clock_i = '1') then
state_round_key_s <= round_key_o_s;
state_tk_o_s <= tk_o_s;
state_o_s <= mux_1_s;
data_out_valid_s <= data_out_valid_i;
end if;
end process reg_roundkey;
--Tweak_key concatenation
tweak_key_i (TWEAK_KEY_LEN downto 0) <= keyb_i & tweak_i;
--formatting tweak_key in type_tweak_key_array
convertion_ligne_key : for i in 0 to LANE_NB-1 generate
convertion_colonne_key : for j in 0 to 7 generate
tk_s(i)(j) <= tweak_key_i(((64*i)+(8*j)+7)downto((64*i)+(8*j)));
end generate;
end generate;
--Avantage on n'utilise le même mux donc pas de changement dans la machine d'état
mux_1_s <= data_i_s when mux_chiffrement_i = '1' else
chiffrement_o_s;
mux_2_s <= tk_s when mux_keyschdule_i = '1' else
state_tk_o_s;
key_schedule_t : key_schedule_liliput port map(
key_i => mux_2_s,
round_number => round_number_i,
key_o => tk_o_s,
round_key_o => round_key_o_s
);
chiffrement_t : chiffrement port map(
chiffrement_i => state_o_s,
permutation_i => permut_valid_i,
round_key_i => state_round_key_s,
chiffrement_o => chiffrement_o_s
);
end roundexe_liliput_arch;
configuration roundexe_liliput_conf of roundexe_liliput is
for roundexe_liliput_arch
for key_schedule_t : key_schedule_liliput
use entity work.key_schedule_liliput(key_schedule_liliputr_arch);
end for;
for chiffrement_t : chiffrement
use entity work.chiffrement(chiffrement_arch);
end for;
end for;
end configuration roundexe_liliput_conf;
|