📄 dcpsha512.pas
字号:
TestHash: TDCP_sha384;
TestOut: array[0..47] of byte;
begin
TestHash:= TDCP_sha384.Create(nil);
TestHash.Init;
TestHash.UpdateStr('abc');
TestHash.Final(TestOut);
Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)));
TestHash.Init;
TestHash.UpdateStr('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu');
TestHash.Final(TestOut);
Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result;
TestHash.Free;
end;
procedure TDCP_sha384.Init;
begin
Burn;
CurrentHash[0]:= $cbbb9d5dc1059ed8;
CurrentHash[1]:= $629a292a367cd507;
CurrentHash[2]:= $9159015a3070dd17;
CurrentHash[3]:= $152fecd8f70e5939;
CurrentHash[4]:= $67332667ffc00b31;
CurrentHash[5]:= $8eb44a8768581511;
CurrentHash[6]:= $db0c2e0d64f98fa7;
CurrentHash[7]:= $47b5481dbefa4fa4;
fInitialized:= true;
end;
procedure TDCP_sha384.Final(var Digest);
begin
if not fInitialized then
raise EDCP_hash.Create('Hash not initialized');
HashBuffer[Index]:= $80;
if Index>= 112 then
Compress;
Pint64(@HashBuffer[112])^:= SwapDWord(LenHi);
Pint64(@HashBuffer[120])^:= SwapDWord(LenLo);
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]);
CurrentHash[5]:= SwapDWord(CurrentHash[5]);
Move(CurrentHash,Digest,384 div 8);
Burn;
end;
{******************************************************************************}
class function TDCP_sha512.GetAlgorithm: string;
begin
Result:= 'SHA512';
end;
class function TDCP_sha512.GetId: integer;
begin
Result:= DCP_sha512;
end;
class function TDCP_sha512.GetHashSize: integer;
begin
Result:= 512;
end;
class function TDCP_sha512.SelfTest: boolean;
const
Test1Out: array[0..63] of byte=
($dd,$af,$35,$a1,$93,$61,$7a,$ba,$cc,$41,$73,$49,$ae,$20,$41,$31,
$12,$e6,$fa,$4e,$89,$a9,$7e,$a2,$0a,$9e,$ee,$e6,$4b,$55,$d3,$9a,
$21,$92,$99,$2a,$27,$4f,$c1,$a8,$36,$ba,$3c,$23,$a3,$fe,$eb,$bd,
$45,$4d,$44,$23,$64,$3c,$e8,$0e,$2a,$9a,$c9,$4f,$a5,$4c,$a4,$9f);
Test2Out: array[0..63] of byte=
($8e,$95,$9b,$75,$da,$e3,$13,$da,$8c,$f4,$f7,$28,$14,$fc,$14,$3f,
$8f,$77,$79,$c6,$eb,$9f,$7f,$a1,$72,$99,$ae,$ad,$b6,$88,$90,$18,
$50,$1d,$28,$9e,$49,$00,$f7,$e4,$33,$1b,$99,$de,$c4,$b5,$43,$3a,
$c7,$d3,$29,$ee,$b6,$dd,$26,$54,$5e,$96,$e5,$5b,$87,$4b,$e9,$09);
var
TestHash: TDCP_sha512;
TestOut: array[0..63] of byte;
begin
TestHash:= TDCP_sha512.Create(nil);
TestHash.Init;
TestHash.UpdateStr('abc');
TestHash.Final(TestOut);
Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)));
TestHash.Init;
TestHash.UpdateStr('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu');
TestHash.Final(TestOut);
Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result;
TestHash.Free;
end;
procedure TDCP_sha512.Init;
begin
Burn;
CurrentHash[0]:= $6a09e667f3bcc908;
CurrentHash[1]:= $bb67ae8584caa73b;
CurrentHash[2]:= $3c6ef372fe94f82b;
CurrentHash[3]:= $a54ff53a5f1d36f1;
CurrentHash[4]:= $510e527fade682d1;
CurrentHash[5]:= $9b05688c2b3e6c1f;
CurrentHash[6]:= $1f83d9abfb41bd6b;
CurrentHash[7]:= $5be0cd19137e2179;
fInitialized:= true;
end;
procedure TDCP_sha512.Final(var Digest);
begin
if not fInitialized then
raise EDCP_hash.Create('Hash not initialized');
HashBuffer[Index]:= $80;
if Index>= 112 then
Compress;
Pint64(@HashBuffer[112])^:= SwapDWord(LenHi);
Pint64(@HashBuffer[120])^:= SwapDWord(LenLo);
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]);
CurrentHash[5]:= SwapDWord(CurrentHash[5]);
CurrentHash[6]:= SwapDWord(CurrentHash[6]);
CurrentHash[7]:= SwapDWord(CurrentHash[7]);
Move(CurrentHash,Digest,Sizeof(CurrentHash));
Burn;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -