sha1.pas
来自「用于开发税务票据管理的软件」· PAS 代码 · 共 284 行 · 第 1/2 页
PAS
284 行
Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $CA62C1D6 + W[70]); B:= (B shl 30) or (B shr 2);
Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $CA62C1D6 + W[71]); A:= (A shl 30) or (A shr 2);
Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $CA62C1D6 + W[72]); E:= (E shl 30) or (E shr 2);
Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $CA62C1D6 + W[73]); D:= (D shl 30) or (D shr 2);
Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $CA62C1D6 + W[74]); C:= (C shl 30) or (C shr 2);
Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $CA62C1D6 + W[75]); B:= (B shl 30) or (B shr 2);
Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $CA62C1D6 + W[76]); A:= (A shl 30) or (A shr 2);
Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $CA62C1D6 + W[77]); E:= (E shl 30) or (E shr 2);
Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $CA62C1D6 + W[78]); D:= (D shl 30) or (D shr 2);
Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $CA62C1D6 + W[79]); C:= (C shl 30) or (C shr 2);
CurrentHash[0]:= CurrentHash[0] + A;
CurrentHash[1]:= CurrentHash[1] + B;
CurrentHash[2]:= CurrentHash[2] + C;
CurrentHash[3]:= CurrentHash[3] + D;
CurrentHash[4]:= CurrentHash[4] + E;
FillChar(W,Sizeof(W),0);
FillChar(HashBuffer,Sizeof(HashBuffer),0);
end;
class function TDCP_sha1.GetAlgorithm: string;
begin
Result:= 'SHA1';
end;
class function TDCP_sha1.GetId: longint;
begin
Result:= DCP_sha1;
end;
class function TDCP_sha1.GetHashSize: longint;
begin
Result:= 160;
end;
class function TDCP_sha1.SelfTest: boolean;
const
Test1Out: array[0..19] of byte=
($A9,$99,$3E,$36,$47,$06,$81,$6A,$BA,$3E,$25,$71,$78,$50,$C2,$6C,$9C,$D0,$D8,$9D);
Test2Out: array[0..19] of byte=
($84,$98,$3E,$44,$1C,$3B,$D2,$6E,$BA,$AE,$4A,$A1,$F9,$51,$29,$E5,$E5,$46,$70,$F1);
var
TestHash: TDCP_sha1;
TestOut: array[0..19] of byte;
begin
TestHash:= TDCP_sha1.Create(nil);
TestHash.Init;
TestHash.UpdateStr('abc');
TestHash.Final(TestOut);
Result:= boolean(CompareMemory(@TestOut,@Test1Out,Sizeof(Test1Out)));
TestHash.Init;
TestHash.UpdateStr('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq');
TestHash.Final(TestOut);
Result:= boolean(CompareMemory(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result;
TestHash.Free;
end;
procedure TDCP_sha1.Init;
begin
Burn;
CurrentHash[0]:= $67452301;
CurrentHash[1]:= $EFCDAB89;
CurrentHash[2]:= $98BADCFE;
CurrentHash[3]:= $10325476;
CurrentHash[4]:= $C3D2E1F0;
fInitialized:= true;
end;
procedure TDCP_sha1.Burn;
begin
LenHi:= 0; LenLo1:= 0; LenLo2:= 0;
Index:= 0;
FillChar(HashBuffer,Sizeof(HashBuffer),0);
FillChar(CurrentHash,Sizeof(CurrentHash),0);
fInitialized:= false;
end;
procedure TDCP_sha1.Update(const Buffer; Size: longint);
var
PBuf: ^byte;
begin
if not fInitialized then
raise EDCP_hash.Create('Hash not initialized');
{ I wish Borland had included an unsigned 32bit from the start }
Inc(LenLo1,(Size shl 3) and $FFFF);
if LenLo1< ((Size shl 3) and $FFFF) then
begin
Inc(LenLo2);
if LenLo2= 0 then
Inc(LenHi);
end;
Inc(LenLo2,Size shr 13);
if LenLo2< ((Size shr 13) and $FFFF) then
Inc(LenHi);
Inc(LenHi,Size shr 29);
PBuf:= @Buffer;
while Size> 0 do
begin
if (Sizeof(HashBuffer)-Index)<= DWord(Size) then
begin
Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index);
Dec(Size,Sizeof(HashBuffer)-Index);
Inc(PBuf,Sizeof(HashBuffer)-Index);
Compress;
end
else
begin
Move(PBuf^,HashBuffer[Index],Size);
Inc(Index,Size);
Size:= 0;
end;
end;
end;
procedure TDCP_sha1.Final(var Digest);
begin
if not fInitialized then
raise EDCP_hash.Create('Hash not initialized');
HashBuffer[Index]:= $80;
if Index>= 56 then
Compress;
PDWord(@HashBuffer[56])^:= SwapDWord(LenHi);
PDWord(@HashBuffer[60])^:= SwapDWord(LenLo1 or (longint(LenLo2) shl 16));
Compress;
CurrentHash[0]:= SwapDWord(CurrentHash[0]);
CurrentHash[1]:= SwapDWord(CurrentHash[1]);
CurrentHash[2]:= SwapDWord(CurrentHash[2]);
CurrentHash[3]:= SwapDWord(CurrentHash[3]);
CurrentHash[4]:= SwapDWord(CurrentHash[4]);
Move(CurrentHash,Digest,Sizeof(CurrentHash));
Burn;
end;
initialization
RegisterClass(TDCP_sha1);
DCPreghash(TDCP_sha1);
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?