diff -uNr a/vtools/ksum.gpr b/vtools/ksum.gpr --- a/vtools/ksum.gpr false +++ b/vtools/ksum.gpr 134fd11107c54b29987b07535a29ace30b0ab066c929988a973c15acfb7340a02dd812f21e5ce104482c432590029f58efd78c58e50e9fa561c4e788d973ea0b @@ -0,0 +1,7 @@ +project Ksum is + for Languages use ("Ada"); + for Source_Dirs use ("src"); + for Object_Dir use "obj"; + for Exec_Dir use "."; + for Main use ("ksum.adb"); +end Ksum; diff -uNr a/vtools/manifest b/vtools/manifest --- a/vtools/manifest 46f4dceb24634a095a5ae2e5993d41ae1d12ec92275e4dbc83dd6737e3512fb2608c2065b0307eddfbac4d3e0782edc9dfb3ca74a94962630ad7482e09b1096d +++ b/vtools/manifest bb7b5cb38ad1749d191b26362c637e55b9abc4a4b689885ececc5c7eea142d86ef56278874b665bb0c14f73819f2857e33f888bcfdc2bde3f3401f241fa566a4 @@ -6,3 +6,4 @@ 514700 phf vtools_vpatch Initial vpatch tool implementation in Ada. 517100 phf vtools_fixes_static_tohex Fixes for xalloc's use of static inline courtesy of spyked, fix broken ToHex implementation 517100 phf vtools_vpatch_newline Vpatch tool support for "No newline at end of file" directive. +543200 phf vtools_ksum Ksum standalone keccak hasher diff -uNr a/vtools/src/ksum.adb b/vtools/src/ksum.adb --- a/vtools/src/ksum.adb false +++ b/vtools/src/ksum.adb 4a973d255432bc899fb3dfe8ab16f5a9a29578fd141dbc501083cfde8d9c42f8d037d778b5df1458b9ea86623ef675db876ef38c9792c3fdb1834f55b4fec248 @@ -0,0 +1,69 @@ +with Ada.Command_Line; use Ada.Command_Line; +with Ada.Directories;use Ada.Directories; +with Ada.Exceptions; +with Ada.Io_Exceptions; +with Ada.Sequential_IO; +with Ada.Text_IO; use Ada.Text_IO; +with Bits; use Bits; +with Interfaces; use Interfaces; +with SMG_Keccak; use SMG_Keccak; +with Character_IO; use Character_IO; +procedure Ksum is + Buffer_Size: constant Natural := 2048; + Hash_Size: constant Natural := 64; + Byte_Size: constant Natural := 8; + + package CIO renames Character_IO.Character_IO; + Fs: File_Size; + File: CIO.File_Type; + Ctx: Keccak_Context(Block_Len=>Default_Bitrate); + Buf: String(1..Buffer_Size); + B: Bitstream(1..Buf'Length*Byte_Size); + + function Read_Buffer return Integer is + C: Character; + begin + for I in 1..Buf'Length loop + CIO.Read(File, C); + Buf(I):=C; + if End_Of_File(File) then + return I; + end if; + end loop; + return Buf'Length; + end Read_Buffer; + +begin + for Arg in 1..Argument_Count loop + declare + Filename: String:=Argument(Arg); + begin + Fs:=Size(Filename); + Character_IO.Open(File, CIO.In_File, Filename); + declare + O: Bitstream(1..Hash_Size*Byte_Size); + N: Integer; + begin + KeccakBegin(Ctx); + Read_Loop: + loop + exit Read_Loop when End_Of_File(File); + N := Read_Buffer; + ToBitstream(Buf(1..N), B(1..N*Byte_Size)); + KeccakHash(Ctx, B(1..N*Byte_Size)); + end loop Read_Loop; + KeccakEnd(Ctx, O); + declare + Hex: String := ToHex(O); + begin + Put(Hex); Put(" "); Put_Line(Filename); + end; + end; + Character_IO.Close(File); + exception + when The_Error : others => + Put(Standard_Error, Filename); Put(": "); + Put_Line(Ada.Exceptions.Exception_Message(The_Error)); + end; + end loop; +end;