?? myldbcipher.pas
字號:
begin
I := CipherList.IndexOfObject(Pointer(CipherClass));
if I >= 0 then Result := FCipherList.Names[I]
else Result := GetShortClassName(CipherClass);
end;
function TCipher.GetFlag(Index: Integer): Boolean;
begin
Result := FFlags and (1 shl Index) <> 0;
end;
procedure TCipher.SetFlag(Index: Integer; Value: Boolean);
begin
Index := 1 shl Index;
if Value then FFlags := FFlags or Index
else FFlags := FFlags and not Index;
end;
procedure TCipher.InitBegin(var Size: Integer);
begin
Initialized := False;
Protect;
if Size < 0 then Size := 0;
if Size > KeySize then
if not CheckCipherKeySize then Size := KeySize
else RaiseCipherException(errInvalidKeySize, Format(sInvalidKeySize, [ClassName, 0, KeySize]));
end;
procedure TCipher.InitEnd(IVector: Pointer);
begin
if IVector = nil then Encode(Vector)
else Move(IVector^, Vector^, BufSize);
Move(Vector^, Feedback^, BufSize);
Initialized := True;
end;
class procedure TCipher.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := 0;
AKeySize := 0;
AUserSize := 0;
end;
class function TCipher.TestVector: Pointer;
begin
Result := GetTestVector;
end;
procedure TCipher.Encode(Data: Pointer);
begin
end;
procedure TCipher.Decode(Data: Pointer);
begin
end;
constructor TCipher.Create(const Password: String; AProtection: TProtection);
begin
inherited Create(AProtection);
FHashClass := DefaultHashClass;
GetContext(FBufSize, FKeySize, FUserSize);
GetMem(FVector, FBufSize);
GetMem(FFeedback, FBufSize);
GetMem(FBuffer, FBufSize);
GetMem(FUser, FUserSize);
Protect;
if Password <> '' then InitKey(Password, nil);
end;
destructor TCipher.Destroy;
begin
Protect;
ReallocMem(FVector, 0);
ReallocMem(FFeedback, 0);
ReallocMem(FBuffer, 0);
ReallocMem(FUser, 0);
FHash.Release;
FHash := nil;
inherited Destroy;
end;
class function TCipher.MaxKeySize: Integer;
var
Dummy: Integer;
begin
GetContext(Dummy, Result, Dummy);
end;
class function TCipher.SelfTest: Boolean;
var
Data: array[0..63] of Char;
Key: String;
SaveKeyCheck: Boolean;
begin
Result := InitTestIsOk; {have anonyme modified the testvectors ?}
{we will use the ClassName as Key :-)}
Key := ClassName;
SaveKeyCheck := CheckCipherKeySize;
with Self.Create('', nil) do
try
CheckCipherKeySize := False;
Mode := cmCTS;
Init(PChar(Key)^, Length(Key), nil);
EncodeBuffer(GetTestVector^, Data, 32);
Result := Result and (MemCompare(TestVector, @Data, 32) = 0);
Done;
DecodeBuffer(Data, Data, 32);
Result := Result and (MemCompare(GetTestVector, @Data, 32) = 0);
finally
CheckCipherKeySize := SaveKeyCheck;
Free;
end;
FillChar(Data, SizeOf(Data), 0);
end;
procedure TCipher.Init(const Key; Size: Integer; IVector: Pointer);
begin
end;
procedure TCipher.InitKey(const Key: String; IVector: Pointer);
var
I: Integer;
begin
Hash.Init;
Hash.Calc(PChar(Key)^, Length(Key));
Hash.Done;
I := Hash.DigestKeySize;
if I > FKeySize then I := FKeySize; {generaly will truncate to large Keys}
Init(Hash.DigestKey^, I, IVector);
EncodeBuffer(Hash.DigestKey^, Hash.DigestKey^, Hash.DigestKeySize);
Done;
SetFlag(0, True);
end;
procedure TCipher.Done;
begin
if MemCompare(FVector, FFeedback, FBufSize) = 0 then Exit;
Move(FFeedback^, FBuffer^, FBufSize);
Move(FVector^, FFeedback^, FBufSize);
end;
procedure TCipher.Protect;
begin
SetFlag(0, False);
Initialized := False;
// a Crypto Fanatican say: this is better !!
FillChar(FVector^, FBufSize, $AA);
FillChar(FFeedback^, FBufSize, $AA);
FillChar(FBuffer^, FBufSize, $AA);
FillChar(FUser^, FUserSize, $AA);
FillChar(FVector^, FBufSize, $55);
FillChar(FFeedback^, FBufSize, $55);
FillChar(FBuffer^, FBufSize, $55);
FillChar(FUser^, FUserSize, $55);
FillChar(FVector^, FBufSize, $FF);
FillChar(FFeedback^, FBufSize, $FF);
FillChar(FBuffer^, FBufSize, 0);
FillChar(FUser^, FUserSize, 0);
end;
function TCipher.GetHash: THash;
begin
if not IsObject(FHash, THash) then
begin
if FHashClass = nil then FHashClass := DefaultHashClass;
FHash := FHashClass.Create(nil);
FHash.AddRef;
end;
Result := FHash;
end;
procedure TCipher.SetHashClass(Value: THashClass);
begin
if Value <> FHashClass then
begin
FHash.Release;
FHash := nil;
FHashClass := Value;
if FHashClass = nil then FHashClass := DefaultHashClass;
end;
end;
procedure TCipher.EncodeBuffer(const Source; var Dest; DataSize: Integer);
var
S,D,F: PByte;
begin
if not Initialized then
RaiseCipherException(errNotInitialized, Format(sNotInitialized, [ClassName]));
S := @Source;
D := @Dest;
case FMode of
cmECB:
begin
if S <> D then Move(S^, D^, DataSize);
while DataSize >= FBufSize do
begin
Encode(D);
Inc(D, FBufSize);
Dec(DataSize, FBufSize);
end;
if DataSize > 0 then
begin
Move(D^, FBuffer^, DataSize);
Encode(FBuffer);
Move(FBuffer^, D^, DataSize);
end;
end;
cmCTS:
begin
while DataSize >= FBufSize do
begin
XORBuffers(S, FFeedback, FBufSize, D);
Encode(D);
XORBuffers(D, FFeedback, FBufSize, FFeedback);
Inc(S, FBufSize);
Inc(D, FBufSize);
Dec(DataSize, FBufSize);
end;
if DataSize > 0 then
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
XORBuffers(S, FBuffer, DataSize, D);
XORBuffers(FBuffer, FFeedback, FBufSize, FFeedback);
end;
end;
cmCBC:
begin
F := FFeedback;
while DataSize >= FBufSize do
begin
XORBuffers(S, F, FBufSize, D);
Encode(D);
F := D;
Inc(S, FBufSize);
Inc(D, FBufSize);
Dec(DataSize, FBufSize);
end;
Move(F^, FFeedback^, FBufSize);
if DataSize > 0 then
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
XORBuffers(S, FBuffer, DataSize, D);
XORBuffers(FBuffer, FFeedback, FBufSize, FFeedback);
end;
end;
cmCFB:
while DataSize > 0 do
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
D^ := S^ xor PByte(FBuffer)^;
Move(PByteArray(FFeedback)[1], FFeedback^, FBufSize-1);
PByteArray(FFeedback)[FBufSize-1] := D^;
Inc(D);
Inc(S);
Dec(DataSize);
end;
cmOFB:
while DataSize > 0 do
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
D^ := S^ xor PByte(FBuffer)^;
Move(PByteArray(FFeedback)[1], FFeedback^, FBufSize-1);
PByteArray(FFeedback)[FBufSize-1] := PByte(FBuffer)^;
Inc(D);
Inc(S);
Dec(DataSize);
end;
cmCTSMAC:
begin
while DataSize >= FBufSize do
begin
XORBuffers(S, FFeedback, FBufSize, FBuffer);
Encode(FBuffer);
XORBuffers(FBuffer, FFeedback, FBufSize, FFeedback);
Inc(S, FBufSize);
Dec(DataSize, FBufSize);
end;
if DataSize > 0 then
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
XORBuffers(FBuffer, FFeedback, FBufSize, FFeedback);
end;
end;
cmCBCMAC:
begin
while DataSize >= FBufSize do
begin
XORBuffers(S, FFeedback, FBufSize, FBuffer);
Encode(FBuffer);
Move(FBuffer^, FFeedback^, FBufSize);
Inc(S, FBufSize);
Dec(DataSize, FBufSize);
end;
if DataSize > 0 then
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
XORBuffers(FBuffer, FFeedback, FBufSize, FFeedback);
end;
end;
cmCFBMAC:
while DataSize > 0 do
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
Move(PByteArray(FFeedback)[1], FFeedback^, FBufSize-1);
PByteArray(FFeedback)[FBufSize-1] := S^ xor PByte(FBuffer)^;
Inc(S);
Dec(DataSize);
end;
end;
end;
procedure TCipher.DecodeBuffer(const Source; var Dest; DataSize: Integer);
var
S,D,F,B: PByte;
begin
if not Initialized then
RaiseCipherException(errNotInitialized, Format(sNotInitialized, [ClassName]));
S := @Source;
D := @Dest;
case FMode of
cmECB:
begin
if S <> D then Move(S^, D^, DataSize);
while DataSize >= FBufSize do
begin
Decode(D);
Inc(D, FBufSize);
Dec(DataSize, FBufSize);
end;
if DataSize > 0 then
begin
Move(D^, FBuffer^, DataSize);
Encode(FBuffer);
Move(FBuffer^, D^, DataSize);
end;
end;
cmCTS:
begin
if S <> D then Move(S^, D^, DataSize);
F := FFeedback;
B := FBuffer;
while DataSize >= FBufSize do
begin
XORBuffers(D, F, FBufSize, B);
Decode(D);
XORBuffers(D, F, FBufSize, D);
S := B;
B := F;
F := S;
Inc(D, FBufSize);
Dec(DataSize, FBufSize);
end;
if F <> FFeedback then Move(F^, FFeedback^, FBufSize);
if DataSize > 0 then
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
XORBuffers(FBuffer, D, DataSize, D);
XORBuffers(FBuffer, FFeedback, FBufSize, FFeedback);
end;
end;
cmCBC:
begin
if S <> D then Move(S^, D^, DataSize);
F := FFeedback;
B := FBuffer;
while DataSize >= FBufSize do
begin
Move(D^, B^, FBufSize);
Decode(D);
XORBuffers(F, D, FBufSize, D);
S := B;
B := F;
F := S;
Inc(D, FBufSize);
Dec(DataSize, FBufSize);
end;
if F <> FFeedback then Move(F^, FFeedback^, FBufSize);
if DataSize > 0 then
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
XORBuffers(D, FBuffer, DataSize, D);
XORBuffers(FBuffer, FFeedback, FBufSize, FFeedback);
end;
end;
cmCFB:
while DataSize > 0 do
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
Move(PByteArray(FFeedback)[1], FFeedback^, FBufSize-1);
PByteArray(FFeedback)[FBufSize-1] := S^;
D^ := S^ xor PByte(FBuffer)^;
Inc(D);
Inc(S);
Dec(DataSize);
end;
cmOFB:
while DataSize > 0 do
begin
Move(FFeedback^, FBuffer^, FBufSize);
Encode(FBuffer);
D^ := S^ xor PByte(FBuffer)^;
Move(PByteArray(FFeedback)[1], FFeedback^, FBufSize-1);
PByteArray(FFeedback)[FBufSize-1] := PByte(FBuffer)^;
Inc(D);
Inc(S);
Dec(DataSize);
end;
cmCTSMAC, cmCBCMAC, cmCFBMAC:
begin
EncodeBuffer(Source, Dest, DataSize);
Exit;
end;
end;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -