raw
vdiff_keccak            1 package body Keccak_C is
vdiff_keccak 2 -- helper functions
vdiff_keccak 3 procedure ToBitstream(S: in String; B: out Bitstream ) is
vdiff_keccak 4 V : Unsigned_8;
vdiff_keccak 5 Pos : Natural;
vdiff_keccak 6 begin
vdiff_keccak 7 Pos := B'First;
vdiff_keccak 8 for C of S loop
vdiff_keccak 9 V := Character'Pos( C );
vdiff_keccak 10 B( Pos ) := Bit( V and 1 );
vdiff_keccak 11 B( Pos + 1 ) := Bit( Shift_Right( V, 1 ) and 1 );
vdiff_keccak 12 B( Pos + 2 ) := Bit( Shift_Right( V, 2 ) and 1 );
vdiff_keccak 13 B( Pos + 3 ) := Bit( Shift_Right( V, 3 ) and 1 );
vdiff_keccak 14 B( Pos + 4 ) := Bit( Shift_Right( V, 4 ) and 1 );
vdiff_keccak 15 B( Pos + 5 ) := Bit( Shift_Right( V, 5 ) and 1 );
vdiff_keccak 16 B( Pos + 6 ) := Bit( Shift_Right( V, 6 ) and 1 );
vdiff_keccak 17 B( Pos + 7 ) := Bit( Shift_Right( V, 7 ) and 1 );
vdiff_keccak 18 Pos := Pos + 8;
vdiff_keccak 19 end loop;
vdiff_keccak 20 end ToBitstream;
vdiff_keccak 21
vdiff_keccak 22 procedure ToString(B: in Bitstream; S: out String ) is
vdiff_keccak 23 N : Natural;
vdiff_keccak 24 Pos : Natural;
vdiff_keccak 25 begin
vdiff_keccak 26 Pos := B'First;
vdiff_keccak 27 for I in S'Range loop
vdiff_keccak 28 N := Natural( B( Pos ) ) +
vdiff_keccak 29 Natural( B( Pos + 1 ) ) * 2 +
vdiff_keccak 30 Natural( B( Pos + 2 ) ) * 4 +
vdiff_keccak 31 Natural( B( Pos + 3 ) ) * 8 +
vdiff_keccak 32 Natural( B( Pos + 4 ) ) * 16 +
vdiff_keccak 33 Natural( B( Pos + 5 ) ) * 32 +
vdiff_keccak 34 Natural( B( Pos + 6 ) ) * 64 +
vdiff_keccak 35 Natural( B( Pos + 7 ) ) * 128;
vdiff_keccak 36 Pos := Pos + 8;
vdiff_keccak 37 S( I ) := Character'Val( N );
vdiff_keccak 38 end loop;
vdiff_keccak 39 end ToString;
vdiff_keccak 40
vdiff_keccak 41 -- C interface
vdiff_keccak 42
vdiff_keccak 43 procedure C_Get_Size(Size: out Interfaces.C.size_t) is
vdiff_keccak 44 begin
vdiff_keccak 45 Size := C_Context'Size / 8;
vdiff_keccak 46 end C_Get_Size;
vdiff_keccak 47
vdiff_keccak 48 function C_Begin return C_Context_Access is
vdiff_keccak 49 Result : C_Context_Access;
vdiff_keccak 50 begin
vdiff_keccak 51 Result := new C_Context;
vdiff_keccak 52 KeccakBegin(Result.all);
vdiff_keccak 53 return Result;
vdiff_keccak 54 end C_Begin;
vdiff_keccak 55
vdiff_keccak 56 procedure C_Hash(Ctx: in C_Context_Access;
vtools_fixes_bitr... 57 Input: Char_Star;
vtools_fixes_bitr... 58 Len: Interfaces.C.size_t) is
vdiff_keccak 59 L: Natural := Natural(Len);
vdiff_keccak 60 S: String(1..L);
vdiff_keccak 61 B: Bitstream(1..S'Length*8);
vtools_fixes_bitr... 62 Ptr: Char_Star := Input;
vdiff_keccak 63 begin
vtools_fixes_bitr... 64 if Input = null then
vtools_fixes_bitr... 65 raise C.Strings.Dereference_Error;
vtools_fixes_bitr... 66 end if;
vtools_fixes_bitr... 67 for Chr of S loop
vtools_fixes_bitr... 68 Chr := Character(Ptr.all);
vtools_fixes_bitr... 69 Char_Ptrs.Increment(Ptr);
vtools_fixes_bitr... 70 end loop;
vdiff_keccak 71 ToBitstream(S, B);
vdiff_keccak 72 KeccakHash(Ctx.all, B);
vdiff_keccak 73 end C_Hash;
vdiff_keccak 74
vdiff_keccak 75 procedure C_End(Ctx: C_Context_Access;
vtools_fixes_bitr... 76 Output: Char_Star;
vdiff_keccak 77 Len: Interfaces.C.Size_T) is
vdiff_keccak 78 L: Natural := Natural(Len);
vdiff_keccak 79 S: String(1..L);
vdiff_keccak 80 B: Bitstream(1..S'Length*8);
vtools_fixes_bitr... 81 Ptr: Char_Star := Output;
vdiff_keccak 82 begin
vtools_fixes_bitr... 83 if Output = null then
vtools_fixes_bitr... 84 raise C.Strings.Dereference_Error;
vtools_fixes_bitr... 85 end if;
vdiff_keccak 86 KeccakEnd(Ctx.all, B);
vdiff_keccak 87 ToString(B, S);
vtools_fixes_bitr... 88 for Chr of S loop
vtools_fixes_bitr... 89 Ptr.all := Interfaces.C.char(Chr);
vtools_fixes_bitr... 90 Char_Ptrs.Increment(Ptr);
vtools_fixes_bitr... 91 end loop;
vdiff_keccak 92 -- Len = Count
vdiff_keccak 93 end C_End;
vdiff_keccak 94
vdiff_keccak 95 procedure C_Context_Deallocate is new Ada.Unchecked_Deallocation
vdiff_keccak 96 (C_Context, C_Context_Access);
vdiff_keccak 97
vdiff_keccak 98 procedure C_Deallocate(Ctx: in out C_Context_Access) is
vdiff_keccak 99 begin
vdiff_keccak 100 C_Context_Deallocate(Ctx);
vdiff_keccak 101 end C_Deallocate;
vdiff_keccak 102 end Keccak_C;