chiffrement.vhd (4753B)
1 -- Implementation of the Lilliput-TBC tweakable block cipher by the 2 -- Lilliput-AE team, hereby denoted as "the implementer". 3 -- 4 -- For more information, feedback or questions, refer to our website: 5 -- https://paclido.fr/lilliput-ae 6 -- 7 -- To the extent possible under law, the implementer has waived all copyright 8 -- and related or neighboring rights to the source code in this file. 9 -- http://creativecommons.org/publicdomain/zero/1.0/ 10 11 library IEEE; 12 library work; 13 use IEEE.numeric_std.ALL; 14 use IEEE.STD_LOGIC_1164.ALL; 15 use work.crypt_pack.ALL; 16 17 18 entity chiffrement is port ( 19 chiffrement_i : in type_state; 20 permutation_i : in std_logic; 21 round_key_i : in type_key; 22 chiffrement_o : out type_state 23 ); 24 25 end chiffrement; 26 27 architecture chiffrement_arch of chiffrement is 28 29 signal non_linear_s : type_half_state; 30 signal non_linear_s1 : type_half_state; 31 signal linear_s : type_half_state; 32 signal linear_tmp_s : type_half_state; 33 signal linear : bit8; 34 35 component sbox 36 port ( 37 sbox_i : in bit8; 38 sbox_o : out bit8 39 ); 40 end component; 41 42 43 begin 44 45 non_linear_s(0)(0) <= chiffrement_i(1)(3) xor round_key_i(1)(3); 46 non_linear_s(0)(1) <= chiffrement_i(1)(2) xor round_key_i(1)(2); 47 non_linear_s(0)(2) <= chiffrement_i(1)(1) xor round_key_i(1)(1); 48 non_linear_s(0)(3) <= chiffrement_i(1)(0) xor round_key_i(1)(0); 49 non_linear_s(1)(0) <= chiffrement_i(0)(3) xor round_key_i(0)(3); 50 non_linear_s(1)(1) <= chiffrement_i(0)(2) xor round_key_i(0)(2); 51 non_linear_s(1)(2) <= chiffrement_i(0)(1) xor round_key_i(0)(1); 52 non_linear_s(1)(3) <= chiffrement_i(0)(0) xor round_key_i(0)(0); 53 54 55 boucle_ligne : for i in 0 to 1 generate 56 boucle_colonne : for j in 0 to 3 generate 57 sboxx : sbox port map( 58 sbox_i => non_linear_s(i)(j), 59 sbox_o => non_linear_s1(i)(j) 60 ); 61 end generate; 62 end generate; 63 64 linear_tmp_s(0)(0) <= chiffrement_i(2)(0); 65 linear_tmp_s(0)(1) <= chiffrement_i(2)(1) xor chiffrement_i(1)(3); 66 linear_tmp_s(0)(2) <= chiffrement_i(2)(2) xor chiffrement_i(1)(3); 67 linear_tmp_s(0)(3) <= chiffrement_i(2)(3) xor chiffrement_i(1)(3); 68 linear_tmp_s(1)(0) <= chiffrement_i(3)(0) xor chiffrement_i(1)(3); 69 linear_tmp_s(1)(1) <= chiffrement_i(3)(1) xor chiffrement_i(1)(3); 70 linear_tmp_s(1)(2) <= chiffrement_i(3)(2) xor chiffrement_i(1)(3); 71 linear_tmp_s(1)(3) <= chiffrement_i(3)(3) xor chiffrement_i(1)(0) xor chiffrement_i(1)(1) xor chiffrement_i(1)(2); 72 linear <= chiffrement_i(0)(3) xor chiffrement_i(0)(1) xor chiffrement_i(0)(2) xor chiffrement_i(1)(3); 73 74 linear_s(0)(0) <= non_linear_s1(0)(0) xor linear_tmp_s(0)(0); 75 linear_s(0)(1) <= non_linear_s1(0)(1) xor linear_tmp_s(0)(1); 76 linear_s(0)(2) <= non_linear_s1(0)(2) xor linear_tmp_s(0)(2); 77 linear_s(0)(3) <= non_linear_s1(0)(3) xor linear_tmp_s(0)(3); 78 linear_s(1)(0) <= non_linear_s1(1)(0) xor linear_tmp_s(1)(0); 79 linear_s(1)(1) <= non_linear_s1(1)(1) xor linear_tmp_s(1)(1); 80 linear_s(1)(2) <= non_linear_s1(1)(2) xor linear_tmp_s(1)(2); 81 linear_s(1)(3) <= non_linear_s1(1)(3) xor linear xor linear_tmp_s(1)(3); 82 83 84 chiffrement_o(0)(0) <= linear_s(1)(2) when permutation_i='1' else chiffrement_i(0)(0); 85 chiffrement_o(0)(1) <= linear_s(0)(3) when permutation_i='1' else chiffrement_i(0)(1); 86 chiffrement_o(0)(2) <= linear_s(1)(0) when permutation_i='1' else chiffrement_i(0)(2); 87 chiffrement_o(0)(3) <= linear_s(0)(2) when permutation_i='1' else chiffrement_i(0)(3); 88 chiffrement_o(1)(0) <= linear_s(0)(0) when permutation_i='1' else chiffrement_i(1)(0); 89 chiffrement_o(1)(1) <= linear_s(0)(1) when permutation_i='1' else chiffrement_i(1)(1); 90 chiffrement_o(1)(2) <= linear_s(1)(1) when permutation_i='1' else chiffrement_i(1)(2); 91 chiffrement_o(1)(3) <= linear_s(1)(3) when permutation_i='1' else chiffrement_i(1)(3); 92 chiffrement_o(2)(0) <= chiffrement_i(0)(3) when permutation_i='1' else linear_s(0)(0); 93 chiffrement_o(2)(1) <= chiffrement_i(0)(1) when permutation_i='1' else linear_s(0)(1); 94 chiffrement_o(2)(2) <= chiffrement_i(1)(0) when permutation_i='1' else linear_s(0)(2); 95 chiffrement_o(2)(3) <= chiffrement_i(1)(1) when permutation_i='1' else linear_s(0)(3); 96 chiffrement_o(3)(0) <= chiffrement_i(1)(2) when permutation_i='1' else linear_s(1)(0); 97 chiffrement_o(3)(1) <= chiffrement_i(0)(0) when permutation_i='1' else linear_s(1)(1); 98 chiffrement_o(3)(2) <= chiffrement_i(0)(2) when permutation_i='1' else linear_s(1)(2); 99 chiffrement_o(3)(3) <= chiffrement_i(1)(3) when permutation_i='1' else linear_s(1)(3); 100 101 end chiffrement_arch; 102 103 configuration chiffrement_conf of chiffrement is 104 for chiffrement_arch 105 for boucle_ligne 106 for boucle_colonne 107 for all : sbox 108 use entity work.sbox( sbox_arch ); 109 end for; 110 end for; 111 end for; 112 end for; 113 end configuration chiffrement_conf ;