diff --git a/Benchmarks/Argon2Benchmarks.cs b/Benchmarks/Argon2Benchmarks.cs new file mode 100644 index 0000000..4beb4cd --- /dev/null +++ b/Benchmarks/Argon2Benchmarks.cs @@ -0,0 +1,128 @@ +// Copyright (c) 2023 Timothy Schenk. Subject to the GNU AGPL Version 3 License. + +using System.Security.Cryptography; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Order; +using Isopoh.Cryptography.Argon2; +using Konscious.Security.Cryptography; +using Argon2 = Isopoh.Cryptography.Argon2.Argon2; + +namespace Benchmarks; + +[Orderer(SummaryOrderPolicy.FastestToSlowest)] +[Config(typeof(GenericConfig))] +public class Argon2Benchmarks +{ + [Params(2, 4)] public int _iterations; + [Params(16, 32)] public int _memory; + [Params(1, 2)] public int _parallelism; + private byte[] _salt = null!; + private byte[] _additionalData = null!; + [Params(16)] public int _length; + + private byte[] _password = null!; + + [GlobalSetup] + public void Setup() + { + _salt = RandomNumberGenerator.GetBytes(16); + _additionalData = RandomNumberGenerator.GetBytes(16); + _password = RandomNumberGenerator.GetBytes(16); + } + + [Benchmark] + public byte[] Argon2i() + { + return new Argon2i(_password) + { + Iterations = _iterations, + MemorySize = 1024 * _memory, + DegreeOfParallelism = _parallelism, + AssociatedData = _additionalData, + Salt = _salt, + }.GetBytes(_length); + } + + [Benchmark] + public byte[] Argon2d() + { + return new Argon2d(_password) + { + Iterations = _iterations, + MemorySize = 1024 * _memory, + DegreeOfParallelism = _parallelism, + AssociatedData = _additionalData, + Salt = _salt, + }.GetBytes(_length); + } + + [Benchmark] + public byte[] Argon2id() + { + return new Argon2id(_password) + { + Iterations = _iterations, + MemorySize = 1024 * _memory, + DegreeOfParallelism = _parallelism, + AssociatedData = _additionalData, + Salt = _salt, + }.GetBytes(_length); + } + + [Benchmark] + public byte[] IsopohArgon2DD() + { + var config = new Argon2Config + { + Type = Argon2Type.DataDependentAddressing, + Version = Argon2Version.Nineteen, + MemoryCost = 1024 * _memory, + TimeCost = _iterations, + Lanes = _parallelism, + HashLength = _length, + Salt = _salt, + AssociatedData = _additionalData, + Password = _password, + }; + var argon2 = new Argon2(config); + return argon2.Hash().Buffer; + } + + [Benchmark] + public byte[] IsopohArgon2DI() + { + var config = new Argon2Config + { + Type = Argon2Type.DataIndependentAddressing, + Version = Argon2Version.Nineteen, + MemoryCost = 1024 * _memory, + TimeCost = _iterations, + Lanes = _parallelism, + HashLength = _length, + Salt = _salt, + AssociatedData = _additionalData, + Password = _password, + }; + var argon2 = new Argon2(config); + return argon2.Hash().Buffer; + } + + [Benchmark] + public byte[] IsopohArgon2Hybrid() + { + var config = new Argon2Config + { + Type = Argon2Type.HybridAddressing, + Version = Argon2Version.Nineteen, + MemoryCost = 1024 * _memory, + TimeCost = _iterations, + Lanes = _parallelism, + HashLength = _length, + Salt = _salt, + AssociatedData = _additionalData, + Password = _password, + }; + var argon2 = new Argon2(config); + return argon2.Hash().Buffer; + } +} diff --git a/Benchmarks/Benchmarks.csproj b/Benchmarks/Benchmarks.csproj index 17df76d..2079114 100644 --- a/Benchmarks/Benchmarks.csproj +++ b/Benchmarks/Benchmarks.csproj @@ -14,6 +14,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + all runtime; build; native; contentfiles; analyzers; buildtransitive