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. |