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;