raw
eucrypt_ch6_kecca...    1  -- S.MG, 2018
eucrypt_ch6_kecca... 2
eucrypt_ch6_kecca... 3 package body SMG_Keccak is
eucrypt_ch6_kecca... 4
eucrypt_ch6_kecca... 5 function Theta(Input : in State) return State is
eucrypt_ch6_kecca... 6 Output : State;
eucrypt_ch6_kecca... 7 C : Plane;
eucrypt_ch6_kecca... 8 W : ZWord;
eucrypt_ch6_kecca... 9 begin
eucrypt_ch6_kecca... 10 for X in XYCoord loop
eucrypt_ch6_kecca... 11 C(X) := Input(X, 0);
eucrypt_ch6_kecca... 12 for Y in 1..XYCoord'Last loop
eucrypt_ch6_kecca... 13 C(X) := C(X) xor Input(X, Y);
eucrypt_ch6_kecca... 14 end loop;
eucrypt_ch6_kecca... 15 end loop;
eucrypt_ch6_kecca... 16
eucrypt_ch6_kecca... 17 for X in XYCoord loop
eucrypt_ch6_kecca... 18 W := C(X-1) xor Rotate_Left(C(X+1), 1);
eucrypt_ch6_kecca... 19 for Y in XYCoord loop
eucrypt_ch6_kecca... 20 Output(X,Y) := Input(X,Y) xor W;
eucrypt_ch6_kecca... 21 end loop;
eucrypt_ch6_kecca... 22 end loop;
eucrypt_ch6_kecca... 23
eucrypt_ch6_kecca... 24 return Output;
eucrypt_ch6_kecca... 25 end Theta;
eucrypt_ch6_kecca... 26
eucrypt_ch6_kecca... 27 function Rho(Input : in State) return State is
eucrypt_ch6_kecca... 28 Output : State;
eucrypt_ch6_kecca... 29 X, Y, Old_Y : XYCoord;
eucrypt_ch6_kecca... 30 begin
eucrypt_ch6_kecca... 31 Output(0,0) := Input(0,0);
eucrypt_ch6_kecca... 32 X := 1;
eucrypt_ch6_kecca... 33 Y := 0;
eucrypt_ch6_kecca... 34
eucrypt_ch6_kecca... 35 for T in 0..23 loop
eucrypt_ch6_kecca... 36 Output(X, Y) := Rotate_Left(Input(X,Y), ((T+1)*(T+2)/2) mod Z_Length);
eucrypt_ch6_kecca... 37 Old_Y := Y;
eucrypt_ch6_kecca... 38 Y := 2*X + 3*Y;
eucrypt_ch6_kecca... 39 X := Old_Y;
eucrypt_ch6_kecca... 40 end loop;
eucrypt_ch6_kecca... 41 return Output;
eucrypt_ch6_kecca... 42 end rho;
eucrypt_ch6_kecca... 43
eucrypt_ch6_kecca... 44 function Pi(Input : in State) return State is
eucrypt_ch6_kecca... 45 Output: State;
eucrypt_ch6_kecca... 46 begin
eucrypt_ch6_kecca... 47 for X in XYCoord loop
eucrypt_ch6_kecca... 48 for Y in XYCoord loop
eucrypt_ch6_kecca... 49 Output(Y, 2*X + 3*Y) := Input(X, Y);
eucrypt_ch6_kecca... 50 end loop;
eucrypt_ch6_kecca... 51 end loop;
eucrypt_ch6_kecca... 52 return Output;
eucrypt_ch6_kecca... 53 end pi;
eucrypt_ch6_kecca... 54
eucrypt_ch6_kecca... 55 function Chi(Input : in State) return State is
eucrypt_ch6_kecca... 56 Output: State;
eucrypt_ch6_kecca... 57 begin
eucrypt_ch6_kecca... 58 for Y in XYCoord loop
eucrypt_ch6_kecca... 59 for X in XYCoord loop
eucrypt_ch6_kecca... 60 Output(X, Y) := Input(X, Y) xor
eucrypt_ch6_kecca... 61 ( (not Input(X + 1, Y)) and Input(X + 2, Y) );
eucrypt_ch6_kecca... 62 end loop;
eucrypt_ch6_kecca... 63 end loop;
eucrypt_ch6_kecca... 64 return Output;
eucrypt_ch6_kecca... 65 end chi;
eucrypt_ch6_kecca... 66
eucrypt_ch6_kecca... 67 function Iota(Round_Const : in ZWord; Input : in State) return State is
eucrypt_ch6_kecca... 68 Output: State;
eucrypt_ch6_kecca... 69 begin
eucrypt_ch6_kecca... 70 Output := Input;
eucrypt_ch6_kecca... 71 Output(0,0) := Input(0,0) xor Round_Const;
eucrypt_ch6_kecca... 72 return Output;
eucrypt_ch6_kecca... 73 end iota;
eucrypt_ch6_kecca... 74
eucrypt_ch6_kecca... 75 function Keccak_Function(Input: in State) return State is
eucrypt_ch6_kecca... 76 Output: State;
eucrypt_ch6_kecca... 77 begin
eucrypt_ch6_kecca... 78 Output := Input;
eucrypt_ch6_kecca... 79 for I in Round_Index loop
eucrypt_ch6_kecca... 80 Output := Iota(RC(I), Chi(Pi(Rho(Theta(Output)))));
eucrypt_ch6_kecca... 81 end loop;
eucrypt_ch6_kecca... 82
eucrypt_ch6_kecca... 83 return Output;
eucrypt_ch6_kecca... 84 end Keccak_Function;
eucrypt_ch6_kecca... 85
eucrypt_ch6_kecca... 86 end SMG_Keccak;