aboutsummaryrefslogtreecommitdiff
path: root/lib/Hashing.Portable
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Hashing.Portable')
-rw-r--r--lib/Hashing.Portable/src/Argon2/SafeArgon2Library.cs4
-rw-r--r--lib/Hashing.Portable/src/IdentityUtility/JwtPayload.cs21
-rw-r--r--lib/Hashing.Portable/src/ManagedHash.cs22
-rw-r--r--lib/Hashing.Portable/src/ManagedHashAlgImpl.cs48
-rw-r--r--lib/Hashing.Portable/tests/Argon2/VnArgon2Tests.cs52
-rw-r--r--lib/Hashing.Portable/tests/VNLib.Hashing.PortableTests.csproj6
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>