File : hash_streams.adb


   1 package body Hash_Streams is
   2    
   3    overriding
   4    procedure Read(Stream : in out Hash_Stream;
   5                   Item   : out Stream_Element_Array;
   6                   Last   : out Stream_Element_Offset) is
   7    begin
   8       Read(Stream.S.all, Item, Last);
   9       Stream.Count := Stream.Count + Item'Length;
  10       GNAT.SHA256.Update(Stream.Ctx, Item);
  11    end Read;
  12    
  13    
  14    overriding
  15    procedure Write(Stream : in out Hash_Stream;
  16                    Item   : in Stream_Element_Array) is
  17    begin
  18       Write(Stream.S.all, Item);
  19       Stream.Count := Stream.Count + Item'Length;
  20       GNAT.SHA256.Update(Stream.Ctx, Item);
  21    end Write;
  22    
  23    
  24    function GetDoubleHash(Stream : in Hash_Stream) return SHA256Hash is
  25       D : GNAT.SHA256.Binary_Message_Digest;
  26       Ctx2nd : GNAT.SHA256.Context := GNAT.SHA256.Initial_Context;
  27    begin
  28       D := GNAT.SHA256.Digest(Stream.Ctx);
  29       GNAT.SHA256.Update(Ctx2nd, D);
  30       D := GNAT.SHA256.Digest(Ctx2nd);
  31       return SHA256Hash(D);
  32    end GetDoubleHash;
  33    
  34    
  35    function GetCount(Stream : in Hash_Stream) return Natural is
  36    begin
  37      return Stream.Count;
  38    end;
  39    pragma inline(GetCount);
  40    
  41 end Hash_Streams;