keccak 1
keccak 2
keccak 3
keccak 4
keccak 5
keccak 6
keccak 7
keccak 8 package SMG_Keccak is
keccak 9 pragma Pure(SMG_Keccak);
keccak 10
keccak 11
keccak 12 Keccak_L: constant := 6;
keccak 13
keccak 14
keccak 15
keccak 16 Default_Bitrate: constant := 1344;
keccak 17
keccak 18
keccak 19
keccak 20 XY_Length: constant := 5;
keccak 21 Z_Length: constant := 2**Keccak_L;
keccak 22 Width: constant := XY_Length * XY_Length * Z_Length;
keccak 23 N_Rounds: constant := 12 + 2*Keccak_L;
keccak 24
keccak 25
keccak 26 type XYCoord is mod XY_Length;
keccak 27 type ZCoord is mod Z_Length;
keccak 28 type Round_Index is mod N_Rounds;
keccak 29
keccak 30 type ZWord is mod 2**Z_Length;
keccak 31 type Plane is array(XYCoord) of ZWord;
keccak 32 type State is array(XYCoord, XYCoord) of ZWord;
keccak 33
keccak 34 type Round_Constants is array(Round_Index) of ZWord;
keccak 35
keccak 36
keccak 37
keccak 38
keccak 39 subtype Keccak_Rate is Positive range 1..Width;
keccak 40
keccak 41 type Bit is mod 2;
keccak 42 type Bitstream is array( Natural range <> ) of Bit;
keccak 43 subtype Bitword is Bitstream( 0..Z_Length - 1 );
keccak 44
keccak 45
keccak 46 function BitsToWord( BWord : in Bitword ) return ZWord;
keccak 47 function WordToBits( Word : in ZWord ) return Bitword;
keccak 48
keccak 49
keccak 50 function FlipOctets( BWord : in Bitword ) return Bitword;
keccak 51
keccak 52
keccak 53
keccak 54
keccak 55
keccak 56
keccak 57
keccak 58 procedure Sponge(Input : in Bitstream;
keccak 59 Output : out Bitstream;
keccak 60 Block_Len : in Keccak_Rate := Default_Bitrate );
keccak 61
keccak 62 private
keccak 63
keccak 64
keccak 65
keccak 66
keccak 67
keccak 68
keccak 69
keccak 70 procedure SqueezeBlock( Block: out Bitstream; S: in State);
keccak 71
keccak 72
keccak 73
keccak 74
keccak 75
keccak 76 procedure AbsorbBlock( Block: in Bitstream; S: in out State );
keccak 77
keccak 78
keccak 79 RC : constant Round_Constants :=
keccak 80 (
keccak 81 16#0000_0000_0000_0001#,
keccak 82 16#0000_0000_0000_8082#,
keccak 83 16#8000_0000_0000_808A#,
keccak 84 16#8000_0000_8000_8000#,
keccak 85 16#0000_0000_0000_808B#,
keccak 86 16#0000_0000_8000_0001#,
keccak 87 16#8000_0000_8000_8081#,
keccak 88 16#8000_0000_0000_8009#,
keccak 89 16#0000_0000_0000_008A#,
keccak 90 16#0000_0000_0000_0088#,
keccak 91 16#0000_0000_8000_8009#,
keccak 92 16#0000_0000_8000_000A#,
keccak 93 16#0000_0000_8000_808B#,
keccak 94 16#8000_0000_0000_008B#,
keccak 95 16#8000_0000_0000_8089#,
keccak 96 16#8000_0000_0000_8003#,
keccak 97 16#8000_0000_0000_8002#,
keccak 98 16#8000_0000_0000_0080#,
keccak 99 16#0000_0000_0000_800A#,
keccak 100 16#8000_0000_8000_000A#,
keccak 101 16#8000_0000_8000_8081#,
keccak 102 16#8000_0000_0000_8080#,
keccak 103 16#0000_0000_8000_0001#,
keccak 104 16#8000_0000_8000_8008#
keccak 105 );
keccak 106
keccak 107
keccak 108 function Rotate_Left( Value : ZWord;
keccak 109 Amount : Natural)
keccak 110 return ZWord;
keccak 111 pragma Import(Intrinsic, Rotate_Left);
keccak 112
keccak 113 function Shift_Right( Value : ZWord;
keccak 114 Amount : Natural)
keccak 115 return ZWord;
keccak 116 pragma Import(Intrinsic, Shift_Right);
keccak 117
keccak 118 function Shift_Left( Value : ZWord;
keccak 119 Amount : Natural)
keccak 120 return ZWord;
keccak 121 pragma Import(Intrinsic, Shift_Left);
keccak 122
keccak 123
keccak 124 function Theta ( Input : in State) return State;
keccak 125 function Rho ( Input : in State) return State;
keccak 126 function Pi ( Input : in State) return State;
keccak 127 function Chi ( Input : in State) return State;
keccak 128 function Iota ( Round_Const : in ZWord; Input : in State) return State;
keccak 129
keccak 130
keccak 131
keccak 132
keccak 133 function Keccak_Function(Input: in State) return State;
keccak 134
keccak 135 end SMG_Keccak;