-
+ 49E31942E59726FDE97368B5651502C78EFA7602B31E77BDCE9AE745FAB817CBCACF9C166022805BB20BA25AD693CFCF5CF9841252044F5BEA30C89792E1A1E5
eucrypt/smg_keccak/smg_keccak.adb
(0 . 0)(1 . 86)
27 -- S.MG, 2018
28
29 package body SMG_Keccak is
30
31 function Theta(Input : in State) return State is
32 Output : State;
33 C : Plane;
34 W : ZWord;
35 begin
36 for X in XYCoord loop
37 C(X) := Input(X, 0);
38 for Y in 1..XYCoord'Last loop
39 C(X) := C(X) xor Input(X, Y);
40 end loop;
41 end loop;
42
43 for X in XYCoord loop
44 W := C(X-1) xor Rotate_Left(C(X+1), 1);
45 for Y in XYCoord loop
46 Output(X,Y) := Input(X,Y) xor W;
47 end loop;
48 end loop;
49
50 return Output;
51 end Theta;
52
53 function Rho(Input : in State) return State is
54 Output : State;
55 X, Y, Old_Y : XYCoord;
56 begin
57 Output(0,0) := Input(0,0);
58 X := 1;
59 Y := 0;
60
61 for T in 0..23 loop
62 Output(X, Y) := Rotate_Left(Input(X,Y), ((T+1)*(T+2)/2) mod Z_Length);
63 Old_Y := Y;
64 Y := 2*X + 3*Y;
65 X := Old_Y;
66 end loop;
67 return Output;
68 end rho;
69
70 function Pi(Input : in State) return State is
71 Output: State;
72 begin
73 for X in XYCoord loop
74 for Y in XYCoord loop
75 Output(Y, 2*X + 3*Y) := Input(X, Y);
76 end loop;
77 end loop;
78 return Output;
79 end pi;
80
81 function Chi(Input : in State) return State is
82 Output: State;
83 begin
84 for Y in XYCoord loop
85 for X in XYCoord loop
86 Output(X, Y) := Input(X, Y) xor
87 ( (not Input(X + 1, Y)) and Input(X + 2, Y) );
88 end loop;
89 end loop;
90 return Output;
91 end chi;
92
93 function Iota(Round_Const : in ZWord; Input : in State) return State is
94 Output: State;
95 begin
96 Output := Input;
97 Output(0,0) := Input(0,0) xor Round_Const;
98 return Output;
99 end iota;
100
101 function Keccak_Function(Input: in State) return State is
102 Output: State;
103 begin
104 Output := Input;
105 for I in Round_Index loop
106 Output := Iota(RC(I), Chi(Pi(Rho(Theta(Output)))));
107 end loop;
108
109 return Output;
110 end Keccak_Function;
111
112 end SMG_Keccak;