public async Task <byte[]> DeriveHashAsync(byte[] value, byte[] salt, int byteCount)
        {
            // just to be safe
            var k = new byte[value.Length];

            value.AsSpan().CopyTo(k);

            var s = salt != null
                ? new byte[salt.Length]
                : null;

            if (s != null)
            {
                salt.AsSpan().CopyTo(s);
            }

            var argon2 = new Argon2id(k)
            {
                DegreeOfParallelism = this.Parallelism ?? (Environment.ProcessorCount * 2),
                MemorySize          = this.MemorySize ?? 131072, /* 128 MiB */
                Iterations          = this.Iterations ?? ComputeIterations(Environment.ProcessorCount),
                Salt = s
            };

            return(await argon2.GetBytesAsync(byteCount));
        }
Exemple #2
0
        public Task <byte[]> HashPassword(string password, byte[] salt)
        {
            var argon2 = new Argon2id(Encoding.UTF8.GetBytes(password))
            {
                Salt = salt,
                DegreeOfParallelism = 2,
                Iterations          = 2,
                MemorySize          = 1024
            };

            return(argon2.GetBytesAsync(16));
        }
Exemple #3
0
        /// <summary>
        /// Create a Hash byte array using Argon2id.
        /// </summary>
        /// <param name="passphrase"></param>
        /// <param name="salt"></param>
        /// <param name="size"></param>
        public static async Task <byte[]> GetHashKeyAsync(byte[] passphrase, byte[] salt, int size)
        {
            using var argon2 = new Argon2id(passphrase)
                  {
                      DegreeOfParallelism = 4,
                      MemorySize          = 2048,
                      Salt       = salt,
                      Iterations = 12
                  };

            return(await argon2.GetBytesAsync(size).ConfigureAwait(false));
        }
Exemple #4
0
        private static async Task <string> GetArgon2Hash(string clearText, byte[] salt, int degreesOfParallelism, int iterations, int memorySize, int hashLength)
        {
            var argon2 = new Argon2id(Encoding.UTF8.GetBytes(clearText))
            {
                Salt = salt,
                DegreeOfParallelism = degreesOfParallelism,
                Iterations          = iterations,
                MemorySize          = memorySize
            };

            string saltString = Convert.ToBase64String(argon2.Salt);

            byte[] hash = await argon2.GetBytesAsync(hashLength);

            string hashString = Convert.ToBase64String(hash);

            return($"$a2${degreesOfParallelism}${iterations}${memorySize}${salt.Length}${hashLength}${saltString}${hashString}");
        }
        public static async Task <Argon2Key> Calculate(SecureString password)
        {
            var buffer = new byte[password.Length];
            var ptr    = Marshal.SecureStringToGlobalAllocAnsi(password);

            try
            {
                Marshal.Copy(ptr, buffer, 0, buffer.Length);
                using (var argon2 = new Argon2id(buffer)
                {
                    Iterations = 10,
                    DegreeOfParallelism = 16,
                    MemorySize = 256
                })
                {
                    return(new Argon2Key(await argon2.GetBytesAsync(32)));
                }
            }
            finally
            {
                Helpers.ClearData(buffer);
                Marshal.ZeroFreeGlobalAllocAnsi(ptr);
            }
        }
Exemple #6
0
 public async Task <byte[]> GetHashAsync()
 {
     return(await _argon.GetBytesAsync(128));
 }