Subversion Repositories decoder

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 daniel-mar 1
{Copyright:      Hagen Reddmann HaReddmann at T-Online dot de
2
 Author:         Hagen Reddmann
3
 Remarks:        freeware, but this Copyright must be included
4
 known Problems: none
5
 Version:        5.1, Delphi Encryption Compendium
6
                 Delphi 2-4, BCB 3-4, designed and testet under D3-5
7
 Description:    secure protected Random Number Generator based on Yarrow
8
 
9
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
10
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
11
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
12
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
13
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
14
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
15
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
16
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
17
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
18
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
19
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20
}
21
 
22
unit DECRandom;
23
 
24
interface
25
 
26
implementation
27
 
28
uses SysUtils, DECUtil, DECFmt, DECHash;
29
 
30
var
31
  RandomClass: TDECHashClass = THash_SHA1;
32
  FRegister: array[0..127] of Byte;
33
  FCounter: Cardinal;
34
  FHash: TDECHash = nil;
35
 
36
function DoProcess: Byte;
37
begin
38
  if not IsObject(FHash, RandomClass) then FHash := RandomClass.Create;
39
  FHash.Init;
40
  FHash.Calc(FCounter, SizeOf(FCounter));
41
  FHash.Calc(FRegister, SizeOf(FRegister));
42
  FHash.Done;
43
  FRegister[FCounter mod SizeOf(FRegister)] := FRegister[FCounter mod SizeOf(FRegister)] xor FHash.Digest[0];
44
  Inc(FCounter);
45
  Result := FHash.Digest[1]; // no real predictable dependency to above FHash.Digest[0] !
46
end;
47
 
48
procedure DoBuffer(var Buffer; Size: Integer);
49
var
50
  I: Integer;
51
begin
52
  for I := 0 to Size -1 do
53
    TByteArray(Buffer)[I] := DoProcess;
54
end;
55
 
56
procedure DoSeed(const Buffer; Size: Integer);
57
var
58
  I: Integer;
59
  T: Cardinal;
60
begin
61
  if Size >= 0 then              
62
  begin
63
// initalize a repeatable Seed  
64
    FillChar(FRegister, SizeOf(FRegister), 0);
65
    FCounter := 0;
66
    for I := 0 to Size -1 do
67
      FRegister[I mod SizeOf(FRegister)] := FRegister[I mod SizeOf(FRegister)] xor TByteArray(Buffer)[I];
68
  end else
69
  begin
70
// initalize a non-repeatable Seed based on Timers,
71
// ATTENTION! this way isn't secure inpredictable,
72
// the user should call RandomSeed(Data, SizeOf(Data)) instead,
73
// where Date contains as example collected informations based on Human inputs.
74
    T := RandomSystemTime;
75
    for I := Low(FRegister) to High(FRegister) do
76
    begin
77
      FRegister[I] := FRegister[I] xor Byte(T);
78
      T := T shl 1 or T shr 31;
79
    end;
80
  end;
81
  for I := Low(FRegister) to High(FRegister) do
82
    DoProcess;
83
  FCounter := 0;
84
end;
85
 
86
procedure DoInit;
87
begin
88
  DoRandomBuffer := DoBuffer;
89
  DoRandomSeed := DoSeed;
90
  DoSeed('', 0);
91
end;
92
 
93
procedure DoDone;
94
begin
95
  try
96
    FHash.Free;
97
  except
98
  end;
99
  FHash := nil;
100
  FillChar(FRegister, SizeOf(FRegister), 0);
101
  FCounter := 0;
102
end;
103
 
104
initialization
105
  DoInit;
106
finalization
107
  DoDone;
108
end.