* Merged revision 3541

git-svn-id: branches/fixes_2_0@3542 -
This commit is contained in:
michael 2006-05-15 19:34:51 +00:00
parent 9c9a742eec
commit 378b08c4a7

View File

@ -15,7 +15,7 @@
{$mode objfpc}
{$endif}
UNIT IDEA;
Unit idea;
{
IDEA encryption routines for pascal
@ -48,68 +48,63 @@ INTERFACE
Uses Sysutils,Classes;
CONST IDEAKEYSIZE = 16;
IDEABLOCKSIZE = 8;
ROUNDS = 8;
KEYLEN = (6*ROUNDS+4);
CONST
IDEAKEYSIZE = 16;
IDEABLOCKSIZE = 8;
ROUNDS = 8;
KEYLEN = (6*ROUNDS+4);
TYPE IDEAkey = ARRAY[0..keylen-1] OF Word;
ideacryptkey = ARRAY[0..7] OF Word;
ideacryptdata = ARRAY[0..3] OF Word;
PROCEDURE EnKeyIdea(userkey: ideacryptkey; VAR z: ideakey);
PROCEDURE DeKeyIdea(z: IDEAKey; VAR dk: ideakey);
PROCEDURE CipherIdea(input: ideacryptdata; VAR outdata: ideacryptdata; z: IDEAkey);
TYPE
TIDEAKey = ARRAY[0..keylen-1] OF Word;
TIdeaCryptKey = ARRAY[0..7] OF Word;
TIdeaCryptData = ARRAY[0..3] OF Word;
{ For backward compatibility }
IDEAkey = TIDEAkey;
IdeaCryptKey = TIdeaCryptKey;
IdeaCryptData = TIdeaCryptData;
PROCEDURE EnKeyIdea(UserKey: TIdeacryptkey; VAR z: TIDEAKey);
PROCEDURE DeKeyIdea(z: TIDEAKey; VAR dk: TIDEAKey);
PROCEDURE CipherIdea(Input: TIDEACryptData; VAR outdata: TIDEACryptData; z: TIDEAKey);
Type
EIDEAError = Class(EStreamError);
EIDEAError = Class(EStreamError);
TIDEAEncryptStream = Class(TStream)
private
FDest : TStream;
FKey : IDEAKey;
FData : IDEACryptData;
TIDEAStream = Class(TOwnerStream)
Private
FKey : TIDEAKey;
FData : TIDEACryptData;
FBufpos : Byte;
FPos : Longint;
FPos : Longint;
Public
Constructor Create(AKey : TIDEAKey; Dest: TStream);
Property Key : TIDEAKey Read FKey;
end;
TIDEAEncryptStream = Class(TIDEAStream)
public
constructor Create(AKey : ideakey; Dest: TStream);
destructor Destroy; override;
Destructor Destroy; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
procedure Flush;
Property Key : IDEAKey Read FKey;
end;
TIDEADeCryptStream = Class(TStream)
private
FSRC : TStream;
FKey : IDEAKey;
FData : IDEACryptData;
FBufpos : Byte;
FPos : Longint;
TIDEADeCryptStream = Class(TIDEAStream)
public
constructor Create(AKey : ideakey; Src: TStream);
destructor Destroy; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
Property Key : IDEAKey Read FKey;
end;
IMPLEMENTATION
Implementation
Const
SNoSeekAllowed = 'Seek not allowed on encryption streams';
SNoReadAllowed = 'Reading from encryption stream not allowed';
SNoSeekAllowed = 'Seek not allowed on encryption streams';
SNoReadAllowed = 'Reading from encryption stream not allowed';
SNoWriteAllowed = 'Writing to decryption stream not allowed';
{$ifdef fpc}
Type
PChar = ^Byte;
{$endif}
PROCEDURE mul(VAR a:Word; b: Word);
VAR p: LongInt;
BEGIN
@ -250,16 +245,24 @@ BEGIN
FOR r := 0 TO 51 DO z[r] := 0;
END;
constructor TIDEAEncryptStream.Create(AKey : ideakey; Dest: TStream);
{ ---------------------------------------------------------------------
TIDEAStream
---------------------------------------------------------------------}
Constructor TIDEAStream.Create(AKey : ideakey; Dest: TStream);
begin
inherited Create;
inherited Create(Dest);
FKey:=AKey;
FDest:=Dest;
FBufPos:=0;
Fpos:=0;
end;
{ ---------------------------------------------------------------------
TIDEAEncryptStream
---------------------------------------------------------------------}
Destructor TIDEAEncryptStream.Destroy;
@ -279,7 +282,7 @@ begin
// Fill with nulls
FillChar(PChar(@FData)[FBufPos],SizeOf(FData)-FBufPos,#0);
CipherIdea(Fdata,OutData,FKey);
FDest.Write(OutData,SizeOf(OutData));
Source.Write(OutData,SizeOf(OutData));
// fixed: Manual flush and then free will now work
FBufPos := 0;
end;
@ -310,7 +313,7 @@ begin
// Empty buffer.
CipherIdea(Fdata,OutData,FKey);
// this will raise an exception if needed.
FDest.Writebuffer(OutData,SizeOf(OutData));
Source.Writebuffer(OutData,SizeOf(OutData));
FBufPos:=0;
end
else
@ -331,20 +334,11 @@ begin
Raise EIDEAError.Create(SNoSeekAllowed);
end;
constructor TIDEADeCryptStream.Create(AKey : ideakey; Src: TStream);
begin
inherited Create;
FKey:=AKey;
FPos:=0;
FBufPos:=SizeOf(Fdata);
FSrc:=Src;
end;
{ ---------------------------------------------------------------------
TIDEADecryptStream
---------------------------------------------------------------------}
destructor TIDEADeCryptStream.Destroy;
begin
Inherited destroy;
end;
function TIDEADeCryptStream.Read(var Buffer; Count: Longint): Longint;
@ -370,7 +364,7 @@ begin
// Fill buffer again if needed.
If (FBufPos=SizeOf(FData)) and (Count>0) then
begin
mvsize:=FSrc.Read(InData,SizeOf(InData));
mvsize:=Source.Read(InData,SizeOf(InData));
If mvsize>0 then
begin
If MvSize<SizeOf(InData) Then