parent
f6dd0e21c6
commit
fddfa15192
7 changed files with 64 additions and 18 deletions
|
|
@ -19,7 +19,17 @@ namespace System.Security.Cryptography
|
|||
|
||||
internal static class Argon2
|
||||
{
|
||||
internal static Argon2Error Hash(uint t_cost, uint m_cost, uint parallelism,
|
||||
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 bool IsUnix = IsLinux || IsDarwin || IsFreeBSD;
|
||||
|
||||
internal static readonly IArgon2 Library = IsUnix ? (IArgon2)new UnixArgon2() : new WindowsArgon2();
|
||||
}
|
||||
|
||||
internal class WindowsArgon2 : IArgon2
|
||||
{
|
||||
public Argon2Error Hash(uint t_cost, uint m_cost, uint parallelism,
|
||||
ReadOnlySpan<byte> pwd,
|
||||
ReadOnlySpan<byte> salt,
|
||||
Span<byte> hash,
|
||||
|
|
@ -33,15 +43,15 @@ namespace System.Security.Cryptography
|
|||
type, version
|
||||
);
|
||||
|
||||
internal static Argon2Error Verify(ReadOnlySpan<byte> encoded, ReadOnlySpan<byte> pwd, int pwdlen, int type) =>
|
||||
public Argon2Error Verify(ReadOnlySpan<byte> encoded, ReadOnlySpan<byte> pwd, int pwdlen, int type) =>
|
||||
SafeNativeMethods.argon2_verify(in encoded.GetPinnableReference(), in pwd.GetPinnableReference(), pwdlen, type);
|
||||
|
||||
internal static Argon2Error Decode(Argon2Context ctx, ReadOnlySpan<byte> str, int type) =>
|
||||
public 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")]
|
||||
[DllImport("argon2", EntryPoint = "argon2_hash", CallingConvention = CallingConvention.Cdecl)]
|
||||
internal static extern Argon2Error argon2_hash(uint t_cost, uint m_cost, uint parallelism,
|
||||
in byte pwd, int pwdlen,
|
||||
in byte salt, int saltlen,
|
||||
|
|
@ -50,10 +60,51 @@ namespace System.Security.Cryptography
|
|||
int type, int version
|
||||
);
|
||||
|
||||
[DllImport("libargon2", EntryPoint = "argon2_verify")]
|
||||
[DllImport("argon2", EntryPoint = "argon2_verify", CallingConvention = CallingConvention.Cdecl)]
|
||||
internal static extern Argon2Error argon2_verify(in byte encoded, in byte pwd, int pwdlen, int type);
|
||||
|
||||
[DllImport("libargon2", EntryPoint = "decode_string")]
|
||||
[DllImport("argon2", EntryPoint = "decode_string", CallingConvention = CallingConvention.Cdecl)]
|
||||
internal static extern Argon2Error 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.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.argon2_verify(in encoded.GetPinnableReference(), in pwd.GetPinnableReference(), pwdlen, type);
|
||||
|
||||
public Argon2Error Decode(Argon2Context ctx, ReadOnlySpan<byte> str, int type) =>
|
||||
SafeNativeMethods.decode_string(ctx, in str.GetPinnableReference(), type);
|
||||
|
||||
internal static class SafeNativeMethods
|
||||
{
|
||||
[DllImport("argon2", EntryPoint = "argon2_hash")]
|
||||
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,
|
||||
ref byte encoded, int encodedlen,
|
||||
int type, int version
|
||||
);
|
||||
|
||||
[DllImport("argon2", EntryPoint = "argon2_verify")]
|
||||
internal static extern Argon2Error argon2_verify(in byte encoded, in byte pwd, int pwdlen, int type);
|
||||
|
||||
[DllImport("argon2", EntryPoint = "decode_string")]
|
||||
internal static extern Argon2Error decode_string(Argon2Context ctx, in byte str, int type);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue