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;
vdiff_keccak 57 Input: Interfaces.C.Char_Array;
vdiff_keccak 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);
vdiff_keccak 62 begin
vdiff_keccak 63 Interfaces.C.To_Ada(Input, S, L, Trim_Nul => False);
vdiff_keccak 64 ToBitstream(S, B);
vdiff_keccak 65 KeccakHash(Ctx.all, B);
vdiff_keccak 66 end C_Hash;
vdiff_keccak 67
vdiff_keccak 68 procedure C_End(Ctx: C_Context_Access;
vdiff_keccak 69 Output: out Interfaces.C.Char_Array;
vdiff_keccak 70 Len: Interfaces.C.Size_T) is
vdiff_keccak 71 L: Natural := Natural(Len);
vdiff_keccak 72 S: String(1..L);
vdiff_keccak 73 B: Bitstream(1..S'Length*8);
vdiff_keccak 74 Count: Interfaces.C.Size_T;
vdiff_keccak 75 begin
vdiff_keccak 76 KeccakEnd(Ctx.all, B);
vdiff_keccak 77 ToString(B, S);
vdiff_keccak 78 Interfaces.C.To_C(S, Output(0..Len), Count, Append_Nul => False);
vdiff_keccak 79 -- Len = Count
vdiff_keccak 80 end C_End;
vdiff_keccak 81
vdiff_keccak 82 procedure C_Context_Deallocate is new Ada.Unchecked_Deallocation
vdiff_keccak 83 (C_Context, C_Context_Access);
vdiff_keccak 84
vdiff_keccak 85 procedure C_Deallocate(Ctx: in out C_Context_Access) is
vdiff_keccak 86 begin
vdiff_keccak 87 C_Context_Deallocate(Ctx);
vdiff_keccak 88 end C_Deallocate;
vdiff_keccak 89 end Keccak_C;