Subversion Repositories decoder

Compare Revisions

Regard whitespace Rev 1 → Rev 2

/trunk/VCL_DEC/DECRandom.pas
0,0 → 1,108
{Copyright: Hagen Reddmann HaReddmann at T-Online dot de
Author: Hagen Reddmann
Remarks: freeware, but this Copyright must be included
known Problems: none
Version: 5.1, Delphi Encryption Compendium
Delphi 2-4, BCB 3-4, designed and testet under D3-5
Description: secure protected Random Number Generator based on Yarrow
 
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
 
unit DECRandom;
 
interface
 
implementation
 
uses SysUtils, DECUtil, DECFmt, DECHash;
 
var
RandomClass: TDECHashClass = THash_SHA1;
FRegister: array[0..127] of Byte;
FCounter: Cardinal;
FHash: TDECHash = nil;
 
function DoProcess: Byte;
begin
if not IsObject(FHash, RandomClass) then FHash := RandomClass.Create;
FHash.Init;
FHash.Calc(FCounter, SizeOf(FCounter));
FHash.Calc(FRegister, SizeOf(FRegister));
FHash.Done;
FRegister[FCounter mod SizeOf(FRegister)] := FRegister[FCounter mod SizeOf(FRegister)] xor FHash.Digest[0];
Inc(FCounter);
Result := FHash.Digest[1]; // no real predictable dependency to above FHash.Digest[0] !
end;
 
procedure DoBuffer(var Buffer; Size: Integer);
var
I: Integer;
begin
for I := 0 to Size -1 do
TByteArray(Buffer)[I] := DoProcess;
end;
 
procedure DoSeed(const Buffer; Size: Integer);
var
I: Integer;
T: Cardinal;
begin
if Size >= 0 then
begin
// initalize a repeatable Seed
FillChar(FRegister, SizeOf(FRegister), 0);
FCounter := 0;
for I := 0 to Size -1 do
FRegister[I mod SizeOf(FRegister)] := FRegister[I mod SizeOf(FRegister)] xor TByteArray(Buffer)[I];
end else
begin
// initalize a non-repeatable Seed based on Timers,
// ATTENTION! this way isn't secure inpredictable,
// the user should call RandomSeed(Data, SizeOf(Data)) instead,
// where Date contains as example collected informations based on Human inputs.
T := RandomSystemTime;
for I := Low(FRegister) to High(FRegister) do
begin
FRegister[I] := FRegister[I] xor Byte(T);
T := T shl 1 or T shr 31;
end;
end;
for I := Low(FRegister) to High(FRegister) do
DoProcess;
FCounter := 0;
end;
 
procedure DoInit;
begin
DoRandomBuffer := DoBuffer;
DoRandomSeed := DoSeed;
DoSeed('', 0);
end;
 
procedure DoDone;
begin
try
FHash.Free;
except
end;
FHash := nil;
FillChar(FRegister, SizeOf(FRegister), 0);
FCounter := 0;
end;
 
initialization
DoInit;
finalization
DoDone;
end.