diff options
Diffstat (limited to 'lib/Hashing.Portable')
6 files changed, 116 insertions, 37 deletions
diff --git a/lib/Hashing.Portable/src/Argon2/SafeArgon2Library.cs b/lib/Hashing.Portable/src/Argon2/SafeArgon2Library.cs index 0ce2fa7..779d627 100644 --- a/lib/Hashing.Portable/src/Argon2/SafeArgon2Library.cs +++ b/lib/Hashing.Portable/src/Argon2/SafeArgon2Library.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023 Vaughn Nugent +* Copyright (c) 2024 Vaughn Nugent * * Library: VNLib * Package: VNLib.Hashing.Portable @@ -52,7 +52,7 @@ namespace VNLib.Hashing { LibHandle = lib; //Get the native method - methodHandle = lib.GetMethod<Argon2InvokeHash>(); + methodHandle = lib.GetFunction<Argon2InvokeHash>(); } ///<inheritdoc/> diff --git a/lib/Hashing.Portable/src/IdentityUtility/JwtPayload.cs b/lib/Hashing.Portable/src/IdentityUtility/JwtPayload.cs index eb33e00..1fc5f61 100644 --- a/lib/Hashing.Portable/src/IdentityUtility/JwtPayload.cs +++ b/lib/Hashing.Portable/src/IdentityUtility/JwtPayload.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023 Vaughn Nugent +* Copyright (c) 2024 Vaughn Nugent * * Library: VNLib * Package: VNLib.Hashing.Portable @@ -22,6 +22,7 @@ * along with VNLib.Hashing.Portable. If not, see http://www.gnu.org/licenses/. */ +using System.Text.Json; using System.Collections.Generic; using VNLib.Utils; @@ -31,9 +32,9 @@ namespace VNLib.Hashing.IdentityUtility /// <summary> /// A fluent api structure for adding and committing claims to a <see cref="JsonWebToken"/> /// </summary> - public readonly record struct JwtPayload : IIndexable<string, object> + public readonly record struct JwtPayload : IIndexable<string, object?> { - private readonly Dictionary<string, object> Claims; + private readonly Dictionary<string, object?> Claims; private readonly JsonWebToken Jwt; internal JwtPayload(JsonWebToken jwt, int initialCapacity) @@ -43,7 +44,7 @@ namespace VNLib.Hashing.IdentityUtility } ///<inheritdoc/> - public readonly object this[string key] + public readonly object? this[string key] { get => Claims[key]; set => Claims[key] = value; @@ -55,7 +56,7 @@ namespace VNLib.Hashing.IdentityUtility /// <param name="claim">The clame name</param> /// <param name="value">The value of the claim</param> /// <returns>The chained response object</returns> - public readonly JwtPayload AddClaim(string claim, object value) + public readonly JwtPayload AddClaim(string claim, object? value) { Claims.Add(claim, value); return this; @@ -69,5 +70,15 @@ namespace VNLib.Hashing.IdentityUtility Jwt.WritePayload(Claims); Claims.Clear(); } + + /// <summary> + /// Writes all claims to the <see cref="JsonWebToken"/> payload segment + /// </summary> + /// <param name="options">Json serializer options to pass to the serializer</param> + public readonly void CommitClaims(JsonSerializerOptions? options) + { + Jwt.WritePayload(Claims, options); + Claims.Clear(); + } } } diff --git a/lib/Hashing.Portable/src/ManagedHash.cs b/lib/Hashing.Portable/src/ManagedHash.cs index 429660f..ae3b35b 100644 --- a/lib/Hashing.Portable/src/ManagedHash.cs +++ b/lib/Hashing.Portable/src/ManagedHash.cs @@ -321,7 +321,7 @@ namespace VNLib.Hashing HashEncodingMode.Hexadecimal => Convert.ToHexString(hashBuffer), HashEncodingMode.Base64 => Convert.ToBase64String(hashBuffer), HashEncodingMode.Base32 => VnEncoding.ToBase32String(hashBuffer), - HashEncodingMode.Base64Url => VnEncoding.ToBase64UrlSafeString(hashBuffer, true), + HashEncodingMode.Base64Url => VnEncoding.Base64UrlEncode(hashBuffer, true), _ => throw new ArgumentException("Encoding mode is not supported"), }; } @@ -343,7 +343,7 @@ namespace VNLib.Hashing HashEncodingMode.Hexadecimal => Convert.ToHexString(hashBuffer), HashEncodingMode.Base64 => Convert.ToBase64String(hashBuffer), HashEncodingMode.Base32 => VnEncoding.ToBase32String(hashBuffer), - HashEncodingMode.Base64Url => VnEncoding.ToBase64UrlSafeString(hashBuffer, true), + HashEncodingMode.Base64Url => VnEncoding.Base64UrlEncode(hashBuffer, true), _ => throw new ArgumentException("Encoding mode is not supported"), }; } @@ -366,15 +366,15 @@ namespace VNLib.Hashing { return alg switch { - HashAlg.SHA3_512 => computeHashInternal(in _3_sha512, data, buffer, key), - HashAlg.SHA3_384 => computeHashInternal(in _3_sha384, data, buffer, key), - HashAlg.SHA3_256 => computeHashInternal(in _3_sha256, data, buffer, key), - HashAlg.BlAKE2B => computeHashInternal(in _blake2bAlg, data, buffer, key), - HashAlg.SHA512 => computeHashInternal(in _sha512Alg, data, buffer, key), - HashAlg.SHA384 => computeHashInternal(in _sha384Alg, data, buffer, key), - HashAlg.SHA256 => computeHashInternal(in _sha256Alg, data, buffer, key), - HashAlg.SHA1 => computeHashInternal(in _sha1Alg, data, buffer, key), - HashAlg.MD5 => computeHashInternal(in _md5Alg, data, buffer, key), + HashAlg.SHA3_512 => computeHashInternal(in _3_sha512, data, buffer, key), + HashAlg.SHA3_384 => computeHashInternal(in _3_sha384, data, buffer, key), + HashAlg.SHA3_256 => computeHashInternal(in _3_sha256, data, buffer, key), + HashAlg.BlAKE2B => computeHashInternal(in _blake2bAlg, data, buffer, key), + HashAlg.SHA512 => computeHashInternal(in _sha512Alg, data, buffer, key), + HashAlg.SHA384 => computeHashInternal(in _sha384Alg, data, buffer, key), + HashAlg.SHA256 => computeHashInternal(in _sha256Alg, data, buffer, key), + HashAlg.SHA1 => computeHashInternal(in _sha1Alg, data, buffer, key), + HashAlg.MD5 => computeHashInternal(in _md5Alg, data, buffer, key), _ => throw new ArgumentException("Invalid hash algorithm", nameof(alg)) }; diff --git a/lib/Hashing.Portable/src/ManagedHashAlgImpl.cs b/lib/Hashing.Portable/src/ManagedHashAlgImpl.cs index eae8903..be4062e 100644 --- a/lib/Hashing.Portable/src/ManagedHashAlgImpl.cs +++ b/lib/Hashing.Portable/src/ManagedHashAlgImpl.cs @@ -47,10 +47,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.SHA1; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => SHA1.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => SHA1.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACSHA1.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACSHA1.TryHashData(key, data, output, out count); } private readonly struct Sha256 : IHashAlgorithm @@ -59,10 +61,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.SHA256; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => SHA256.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => SHA256.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACSHA256.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACSHA256.TryHashData(key, data, output, out count); } private readonly struct Sha384 : IHashAlgorithm @@ -71,10 +75,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.SHA384; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => SHA384.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => SHA384.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACSHA384.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACSHA384.TryHashData(key, data, output, out count); } private readonly struct Sha512 : IHashAlgorithm @@ -83,10 +89,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.SHA512; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => SHA512.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => SHA512.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACSHA512.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACSHA512.TryHashData(key, data, output, out count); } private readonly struct Md5 : IHashAlgorithm @@ -95,10 +103,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.MD5; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => MD5.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => MD5.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACMD5.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACMD5.TryHashData(key, data, output, out count); } private readonly struct Sha3_256 : IHashAlgorithm @@ -109,10 +119,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.SHA256; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => SHA3_256.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => SHA3_256.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACSHA3_256.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACSHA3_256.TryHashData(key, data, output, out count); } private readonly struct Sha3_384 : IHashAlgorithm @@ -123,10 +135,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.SHA384; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => SHA3_384.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => SHA3_384.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACSHA3_384.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACSHA3_384.TryHashData(key, data, output, out count); } private readonly struct Sha3_512 : IHashAlgorithm @@ -137,10 +151,12 @@ namespace VNLib.Hashing public readonly int HashSize => (int)HashAlg.SHA512; ///<inheritdoc/> - public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) => SHA3_512.TryHashData(data, output, out count); + public readonly bool TryComputeHash(ReadOnlySpan<byte> data, Span<byte> output, out int count) + => SHA3_512.TryHashData(data, output, out count); ///<inheritdoc/> - public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) => HMACSHA3_512.TryHashData(key, data, output, out count); + public readonly bool TryComputeHmac(ReadOnlySpan<byte> key, ReadOnlySpan<byte> data, Span<byte> output, out int count) + => HMACSHA3_512.TryHashData(key, data, output, out count); } private readonly struct Blake2b : IHashAlgorithm diff --git a/lib/Hashing.Portable/tests/Argon2/VnArgon2Tests.cs b/lib/Hashing.Portable/tests/Argon2/VnArgon2Tests.cs new file mode 100644 index 0000000..dcf6900 --- /dev/null +++ b/lib/Hashing.Portable/tests/Argon2/VnArgon2Tests.cs @@ -0,0 +1,52 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace VNLib.Hashing.Tests +{ + [TestClass()] + public class VnArgon2Tests + { + private static string LocalArgon2Lib = "../../../../../Utils.Cryptography/argon2/build/Debug/Argon2"; + + [TestInitialize] + public void InitDefaultLibPath() + { + Environment.SetEnvironmentVariable(VnArgon2.ARGON2_LIB_ENVIRONMENT_VAR_NAME, LocalArgon2Lib); + } + + [TestMethod] + public void LoadLibraryTest() + { + //shared lib should load without issue + _ = VnArgon2.GetOrLoadSharedLib(); + } + + [TestMethod] + public void Argon2IdHashTest() + { + const string RawPass = "HelloWorld1!*"; + const string SaltHex = "de7cdb9d59828ac9"; + const string PepperHex = "13fe89892162d477"; + const string KnownOutput = ""; + const uint HashSize = 64u; + + Argon2CostParams a2Params = new() + { + MemoryCost = 65535, + Parallelism = 4, + TimeCost = 2, + }; + + IArgon2Library lib = VnArgon2.GetOrLoadSharedLib(); + + string passHash = lib.Hash2id( + password: RawPass, + salt: Convert.FromHexString(SaltHex), + secret: Convert.FromHexString(PepperHex), + costParams: in a2Params, + hashLen: HashSize + ); + + Console.WriteLine(passHash); + } + } +}
\ No newline at end of file diff --git a/lib/Hashing.Portable/tests/VNLib.Hashing.PortableTests.csproj b/lib/Hashing.Portable/tests/VNLib.Hashing.PortableTests.csproj index 1834464..eb95e7c 100644 --- a/lib/Hashing.Portable/tests/VNLib.Hashing.PortableTests.csproj +++ b/lib/Hashing.Portable/tests/VNLib.Hashing.PortableTests.csproj @@ -14,9 +14,9 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" /> - <PackageReference Include="MSTest.TestAdapter" Version="3.3.1" /> - <PackageReference Include="MSTest.TestFramework" Version="3.3.1" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" /> + <PackageReference Include="MSTest.TestAdapter" Version="3.5.0" /> + <PackageReference Include="MSTest.TestFramework" Version="3.5.0" /> <PackageReference Include="coverlet.collector" Version="6.0.2"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |