| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Globalization;
 
- using System.Security.Cryptography;
 
- using MediaBrowser.Model.Cryptography;
 
- using static MediaBrowser.Model.Cryptography.Constants;
 
- namespace Emby.Server.Implementations.Cryptography
 
- {
 
-     /// <summary>
 
-     /// Class providing abstractions over cryptographic functions.
 
-     /// </summary>
 
-     public class CryptographyProvider : ICryptoProvider
 
-     {
 
-         /// <inheritdoc />
 
-         public string DefaultHashMethod => "PBKDF2-SHA512";
 
-         /// <inheritdoc />
 
-         public PasswordHash CreatePasswordHash(ReadOnlySpan<char> password)
 
-         {
 
-             byte[] salt = GenerateSalt();
 
-             return new PasswordHash(
 
-                 DefaultHashMethod,
 
-                 Rfc2898DeriveBytes.Pbkdf2(
 
-                     password,
 
-                     salt,
 
-                     DefaultIterations,
 
-                     HashAlgorithmName.SHA512,
 
-                     DefaultOutputLength),
 
-                 salt,
 
-                 new Dictionary<string, string>
 
-                 {
 
-                     { "iterations", DefaultIterations.ToString(CultureInfo.InvariantCulture) }
 
-                 });
 
-         }
 
-         /// <inheritdoc />
 
-         public bool Verify(PasswordHash hash, ReadOnlySpan<char> password)
 
-         {
 
-             if (string.Equals(hash.Id, "PBKDF2", StringComparison.Ordinal))
 
-             {
 
-                 return hash.Hash.SequenceEqual(
 
-                     Rfc2898DeriveBytes.Pbkdf2(
 
-                         password,
 
-                         hash.Salt,
 
-                         int.Parse(hash.Parameters["iterations"], CultureInfo.InvariantCulture),
 
-                         HashAlgorithmName.SHA1,
 
-                         32));
 
-             }
 
-             if (string.Equals(hash.Id, "PBKDF2-SHA512", StringComparison.Ordinal))
 
-             {
 
-                 return hash.Hash.SequenceEqual(
 
-                     Rfc2898DeriveBytes.Pbkdf2(
 
-                         password,
 
-                         hash.Salt,
 
-                         int.Parse(hash.Parameters["iterations"], CultureInfo.InvariantCulture),
 
-                         HashAlgorithmName.SHA512,
 
-                         DefaultOutputLength));
 
-             }
 
-             throw new NotSupportedException($"Can't verify hash with id: {hash.Id}");
 
-         }
 
-         /// <inheritdoc />
 
-         public byte[] GenerateSalt()
 
-             => GenerateSalt(DefaultSaltLength);
 
-         /// <inheritdoc />
 
-         public byte[] GenerateSalt(int length)
 
-         {
 
-             var salt = new byte[length];
 
-             using var rng = RandomNumberGenerator.Create();
 
-             rng.GetNonZeroBytes(salt);
 
-             return salt;
 
-         }
 
-     }
 
- }
 
 
  |