diff --git a/HashLib.Benchmark/Delphi/PerformanceBenchmarkConsole.dpr b/HashLib.Benchmark/Delphi/PerformanceBenchmarkConsole.dpr
new file mode 100644
index 0000000..45f62c0
--- /dev/null
+++ b/HashLib.Benchmark/Delphi/PerformanceBenchmarkConsole.dpr
@@ -0,0 +1,139 @@
+program PerformanceBenchmarkConsole;
+
+{$APPTYPE CONSOLE}
+
+uses
+ Classes,
+ SysUtils,
+ uPerformanceBenchmark in '..\src\Core\uPerformanceBenchmark.pas',
+ HlpCRC in '..\..\HashLib\src\Checksum\HlpCRC.pas',
+ HlpICRC in '..\..\HashLib\src\Interfaces\HlpICRC.pas',
+ HlpBitConverter in '..\..\HashLib\src\Utils\HlpBitConverter.pas',
+ HlpGrindahl512 in '..\..\HashLib\src\Crypto\HlpGrindahl512.pas',
+ HlpGrindahl256 in '..\..\HashLib\src\Crypto\HlpGrindahl256.pas',
+ HlpHashFactory in '..\..\HashLib\src\Base\HlpHashFactory.pas',
+ HlpCRC32Fast in '..\..\HashLib\src\Checksum\HlpCRC32Fast.pas',
+ HlpCRC64 in '..\..\HashLib\src\Checksum\HlpCRC64.pas',
+ HlpCRC32 in '..\..\HashLib\src\Checksum\HlpCRC32.pas',
+ HlpBlake2B in '..\..\HashLib\src\Crypto\HlpBlake2B.pas',
+ HlpFNV64 in '..\..\HashLib\src\Hash64\HlpFNV64.pas',
+ HlpBits in '..\..\HashLib\src\Utils\HlpBits.pas',
+ HlpConverters in '..\..\HashLib\src\Utils\HlpConverters.pas',
+ HlpSHA3 in '..\..\HashLib\src\Crypto\HlpSHA3.pas',
+ HlpIHashInfo in '..\..\HashLib\src\Interfaces\HlpIHashInfo.pas',
+ HlpHashBuffer in '..\..\HashLib\src\Base\HlpHashBuffer.pas',
+ HlpSnefru in '..\..\HashLib\src\Crypto\HlpSnefru.pas',
+ HlpHash in '..\..\HashLib\src\Base\HlpHash.pas',
+ HlpXXHash32 in '..\..\HashLib\src\Hash32\HlpXXHash32.pas',
+ HlpXXHash64 in '..\..\HashLib\src\Hash64\HlpXXHash64.pas',
+ HlpHashCryptoNotBuildIn in '..\..\HashLib\src\Base\HlpHashCryptoNotBuildIn.pas',
+ HlpHMACNotBuildInAdapter in '..\..\HashLib\src\Base\HlpHMACNotBuildInAdapter.pas',
+ HlpPBKDF2_HMACNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF2_HMACNotBuildInAdapter.pas',
+ HlpPBKDF_Argon2NotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_Argon2NotBuildInAdapter.pas',
+ HlpArgon2TypeAndVersion in '..\..\HashLib\src\KDF\HlpArgon2TypeAndVersion.pas',
+ HlpPBKDF_ScryptNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_ScryptNotBuildInAdapter.pas',
+ HlpPanama in '..\..\HashLib\src\Crypto\HlpPanama.pas',
+ HlpAdler32 in '..\..\HashLib\src\Checksum\HlpAdler32.pas',
+ HlpAP in '..\..\HashLib\src\Hash32\HlpAP.pas',
+ HlpBernstein in '..\..\HashLib\src\Hash32\HlpBernstein.pas',
+ HlpBernstein1 in '..\..\HashLib\src\Hash32\HlpBernstein1.pas',
+ HlpBKDR in '..\..\HashLib\src\Hash32\HlpBKDR.pas',
+ HlpBlake2S in '..\..\HashLib\src\Crypto\HlpBlake2S.pas',
+ HlpCRC16 in '..\..\HashLib\src\Checksum\HlpCRC16.pas',
+ HlpDEK in '..\..\HashLib\src\Hash32\HlpDEK.pas',
+ HlpDJB in '..\..\HashLib\src\Hash32\HlpDJB.pas',
+ HlpELF in '..\..\HashLib\src\Hash32\HlpELF.pas',
+ HlpFNV in '..\..\HashLib\src\Hash32\HlpFNV.pas',
+ HlpFNV1a in '..\..\HashLib\src\Hash32\HlpFNV1a.pas',
+ HlpFNV1a64 in '..\..\HashLib\src\Hash64\HlpFNV1a64.pas',
+ HlpGost in '..\..\HashLib\src\Crypto\HlpGost.pas',
+ HlpGOST3411_2012 in '..\..\HashLib\src\Crypto\HlpGOST3411_2012.pas',
+ HlpHAS160 in '..\..\HashLib\src\Crypto\HlpHAS160.pas',
+ HlpHashLibTypes in '..\..\HashLib\src\Utils\HlpHashLibTypes.pas',
+ HlpHashResult in '..\..\HashLib\src\Base\HlpHashResult.pas',
+ HlpHashRounds in '..\..\HashLib\src\Base\HlpHashRounds.pas',
+ HlpHashSize in '..\..\HashLib\src\Base\HlpHashSize.pas',
+ HlpHaval in '..\..\HashLib\src\Crypto\HlpHaval.pas',
+ HlpBlake2BP in '..\..\HashLib\src\Crypto\HlpBlake2BP.pas',
+ HlpBlake2SP in '..\..\HashLib\src\Crypto\HlpBlake2SP.pas',
+ HlpBlake3 in '..\..\HashLib\src\Crypto\HlpBlake3.pas',
+ HlpIHash in '..\..\HashLib\src\Interfaces\HlpIHash.pas',
+ HlpIHashResult in '..\..\HashLib\src\Interfaces\HlpIHashResult.pas',
+ HlpIKDF in '..\..\HashLib\src\Interfaces\HlpIKDF.pas',
+ HlpJenkins3 in '..\..\HashLib\src\Hash32\HlpJenkins3.pas',
+ HlpJS in '..\..\HashLib\src\Hash32\HlpJS.pas',
+ HlpKDF in '..\..\HashLib\src\Base\HlpKDF.pas',
+ HlpMD2 in '..\..\HashLib\src\Crypto\HlpMD2.pas',
+ HlpMD4 in '..\..\HashLib\src\Crypto\HlpMD4.pas',
+ HlpMD5 in '..\..\HashLib\src\Crypto\HlpMD5.pas',
+ HlpMDBase in '..\..\HashLib\src\Crypto\HlpMDBase.pas',
+ HlpMultipleTransformNonBlock in '..\..\HashLib\src\Base\HlpMultipleTransformNonBlock.pas',
+ HlpMurmur2 in '..\..\HashLib\src\Hash32\HlpMurmur2.pas',
+ HlpMurmur2_64 in '..\..\HashLib\src\Hash64\HlpMurmur2_64.pas',
+ HlpMurmurHash3_x64_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x64_128.pas',
+ HlpMurmurHash3_x86_32 in '..\..\HashLib\src\Hash32\HlpMurmurHash3_x86_32.pas',
+ HlpMurmurHash3_x86_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x86_128.pas',
+ HlpSipHash128 in '..\..\HashLib\src\Hash128\HlpSipHash128.pas',
+ HlpNullable in '..\..\HashLib\src\Nullable\HlpNullable.pas',
+ HlpNullDigest in '..\..\HashLib\src\NullDigest\HlpNullDigest.pas',
+ HlpOneAtTime in '..\..\HashLib\src\Hash32\HlpOneAtTime.pas',
+ HlpPJW in '..\..\HashLib\src\Hash32\HlpPJW.pas',
+ HlpRadioGatun32 in '..\..\HashLib\src\Crypto\HlpRadioGatun32.pas',
+ HlpRadioGatun64 in '..\..\HashLib\src\Crypto\HlpRadioGatun64.pas',
+ HlpRIPEMD in '..\..\HashLib\src\Crypto\HlpRIPEMD.pas',
+ HlpRIPEMD128 in '..\..\HashLib\src\Crypto\HlpRIPEMD128.pas',
+ HlpRIPEMD160 in '..\..\HashLib\src\Crypto\HlpRIPEMD160.pas',
+ HlpRIPEMD256 in '..\..\HashLib\src\Crypto\HlpRIPEMD256.pas',
+ HlpRIPEMD320 in '..\..\HashLib\src\Crypto\HlpRIPEMD320.pas',
+ HlpRotating in '..\..\HashLib\src\Hash32\HlpRotating.pas',
+ HlpRS in '..\..\HashLib\src\Hash32\HlpRS.pas',
+ HlpSDBM in '..\..\HashLib\src\Hash32\HlpSDBM.pas',
+ HlpSHA0 in '..\..\HashLib\src\Crypto\HlpSHA0.pas',
+ HlpSHA1 in '..\..\HashLib\src\Crypto\HlpSHA1.pas',
+ HlpSHA2_224 in '..\..\HashLib\src\Crypto\HlpSHA2_224.pas',
+ HlpSHA2_256 in '..\..\HashLib\src\Crypto\HlpSHA2_256.pas',
+ HlpSHA2_256Base in '..\..\HashLib\src\Crypto\HlpSHA2_256Base.pas',
+ HlpSHA2_384 in '..\..\HashLib\src\Crypto\HlpSHA2_384.pas',
+ HlpSHA2_512 in '..\..\HashLib\src\Crypto\HlpSHA2_512.pas',
+ HlpSHA2_512_224 in '..\..\HashLib\src\Crypto\HlpSHA2_512_224.pas',
+ HlpSHA2_512_256 in '..\..\HashLib\src\Crypto\HlpSHA2_512_256.pas',
+ HlpSHA2_512Base in '..\..\HashLib\src\Crypto\HlpSHA2_512Base.pas',
+ HlpShiftAndXor in '..\..\HashLib\src\Hash32\HlpShiftAndXor.pas',
+ HlpSipHash in '..\..\HashLib\src\Hash64\HlpSipHash.pas',
+ HlpSuperFast in '..\..\HashLib\src\Hash32\HlpSuperFast.pas',
+ HlpTiger in '..\..\HashLib\src\Crypto\HlpTiger.pas',
+ HlpTiger2 in '..\..\HashLib\src\Crypto\HlpTiger2.pas',
+ HlpWhirlPool in '..\..\HashLib\src\Crypto\HlpWhirlPool.pas',
+ HlpArrayUtils in '..\..\HashLib\src\Utils\HlpArrayUtils.pas',
+ HlpBlake2SParams in '..\..\HashLib\src\Crypto\Blake2SParams\HlpBlake2SParams.pas',
+ HlpBlake2BParams in '..\..\HashLib\src\Crypto\Blake2BParams\HlpBlake2BParams.pas',
+ HlpIBlake2SParams in '..\..\HashLib\src\Interfaces\IBlake2SParams\HlpIBlake2SParams.pas',
+ HlpIBlake2BParams in '..\..\HashLib\src\Interfaces\IBlake2BParams\HlpIBlake2BParams.pas';
+
+var
+ StringList: TStringList;
+ Log: String;
+
+begin
+ try
+ Writeln('Please be patient, this might take some time' + SLineBreak);
+ StringList := TStringList.Create;
+ try
+ TPerformanceBenchmark.DoBenchmark(StringList);
+
+ for Log in StringList do
+ begin
+ Writeln(Log);
+ end;
+
+ finally
+ StringList.Free;
+ end;
+ Writeln(SLineBreak + 'Performance Benchmark Finished');
+ ReadLn;
+ except
+ on E: Exception do
+ Writeln(E.ClassName, ': ', E.Message);
+ end;
+
+end.
diff --git a/HashLib.Benchmark/Delphi/PerformanceBenchmarkFMX.dpr b/HashLib.Benchmark/Delphi/PerformanceBenchmarkFMX.dpr
new file mode 100644
index 0000000..032bf80
--- /dev/null
+++ b/HashLib.Benchmark/Delphi/PerformanceBenchmarkFMX.dpr
@@ -0,0 +1,118 @@
+program PerformanceBenchmarkFMX;
+
+uses
+ System.StartUpCopy,
+ FMX.Forms,
+ fmxMainForm in '..\src\Forms\FMX\fmxMainForm.pas' {MainForm},
+ uPerformanceBenchmark in '..\src\Core\uPerformanceBenchmark.pas',
+ HlpCRC in '..\..\HashLib\src\Checksum\HlpCRC.pas',
+ HlpICRC in '..\..\HashLib\src\Interfaces\HlpICRC.pas',
+ HlpBitConverter in '..\..\HashLib\src\Utils\HlpBitConverter.pas',
+ HlpGrindahl512 in '..\..\HashLib\src\Crypto\HlpGrindahl512.pas',
+ HlpGrindahl256 in '..\..\HashLib\src\Crypto\HlpGrindahl256.pas',
+ HlpHashFactory in '..\..\HashLib\src\Base\HlpHashFactory.pas',
+ HlpCRC32Fast in '..\..\HashLib\src\Checksum\HlpCRC32Fast.pas',
+ HlpCRC64 in '..\..\HashLib\src\Checksum\HlpCRC64.pas',
+ HlpCRC32 in '..\..\HashLib\src\Checksum\HlpCRC32.pas',
+ HlpBlake2B in '..\..\HashLib\src\Crypto\HlpBlake2B.pas',
+ HlpFNV64 in '..\..\HashLib\src\Hash64\HlpFNV64.pas',
+ HlpBits in '..\..\HashLib\src\Utils\HlpBits.pas',
+ HlpConverters in '..\..\HashLib\src\Utils\HlpConverters.pas',
+ HlpSHA3 in '..\..\HashLib\src\Crypto\HlpSHA3.pas',
+ HlpIHashInfo in '..\..\HashLib\src\Interfaces\HlpIHashInfo.pas',
+ HlpHashBuffer in '..\..\HashLib\src\Base\HlpHashBuffer.pas',
+ HlpSnefru in '..\..\HashLib\src\Crypto\HlpSnefru.pas',
+ HlpHash in '..\..\HashLib\src\Base\HlpHash.pas',
+ HlpXXHash32 in '..\..\HashLib\src\Hash32\HlpXXHash32.pas',
+ HlpXXHash64 in '..\..\HashLib\src\Hash64\HlpXXHash64.pas',
+ HlpHashCryptoNotBuildIn in '..\..\HashLib\src\Base\HlpHashCryptoNotBuildIn.pas',
+ HlpHMACNotBuildInAdapter in '..\..\HashLib\src\Base\HlpHMACNotBuildInAdapter.pas',
+ HlpPBKDF2_HMACNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF2_HMACNotBuildInAdapter.pas',
+ HlpPBKDF_Argon2NotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_Argon2NotBuildInAdapter.pas',
+ HlpArgon2TypeAndVersion in '..\..\HashLib\src\KDF\HlpArgon2TypeAndVersion.pas',
+ HlpPBKDF_ScryptNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_ScryptNotBuildInAdapter.pas',
+ HlpPanama in '..\..\HashLib\src\Crypto\HlpPanama.pas',
+ HlpAdler32 in '..\..\HashLib\src\Checksum\HlpAdler32.pas',
+ HlpAP in '..\..\HashLib\src\Hash32\HlpAP.pas',
+ HlpBernstein in '..\..\HashLib\src\Hash32\HlpBernstein.pas',
+ HlpBernstein1 in '..\..\HashLib\src\Hash32\HlpBernstein1.pas',
+ HlpBKDR in '..\..\HashLib\src\Hash32\HlpBKDR.pas',
+ HlpBlake2S in '..\..\HashLib\src\Crypto\HlpBlake2S.pas',
+ HlpCRC16 in '..\..\HashLib\src\Checksum\HlpCRC16.pas',
+ HlpDEK in '..\..\HashLib\src\Hash32\HlpDEK.pas',
+ HlpDJB in '..\..\HashLib\src\Hash32\HlpDJB.pas',
+ HlpELF in '..\..\HashLib\src\Hash32\HlpELF.pas',
+ HlpFNV in '..\..\HashLib\src\Hash32\HlpFNV.pas',
+ HlpFNV1a in '..\..\HashLib\src\Hash32\HlpFNV1a.pas',
+ HlpFNV1a64 in '..\..\HashLib\src\Hash64\HlpFNV1a64.pas',
+ HlpGost in '..\..\HashLib\src\Crypto\HlpGost.pas',
+ HlpGOST3411_2012 in '..\..\HashLib\src\Crypto\HlpGOST3411_2012.pas',
+ HlpHAS160 in '..\..\HashLib\src\Crypto\HlpHAS160.pas',
+ HlpHashLibTypes in '..\..\HashLib\src\Utils\HlpHashLibTypes.pas',
+ HlpHashResult in '..\..\HashLib\src\Base\HlpHashResult.pas',
+ HlpHashRounds in '..\..\HashLib\src\Base\HlpHashRounds.pas',
+ HlpHashSize in '..\..\HashLib\src\Base\HlpHashSize.pas',
+ HlpHaval in '..\..\HashLib\src\Crypto\HlpHaval.pas',
+ HlpBlake2BP in '..\..\HashLib\src\Crypto\HlpBlake2BP.pas',
+ HlpBlake2SP in '..\..\HashLib\src\Crypto\HlpBlake2SP.pas',
+ HlpBlake3 in '..\..\HashLib\src\Crypto\HlpBlake3.pas',
+ HlpIHash in '..\..\HashLib\src\Interfaces\HlpIHash.pas',
+ HlpIHashResult in '..\..\HashLib\src\Interfaces\HlpIHashResult.pas',
+ HlpIKDF in '..\..\HashLib\src\Interfaces\HlpIKDF.pas',
+ HlpJenkins3 in '..\..\HashLib\src\Hash32\HlpJenkins3.pas',
+ HlpJS in '..\..\HashLib\src\Hash32\HlpJS.pas',
+ HlpKDF in '..\..\HashLib\src\Base\HlpKDF.pas',
+ HlpMD2 in '..\..\HashLib\src\Crypto\HlpMD2.pas',
+ HlpMD4 in '..\..\HashLib\src\Crypto\HlpMD4.pas',
+ HlpMD5 in '..\..\HashLib\src\Crypto\HlpMD5.pas',
+ HlpMDBase in '..\..\HashLib\src\Crypto\HlpMDBase.pas',
+ HlpMultipleTransformNonBlock in '..\..\HashLib\src\Base\HlpMultipleTransformNonBlock.pas',
+ HlpMurmur2 in '..\..\HashLib\src\Hash32\HlpMurmur2.pas',
+ HlpMurmur2_64 in '..\..\HashLib\src\Hash64\HlpMurmur2_64.pas',
+ HlpMurmurHash3_x64_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x64_128.pas',
+ HlpMurmurHash3_x86_32 in '..\..\HashLib\src\Hash32\HlpMurmurHash3_x86_32.pas',
+ HlpMurmurHash3_x86_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x86_128.pas',
+ HlpSipHash128 in '..\..\HashLib\src\Hash128\HlpSipHash128.pas',
+ HlpNullable in '..\..\HashLib\src\Nullable\HlpNullable.pas',
+ HlpNullDigest in '..\..\HashLib\src\NullDigest\HlpNullDigest.pas',
+ HlpOneAtTime in '..\..\HashLib\src\Hash32\HlpOneAtTime.pas',
+ HlpPJW in '..\..\HashLib\src\Hash32\HlpPJW.pas',
+ HlpRadioGatun32 in '..\..\HashLib\src\Crypto\HlpRadioGatun32.pas',
+ HlpRadioGatun64 in '..\..\HashLib\src\Crypto\HlpRadioGatun64.pas',
+ HlpRIPEMD in '..\..\HashLib\src\Crypto\HlpRIPEMD.pas',
+ HlpRIPEMD128 in '..\..\HashLib\src\Crypto\HlpRIPEMD128.pas',
+ HlpRIPEMD160 in '..\..\HashLib\src\Crypto\HlpRIPEMD160.pas',
+ HlpRIPEMD256 in '..\..\HashLib\src\Crypto\HlpRIPEMD256.pas',
+ HlpRIPEMD320 in '..\..\HashLib\src\Crypto\HlpRIPEMD320.pas',
+ HlpRotating in '..\..\HashLib\src\Hash32\HlpRotating.pas',
+ HlpRS in '..\..\HashLib\src\Hash32\HlpRS.pas',
+ HlpSDBM in '..\..\HashLib\src\Hash32\HlpSDBM.pas',
+ HlpSHA0 in '..\..\HashLib\src\Crypto\HlpSHA0.pas',
+ HlpSHA1 in '..\..\HashLib\src\Crypto\HlpSHA1.pas',
+ HlpSHA2_224 in '..\..\HashLib\src\Crypto\HlpSHA2_224.pas',
+ HlpSHA2_256 in '..\..\HashLib\src\Crypto\HlpSHA2_256.pas',
+ HlpSHA2_256Base in '..\..\HashLib\src\Crypto\HlpSHA2_256Base.pas',
+ HlpSHA2_384 in '..\..\HashLib\src\Crypto\HlpSHA2_384.pas',
+ HlpSHA2_512 in '..\..\HashLib\src\Crypto\HlpSHA2_512.pas',
+ HlpSHA2_512_224 in '..\..\HashLib\src\Crypto\HlpSHA2_512_224.pas',
+ HlpSHA2_512_256 in '..\..\HashLib\src\Crypto\HlpSHA2_512_256.pas',
+ HlpSHA2_512Base in '..\..\HashLib\src\Crypto\HlpSHA2_512Base.pas',
+ HlpShiftAndXor in '..\..\HashLib\src\Hash32\HlpShiftAndXor.pas',
+ HlpSipHash in '..\..\HashLib\src\Hash64\HlpSipHash.pas',
+ HlpSuperFast in '..\..\HashLib\src\Hash32\HlpSuperFast.pas',
+ HlpTiger in '..\..\HashLib\src\Crypto\HlpTiger.pas',
+ HlpTiger2 in '..\..\HashLib\src\Crypto\HlpTiger2.pas',
+ HlpWhirlPool in '..\..\HashLib\src\Crypto\HlpWhirlPool.pas',
+ HlpArrayUtils in '..\..\HashLib\src\Utils\HlpArrayUtils.pas',
+ HlpBlake2SParams in '..\..\HashLib\src\Crypto\Blake2SParams\HlpBlake2SParams.pas',
+ HlpBlake2BParams in '..\..\HashLib\src\Crypto\Blake2BParams\HlpBlake2BParams.pas',
+ HlpIBlake2SParams in '..\..\HashLib\src\Interfaces\IBlake2SParams\HlpIBlake2SParams.pas',
+ HlpIBlake2BParams in '..\..\HashLib\src\Interfaces\IBlake2BParams\HlpIBlake2BParams.pas';
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TMainForm, MainForm);
+ Application.Run;
+end.
diff --git a/HashLib.Benchmark/project/Lazarus/PerformanceBenchmarkConsole.lpi b/HashLib.Benchmark/Lazarus/PerformanceBenchmarkConsole.lpi
similarity index 96%
rename from HashLib.Benchmark/project/Lazarus/PerformanceBenchmarkConsole.lpi
rename to HashLib.Benchmark/Lazarus/PerformanceBenchmarkConsole.lpi
index a916edb..f75b089 100644
--- a/HashLib.Benchmark/project/Lazarus/PerformanceBenchmarkConsole.lpi
+++ b/HashLib.Benchmark/Lazarus/PerformanceBenchmarkConsole.lpi
@@ -73,7 +73,7 @@
-
+
@@ -86,7 +86,7 @@
-
+
diff --git a/HashLib.Benchmark/project/Lazarus/PerformanceBenchmarkConsole.lpr b/HashLib.Benchmark/Lazarus/PerformanceBenchmarkConsole.lpr
similarity index 100%
rename from HashLib.Benchmark/project/Lazarus/PerformanceBenchmarkConsole.lpr
rename to HashLib.Benchmark/Lazarus/PerformanceBenchmarkConsole.lpr
diff --git a/HashLib.Benchmark/project/Delphi/PerformanceBenchmarkConsole.dpr b/HashLib.Benchmark/project/Delphi/PerformanceBenchmarkConsole.dpr
deleted file mode 100644
index 0363b89..0000000
--- a/HashLib.Benchmark/project/Delphi/PerformanceBenchmarkConsole.dpr
+++ /dev/null
@@ -1,139 +0,0 @@
-program PerformanceBenchmarkConsole;
-
-{$APPTYPE CONSOLE}
-
-uses
- Classes,
- SysUtils,
- uPerformanceBenchmark in '..\..\src\Core\uPerformanceBenchmark.pas',
- HlpCRC in '..\..\..\HashLib\src\Checksum\HlpCRC.pas',
- HlpICRC in '..\..\..\HashLib\src\Interfaces\HlpICRC.pas',
- HlpBitConverter in '..\..\..\HashLib\src\Utils\HlpBitConverter.pas',
- HlpGrindahl512 in '..\..\..\HashLib\src\Crypto\HlpGrindahl512.pas',
- HlpGrindahl256 in '..\..\..\HashLib\src\Crypto\HlpGrindahl256.pas',
- HlpHashFactory in '..\..\..\HashLib\src\Base\HlpHashFactory.pas',
- HlpCRC32Fast in '..\..\..\HashLib\src\Checksum\HlpCRC32Fast.pas',
- HlpCRC64 in '..\..\..\HashLib\src\Checksum\HlpCRC64.pas',
- HlpCRC32 in '..\..\..\HashLib\src\Checksum\HlpCRC32.pas',
- HlpBlake2B in '..\..\..\HashLib\src\Crypto\HlpBlake2B.pas',
- HlpFNV64 in '..\..\..\HashLib\src\Hash64\HlpFNV64.pas',
- HlpBits in '..\..\..\HashLib\src\Utils\HlpBits.pas',
- HlpConverters in '..\..\..\HashLib\src\Utils\HlpConverters.pas',
- HlpSHA3 in '..\..\..\HashLib\src\Crypto\HlpSHA3.pas',
- HlpIHashInfo in '..\..\..\HashLib\src\Interfaces\HlpIHashInfo.pas',
- HlpHashBuffer in '..\..\..\HashLib\src\Base\HlpHashBuffer.pas',
- HlpSnefru in '..\..\..\HashLib\src\Crypto\HlpSnefru.pas',
- HlpHash in '..\..\..\HashLib\src\Base\HlpHash.pas',
- HlpXXHash32 in '..\..\..\HashLib\src\Hash32\HlpXXHash32.pas',
- HlpXXHash64 in '..\..\..\HashLib\src\Hash64\HlpXXHash64.pas',
- HlpHashCryptoNotBuildIn in '..\..\..\HashLib\src\Base\HlpHashCryptoNotBuildIn.pas',
- HlpHMACNotBuildInAdapter in '..\..\..\HashLib\src\Base\HlpHMACNotBuildInAdapter.pas',
- HlpPBKDF2_HMACNotBuildInAdapter in '..\..\..\HashLib\src\KDF\HlpPBKDF2_HMACNotBuildInAdapter.pas',
- HlpPBKDF_Argon2NotBuildInAdapter in '..\..\..\HashLib\src\KDF\HlpPBKDF_Argon2NotBuildInAdapter.pas',
- HlpArgon2TypeAndVersion in '..\..\..\HashLib\src\KDF\HlpArgon2TypeAndVersion.pas',
- HlpPBKDF_ScryptNotBuildInAdapter in '..\..\..\HashLib\src\KDF\HlpPBKDF_ScryptNotBuildInAdapter.pas',
- HlpPanama in '..\..\..\HashLib\src\Crypto\HlpPanama.pas',
- HlpAdler32 in '..\..\..\HashLib\src\Checksum\HlpAdler32.pas',
- HlpAP in '..\..\..\HashLib\src\Hash32\HlpAP.pas',
- HlpBernstein in '..\..\..\HashLib\src\Hash32\HlpBernstein.pas',
- HlpBernstein1 in '..\..\..\HashLib\src\Hash32\HlpBernstein1.pas',
- HlpBKDR in '..\..\..\HashLib\src\Hash32\HlpBKDR.pas',
- HlpBlake2S in '..\..\..\HashLib\src\Crypto\HlpBlake2S.pas',
- HlpCRC16 in '..\..\..\HashLib\src\Checksum\HlpCRC16.pas',
- HlpDEK in '..\..\..\HashLib\src\Hash32\HlpDEK.pas',
- HlpDJB in '..\..\..\HashLib\src\Hash32\HlpDJB.pas',
- HlpELF in '..\..\..\HashLib\src\Hash32\HlpELF.pas',
- HlpFNV in '..\..\..\HashLib\src\Hash32\HlpFNV.pas',
- HlpFNV1a in '..\..\..\HashLib\src\Hash32\HlpFNV1a.pas',
- HlpFNV1a64 in '..\..\..\HashLib\src\Hash64\HlpFNV1a64.pas',
- HlpGost in '..\..\..\HashLib\src\Crypto\HlpGost.pas',
- HlpGOST3411_2012 in '..\..\..\HashLib\src\Crypto\HlpGOST3411_2012.pas',
- HlpHAS160 in '..\..\..\HashLib\src\Crypto\HlpHAS160.pas',
- HlpHashLibTypes in '..\..\..\HashLib\src\Utils\HlpHashLibTypes.pas',
- HlpHashResult in '..\..\..\HashLib\src\Base\HlpHashResult.pas',
- HlpHashRounds in '..\..\..\HashLib\src\Base\HlpHashRounds.pas',
- HlpHashSize in '..\..\..\HashLib\src\Base\HlpHashSize.pas',
- HlpHaval in '..\..\..\HashLib\src\Crypto\HlpHaval.pas',
- HlpBlake2BP in '..\..\..\HashLib\src\Crypto\HlpBlake2BP.pas',
- HlpBlake2SP in '..\..\..\HashLib\src\Crypto\HlpBlake2SP.pas',
- HlpBlake3 in '..\..\..\HashLib\src\Crypto\HlpBlake3.pas',
- HlpIHash in '..\..\..\HashLib\src\Interfaces\HlpIHash.pas',
- HlpIHashResult in '..\..\..\HashLib\src\Interfaces\HlpIHashResult.pas',
- HlpIKDF in '..\..\..\HashLib\src\Interfaces\HlpIKDF.pas',
- HlpJenkins3 in '..\..\..\HashLib\src\Hash32\HlpJenkins3.pas',
- HlpJS in '..\..\..\HashLib\src\Hash32\HlpJS.pas',
- HlpKDF in '..\..\..\HashLib\src\Base\HlpKDF.pas',
- HlpMD2 in '..\..\..\HashLib\src\Crypto\HlpMD2.pas',
- HlpMD4 in '..\..\..\HashLib\src\Crypto\HlpMD4.pas',
- HlpMD5 in '..\..\..\HashLib\src\Crypto\HlpMD5.pas',
- HlpMDBase in '..\..\..\HashLib\src\Crypto\HlpMDBase.pas',
- HlpMultipleTransformNonBlock in '..\..\..\HashLib\src\Base\HlpMultipleTransformNonBlock.pas',
- HlpMurmur2 in '..\..\..\HashLib\src\Hash32\HlpMurmur2.pas',
- HlpMurmur2_64 in '..\..\..\HashLib\src\Hash64\HlpMurmur2_64.pas',
- HlpMurmurHash3_x64_128 in '..\..\..\HashLib\src\Hash128\HlpMurmurHash3_x64_128.pas',
- HlpMurmurHash3_x86_32 in '..\..\..\HashLib\src\Hash32\HlpMurmurHash3_x86_32.pas',
- HlpMurmurHash3_x86_128 in '..\..\..\HashLib\src\Hash128\HlpMurmurHash3_x86_128.pas',
- HlpSipHash128 in '..\..\..\HashLib\src\Hash128\HlpSipHash128.pas',
- HlpNullable in '..\..\..\HashLib\src\Nullable\HlpNullable.pas',
- HlpNullDigest in '..\..\..\HashLib\src\NullDigest\HlpNullDigest.pas',
- HlpOneAtTime in '..\..\..\HashLib\src\Hash32\HlpOneAtTime.pas',
- HlpPJW in '..\..\..\HashLib\src\Hash32\HlpPJW.pas',
- HlpRadioGatun32 in '..\..\..\HashLib\src\Crypto\HlpRadioGatun32.pas',
- HlpRadioGatun64 in '..\..\..\HashLib\src\Crypto\HlpRadioGatun64.pas',
- HlpRIPEMD in '..\..\..\HashLib\src\Crypto\HlpRIPEMD.pas',
- HlpRIPEMD128 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD128.pas',
- HlpRIPEMD160 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD160.pas',
- HlpRIPEMD256 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD256.pas',
- HlpRIPEMD320 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD320.pas',
- HlpRotating in '..\..\..\HashLib\src\Hash32\HlpRotating.pas',
- HlpRS in '..\..\..\HashLib\src\Hash32\HlpRS.pas',
- HlpSDBM in '..\..\..\HashLib\src\Hash32\HlpSDBM.pas',
- HlpSHA0 in '..\..\..\HashLib\src\Crypto\HlpSHA0.pas',
- HlpSHA1 in '..\..\..\HashLib\src\Crypto\HlpSHA1.pas',
- HlpSHA2_224 in '..\..\..\HashLib\src\Crypto\HlpSHA2_224.pas',
- HlpSHA2_256 in '..\..\..\HashLib\src\Crypto\HlpSHA2_256.pas',
- HlpSHA2_256Base in '..\..\..\HashLib\src\Crypto\HlpSHA2_256Base.pas',
- HlpSHA2_384 in '..\..\..\HashLib\src\Crypto\HlpSHA2_384.pas',
- HlpSHA2_512 in '..\..\..\HashLib\src\Crypto\HlpSHA2_512.pas',
- HlpSHA2_512_224 in '..\..\..\HashLib\src\Crypto\HlpSHA2_512_224.pas',
- HlpSHA2_512_256 in '..\..\..\HashLib\src\Crypto\HlpSHA2_512_256.pas',
- HlpSHA2_512Base in '..\..\..\HashLib\src\Crypto\HlpSHA2_512Base.pas',
- HlpShiftAndXor in '..\..\..\HashLib\src\Hash32\HlpShiftAndXor.pas',
- HlpSipHash in '..\..\..\HashLib\src\Hash64\HlpSipHash.pas',
- HlpSuperFast in '..\..\..\HashLib\src\Hash32\HlpSuperFast.pas',
- HlpTiger in '..\..\..\HashLib\src\Crypto\HlpTiger.pas',
- HlpTiger2 in '..\..\..\HashLib\src\Crypto\HlpTiger2.pas',
- HlpWhirlPool in '..\..\..\HashLib\src\Crypto\HlpWhirlPool.pas',
- HlpArrayUtils in '..\..\..\HashLib\src\Utils\HlpArrayUtils.pas',
- HlpBlake2SParams in '..\..\..\HashLib\src\Crypto\Blake2SParams\HlpBlake2SParams.pas',
- HlpBlake2BParams in '..\..\..\HashLib\src\Crypto\Blake2BParams\HlpBlake2BParams.pas',
- HlpIBlake2SParams in '..\..\..\HashLib\src\Interfaces\IBlake2SParams\HlpIBlake2SParams.pas',
- HlpIBlake2BParams in '..\..\..\HashLib\src\Interfaces\IBlake2BParams\HlpIBlake2BParams.pas';
-
-var
- StringList: TStringList;
- Log: String;
-
-begin
- try
- Writeln('Please be patient, this might take some time' + SLineBreak);
- StringList := TStringList.Create;
- try
- TPerformanceBenchmark.DoBenchmark(StringList);
-
- for Log in StringList do
- begin
- Writeln(Log);
- end;
-
- finally
- StringList.Free;
- end;
- Writeln(SLineBreak + 'Performance Benchmark Finished');
- ReadLn;
- except
- on E: Exception do
- Writeln(E.ClassName, ': ', E.Message);
- end;
-
-end.
diff --git a/HashLib.Benchmark/project/Delphi/PerformanceBenchmarkFMX.dpr b/HashLib.Benchmark/project/Delphi/PerformanceBenchmarkFMX.dpr
deleted file mode 100644
index 265da73..0000000
--- a/HashLib.Benchmark/project/Delphi/PerformanceBenchmarkFMX.dpr
+++ /dev/null
@@ -1,118 +0,0 @@
-program PerformanceBenchmarkFMX;
-
-uses
- System.StartUpCopy,
- FMX.Forms,
- fmxMainForm in '..\..\src\Forms\FMX\fmxMainForm.pas' {MainForm},
- uPerformanceBenchmark in '..\..\src\Core\uPerformanceBenchmark.pas',
- HlpCRC in '..\..\..\HashLib\src\Checksum\HlpCRC.pas',
- HlpICRC in '..\..\..\HashLib\src\Interfaces\HlpICRC.pas',
- HlpBitConverter in '..\..\..\HashLib\src\Utils\HlpBitConverter.pas',
- HlpGrindahl512 in '..\..\..\HashLib\src\Crypto\HlpGrindahl512.pas',
- HlpGrindahl256 in '..\..\..\HashLib\src\Crypto\HlpGrindahl256.pas',
- HlpHashFactory in '..\..\..\HashLib\src\Base\HlpHashFactory.pas',
- HlpCRC32Fast in '..\..\..\HashLib\src\Checksum\HlpCRC32Fast.pas',
- HlpCRC64 in '..\..\..\HashLib\src\Checksum\HlpCRC64.pas',
- HlpCRC32 in '..\..\..\HashLib\src\Checksum\HlpCRC32.pas',
- HlpBlake2B in '..\..\..\HashLib\src\Crypto\HlpBlake2B.pas',
- HlpFNV64 in '..\..\..\HashLib\src\Hash64\HlpFNV64.pas',
- HlpBits in '..\..\..\HashLib\src\Utils\HlpBits.pas',
- HlpConverters in '..\..\..\HashLib\src\Utils\HlpConverters.pas',
- HlpSHA3 in '..\..\..\HashLib\src\Crypto\HlpSHA3.pas',
- HlpIHashInfo in '..\..\..\HashLib\src\Interfaces\HlpIHashInfo.pas',
- HlpHashBuffer in '..\..\..\HashLib\src\Base\HlpHashBuffer.pas',
- HlpSnefru in '..\..\..\HashLib\src\Crypto\HlpSnefru.pas',
- HlpHash in '..\..\..\HashLib\src\Base\HlpHash.pas',
- HlpXXHash32 in '..\..\..\HashLib\src\Hash32\HlpXXHash32.pas',
- HlpXXHash64 in '..\..\..\HashLib\src\Hash64\HlpXXHash64.pas',
- HlpHashCryptoNotBuildIn in '..\..\..\HashLib\src\Base\HlpHashCryptoNotBuildIn.pas',
- HlpHMACNotBuildInAdapter in '..\..\..\HashLib\src\Base\HlpHMACNotBuildInAdapter.pas',
- HlpPBKDF2_HMACNotBuildInAdapter in '..\..\..\HashLib\src\KDF\HlpPBKDF2_HMACNotBuildInAdapter.pas',
- HlpPBKDF_Argon2NotBuildInAdapter in '..\..\..\HashLib\src\KDF\HlpPBKDF_Argon2NotBuildInAdapter.pas',
- HlpArgon2TypeAndVersion in '..\..\..\HashLib\src\KDF\HlpArgon2TypeAndVersion.pas',
- HlpPBKDF_ScryptNotBuildInAdapter in '..\..\..\HashLib\src\KDF\HlpPBKDF_ScryptNotBuildInAdapter.pas',
- HlpPanama in '..\..\..\HashLib\src\Crypto\HlpPanama.pas',
- HlpAdler32 in '..\..\..\HashLib\src\Checksum\HlpAdler32.pas',
- HlpAP in '..\..\..\HashLib\src\Hash32\HlpAP.pas',
- HlpBernstein in '..\..\..\HashLib\src\Hash32\HlpBernstein.pas',
- HlpBernstein1 in '..\..\..\HashLib\src\Hash32\HlpBernstein1.pas',
- HlpBKDR in '..\..\..\HashLib\src\Hash32\HlpBKDR.pas',
- HlpBlake2S in '..\..\..\HashLib\src\Crypto\HlpBlake2S.pas',
- HlpCRC16 in '..\..\..\HashLib\src\Checksum\HlpCRC16.pas',
- HlpDEK in '..\..\..\HashLib\src\Hash32\HlpDEK.pas',
- HlpDJB in '..\..\..\HashLib\src\Hash32\HlpDJB.pas',
- HlpELF in '..\..\..\HashLib\src\Hash32\HlpELF.pas',
- HlpFNV in '..\..\..\HashLib\src\Hash32\HlpFNV.pas',
- HlpFNV1a in '..\..\..\HashLib\src\Hash32\HlpFNV1a.pas',
- HlpFNV1a64 in '..\..\..\HashLib\src\Hash64\HlpFNV1a64.pas',
- HlpGost in '..\..\..\HashLib\src\Crypto\HlpGost.pas',
- HlpGOST3411_2012 in '..\..\..\HashLib\src\Crypto\HlpGOST3411_2012.pas',
- HlpHAS160 in '..\..\..\HashLib\src\Crypto\HlpHAS160.pas',
- HlpHashLibTypes in '..\..\..\HashLib\src\Utils\HlpHashLibTypes.pas',
- HlpHashResult in '..\..\..\HashLib\src\Base\HlpHashResult.pas',
- HlpHashRounds in '..\..\..\HashLib\src\Base\HlpHashRounds.pas',
- HlpHashSize in '..\..\..\HashLib\src\Base\HlpHashSize.pas',
- HlpHaval in '..\..\..\HashLib\src\Crypto\HlpHaval.pas',
- HlpBlake2BP in '..\..\..\HashLib\src\Crypto\HlpBlake2BP.pas',
- HlpBlake2SP in '..\..\..\HashLib\src\Crypto\HlpBlake2SP.pas',
- HlpBlake3 in '..\..\..\HashLib\src\Crypto\HlpBlake3.pas',
- HlpIHash in '..\..\..\HashLib\src\Interfaces\HlpIHash.pas',
- HlpIHashResult in '..\..\..\HashLib\src\Interfaces\HlpIHashResult.pas',
- HlpIKDF in '..\..\..\HashLib\src\Interfaces\HlpIKDF.pas',
- HlpJenkins3 in '..\..\..\HashLib\src\Hash32\HlpJenkins3.pas',
- HlpJS in '..\..\..\HashLib\src\Hash32\HlpJS.pas',
- HlpKDF in '..\..\..\HashLib\src\Base\HlpKDF.pas',
- HlpMD2 in '..\..\..\HashLib\src\Crypto\HlpMD2.pas',
- HlpMD4 in '..\..\..\HashLib\src\Crypto\HlpMD4.pas',
- HlpMD5 in '..\..\..\HashLib\src\Crypto\HlpMD5.pas',
- HlpMDBase in '..\..\..\HashLib\src\Crypto\HlpMDBase.pas',
- HlpMultipleTransformNonBlock in '..\..\..\HashLib\src\Base\HlpMultipleTransformNonBlock.pas',
- HlpMurmur2 in '..\..\..\HashLib\src\Hash32\HlpMurmur2.pas',
- HlpMurmur2_64 in '..\..\..\HashLib\src\Hash64\HlpMurmur2_64.pas',
- HlpMurmurHash3_x64_128 in '..\..\..\HashLib\src\Hash128\HlpMurmurHash3_x64_128.pas',
- HlpMurmurHash3_x86_32 in '..\..\..\HashLib\src\Hash32\HlpMurmurHash3_x86_32.pas',
- HlpMurmurHash3_x86_128 in '..\..\..\HashLib\src\Hash128\HlpMurmurHash3_x86_128.pas',
- HlpSipHash128 in '..\..\..\HashLib\src\Hash128\HlpSipHash128.pas',
- HlpNullable in '..\..\..\HashLib\src\Nullable\HlpNullable.pas',
- HlpNullDigest in '..\..\..\HashLib\src\NullDigest\HlpNullDigest.pas',
- HlpOneAtTime in '..\..\..\HashLib\src\Hash32\HlpOneAtTime.pas',
- HlpPJW in '..\..\..\HashLib\src\Hash32\HlpPJW.pas',
- HlpRadioGatun32 in '..\..\..\HashLib\src\Crypto\HlpRadioGatun32.pas',
- HlpRadioGatun64 in '..\..\..\HashLib\src\Crypto\HlpRadioGatun64.pas',
- HlpRIPEMD in '..\..\..\HashLib\src\Crypto\HlpRIPEMD.pas',
- HlpRIPEMD128 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD128.pas',
- HlpRIPEMD160 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD160.pas',
- HlpRIPEMD256 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD256.pas',
- HlpRIPEMD320 in '..\..\..\HashLib\src\Crypto\HlpRIPEMD320.pas',
- HlpRotating in '..\..\..\HashLib\src\Hash32\HlpRotating.pas',
- HlpRS in '..\..\..\HashLib\src\Hash32\HlpRS.pas',
- HlpSDBM in '..\..\..\HashLib\src\Hash32\HlpSDBM.pas',
- HlpSHA0 in '..\..\..\HashLib\src\Crypto\HlpSHA0.pas',
- HlpSHA1 in '..\..\..\HashLib\src\Crypto\HlpSHA1.pas',
- HlpSHA2_224 in '..\..\..\HashLib\src\Crypto\HlpSHA2_224.pas',
- HlpSHA2_256 in '..\..\..\HashLib\src\Crypto\HlpSHA2_256.pas',
- HlpSHA2_256Base in '..\..\..\HashLib\src\Crypto\HlpSHA2_256Base.pas',
- HlpSHA2_384 in '..\..\..\HashLib\src\Crypto\HlpSHA2_384.pas',
- HlpSHA2_512 in '..\..\..\HashLib\src\Crypto\HlpSHA2_512.pas',
- HlpSHA2_512_224 in '..\..\..\HashLib\src\Crypto\HlpSHA2_512_224.pas',
- HlpSHA2_512_256 in '..\..\..\HashLib\src\Crypto\HlpSHA2_512_256.pas',
- HlpSHA2_512Base in '..\..\..\HashLib\src\Crypto\HlpSHA2_512Base.pas',
- HlpShiftAndXor in '..\..\..\HashLib\src\Hash32\HlpShiftAndXor.pas',
- HlpSipHash in '..\..\..\HashLib\src\Hash64\HlpSipHash.pas',
- HlpSuperFast in '..\..\..\HashLib\src\Hash32\HlpSuperFast.pas',
- HlpTiger in '..\..\..\HashLib\src\Crypto\HlpTiger.pas',
- HlpTiger2 in '..\..\..\HashLib\src\Crypto\HlpTiger2.pas',
- HlpWhirlPool in '..\..\..\HashLib\src\Crypto\HlpWhirlPool.pas',
- HlpArrayUtils in '..\..\..\HashLib\src\Utils\HlpArrayUtils.pas',
- HlpBlake2SParams in '..\..\..\HashLib\src\Crypto\Blake2SParams\HlpBlake2SParams.pas',
- HlpBlake2BParams in '..\..\..\HashLib\src\Crypto\Blake2BParams\HlpBlake2BParams.pas',
- HlpIBlake2SParams in '..\..\..\HashLib\src\Interfaces\IBlake2SParams\HlpIBlake2SParams.pas',
- HlpIBlake2BParams in '..\..\..\HashLib\src\Interfaces\IBlake2BParams\HlpIBlake2BParams.pas';
-
-{$R *.res}
-
-begin
- Application.Initialize;
- Application.CreateForm(TMainForm, MainForm);
- Application.Run;
-end.
diff --git a/HashLib.Benchmark/src/Core/uPerformanceBenchmark.pas b/HashLib.Benchmark/src/Core/uPerformanceBenchmark.pas
index ad288b9..33862e4 100644
--- a/HashLib.Benchmark/src/Core/uPerformanceBenchmark.pas
+++ b/HashLib.Benchmark/src/Core/uPerformanceBenchmark.pas
@@ -4,7 +4,6 @@
{$MODE DELPHI}
{$WARNINGS OFF}
{$ENDIF FPC}
-{$ZEROBASEDSTRINGS OFF}
interface
diff --git a/HashLib/src/Base/HlpHashResult.pas b/HashLib/src/Base/HlpHashResult.pas
index 8d86061..40132ac 100644
--- a/HashLib/src/Base/HlpHashResult.pas
+++ b/HashLib/src/Base/HlpHashResult.pas
@@ -156,13 +156,9 @@ function THashResult.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
LTemp := AnsiUpperCase(LTemp);
LResult := 0;
-{$IFDEF DELPHIXE3_UP}
- LIdx := System.Low(LTemp);
- LTop := System.High(LTemp);
-{$ELSE}
LIdx := 1;
LTop := System.Length(LTemp);
-{$ENDIF DELPHIXE3_UP}
+
while LIdx <= LTop do
begin
LResult := TBits.RotateLeft32(LResult, 5);
diff --git a/HashLib/src/Crypto/HlpBlake2BP.pas b/HashLib/src/Crypto/HlpBlake2BP.pas
index 799fe47..f2d62ac 100644
--- a/HashLib/src/Crypto/HlpBlake2BP.pas
+++ b/HashLib/src/Crypto/HlpBlake2BP.pas
@@ -6,16 +6,9 @@ interface
uses
SysUtils,
-{$IFDEF USE_DELPHI_PPL}
- System.Classes,
+{$IFDEF HASHLIB_USE_PPL}
System.Threading,
-{$ENDIF USE_DELPHI_PPL}
-{$IFDEF USE_PASMP}
- PasMP,
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- MTProcs,
-{$ENDIF USE_MTPROCS}
+{$ENDIF HASHLIB_USE_PPL}
HlpHash,
HlpIHashResult,
HlpBlake2B,
@@ -29,19 +22,11 @@ interface
type
TBlake2BP = class sealed(THash, ICryptoNotBuildIn, ITransformBlock)
strict private
-
- type
- PDataContainer = ^TDataContainer;
-
- TDataContainer = record
- PtrData: PByte;
- Counter: UInt64;
- end;
-
const
- BlockSizeInBytes = Int32(128);
- OutSizeInBytes = Int32(64);
- ParallelismDegree = Int32(4);
+ BlockSizeInBytes = 128;
+ OutSizeInBytes = 64;
+ ParallelismDegree = 4;
+ StripeSize = ParallelismDegree * BlockSizeInBytes;
var
// had to use the classes directly for performance purposes
@@ -61,26 +46,20 @@ TDataContainer = record
const ABlake2BTreeConfig: IBlake2BTreeConfig): TBlake2B;
function Blake2BPCreateLeaf(AOffset: UInt64): TBlake2B;
function Blake2BPCreateRoot(): TBlake2B;
- procedure ParallelComputation(AIdx: Int32; ADataContainer: PDataContainer);
- procedure DoParallelComputation(ADataContainer: PDataContainer);
+ // Each lane processes its own "stripe" of the input
+ procedure ProcessLeafLane(AIdx: Int32; APtrData: PByte;
+ ADataLength: UInt64);
+
+ // Dispatch computation across all lanes (parallel or sequential)
+ procedure ProcessLeafLanesInParallel(APtrData: PByte; ADataLength: UInt64);
function DeepCloneBlake2BInstances(const ALeafHashes
: THashLibGenericArray): THashLibGenericArray;
- procedure Clear();
+ procedure Clear;
constructor CreateInternal(AHashSize: Int32);
-
-{$IFDEF USE_PASMP}
- procedure PasMPParallelComputationWrapper(const AJob: PPasMPJob;
- const AThreadIndex: LongInt; const ADataContainer: Pointer;
- const AFromIndex, AToIndex: TPasMPNativeInt); inline;
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- procedure MTProcsParallelComputationWrapper(AIdx: PtrInt;
- ADataContainer: Pointer; AItem: TMultiThreadProcItem); inline;
-{$ENDIF USE_MTPROCS}
strict protected
function GetName: String; override;
@@ -111,17 +90,20 @@ function TBlake2BP.Blake2BPCreateLeaf(AOffset: UInt64): TBlake2B;
begin
LBlake2BConfig := TBlake2BConfig.Create(HashSize);
LBlake2BConfig.Key := FKey;
+
LBlake2BTreeConfig := TBlake2BTreeConfig.Create();
- LBlake2BTreeConfig.FanOut := ParallelismDegree;
- LBlake2BTreeConfig.MaxDepth := 2;
- LBlake2BTreeConfig.NodeDepth := 0;
- LBlake2BTreeConfig.LeafSize := 0;
- LBlake2BTreeConfig.NodeOffset := AOffset;
+ LBlake2BTreeConfig.FanOut := ParallelismDegree;
+ LBlake2BTreeConfig.MaxDepth := 2;
+ LBlake2BTreeConfig.NodeDepth := 0;
+ LBlake2BTreeConfig.LeafSize := 0;
+ LBlake2BTreeConfig.NodeOffset := AOffset;
LBlake2BTreeConfig.InnerHashSize := OutSizeInBytes;
+
if AOffset = (ParallelismDegree - 1) then
begin
LBlake2BTreeConfig.IsLastNode := True;
end;
+
Result := Blake2BPCreateLeafParam(LBlake2BConfig, LBlake2BTreeConfig);
end;
@@ -132,14 +114,16 @@ function TBlake2BP.Blake2BPCreateRoot(): TBlake2B;
begin
LBlake2BConfig := TBlake2BConfig.Create(HashSize);
LBlake2BConfig.Key := FKey;
+
LBlake2BTreeConfig := TBlake2BTreeConfig.Create();
- LBlake2BTreeConfig.FanOut := ParallelismDegree;
- LBlake2BTreeConfig.MaxDepth := 2;
- LBlake2BTreeConfig.NodeDepth := 1;
- LBlake2BTreeConfig.LeafSize := 0;
- LBlake2BTreeConfig.NodeOffset := 0;
+ LBlake2BTreeConfig.FanOut := ParallelismDegree;
+ LBlake2BTreeConfig.MaxDepth := 2;
+ LBlake2BTreeConfig.NodeDepth := 1;
+ LBlake2BTreeConfig.LeafSize := 0;
+ LBlake2BTreeConfig.NodeOffset := 0;
LBlake2BTreeConfig.InnerHashSize := OutSizeInBytes;
- LBlake2BTreeConfig.IsLastNode := True;
+ LBlake2BTreeConfig.IsLastNode := True;
+
Result := TBlake2B.Create(LBlake2BConfig, LBlake2BTreeConfig, False);
end;
@@ -166,13 +150,16 @@ function TBlake2BP.Clone(): IHash;
begin
LHashInstance := TBlake2BP.CreateInternal(HashSize);
LHashInstance.FKey := System.Copy(FKey);
+
if FRootHash <> Nil then
begin
LHashInstance.FRootHash := FRootHash.CloneInternal();
end;
- LHashInstance.FLeafHashes := DeepCloneBlake2BInstances(FLeafHashes);
- LHashInstance.FBuffer := System.Copy(FBuffer);
+
+ LHashInstance.FLeafHashes := DeepCloneBlake2BInstances(FLeafHashes);
+ LHashInstance.FBuffer := System.Copy(FBuffer);
LHashInstance.FBufferLength := FBufferLength;
+
Result := LHashInstance as IHash;
Result.BufferSize := BufferSize;
end;
@@ -187,10 +174,13 @@ constructor TBlake2BP.Create(AHashSize: Int32; const AKey: THashLibByteArray);
LIdx: Int32;
begin
Inherited Create(AHashSize, BlockSizeInBytes);
+
System.SetLength(FBuffer, ParallelismDegree * BlockSizeInBytes);
System.SetLength(FLeafHashes, ParallelismDegree);
- FKey := System.Copy(AKey);
+
+ FKey := System.Copy(AKey);
FRootHash := Blake2BPCreateRoot;
+
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
FLeafHashes[LIdx] := Blake2BPCreateLeaf(LIdx);
@@ -202,14 +192,18 @@ destructor TBlake2BP.Destroy;
LIdx: Int32;
begin
Clear();
+
FRootHash.Free;
FRootHash := Nil;
+
for LIdx := System.Low(FLeafHashes) to System.High(FLeafHashes) do
begin
FLeafHashes[LIdx].Free;
FLeafHashes[LIdx] := Nil;
end;
+
FLeafHashes := Nil;
+
inherited Destroy;
end;
@@ -223,17 +217,19 @@ procedure TBlake2BP.Initialize;
LIdx: Int32;
begin
FRootHash.Initialize;
+
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
FLeafHashes[LIdx].Initialize;
FLeafHashes[LIdx].HashSize := OutSizeInBytes;
end;
+
TArrayUtils.ZeroFill(FBuffer);
FBufferLength := 0;
end;
-procedure TBlake2BP.ParallelComputation(AIdx: Int32;
- ADataContainer: PDataContainer);
+procedure TBlake2BP.ProcessLeafLane(AIdx: Int32; APtrData: PByte;
+ ADataLength: UInt64);
var
LLeafHashes: THashLibGenericArray;
LTemp: THashLibByteArray;
@@ -241,106 +237,74 @@ procedure TBlake2BP.ParallelComputation(AIdx: Int32;
LPtrData: PByte;
begin
System.SetLength(LTemp, BlockSizeInBytes);
- LPtrData := ADataContainer^.PtrData;
- LCounter := ADataContainer^.Counter;
- System.Inc(LPtrData, AIdx * BlockSizeInBytes);
- LLeafHashes := FLeafHashes;
- while (LCounter >= (ParallelismDegree * BlockSizeInBytes)) do
- begin
- System.Move(LPtrData^, LTemp[0], BlockSizeInBytes);
- LLeafHashes[AIdx].TransformBytes(LTemp, 0, BlockSizeInBytes);
- System.Inc(LPtrData, UInt64(ParallelismDegree * BlockSizeInBytes));
- LCounter := LCounter - UInt64(ParallelismDegree * BlockSizeInBytes);
- end;
-end;
-{$IFDEF USE_PASMP}
-
-procedure TBlake2BP.PasMPParallelComputationWrapper(const AJob: PPasMPJob;
- const AThreadIndex: LongInt; const ADataContainer: Pointer;
- const AFromIndex, AToIndex: TPasMPNativeInt);
-begin
- ParallelComputation(AFromIndex, ADataContainer);
-end;
-{$ENDIF}
-{$IFDEF USE_MTPROCS}
-
-procedure TBlake2BP.MTProcsParallelComputationWrapper(AIdx: PtrInt;
- ADataContainer: Pointer; AItem: TMultiThreadProcItem);
-begin
- ParallelComputation(AIdx, ADataContainer);
-end;
-{$ENDIF}
-{$IF DEFINED(USE_DELPHI_PPL)}
+ LPtrData := APtrData;
+ LCounter := ADataLength;
+ LLeafHashes := FLeafHashes;
-procedure TBlake2BP.DoParallelComputation(ADataContainer: PDataContainer);
+ // Start at lane offset
+ Inc(LPtrData, AIdx * BlockSizeInBytes);
- function CreateTask(AIdx: Int32; ADataContainer: PDataContainer): ITask;
+ // Process all full "stripes" of ParallelismDegree * BlockSizeInBytes
+ while (LCounter >= StripeSize) do
begin
- Result := TTask.Create(
- procedure()
- begin
- ParallelComputation(AIdx, ADataContainer);
- end);
- end;
+ System.Move(LPtrData^, LTemp[0], BlockSizeInBytes);
+ LLeafHashes[AIdx].TransformBytes(LTemp, 0, BlockSizeInBytes);
-var
- LArrayTasks: array of ITask;
- LIdx: Int32;
-begin
- System.SetLength(LArrayTasks, ParallelismDegree);
- for LIdx := 0 to System.Pred(ParallelismDegree) do
- begin
- LArrayTasks[LIdx] := CreateTask(LIdx, ADataContainer);
- LArrayTasks[LIdx].Start;
+ Inc(LPtrData, UInt64(StripeSize));
+ LCounter := LCounter - UInt64(StripeSize);
end;
- TTask.WaitForAll(LArrayTasks);
-end;
-
-{$ELSEIF DEFINED(USE_PASMP) OR DEFINED(USE_MTPROCS)}
-
-procedure TBlake2BP.DoParallelComputation(ADataContainer: PDataContainer);
-begin
-{$IF DEFINED(USE_PASMP)}
- TPasMP.CreateGlobalInstance;
- GlobalPasMP.Invoke(GlobalPasMP.ParallelFor(ADataContainer, 0,
- ParallelismDegree - 1, PasMPParallelComputationWrapper));
-{$ELSEIF DEFINED(USE_MTPROCS)}
- ProcThreadPool.DoParallel(MTProcsParallelComputationWrapper, 0,
- ParallelismDegree - 1, ADataContainer);
-{$ELSE}
-{$MESSAGE ERROR 'Unsupported Threading Library.'}
-{$IFEND USE_PASMP}
end;
-{$ELSE}
-
-procedure TBlake2BP.DoParallelComputation(ADataContainer: PDataContainer);
+procedure TBlake2BP.ProcessLeafLanesInParallel(APtrData: PByte;
+ ADataLength: UInt64);
var
+ LFullStripeLength: UInt64;
+{$IFNDEF HASHLIB_USE_PPL}
LIdx: Int32;
+{$ENDIF}
begin
+ // Only full stripes are processed here
+ LFullStripeLength := (ADataLength div StripeSize) * StripeSize;
+ if LFullStripeLength = 0 then
+ Exit;
+
+{$IFDEF HASHLIB_USE_PPL}
+ // parallel processing of each lane
+ TParallel.&For(
+ 0,
+ ParallelismDegree - 1,
+ procedure(AIdx: Integer)
+ begin
+ ProcessLeafLane(AIdx, APtrData, LFullStripeLength);
+ end
+ );
+{$ELSE}
+ // Fallback: simple sequential processing of each lane
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
- ParallelComputation(LIdx, ADataContainer);
+ ProcessLeafLane(LIdx, APtrData, LFullStripeLength);
end;
+{$ENDIF HASHLIB_USE_PPL}
end;
-{$IFEND USE_DELPHI_PPL}
procedure TBlake2BP.TransformBytes(const AData: THashLibByteArray;
-AIndex, ADataLength: Int32);
+ AIndex, ADataLength: Int32);
var
LLeft, LFill, LDataLength: UInt64;
LPtrData: PByte;
LIdx: Int32;
LLeafHashes: THashLibGenericArray;
- LPtrDataContainer: PDataContainer;
+ LProcessed: UInt64;
begin
LLeafHashes := FLeafHashes;
LDataLength := UInt64(ADataLength);
- LPtrData := PByte(AData) + AIndex;
+ LPtrData := PByte(AData) + AIndex;
+
LLeft := FBufferLength;
LFill := UInt64(System.Length(FBuffer)) - LLeft;
+ // Fill existing buffer to a full "parallel chunk" if possible
if (LLeft > 0) and (LDataLength >= LFill) then
begin
System.Move(LPtrData^, FBuffer[LLeft], LFill);
@@ -356,18 +320,15 @@ procedure TBlake2BP.TransformBytes(const AData: THashLibByteArray;
LLeft := 0;
end;
- LPtrDataContainer := New(PDataContainer);
- try
- LPtrDataContainer^.PtrData := LPtrData;
- LPtrDataContainer^.Counter := LDataLength;
- DoParallelComputation(LPtrDataContainer);
- finally
- Dispose(LPtrDataContainer);
- end;
+ // Process as many full "parallel stripes" as possible
+ ProcessLeafLanesInParallel(LPtrData, LDataLength);
- System.Inc(LPtrData, LDataLength - (LDataLength mod UInt64(ParallelismDegree *
- BlockSizeInBytes)));
- LDataLength := LDataLength mod UInt64(ParallelismDegree * BlockSizeInBytes);
+ // Move pointer past processed data (everything except the remainder)
+ LProcessed := (LDataLength div StripeSize) * StripeSize;
+ Inc(LPtrData, LProcessed);
+
+ // Keep the remainder in the buffer
+ LDataLength := LDataLength - LProcessed;
if (LDataLength > 0) then
begin
@@ -386,35 +347,44 @@ function TBlake2BP.TransformFinal: IHashResult;
LRootHash: TBlake2B;
begin
LLeafHashes := FLeafHashes;
- LRootHash := FRootHash;
+ LRootHash := FRootHash;
+
System.SetLength(LHash, ParallelismDegree);
for LIdx := System.Low(LHash) to System.High(LHash) do
begin
System.SetLength(LHash[LIdx], OutSizeInBytes);
end;
+ // Finalize each leaf with the remaining buffered bytes
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
- if (FBufferLength > (LIdx * BlockSizeInBytes)) then
+ if (FBufferLength > (UInt64(LIdx) * BlockSizeInBytes)) then
begin
LLeft := FBufferLength - UInt64(LIdx * BlockSizeInBytes);
if (LLeft > BlockSizeInBytes) then
begin
LLeft := BlockSizeInBytes;
end;
- LLeafHashes[LIdx].TransformBytes(FBuffer, LIdx * BlockSizeInBytes,
- Int32(LLeft));
+
+ LLeafHashes[LIdx].TransformBytes(
+ FBuffer,
+ LIdx * BlockSizeInBytes,
+ Int32(LLeft)
+ );
end;
LHash[LIdx] := LLeafHashes[LIdx].TransformFinal().GetBytes();
end;
+ // Feed all leaf hashes into the root
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
LRootHash.TransformBytes(LHash[LIdx], 0, OutSizeInBytes);
end;
+
Result := LRootHash.TransformFinal();
Initialize();
end;
end.
+
diff --git a/HashLib/src/Crypto/HlpBlake2SP.pas b/HashLib/src/Crypto/HlpBlake2SP.pas
index 1078164..2168881 100644
--- a/HashLib/src/Crypto/HlpBlake2SP.pas
+++ b/HashLib/src/Crypto/HlpBlake2SP.pas
@@ -6,16 +6,9 @@ interface
uses
SysUtils,
-{$IFDEF USE_DELPHI_PPL}
- System.Classes,
+{$IFDEF HASHLIB_USE_PPL}
System.Threading,
-{$ENDIF USE_DELPHI_PPL}
-{$IFDEF USE_PASMP}
- PasMP,
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- MTProcs,
-{$ENDIF USE_MTPROCS}
+{$ENDIF HASHLIB_USE_PPL}
HlpHash,
HlpIHashResult,
HlpBlake2S,
@@ -29,19 +22,11 @@ interface
type
TBlake2SP = class sealed(THash, ICryptoNotBuildIn, ITransformBlock)
strict private
-
- type
- PDataContainer = ^TDataContainer;
-
- TDataContainer = record
- PtrData: PByte;
- Counter: UInt64;
- end;
-
const
- BlockSizeInBytes = Int32(64);
- OutSizeInBytes = Int32(32);
- ParallelismDegree = Int32(8);
+ BlockSizeInBytes = 64;
+ OutSizeInBytes = 32;
+ ParallelismDegree = 8;
+ StripeSize = ParallelismDegree * BlockSizeInBytes;
var
// had to use the classes directly for performance purposes
@@ -61,26 +46,20 @@ TDataContainer = record
const ABlake2STreeConfig: IBlake2STreeConfig): TBlake2S;
function Blake2SPCreateLeaf(AOffset: UInt64): TBlake2S;
function Blake2SPCreateRoot(): TBlake2S;
- procedure ParallelComputation(AIdx: Int32; ADataContainer: PDataContainer);
- procedure DoParallelComputation(ADataContainer: PDataContainer);
+ // Each lane processes its own "stripe" of the input
+ procedure ProcessLeafLane(AIdx: Int32; APtrData: PByte;
+ ADataLength: UInt64);
+
+ // Dispatch computation across all lanes (parallel or sequential)
+ procedure ProcessLeafLanesInParallel(APtrData: PByte; ADataLength: UInt64);
function DeepCloneBlake2SInstances(const ALeafHashes
: THashLibGenericArray): THashLibGenericArray;
- procedure Clear();
+ procedure Clear;
constructor CreateInternal(AHashSize: Int32);
-
-{$IFDEF USE_PASMP}
- procedure PasMPParallelComputationWrapper(const AJob: PPasMPJob;
- const AThreadIndex: LongInt; const ADataContainer: Pointer;
- const AFromIndex, AToIndex: TPasMPNativeInt); inline;
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- procedure MTProcsParallelComputationWrapper(AIdx: PtrInt;
- ADataContainer: Pointer; AItem: TMultiThreadProcItem); inline;
-{$ENDIF USE_MTPROCS}
strict protected
function GetName: String; override;
@@ -111,17 +90,20 @@ function TBlake2SP.Blake2SPCreateLeaf(AOffset: UInt64): TBlake2S;
begin
LBlake2SConfig := TBlake2SConfig.Create(HashSize);
LBlake2SConfig.Key := FKey;
+
LBlake2STreeConfig := TBlake2STreeConfig.Create();
- LBlake2STreeConfig.FanOut := ParallelismDegree;
- LBlake2STreeConfig.MaxDepth := 2;
- LBlake2STreeConfig.NodeDepth := 0;
- LBlake2STreeConfig.LeafSize := 0;
- LBlake2STreeConfig.NodeOffset := AOffset;
+ LBlake2STreeConfig.FanOut := ParallelismDegree;
+ LBlake2STreeConfig.MaxDepth := 2;
+ LBlake2STreeConfig.NodeDepth := 0;
+ LBlake2STreeConfig.LeafSize := 0;
+ LBlake2STreeConfig.NodeOffset := AOffset;
LBlake2STreeConfig.InnerHashSize := OutSizeInBytes;
+
if AOffset = (ParallelismDegree - 1) then
begin
LBlake2STreeConfig.IsLastNode := True;
end;
+
Result := Blake2SPCreateLeafParam(LBlake2SConfig, LBlake2STreeConfig);
end;
@@ -132,14 +114,16 @@ function TBlake2SP.Blake2SPCreateRoot(): TBlake2S;
begin
LBlake2SConfig := TBlake2SConfig.Create(HashSize);
LBlake2SConfig.Key := FKey;
+
LBlake2STreeConfig := TBlake2STreeConfig.Create();
- LBlake2STreeConfig.FanOut := ParallelismDegree;
- LBlake2STreeConfig.MaxDepth := 2;
- LBlake2STreeConfig.NodeDepth := 1;
- LBlake2STreeConfig.LeafSize := 0;
- LBlake2STreeConfig.NodeOffset := 0;
+ LBlake2STreeConfig.FanOut := ParallelismDegree;
+ LBlake2STreeConfig.MaxDepth := 2;
+ LBlake2STreeConfig.NodeDepth := 1;
+ LBlake2STreeConfig.LeafSize := 0;
+ LBlake2STreeConfig.NodeOffset := 0;
LBlake2STreeConfig.InnerHashSize := OutSizeInBytes;
- LBlake2STreeConfig.IsLastNode := True;
+ LBlake2STreeConfig.IsLastNode := True;
+
Result := TBlake2S.Create(LBlake2SConfig, LBlake2STreeConfig, False);
end;
@@ -166,13 +150,16 @@ function TBlake2SP.Clone(): IHash;
begin
LHashInstance := TBlake2SP.CreateInternal(HashSize);
LHashInstance.FKey := System.Copy(FKey);
+
if FRootHash <> Nil then
begin
LHashInstance.FRootHash := FRootHash.CloneInternal();
end;
- LHashInstance.FLeafHashes := DeepCloneBlake2SInstances(FLeafHashes);
- LHashInstance.FBuffer := System.Copy(FBuffer);
+
+ LHashInstance.FLeafHashes := DeepCloneBlake2SInstances(FLeafHashes);
+ LHashInstance.FBuffer := System.Copy(FBuffer);
LHashInstance.FBufferLength := FBufferLength;
+
Result := LHashInstance as IHash;
Result.BufferSize := BufferSize;
end;
@@ -187,10 +174,13 @@ constructor TBlake2SP.Create(AHashSize: Int32; const AKey: THashLibByteArray);
LIdx: Int32;
begin
Inherited Create(AHashSize, BlockSizeInBytes);
+
System.SetLength(FBuffer, ParallelismDegree * BlockSizeInBytes);
System.SetLength(FLeafHashes, ParallelismDegree);
- FKey := System.Copy(AKey);
+
+ FKey := System.Copy(AKey);
FRootHash := Blake2SPCreateRoot;
+
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
FLeafHashes[LIdx] := Blake2SPCreateLeaf(LIdx);
@@ -202,14 +192,18 @@ destructor TBlake2SP.Destroy;
LIdx: Int32;
begin
Clear();
+
FRootHash.Free;
FRootHash := Nil;
+
for LIdx := System.Low(FLeafHashes) to System.High(FLeafHashes) do
begin
FLeafHashes[LIdx].Free;
FLeafHashes[LIdx] := Nil;
end;
+
FLeafHashes := Nil;
+
inherited Destroy;
end;
@@ -223,17 +217,19 @@ procedure TBlake2SP.Initialize;
LIdx: Int32;
begin
FRootHash.Initialize;
+
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
FLeafHashes[LIdx].Initialize;
FLeafHashes[LIdx].HashSize := OutSizeInBytes;
end;
+
TArrayUtils.ZeroFill(FBuffer);
FBufferLength := 0;
end;
-procedure TBlake2SP.ParallelComputation(AIdx: Int32;
- ADataContainer: PDataContainer);
+procedure TBlake2SP.ProcessLeafLane(AIdx: Int32; APtrData: PByte;
+ ADataLength: UInt64);
var
LLeafHashes: THashLibGenericArray;
LTemp: THashLibByteArray;
@@ -241,106 +237,74 @@ procedure TBlake2SP.ParallelComputation(AIdx: Int32;
LPtrData: PByte;
begin
System.SetLength(LTemp, BlockSizeInBytes);
- LPtrData := ADataContainer^.PtrData;
- LCounter := ADataContainer^.Counter;
- System.Inc(LPtrData, AIdx * BlockSizeInBytes);
- LLeafHashes := FLeafHashes;
- while (LCounter >= (ParallelismDegree * BlockSizeInBytes)) do
- begin
- System.Move(LPtrData^, LTemp[0], BlockSizeInBytes);
- LLeafHashes[AIdx].TransformBytes(LTemp, 0, BlockSizeInBytes);
- System.Inc(LPtrData, UInt64(ParallelismDegree * BlockSizeInBytes));
- LCounter := LCounter - UInt64(ParallelismDegree * BlockSizeInBytes);
- end;
-end;
-{$IFDEF USE_PASMP}
-
-procedure TBlake2SP.PasMPParallelComputationWrapper(const AJob: PPasMPJob;
- const AThreadIndex: LongInt; const ADataContainer: Pointer;
- const AFromIndex, AToIndex: TPasMPNativeInt);
-begin
- ParallelComputation(AFromIndex, ADataContainer);
-end;
-{$ENDIF}
-{$IFDEF USE_MTPROCS}
-
-procedure TBlake2SP.MTProcsParallelComputationWrapper(AIdx: PtrInt;
- ADataContainer: Pointer; AItem: TMultiThreadProcItem);
-begin
- ParallelComputation(AIdx, ADataContainer);
-end;
-{$ENDIF}
-{$IF DEFINED(USE_DELPHI_PPL)}
+ LPtrData := APtrData;
+ LCounter := ADataLength;
+ LLeafHashes := FLeafHashes;
-procedure TBlake2SP.DoParallelComputation(ADataContainer: PDataContainer);
+ // Start at lane offset
+ Inc(LPtrData, AIdx * BlockSizeInBytes);
- function CreateTask(AIdx: Int32; ADataContainer: PDataContainer): ITask;
+ // Process all full "stripes" of ParallelismDegree * BlockSizeInBytes
+ while (LCounter >= StripeSize) do
begin
- Result := TTask.Create(
- procedure()
- begin
- ParallelComputation(AIdx, ADataContainer);
- end);
- end;
+ System.Move(LPtrData^, LTemp[0], BlockSizeInBytes);
+ LLeafHashes[AIdx].TransformBytes(LTemp, 0, BlockSizeInBytes);
-var
- LArrayTasks: array of ITask;
- LIdx: Int32;
-begin
- System.SetLength(LArrayTasks, ParallelismDegree);
- for LIdx := 0 to System.Pred(ParallelismDegree) do
- begin
- LArrayTasks[LIdx] := CreateTask(LIdx, ADataContainer);
- LArrayTasks[LIdx].Start;
+ Inc(LPtrData, UInt64(StripeSize));
+ LCounter := LCounter - UInt64(StripeSize);
end;
- TTask.WaitForAll(LArrayTasks);
-end;
-
-{$ELSEIF DEFINED(USE_PASMP) OR DEFINED(USE_MTPROCS)}
-
-procedure TBlake2SP.DoParallelComputation(ADataContainer: PDataContainer);
-begin
-{$IF DEFINED(USE_PASMP)}
- TPasMP.CreateGlobalInstance;
- GlobalPasMP.Invoke(GlobalPasMP.ParallelFor(ADataContainer, 0,
- ParallelismDegree - 1, PasMPParallelComputationWrapper));
-{$ELSEIF DEFINED(USE_MTPROCS)}
- ProcThreadPool.DoParallel(MTProcsParallelComputationWrapper, 0,
- ParallelismDegree - 1, ADataContainer);
-{$ELSE}
-{$MESSAGE ERROR 'Unsupported Threading Library.'}
-{$IFEND USE_PASMP}
end;
-{$ELSE}
-
-procedure TBlake2SP.DoParallelComputation(ADataContainer: PDataContainer);
+procedure TBlake2SP.ProcessLeafLanesInParallel(APtrData: PByte;
+ ADataLength: UInt64);
var
+ LFullStripeLength: UInt64;
+{$IFNDEF HASHLIB_USE_PPL}
LIdx: Int32;
+{$ENDIF}
begin
+ // Only full stripes are processed here
+ LFullStripeLength := (ADataLength div StripeSize) * StripeSize;
+ if LFullStripeLength = 0 then
+ Exit;
+
+{$IFDEF HASHLIB_USE_PPL}
+ // parallel processing of each lane
+ TParallel.&For(
+ 0,
+ ParallelismDegree - 1,
+ procedure(AIdx: Integer)
+ begin
+ ProcessLeafLane(AIdx, APtrData, LFullStripeLength);
+ end
+ );
+{$ELSE}
+ // Fallback: simple sequential processing of each lane
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
- ParallelComputation(LIdx, ADataContainer);
+ ProcessLeafLane(LIdx, APtrData, LFullStripeLength);
end;
+{$ENDIF HASHLIB_USE_PPL}
end;
-{$IFEND USE_DELPHI_PPL}
procedure TBlake2SP.TransformBytes(const AData: THashLibByteArray;
-AIndex, ADataLength: Int32);
+ AIndex, ADataLength: Int32);
var
LLeft, LFill, LDataLength: UInt64;
LPtrData: PByte;
LIdx: Int32;
LLeafHashes: THashLibGenericArray;
- LPtrDataContainer: PDataContainer;
+ LProcessed: UInt64;
begin
LLeafHashes := FLeafHashes;
LDataLength := UInt64(ADataLength);
- LPtrData := PByte(AData) + AIndex;
+ LPtrData := PByte(AData) + AIndex;
+
LLeft := FBufferLength;
LFill := UInt64(System.Length(FBuffer)) - LLeft;
+ // Fill existing buffer to a full "parallel chunk" if possible
if (LLeft > 0) and (LDataLength >= LFill) then
begin
System.Move(LPtrData^, FBuffer[LLeft], LFill);
@@ -351,23 +315,20 @@ procedure TBlake2SP.TransformBytes(const AData: THashLibByteArray;
BlockSizeInBytes);
end;
- System.Inc(LPtrData, LFill);
+ Inc(LPtrData, LFill);
LDataLength := LDataLength - LFill;
LLeft := 0;
end;
- LPtrDataContainer := New(PDataContainer);
- try
- LPtrDataContainer^.PtrData := LPtrData;
- LPtrDataContainer^.Counter := LDataLength;
- DoParallelComputation(LPtrDataContainer);
- finally
- Dispose(LPtrDataContainer);
- end;
+ // Process as many full "parallel stripes" as possible
+ ProcessLeafLanesInParallel(LPtrData, LDataLength);
- System.Inc(LPtrData, LDataLength - (LDataLength mod UInt64(ParallelismDegree *
- BlockSizeInBytes)));
- LDataLength := LDataLength mod UInt64(ParallelismDegree * BlockSizeInBytes);
+ // Move pointer past processed data (everything except the remainder)
+ LProcessed := (LDataLength div StripeSize) * StripeSize;
+ Inc(LPtrData, LProcessed);
+
+ // Keep the remainder in the buffer
+ LDataLength := LDataLength - LProcessed;
if (LDataLength > 0) then
begin
@@ -386,35 +347,44 @@ function TBlake2SP.TransformFinal: IHashResult;
LRootHash: TBlake2S;
begin
LLeafHashes := FLeafHashes;
- LRootHash := FRootHash;
+ LRootHash := FRootHash;
+
System.SetLength(LHash, ParallelismDegree);
for LIdx := System.Low(LHash) to System.High(LHash) do
begin
System.SetLength(LHash[LIdx], OutSizeInBytes);
end;
+ // Finalize each leaf with the remaining buffered bytes
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
- if (FBufferLength > (LIdx * BlockSizeInBytes)) then
+ if (FBufferLength > (UInt64(LIdx) * BlockSizeInBytes)) then
begin
LLeft := FBufferLength - UInt64(LIdx * BlockSizeInBytes);
if (LLeft > BlockSizeInBytes) then
begin
LLeft := BlockSizeInBytes;
end;
- LLeafHashes[LIdx].TransformBytes(FBuffer, LIdx * BlockSizeInBytes,
- Int32(LLeft));
+
+ LLeafHashes[LIdx].TransformBytes(
+ FBuffer,
+ LIdx * BlockSizeInBytes,
+ Int32(LLeft)
+ );
end;
LHash[LIdx] := LLeafHashes[LIdx].TransformFinal().GetBytes();
end;
+ // Feed all leaf hashes into the root
for LIdx := 0 to System.Pred(ParallelismDegree) do
begin
LRootHash.TransformBytes(LHash[LIdx], 0, OutSizeInBytes);
end;
+
Result := LRootHash.TransformFinal();
Initialize();
end;
end.
+
diff --git a/HashLib/src/Include/HashLib.inc b/HashLib/src/Include/HashLib.inc
index 79a7c4c..1dfc0da 100644
--- a/HashLib/src/Include/HashLib.inc
+++ b/HashLib/src/Include/HashLib.inc
@@ -1,154 +1,31 @@
-{ *********************************************************************************** }
-{ * HashLib Library * }
-{ * Copyright (c) 2016 - 2020 Ugochukwu Mmaduekwe * }
-{ * Github Repository * }
+{ * ************************************************************************ * }
+{ * HashLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * Distributed under the MIT software license, see the accompanying file * }
+{ * LICENSE * }
+{ * or visit http://www.opensource.org/licenses/mit-license. * }
+{ * * }
+{ * ************************************************************************ * }
-{ * Distributed under the MIT software license, see the accompanying file LICENSE * }
-{ * or visit http://www.opensource.org/licenses/mit-license.php. * }
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-{ * ******************************************************************************* * }
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-
-{$DEFINE DELPHI}
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+{---------------------------- Compiler Family Switch --------------------------}
{$IFDEF FPC}
-{$I HashLibHelper.inc} // Had to Include this Since Delphi Does not allow "FPC_FULLVERSION" to Compile.
-{$UNDEF DELPHI}
-{$MODE delphi}
-
-{$IFDEF FPC_LITTLE_ENDIAN}
- {$DEFINE HASHLIB_LITTLE_ENDIAN}
-{$ENDIF}
-
-{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
- {$DEFINE HASHLIB_REQUIRES_PROPER_ALIGNMENT}
+ {$I HashLibFPC.inc} // FPC-specific settings
+{$ELSE}
+ {$DEFINE DELPHI}
+ {$I ../../HashLib/src/Include/HashLibDelphi.inc} // Delphi-specific settings
{$ENDIF}
-{$DEFINE USE_UNROLLED_VARIANT}
-
-// Disable Overflow and RangeChecks.
+{-------------------------- Common Compiler Settings --------------------------}
+{$SCOPEDENUMS ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
-
-// Enable Pointer Math
{$POINTERMATH ON}
-
-// Disable Warnings and Hints.
{$WARNINGS OFF}
{$HINTS OFF}
-{$NOTES OFF}
-
-// Optimizations
-{$OPTIMIZATION LEVEL3}
-// disable "USELOADMODIFYSTORE" because it produces incorrect result
-// when used in combination with -CpCOREAVX2 and -OpCOREAVX2 in FPC 3.2.0 beta
-{$IFDEF FPC_GREATER_THAN_3.0.4}
- {$OPTIMIZATION NOUSELOADMODIFYSTORE}
-{$ENDIF}
-// level 4 optimizations
-{$OPTIMIZATION ORDERFIELDS}
-{$OPTIMIZATION DEADVALUES}
-
-{$IFDEF CPUI386}
- {$OPTIMIZATION USEEBP}
-{$ENDIF}
-
-{$IFDEF CPUX86_64}
- {$OPTIMIZATION USERBP}
-{$ENDIF}
-
-{.$DEFINE USE_MTPROCS}
-{.$DEFINE USE_PASMP}
-
-{$IF DEFINED(USE_MTPROCS) AND DEFINED(USE_PASMP)}
- {$MESSAGE ERROR 'Only One Threading Library can be used at a time.'}
-{$IFEND}
-
-{$ENDIF FPC}
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-{$IFDEF DELPHI}
-
-{$DEFINE HASHLIB_LITTLE_ENDIAN}
-
-{$IFDEF CPUARM}
- {$DEFINE HASHLIB_REQUIRES_PROPER_ALIGNMENT}
-{$ENDIF}
-
- // XE3 and Above
-{$IF CompilerVersion >= 24.0}
- {$DEFINE DELPHIXE3_UP}
- {$LEGACYIFEND ON}
- {$ZEROBASEDSTRINGS OFF}
-{$IFEND}
-
- // 2010 only
-{$IF CompilerVersion = 21.0}
- {$DEFINE DELPHI2010}
-{$IFEND}
-
- // 2010 and Above
-{$IF CompilerVersion >= 21.0}
- {$DEFINE DELPHI2010_UP}
-{$IFEND}
-
- // XE and Above
-{$IF CompilerVersion >= 22.0}
- {$DEFINE DELPHIXE_UP}
-{$IFEND}
-
- // XE2 and Above
-{$IF CompilerVersion >= 23.0}
- {$DEFINE DELPHIXE2_UP}
-{$IFEND}
-
- // XE4 and Above
-{$IF CompilerVersion >= 25.0}
- {$DEFINE DELPHIXE4_UP}
- {$DEFINE SHIFT_OVERFLOW_BUG_FIXED}
-{$IFEND}
-
- // XE7 and Above
-{$IF CompilerVersion >= 28.0}
- {$DEFINE DELPHIXE7_UP}
- {.$DEFINE USE_DELPHI_PPL} // Use Delphi Parallel Programming Library
- {$DEFINE HAS_DELPHI_NET_ENCODING}
-{$IFEND}
-
- // 2010 and Above
-{$IFNDEF DELPHI2010_UP}
- {$MESSAGE ERROR 'This Library requires Delphi 2010 or higher.'}
-{$ENDIF}
-
-{$DEFINE USE_UNROLLED_VARIANT}
-
-{.$DEFINE USE_PASMP}
-
-{$IF DEFINED(USE_DELPHI_PPL) AND DEFINED(USE_PASMP)}
- {$MESSAGE ERROR 'Only One Threading Library can be used at a time.'}
-{$IFEND}
-
-// This option is needed to enable code browsing (aka Ctrl+Click)
-// It does not affect the binary size or generated code
-{$DEFINITIONINFO ON}
-
-// Disable Overflow and RangeChecks.
-{$OVERFLOWCHECKS OFF}
-{$RANGECHECKS OFF}
-
- // Enable Pointer Math
-{$POINTERMATH ON}
-
-// Disable String Checks
-{$STRINGCHECKS OFF}
-
-// Disable Duplicate Constructor Warnings
-{$WARN DUPLICATE_CTOR_DTOR OFF}
-
-{$ENDIF DELPHI}
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
diff --git a/HashLib/src/Include/HashLibDelphi.inc b/HashLib/src/Include/HashLibDelphi.inc
new file mode 100644
index 0000000..d6aa165
--- /dev/null
+++ b/HashLib/src/Include/HashLibDelphi.inc
@@ -0,0 +1,52 @@
+{ * ************************************************************************ * }
+{ * HashLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * Distributed under the MIT software license, see the accompanying file * }
+{ * LICENSE * }
+{ * or visit http://www.opensource.org/licenses/mit-license. * }
+{ * * }
+{ * ************************************************************************ * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+{$IFDEF DELPHI}
+ {$DEFINITIONINFO ON} // IDE navigation; no binary impact
+ {$STRINGCHECKS OFF}
+ {$WARN DUPLICATE_CTOR_DTOR OFF}
+
+ {$DEFINE HASHLIB_LITTLE_ENDIAN}
+
+{$IFDEF CPUARM}
+ {$DEFINE HASHLIB_REQUIRES_PROPER_ALIGNMENT}
+{$ENDIF}
+
+ {$DEFINE USE_UNROLLED_VARIANT}
+
+ // 2010 only
+{$IF CompilerVersion = 21.0}
+ {$DEFINE DELPHI2010}
+{$IFEND}
+
+ // XE and Above
+{$IF CompilerVersion >= 22.0}
+ {$DEFINE DELPHIXE_UP}
+{$IFEND}
+
+ // XE4 and Above
+{$IF CompilerVersion >= 25.0}
+ {$DEFINE SHIFT_OVERFLOW_BUG_FIXED}
+{$IFEND}
+
+ // XE7 and Above
+{$IF CompilerVersion >= 28.0}
+ {$DEFINE HASHLIB_USE_PPL} // Use Parallel Programming Library
+ {$DEFINE HAS_DELPHI_NET_ENCODING}
+{$IFEND}
+
+ {$IF CompilerVersion < 21.0}
+ {$MESSAGE ERROR 'This Library requires Delphi 2010 or higher.'}
+ {$IFEND}
+{$ENDIF}
+
diff --git a/HashLib/src/Include/HashLibFPC.inc b/HashLib/src/Include/HashLibFPC.inc
new file mode 100644
index 0000000..1819809
--- /dev/null
+++ b/HashLib/src/Include/HashLibFPC.inc
@@ -0,0 +1,39 @@
+{ * ************************************************************************ * }
+{ * HashLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * Distributed under the MIT software license, see the accompanying file * }
+{ * LICENSE * }
+{ * or visit http://www.opensource.org/licenses/mit-license. * }
+{ * * }
+{ * ************************************************************************ * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+{$IFDEF FPC}
+{$IFDEF FPC_LITTLE_ENDIAN}
+ {$DEFINE HASHLIB_LITTLE_ENDIAN}
+{$ENDIF}
+
+{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
+ {$DEFINE HASHLIB_REQUIRES_PROPER_ALIGNMENT}
+{$ENDIF}
+
+{$IF FPC_FULLVERSION >= 30301}
+ {.$DEFINE HASHLIB_USE_PPL} // Use Parallel Programming Library
+{$IFEND}
+
+ {$DEFINE USE_UNROLLED_VARIANT}
+
+ {$MODE DELPHI}
+ {$MACRO ON}
+ {$NOTES OFF}
+ {$OPTIMIZATION LEVEL3}
+ {$OPTIMIZATION NOUSELOADMODIFYSTORE}
+ {$OPTIMIZATION ORDERFIELDS}
+ {$OPTIMIZATION DEADVALUES}
+ {$IFDEF CPUI386} {$OPTIMIZATION USEEBP} {$ENDIF}
+ {$IFDEF CPUX86_64} {$OPTIMIZATION USERBP} {$ENDIF}
+{$ENDIF}
+
diff --git a/HashLib/src/Include/HashLibHelper.inc b/HashLib/src/Include/HashLibHelper.inc
deleted file mode 100644
index 345079d..0000000
--- a/HashLib/src/Include/HashLibHelper.inc
+++ /dev/null
@@ -1,26 +0,0 @@
-{ *********************************************************************************** }
-{ * HashLib Library * }
-{ * Copyright (c) 2016 - 2020 Ugochukwu Mmaduekwe * }
-{ * Github Repository * }
-
-{ * Distributed under the MIT software license, see the accompanying file LICENSE * }
-{ * or visit http://www.opensource.org/licenses/mit-license.php. * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-
-{$MACRO ON}
-{$IFDEF ENDIAN_BIG}
- {$MESSAGE FATAL 'This Library does not support "Big Endian" processors yet.'}
-{$ENDIF}
-// FPC 3.0.0 and Above
-// Had to Include this here since Delphi does not allow it Compile in "HashLib.inc".
-{$IF FPC_FULLVERSION < 30000}
- {$MESSAGE ERROR 'This Library requires FreePascal 3.0.0 or higher.'}
-{$IFEND}
-
-{$IF FPC_FULLVERSION > 30004}
- {$DEFINE FPC_GREATER_THAN_3.0.4}
-{$IFEND}
diff --git a/HashLib/src/KDF/HlpPBKDF_Argon2NotBuildInAdapter.pas b/HashLib/src/KDF/HlpPBKDF_Argon2NotBuildInAdapter.pas
index 811373e..ea82b51 100644
--- a/HashLib/src/KDF/HlpPBKDF_Argon2NotBuildInAdapter.pas
+++ b/HashLib/src/KDF/HlpPBKDF_Argon2NotBuildInAdapter.pas
@@ -5,17 +5,10 @@
interface
uses
-{$IFDEF USE_DELPHI_PPL}
- System.Classes,
- System.SysUtils,
+ SysUtils,
+{$IFDEF HASHLIB_USE_PPL}
System.Threading,
-{$ENDIF USE_DELPHI_PPL}
-{$IFDEF USE_PASMP}
- PasMP,
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- MTProcs,
-{$ENDIF USE_MTPROCS}
+{$ENDIF HASHLIB_USE_PPL}
HlpKDF,
HlpBits,
HlpIHash,
@@ -284,13 +277,6 @@ TFillBlock = record
class function CreateFillBlock(): TFillBlock; static;
end;
- type
- PDataContainer = ^TDataContainer;
-
- TDataContainer = record
- Position: TPosition;
- end;
-
var
FMemory: THashLibGenericArray;
@@ -337,19 +323,10 @@ TDataContainer = record
function GetPrevOffset(ACurrentOffset: Int32): Int32; inline;
function RotatePrevOffset(ACurrentOffset, APrevOffset: Int32)
: Int32; inline;
- procedure FillSegment(AIdx: Int32; var APosition: TPosition);
- procedure FillMemoryBlocks(AIdx: Int32;
- ADataContainer: PDataContainer); inline;
- procedure DoParallelFillMemoryBlocks(ADataContainer: PDataContainer);
-{$IFDEF USE_PASMP}
- procedure PasMPFillMemoryBlocksWrapper(const AJob: PPasMPJob;
- const AThreadIndex: LongInt; const ADataContainer: Pointer;
- const AFromIndex, AToIndex: TPasMPNativeInt); inline;
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- procedure MTProcsFillMemoryBlocksWrapper(AIdx: PtrInt;
- ADataContainer: Pointer; AItem: TMultiThreadProcItem); inline;
-{$ENDIF USE_MTPROCS}
+ procedure FillSegment(ALane: Int32; var APosition: TPosition);
+ procedure FillSegmentForLane(ALane: Int32; const ABasePosition: TPosition);
+ procedure DoParallelFillMemoryBlocks;
+
(* *
* H0 = H64(p, τ, m, t, v, y, |P|, P, |S|, S, |L|, K, |X|, X)
@@ -412,7 +389,7 @@ implementation
class function TPBKDF_Argon2NotBuildInAdapter.TBlock.CreateBlock: TBlock;
begin
- result := Default (TBlock);
+ result := Default(TBlock);
System.SetLength(result.Fv, SIZE);
result.FInitialized := True;
end;
@@ -530,7 +507,7 @@ function TPBKDF_Argon2NotBuildInAdapter.TBlock.ToString: String;
class function TPBKDF_Argon2NotBuildInAdapter.TPosition.CreatePosition()
: TPosition;
begin
- result := Default (TPosition);
+ result := Default(TPosition);
end;
procedure TPBKDF_Argon2NotBuildInAdapter.TPosition.Update(APass, ALane, ASlice,
@@ -651,7 +628,7 @@ procedure TPBKDF_Argon2NotBuildInAdapter.TFillBlock.ApplyBlake();
class function TPBKDF_Argon2NotBuildInAdapter.TFillBlock.CreateFillBlock
: TFillBlock;
begin
- result := Default (TFillBlock);
+ result := Default(TFillBlock);
result.FR := TBlock.CreateBlock();
result.FZ := TBlock.CreateBlock();
result.FAddressBlock := TBlock.CreateBlock();
@@ -961,7 +938,7 @@ procedure TPBKDF_Argon2NotBuildInAdapter.Reset;
for LIdx := 0 to System.Pred(System.Length(FMemory)) do
begin
FMemory[LIdx].Clear;
- FMemory[LIdx] := Default (TBlock);
+ FMemory[LIdx] := Default(TBlock);
end;
FMemory := Nil;
TArrayUtils.ZeroFill(FResult);
@@ -1297,7 +1274,7 @@ procedure TPBKDF_Argon2NotBuildInAdapter.Initialize(const APassword
FillFirstBlocks(LInitialHash);
end;
-procedure TPBKDF_Argon2NotBuildInAdapter.FillSegment(AIdx: Int32;
+procedure TPBKDF_Argon2NotBuildInAdapter.FillSegment(ALane: Int32;
var APosition: TPosition);
var
LAddressBlock, LInputBlock, LZeroBlock, LPrevBlock, LRefBlock,
@@ -1307,8 +1284,7 @@ procedure TPBKDF_Argon2NotBuildInAdapter.FillSegment(AIdx: Int32;
LPseudoRandom: UInt64;
LFiller: TFillBlock;
begin
- // line below not really needed, just added to fix compiler hint
- APosition.FLane := AIdx;
+ APosition.FLane := ALane;
LFiller := TFillBlock.CreateFillBlock();
LDataIndependentAddressing := IsDataIndependentAddressing(APosition);
LStartingIndex := GetStartingIndex(APosition);
@@ -1316,9 +1292,9 @@ procedure TPBKDF_Argon2NotBuildInAdapter.FillSegment(AIdx: Int32;
(APosition.FSlice * FSegmentLength) + LStartingIndex;
LPrevOffset := GetPrevOffset(LCurrentOffset);
- LAddressBlock := Default (TBlock);
- LInputBlock := Default (TBlock);
- LZeroBlock := Default (TBlock);
+ LAddressBlock := Default(TBlock);
+ LInputBlock := Default(TBlock);
+ LZeroBlock := Default(TBlock);
if (LDataIndependentAddressing) then
begin
@@ -1356,130 +1332,55 @@ procedure TPBKDF_Argon2NotBuildInAdapter.FillSegment(AIdx: Int32;
end;
end;
-procedure TPBKDF_Argon2NotBuildInAdapter.FillMemoryBlocks(AIdx: Int32;
- ADataContainer: PDataContainer);
+procedure TPBKDF_Argon2NotBuildInAdapter.FillSegmentForLane(ALane: Int32;
+ const ABasePosition: TPosition);
var
- LPosition: TPosition;
+ LPos: TPosition;
begin
- LPosition := ADataContainer^.Position;
- FillSegment(AIdx, LPosition);
+ LPos := ABasePosition;
+ FillSegment(ALane, LPos);
end;
-{$IFDEF USE_PASMP}
-
-procedure TPBKDF_Argon2NotBuildInAdapter.PasMPFillMemoryBlocksWrapper
- (const AJob: PPasMPJob; const AThreadIndex: LongInt;
- const ADataContainer: Pointer; const AFromIndex, AToIndex: TPasMPNativeInt);
-begin
- PDataContainer(ADataContainer)^.Position.FLane := AFromIndex;
- FillMemoryBlocks(AFromIndex, ADataContainer);
-end;
-{$ENDIF}
-{$IFDEF USE_MTPROCS}
-
-procedure TPBKDF_Argon2NotBuildInAdapter.MTProcsFillMemoryBlocksWrapper
- (AIdx: PtrInt; ADataContainer: Pointer; AItem: TMultiThreadProcItem);
-begin
- PDataContainer(ADataContainer)^.Position.FLane := AIdx;
- FillMemoryBlocks(AIdx, ADataContainer);
-end;
-{$ENDIF}
-{$IF DEFINED(USE_DELPHI_PPL)}
-
-procedure TPBKDF_Argon2NotBuildInAdapter.DoParallelFillMemoryBlocks
- (ADataContainer: PDataContainer);
-
- function CreateTask(AIdx: Int32; ADataContainer: PDataContainer): ITask;
- begin
- result := TTask.Create(
- procedure()
- begin
- FillMemoryBlocks(AIdx, ADataContainer);
- end);
- end;
-
+procedure TPBKDF_Argon2NotBuildInAdapter.DoParallelFillMemoryBlocks;
var
- LIdx, LJdx, LKdx, LIterations, LLanes: Int32;
- LArrayTasks: array of ITask;
+ LPass, LSlice: Int32;
+ LIterations, LLanes: Int32;
+ LBasePosition: TPosition;
+{$IFNDEF HASHLIB_USE_PPL}
+ LLane: Int32;
+{$ENDIF}
begin
LIterations := FParameters.Iterations;
- LLanes := FParameters.Lanes;
- System.SetLength(LArrayTasks, LLanes);
+ LLanes := FParameters.Lanes;
- for LIdx := 0 to System.Pred(LIterations) do
+ for LPass := 0 to System.Pred(LIterations) do
begin
- for LJdx := 0 to System.Pred(ARGON2_SYNC_POINTS) do
+ for LSlice := 0 to System.Pred(ARGON2_SYNC_POINTS) do
begin
- for LKdx := 0 to System.Pred(LLanes) do
- begin
- ADataContainer^.Position.Update(LIdx, LKdx, LJdx, 0);
- LArrayTasks[LKdx] := CreateTask(LKdx, ADataContainer);
- LArrayTasks[LKdx].Start;
- end;
- TTask.WaitForAll(LArrayTasks);
- end;
- end;
-
-end;
-
-{$ELSEIF DEFINED(USE_PASMP) OR DEFINED(USE_MTPROCS)}
-
-procedure TPBKDF_Argon2NotBuildInAdapter.DoParallelFillMemoryBlocks
- (ADataContainer: PDataContainer);
-var
- LIdx, LJdx, LIterations, LLanes: Int32;
-begin
- LIterations := FParameters.Iterations;
- LLanes := FParameters.Lanes;
- for LIdx := 0 to System.Pred(LIterations) do
- begin
- for LJdx := 0 to System.Pred(ARGON2_SYNC_POINTS) do
- begin
- ADataContainer^.Position.Update(LIdx, 0, LJdx, 0);
-{$IF DEFINED(USE_PASMP)}
- TPasMP.CreateGlobalInstance;
- GlobalPasMP.Invoke(GlobalPasMP.ParallelFor(ADataContainer, 0, LLanes - 1,
- PasMPFillMemoryBlocksWrapper));
-{$ELSEIF DEFINED(USE_MTPROCS)}
- ProcThreadPool.DoParallel(MTProcsFillMemoryBlocksWrapper, 0, LLanes - 1,
- ADataContainer);
-{$ELSE}
-{$MESSAGE ERROR 'Unsupported Threading Library.'}
-{$IFEND USE_PASMP}
- end;
- end;
-
-end;
-
+ LBasePosition := TPosition.CreatePosition();
+ LBasePosition.Update(LPass, 0, LSlice, 0);
+
+{$IFDEF HASHLIB_USE_PPL}
+ TParallel.&For(
+ 0,
+ LLanes - 1,
+ procedure(ALane: Integer)
+ begin
+ FillSegmentForLane(ALane, LBasePosition);
+ end
+ );
{$ELSE}
-
-procedure TPBKDF_Argon2NotBuildInAdapter.DoParallelFillMemoryBlocks
- (ADataContainer: PDataContainer);
-var
- LIdx, LJdx, LKdx, LIterations, LLanes: Int32;
-begin
- LIterations := FParameters.Iterations;
- LLanes := FParameters.Lanes;
- for LIdx := 0 to System.Pred(LIterations) do
- begin
- for LJdx := 0 to System.Pred(ARGON2_SYNC_POINTS) do
- begin
- for LKdx := 0 to System.Pred(LLanes) do
+ for LLane := 0 to System.Pred(LLanes) do
begin
- ADataContainer^.Position.Update(LIdx, LKdx, LJdx, 0);
- FillMemoryBlocks(LKdx, ADataContainer);
+ FillSegmentForLane(LLane, LBasePosition);
end;
+{$ENDIF HASHLIB_USE_PPL}
end;
end;
end;
-{$IFEND USE_DELPHI_PPL}
-
function TPBKDF_Argon2NotBuildInAdapter.GetBytes(AByteCount: Int32)
: THashLibByteArray;
-var
- LPtrDataContainer: PDataContainer;
- LPosition: TPosition;
begin
if (AByteCount <= MIN_OUTLEN) then
begin
@@ -1488,14 +1389,7 @@ function TPBKDF_Argon2NotBuildInAdapter.GetBytes(AByteCount: Int32)
end;
Initialize(FPassword, AByteCount);
- LPosition := TPosition.CreatePosition();
- LPtrDataContainer := New(PDataContainer);
- try
- LPtrDataContainer^.Position := LPosition;
- DoParallelFillMemoryBlocks(LPtrDataContainer);
- finally
- Dispose(LPtrDataContainer);
- end;
+ DoParallelFillMemoryBlocks;
Digest(AByteCount);
System.SetLength(result, AByteCount);
System.Move(FResult[0], result[0], AByteCount * System.SizeOf(Byte));
@@ -1547,3 +1441,4 @@ destructor TPBKDF_Argon2NotBuildInAdapter.Destroy;
end;
end.
+
diff --git a/HashLib/src/KDF/HlpPBKDF_ScryptNotBuildInAdapter.pas b/HashLib/src/KDF/HlpPBKDF_ScryptNotBuildInAdapter.pas
index 8425feb..61b5e36 100644
--- a/HashLib/src/KDF/HlpPBKDF_ScryptNotBuildInAdapter.pas
+++ b/HashLib/src/KDF/HlpPBKDF_ScryptNotBuildInAdapter.pas
@@ -5,17 +5,10 @@
interface
uses
-{$IFDEF USE_DELPHI_PPL}
- System.Classes,
- System.SysUtils,
+ SysUtils,
+{$IFDEF HASHLIB_USE_PPL}
System.Threading,
-{$ENDIF USE_DELPHI_PPL}
-{$IFDEF USE_PASMP}
- PasMP,
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- MTProcs,
-{$ENDIF USE_MTPROCS}
+{$ENDIF HASHLIB_USE_PPL}
HlpIHash,
HlpKDF,
HlpBits,
@@ -46,14 +39,6 @@ TPBKDF_ScryptNotBuildInAdapter = class sealed(TKDF, IPBKDF_Scrypt,
IPBKDF_ScryptNotBuildIn)
strict private
- type
- PDataContainer = ^TDataContainer;
-
- TDataContainer = record
- PtrB: PCardinal;
- Parallelism, Cost, BlockSize: Int32;
- end;
-
var
FPasswordBytes, FSaltBytes: THashLibByteArray;
FCost, FBlockSize, FParallelism: Int32;
@@ -97,23 +82,15 @@ TDataContainer = record
class procedure &Xor(const Aa, Ab: THashLibUInt32Array; AbOff: Int32;
const AOutput: THashLibUInt32Array); static;
- class procedure SMix(AIdx: Int32;
- APtrDataContainer: PDataContainer); static;
+ class procedure SMixLane(AIdx: Int32; APtrB: PCardinal;
+ ACost, ABlockSize: Int32); static;
class procedure BlockMix(const Ab, AX1, AX2, Ay: THashLibUInt32Array;
AR: Int32); static;
- class procedure DoParallelSMix(ADataContainer: PDataContainer); static;
-
-{$IFDEF USE_PASMP}
- class procedure PasMPSMixWrapper(const AJob: PPasMPJob;
- const AThreadIndex: LongInt; const ADataContainer: Pointer;
- const AFromIndex, AToIndex: TPasMPNativeInt); inline;
-{$ENDIF USE_PASMP}
-{$IFDEF USE_MTPROCS}
- class procedure MTProcsSMixWrapper(AIdx: PtrInt; ADataContainer: Pointer;
- AItem: TMultiThreadProcItem); inline;
-{$ENDIF USE_MTPROCS}
+ class procedure DoParallelSMix(APtrB: PCardinal; AParallelism, ACost,
+ ABlockSize: Int32); static;
+
class function MFCrypt(const APasswordBytes, ASaltBytes: THashLibByteArray;
ACost, ABlockSize, AParallelism, AOutputLength: Int32)
: THashLibByteArray; static;
@@ -322,57 +299,52 @@ class procedure TPBKDF_ScryptNotBuildInAdapter.BlockMix(const Ab, AX1, AX2,
end;
end;
-class procedure TPBKDF_ScryptNotBuildInAdapter.SMix(AIdx: Int32;
- APtrDataContainer: PDataContainer);
+class procedure TPBKDF_ScryptNotBuildInAdapter.SMixLane(AIdx: Int32;
+ APtrB: PCardinal; ACost, ABlockSize: Int32);
var
- LBCount, LIdx, LJdx, LOffset, LBlockSize, LCost: Int32;
+ LBCount, LIdx, LJdx, LOffset: Int32;
LMask: UInt32;
LBlockX1, LBlockX2, LBlockY, LX, LV: THashLibUInt32Array;
- LPtrB: PCardinal;
begin
- LPtrB := APtrDataContainer^.PtrB;
- LCost := APtrDataContainer^.Cost;
- LBlockSize := APtrDataContainer^.BlockSize;
- AIdx := AIdx * 32 * LBlockSize;
- LBCount := LBlockSize * 32;
+ AIdx := AIdx * 32 * ABlockSize;
+ LBCount := ABlockSize * 32;
+
System.SetLength(LBlockX1, 16);
System.SetLength(LBlockX2, 16);
System.SetLength(LBlockY, LBCount);
-
System.SetLength(LX, LBCount);
-
- System.SetLength(LV, LCost * LBCount);
+ System.SetLength(LV, ACost * LBCount);
try
- System.Move(LPtrB[AIdx], LX[0], LBCount * System.SizeOf(UInt32));
+ System.Move(APtrB[AIdx], LX[0], LBCount * System.SizeOf(UInt32));
LOffset := 0;
LIdx := 0;
- while LIdx < LCost do
+ while LIdx < ACost do
begin
System.Move(LX[0], LV[LOffset], LBCount * System.SizeOf(UInt32));
LOffset := LOffset + LBCount;
- BlockMix(LX, LBlockX1, LBlockX2, LBlockY, LBlockSize);
+ BlockMix(LX, LBlockX1, LBlockX2, LBlockY, ABlockSize);
System.Move(LBlockY[0], LV[LOffset], LBCount * System.SizeOf(UInt32));
LOffset := LOffset + LBCount;
- BlockMix(LBlockY, LBlockX1, LBlockX2, LX, LBlockSize);
+ BlockMix(LBlockY, LBlockX1, LBlockX2, LX, ABlockSize);
System.Inc(LIdx, 2);
end;
- LMask := UInt32(LCost) - 1;
+ LMask := UInt32(ACost) - 1;
LIdx := 0;
- while LIdx < LCost do
+ while LIdx < ACost do
begin
LJdx := Int32(LX[LBCount - 16] and LMask);
System.Move(LV[LJdx * LBCount], LBlockY[0],
LBCount * System.SizeOf(UInt32));
&Xor(LBlockY, LX, 0, LBlockY);
- BlockMix(LBlockY, LBlockX1, LBlockX2, LX, LBlockSize);
+ BlockMix(LBlockY, LBlockX1, LBlockX2, LX, ABlockSize);
System.Inc(LIdx);
end;
- System.Move(LX[0], LPtrB[AIdx], LBCount * System.SizeOf(UInt32));
+ System.Move(LX[0], APtrB[AIdx], LBCount * System.SizeOf(UInt32));
finally
ClearArray(LV);
ClearAllArrays(THashLibMatrixUInt32Array.Create(LX, LBlockX1, LBlockX2,
@@ -380,87 +352,30 @@ class procedure TPBKDF_ScryptNotBuildInAdapter.SMix(AIdx: Int32;
end;
end;
-{$IFDEF USE_PASMP}
-
-class procedure TPBKDF_ScryptNotBuildInAdapter.PasMPSMixWrapper
- (const AJob: PPasMPJob; const AThreadIndex: LongInt;
- const ADataContainer: Pointer; const AFromIndex, AToIndex: TPasMPNativeInt);
-begin
- SMix(AFromIndex, ADataContainer);
-end;
-{$ENDIF}
-{$IFDEF USE_MTPROCS}
-
-class procedure TPBKDF_ScryptNotBuildInAdapter.MTProcsSMixWrapper(AIdx: PtrInt;
- ADataContainer: Pointer; AItem: TMultiThreadProcItem);
-begin
- SMix(AIdx, ADataContainer);
-end;
-{$ENDIF}
-{$IF DEFINED(USE_DELPHI_PPL)}
-
-class procedure TPBKDF_ScryptNotBuildInAdapter.DoParallelSMix
- (ADataContainer: PDataContainer);
-
- function CreateTask(AIdx: Int32; ADataContainer: PDataContainer): ITask;
- begin
- result := TTask.Create(
- procedure()
- begin
- SMix(AIdx, ADataContainer);
- end);
- end;
-
+class procedure TPBKDF_ScryptNotBuildInAdapter.DoParallelSMix(
+ APtrB: PCardinal; AParallelism, ACost, ABlockSize: Int32);
+{$IFNDEF HASHLIB_USE_PPL}
var
- LIdx, LParallelism: Int32;
- LArrayTasks: array of ITask;
-begin
- LParallelism := ADataContainer^.Parallelism;
- System.SetLength(LArrayTasks, LParallelism);
- for LIdx := 0 to System.Pred(LParallelism) do
- begin
- LArrayTasks[LIdx] := CreateTask(LIdx, ADataContainer);
- LArrayTasks[LIdx].Start;
- end;
- TTask.WaitForAll(LArrayTasks);
-end;
-
-{$ELSEIF DEFINED(USE_PASMP) OR DEFINED(USE_MTPROCS)}
-
-class procedure TPBKDF_ScryptNotBuildInAdapter.DoParallelSMix
- (ADataContainer: PDataContainer);
-var
- LParallelism: Int32;
+ LIdx: Int32;
+{$ENDIF}
begin
- LParallelism := ADataContainer^.Parallelism;
-{$IF DEFINED(USE_PASMP)}
- TPasMP.CreateGlobalInstance;
- GlobalPasMP.Invoke(GlobalPasMP.ParallelFor(ADataContainer, 0,
- LParallelism - 1, PasMPSMixWrapper));
-{$ELSEIF DEFINED(USE_MTPROCS)}
- ProcThreadPool.DoParallel(MTProcsSMixWrapper, 0, LParallelism - 1,
- ADataContainer);
-{$ELSE}
-{$MESSAGE ERROR 'Unsupported Threading Library.'}
-{$IFEND USE_PASMP}
-end;
-
+{$IFDEF HASHLIB_USE_PPL}
+ TParallel.&For(
+ 0,
+ AParallelism - 1,
+ procedure(AIdx: Integer)
+ begin
+ SMixLane(AIdx, APtrB, ACost, ABlockSize);
+ end
+ );
{$ELSE}
-
-class procedure TPBKDF_ScryptNotBuildInAdapter.DoParallelSMix
- (ADataContainer: PDataContainer);
-var
- LIdx, LParallelism: Int32;
-begin
- LParallelism := ADataContainer^.Parallelism;
- for LIdx := 0 to System.Pred(LParallelism) do
+ for LIdx := 0 to AParallelism - 1 do
begin
- SMix(LIdx, ADataContainer);
+ SMixLane(LIdx, APtrB, ACost, ABlockSize);
end;
+{$ENDIF HASHLIB_USE_PPL}
end;
-{$IFEND USE_DELPHI_PPL}
-
class function TPBKDF_ScryptNotBuildInAdapter.MFCrypt(const APasswordBytes,
ASaltBytes: THashLibByteArray; ACost, ABlockSize, AParallelism,
AOutputLength: Int32): THashLibByteArray;
@@ -468,7 +383,6 @@ class function TPBKDF_ScryptNotBuildInAdapter.MFCrypt(const APasswordBytes,
LMFLenBytes, LBLen: Int32;
LBytes: THashLibByteArray;
Lb: THashLibUInt32Array;
- LPtrDataContainer: PDataContainer;
begin
LMFLenBytes := ABlockSize * 128;
LBytes := SingleIterationPBKDF2(APasswordBytes, ASaltBytes,
@@ -481,16 +395,7 @@ class function TPBKDF_ScryptNotBuildInAdapter.MFCrypt(const APasswordBytes,
TConverters.le32_copy(PByte(LBytes), 0, PCardinal(Lb), 0,
System.Length(LBytes) * System.SizeOf(Byte));
- LPtrDataContainer := New(PDataContainer);
- try
- LPtrDataContainer^.PtrB := PCardinal(Lb);
- LPtrDataContainer^.Parallelism := AParallelism;
- LPtrDataContainer^.Cost := ACost;
- LPtrDataContainer^.BlockSize := ABlockSize;
- DoParallelSMix(LPtrDataContainer);
- finally
- Dispose(LPtrDataContainer);
- end;
+ DoParallelSMix(PCardinal(Lb), AParallelism, ACost, ABlockSize);
TConverters.le32_copy(PCardinal(Lb), 0, PByte(LBytes), 0,
System.Length(Lb) * System.SizeOf(UInt32));
@@ -571,3 +476,4 @@ function TPBKDF_ScryptNotBuildInAdapter.GetBytes(AByteCount: Int32)
end;
end.
+
diff --git a/HashLib/src/Packages/FPC/HashLib4PascalPackage.lpk b/HashLib/src/Packages/FPC/HashLib4PascalPackage.lpk
index afc0ecc..b56831d 100644
--- a/HashLib/src/Packages/FPC/HashLib4PascalPackage.lpk
+++ b/HashLib/src/Packages/FPC/HashLib4PascalPackage.lpk
@@ -22,7 +22,7 @@
-
+
@@ -325,7 +325,7 @@
-
+