fpc/packages/fcl-hash/tests/utestsha512.pp
Michaël Van Canneyt 3180a5e83a * PChar -> PAnsiChar
2023-07-15 18:22:41 +02:00

285 lines
6.9 KiB
ObjectPascal

unit utestsha512;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpcunit, testutils, testregistry, fpsha512, fphashutils;
type
{ TTestSHA512 }
TTestSHA512 = class(TTestCase)
Public
Procedure TestHexString(Const aString,aDigest : String);
Procedure TestBase64String(Const aString,aDigest : String);
Procedure TestHMACString(Const aString,aKey,aDigest : String);
published
procedure TestEmpty;
procedure TestSmallString;
procedure TestLargeString;
procedure TestEmptyBase64;
procedure TestSmallBase64;
procedure TestSmallHMAC;
procedure TestHMACStream;
end;
{ TTestSHA384 }
TTestSHA384 = class(TTestCase)
Public
Procedure TestHexString(Const aString,aDigest : String);
Procedure TestBase64String(Const aString,aDigest : String);
Procedure TestHMACString(Const aString,aKey,aDigest : String);
published
procedure TestEmpty;
procedure TestSmallString;
procedure TestLargeString;
procedure TestEmptyBase64;
procedure TestSmallBase64;
procedure TestSmallHMAC;
procedure TestHMACStream;
end;
implementation
uses
basenenc;
{ TTestSHA512 }
procedure TTestSHA512.TestHexString(const aString, aDigest: String);
var
Digest : AnsiString;
S : TBytes;
begin
S:=[];
Digest:='';
S:=TEncoding.UTF8.GetAnsiBytes(aString);
TSHA512.DigestHexa(S, Digest);
AssertEquals('Correct hex digest',aDigest, Digest);
end;
procedure TTestSHA512.TestBase64String(const aString, aDigest: String);
var
Digest : AnsiString;
S : TBytes;
begin
S:=TEncoding.UTF8.GetAnsiBytes(aString);
Digest:='';
TSHA512.DigestBase64(S,False,Digest);
AssertEquals('Correct base64 digest',aDigest, Digest);
end;
procedure TTestSHA512.TestHMACString(const aString, aKey, aDigest: String);
var
Digest : AnsiString;
S,K : TBytes;
begin
S:=TEncoding.UTF8.GetAnsiBytes(aString);
K:=TEncoding.UTF8.GetAnsiBytes(aKey);
TSHA512.HMACHexa(K,S,Digest);
AssertEquals('Correct base64 digest',aDigest, Digest);
end;
const
Empty512Hash = 'CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E';
// Taken from DCPCrypt
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);
procedure TTestSHA512.TestEmpty;
begin
TestHexString('',Empty512Hash);
end;
procedure TTestSHA512.TestSmallString;
Var
S : AnsiString;
begin
BytesToHexStr(S,@Test1Out,SizeOf(Test1Out));
TestHexString('abc',S);
end;
procedure TTestSHA512.TestLargeString;
Var
S : AnsiString;
begin
BytesToHexStr(S,@Test2Out,SizeOf(Test2Out));
TestHexString('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu',S);
end;
procedure TTestSHA512.TestEmptyBase64;
begin
TestBase64String('',Base64.Encode(Base16.Decode(Empty512Hash),False));
end;
procedure TTestSHA512.TestSmallBase64;
begin
TestBase64String('abc',Base64.Encode(@Test1out,SizeOf(Test1Out),False));
end;
procedure TTestSHA512.TestSmallHMAC;
// Consts taken from HashlibTestBase
Const
Expected = 'DEDFCEAD40225068527D0E53B7C892226E188891D939E21A0777A40EA2E29D7233638C178C879F26088A502A887674C01DF61EAF1635D707D114097ED1D0D762';
DefaultData = 'HashLib4Pascal';
begin
TestHMACString(DefaultData,'Hash' ,Expected);
end;
procedure TTestSHA512.TestHMACStream;
Var
S : TStringStream;
res : AnsiString;
begin
BytesToHexStr(Res,@Test1Out,SizeOf(Test1Out));
S:=TStringStream.Create('abc');
try
AssertEquals('Correct hash',Res,TSHA512.StreamHexa(S));
finally
S.Free;
end;
end;
{ TTestSHA384 }
procedure TTestSHA384.TestHexString(const aString, aDigest: String);
var
Digest : AnsiString;
S : TBytes;
begin
S:=[];
Digest:='';
S:=TEncoding.UTF8.GetAnsiBytes(aString);
TSHA384.DigestHexa(S, Digest);
AssertEquals('Correct hex digest',aDigest, Digest);
end;
procedure TTestSHA384.TestBase64String(const aString, aDigest: String);
var
Digest : AnsiString;
S : TBytes;
begin
S:=TEncoding.UTF8.GetAnsiBytes(aString);
Digest:='';
TSHA384.DigestBase64(S,False,Digest);
AssertEquals('Correct base64 digest',aDigest, Digest);
end;
procedure TTestSHA384.TestHMACString(const aString, aKey, aDigest: String);
var
Digest : AnsiString;
S,K : TBytes;
begin
S:=TEncoding.UTF8.GetAnsiBytes(aString);
K:=TEncoding.UTF8.GetAnsiBytes(aKey);
TSHA384.HMACHexa(K,S,Digest);
AssertEquals('Correct base64 digest',aDigest, Digest);
end;
const
Empty384Hash = '38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B';
Test1Out384: array[0..47] of byte=
($cb,$00,$75,$3f,$45,$a3,$5e,$8b,$b5,$a0,$3d,$69,$9a,$c6,$50,$07,
$27,$2c,$32,$ab,$0e,$de,$d1,$63,$1a,$8b,$60,$5a,$43,$ff,$5b,$ed,
$80,$86,$07,$2b,$a1,$e7,$cc,$23,$58,$ba,$ec,$a1,$34,$c8,$25,$a7);
Test2Out384: array[0..47] of byte=
($09,$33,$0c,$33,$f7,$11,$47,$e8,$3d,$19,$2f,$c7,$82,$cd,$1b,$47,
$53,$11,$1b,$17,$3b,$3b,$05,$d2,$2f,$a0,$80,$86,$e3,$b0,$f7,$12,
$fc,$c7,$c7,$1a,$55,$7e,$2d,$b9,$66,$c3,$e9,$fa,$91,$74,$60,$39);
procedure TTestSHA384.TestEmpty;
begin
TestHexString('',Empty384Hash);
end;
procedure TTestSHA384.TestSmallString;
Var
S : AnsiString;
begin
BytesToHexStr(S,@Test1Out384,SizeOf(Test1Out384));
TestHexString('abc',S);
end;
procedure TTestSHA384.TestLargeString;
Var
S : AnsiString;
begin
BytesToHexStr(S,@Test2Out384,SizeOf(Test2Out384));
TestHexString('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu',S);
end;
procedure TTestSHA384.TestEmptyBase64;
begin
TestBase64String('',Base64.Encode(Base16.Decode(Empty384Hash),False));
end;
procedure TTestSHA384.TestSmallBase64;
begin
TestBase64String('abc',Base64.Encode(@Test1out384,SizeOf(Test1Out384),False));
end;
procedure TTestSHA384.TestSmallHMAC;
// Consts taken from HashlibTestBase
Const
Expected = '3D6DCED731DAF3599CC0971646C1A8B8CCC61650722F111A9EB26CE7B65189EB220EACB09152D9A09065099FE6C1FDC9';
DefaultData = 'HashLib4Pascal';
begin
TestHMACString(DefaultData,'Hash' ,Expected);
end;
procedure TTestSHA384.TestHMACStream;
Var
S : TStringStream;
res : AnsiString;
begin
BytesToHexStr(Res,@Test1Out384,SizeOf(Test1Out384));
S:=TStringStream.Create('abc');
try
AssertEquals('Correct hash',Res,TSHA384.StreamHexa(S));
finally
S.Free;
end;
end;
initialization
RegisterTests([TTestSHA512,TTestSHA384]);
end.