using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace SharpRSS.API.Cryptography
{
    public static class Hasher
    {
        private const int KeySize = 128;
        private const int Iterations = 420069;
        private static readonly HashAlgorithmName Algorithm = HashAlgorithmName.SHA512;
        
        public static byte[] HashPassword(string password, out byte[] salt)
        {
            salt = RandomNumberGenerator.GetBytes(KeySize);
            return HashInternal(password, salt);
        }

        public static bool ComparePasswords(string password, byte[] hash, byte[] salt)
        {
            byte[] passwordHashed = HashInternal(password, salt);
            if (hash.Length != passwordHashed.Length)
                return false;
            return !hash.Where((t, i) => t != passwordHashed[i]).Any();
        }

        private static byte[] HashInternal(string password, byte[] salt)
        {
            var hash = Rfc2898DeriveBytes.Pbkdf2(Encoding.UTF8.GetBytes(password), salt, Iterations, Algorithm,KeySize);
            return hash;
        }
    }
}