Fixes loading argon on windows (#146)

This commit is contained in:
Kamron Batman 2020-05-25 17:38:05 -07:00 committed by GitHub
parent 8cffd82780
commit f6dd0e21c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 17 additions and 68 deletions

View file

@ -19,23 +19,13 @@ namespace System.Security.Cryptography
internal static class Argon2
{
internal static readonly bool IsDarwin = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
internal static readonly bool IsFreeBSD = RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD);
internal static readonly bool IsLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
internal static readonly IArgon2 Library =
IsLinux || IsFreeBSD || IsDarwin ? (IArgon2)new UnixArgon2() : new WindowsArgon2();
}
internal class WindowsArgon2 : IArgon2
{
public Argon2Error Hash(uint t_cost, uint m_cost, uint parallelism,
internal static Argon2Error Hash(uint t_cost, uint m_cost, uint parallelism,
ReadOnlySpan<byte> pwd,
ReadOnlySpan<byte> salt,
Span<byte> hash,
Span<byte> encoded,
int type, int version) =>
SafeNativeMethods.crypto_argon2_hash(t_cost, m_cost, parallelism,
SafeNativeMethods.argon2_hash(t_cost, m_cost, parallelism,
in pwd.GetPinnableReference(), pwd.Length,
in salt.GetPinnableReference(), salt.Length,
ref hash.GetPinnableReference(), hash.Length,
@ -43,57 +33,16 @@ namespace System.Security.Cryptography
type, version
);
public Argon2Error Verify(ReadOnlySpan<byte> encoded, ReadOnlySpan<byte> pwd, int pwdlen, int type) =>
SafeNativeMethods.crypto_argon2_verify(in encoded.GetPinnableReference(), in pwd.GetPinnableReference(), pwdlen, type);
internal static Argon2Error Verify(ReadOnlySpan<byte> encoded, ReadOnlySpan<byte> pwd, int pwdlen, int type) =>
SafeNativeMethods.argon2_verify(in encoded.GetPinnableReference(), in pwd.GetPinnableReference(), pwdlen, type);
public Argon2Error Decode(Argon2Context ctx, ReadOnlySpan<byte> str, int type) =>
SafeNativeMethods.crypto_decode_string(ctx, in str.GetPinnableReference(), type);
internal static class SafeNativeMethods
{
[DllImport("argon2.dll", EntryPoint = "crypto_argon2_hash", CallingConvention = CallingConvention.Cdecl)]
internal static extern Argon2Error crypto_argon2_hash(uint t_cost, uint m_cost, uint parallelism,
in byte pwd, int pwdlen,
in byte salt, int saltlen,
ref byte hash, int hashlen,
ref byte encoded, int encodedlen,
int type, int version
);
[DllImport("argon2.dll", EntryPoint = "crypto_argon2_verify", CallingConvention = CallingConvention.Cdecl)]
internal static extern Argon2Error crypto_argon2_verify(in byte encoded, in byte pwd, int pwdlen, int type);
[DllImport("argon2.dll", EntryPoint = "crypto_decode_string", CallingConvention = CallingConvention.Cdecl)]
internal static extern Argon2Error crypto_decode_string(Argon2Context ctx, in byte str, int type);
}
}
internal class UnixArgon2 : IArgon2
{
public Argon2Error Hash(uint t_cost, uint m_cost, uint parallelism,
ReadOnlySpan<byte> pwd,
ReadOnlySpan<byte> salt,
Span<byte> hash,
Span<byte> encoded,
int type, int version) =>
SafeNativeMethods.crypto_argon2_hash(t_cost, m_cost, parallelism,
in pwd.GetPinnableReference(), pwd.Length,
in salt.GetPinnableReference(), salt.Length,
ref hash.GetPinnableReference(), hash.Length,
ref encoded.GetPinnableReference(), encoded.Length,
type, version
);
public Argon2Error Verify(ReadOnlySpan<byte> encoded, ReadOnlySpan<byte> pwd, int pwdlen, int type) =>
SafeNativeMethods.crypto_argon2_verify(in encoded.GetPinnableReference(), in pwd.GetPinnableReference(), pwdlen, type);
public Argon2Error Decode(Argon2Context ctx, ReadOnlySpan<byte> str, int type) =>
SafeNativeMethods.crypto_decode_string(ctx, in str.GetPinnableReference(), type);
internal static Argon2Error Decode(Argon2Context ctx, ReadOnlySpan<byte> str, int type) =>
SafeNativeMethods.decode_string(ctx, in str.GetPinnableReference(), type);
internal static class SafeNativeMethods
{
[DllImport("libargon2", EntryPoint = "argon2_hash")]
internal static extern Argon2Error crypto_argon2_hash(uint t_cost, uint m_cost, uint parallelism,
internal static extern Argon2Error argon2_hash(uint t_cost, uint m_cost, uint parallelism,
in byte pwd, int pwdlen,
in byte salt, int saltlen,
ref byte hash, int hashlen,
@ -102,10 +51,10 @@ namespace System.Security.Cryptography
);
[DllImport("libargon2", EntryPoint = "argon2_verify")]
internal static extern Argon2Error crypto_argon2_verify(in byte encoded, in byte pwd, int pwdlen, int type);
internal static extern Argon2Error argon2_verify(in byte encoded, in byte pwd, int pwdlen, int type);
[DllImport("libargon2", EntryPoint = "decode_string")]
internal static extern Argon2Error crypto_decode_string(Argon2Context ctx, in byte str, int type);
internal static extern Argon2Error decode_string(Argon2Context ctx, in byte str, int type);
}
}
}

View file

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RuntimeIdentifiers>win-x64;linux-x64;osx-x64</RuntimeIdentifiers>
<PackageVersion>1.1.8</PackageVersion>
<PackageVersion>1.2.0</PackageVersion>
<RootNamespace>System.Security.Cryptography</RootNamespace>
<AssemblyName>Argon2.Bindings</AssemblyName>
<PlatformTarget>x64</PlatformTarget>
@ -11,11 +11,11 @@
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
<Configurations>Debug;Release;Analyze</Configurations>
<AssemblyVersion>1.1.8</AssemblyVersion>
<AssemblyVersion>1.2.0</AssemblyVersion>
<Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
<Content Include="runtimes\win-x64\native\argon2.dll">
<Content Include="runtimes\win-x64\native\libargon2.dll">
<Pack>true</Pack>
<PackagePath>runtimes/win-x64/native</PackagePath>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

View file

@ -94,7 +94,7 @@ namespace System.Security.Cryptography
Span<byte> passwordBytes = stackalloc byte[StringEncoding.GetByteCount(password)];
StringEncoding.GetBytes(password, passwordBytes);
var result = Argon2.Library.Hash(
var result = Argon2.Hash(
TimeCost,
MemoryCost,
Parallelism,
@ -128,7 +128,7 @@ namespace System.Security.Cryptography
Span<byte> passwordBytes = stackalloc byte[StringEncoding.GetByteCount(password)];
StringEncoding.GetBytes(password, passwordBytes);
var result = Argon2.Library.Hash(
var result = Argon2.Hash(
TimeCost,
MemoryCost,
Parallelism,
@ -172,7 +172,7 @@ namespace System.Security.Cryptography
/// </summary>
public bool Verify(ReadOnlySpan<byte> expectedHash, ReadOnlySpan<byte> password)
{
var result = Argon2.Library.Verify(expectedHash, password, password.Length, (int)ArgonType);
var result = Argon2.Verify(expectedHash, password, password.Length, (int)ArgonType);
if (result == Argon2Error.OK || result == Argon2Error.VERIFY_MISMATCH || result == Argon2Error.DECODING_FAIL)
return result == Argon2Error.OK;
@ -246,7 +246,7 @@ namespace System.Security.Cryptography
Span<byte> bytes = stackalloc byte[formattedHash.Length];
Encoding.ASCII.GetBytes(formattedHash, bytes);
var result = Argon2.Library.Decode(context, bytes, (int)type);
var result = Argon2.Decode(context, bytes, (int)type);
if (result != Argon2Error.OK)
return null;

View file

@ -80,7 +80,7 @@
<PackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.3" />
<PackageReference Include="Argon2.Bindings" Version="1.1.8" />
<PackageReference Include="Argon2.Bindings" Version="1.2.0" />
<PackageReference Include="Zlib.Bindings" Version="1.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)'=='Analyze'">