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 @@ - +