/// <summary> /// Password-Based Key Derivation Function 2 /// https://github.com/defuse/password-hashing /// </summary> public override void Execute() { Verified = false; if (Salt != null && !string.IsNullOrEmpty(HashAlgorithm)) { var passwordHash = GetHash( Login, Password, Salt, HashAlgorithm, Iterations, PasswordHashLength); Hash = string.Join(DELIMITER.ToString(), new string[] { HashAlgorithm, Iterations.ToString(), PasswordHashLength.ToString(), Convert.ToBase64String(Salt), Convert.ToBase64String(passwordHash) }); } else { Hash = null; } if (!string.IsNullOrEmpty(ToVerify) /*&& !string.IsNullOrEmpty(Login)*/ && !string.IsNullOrEmpty(Password)) { var split = ToVerify.Split(DELIMITER); var hash = Convert.FromBase64String(split[PASSWORD_HASH_INDEX]); var storedHashSize = Int32.Parse(split[PASSWORD_HASH_BYTES_INDEX]); if (storedHashSize == hash.Length) { var computedHash = GetHash( Login, Password, Convert.FromBase64String(split[SALT_INDEX]), split[HASH_ALGORITHM_INDEX], Int32.Parse(split[PBKDF2_ITERATIONS_INDEX]), hash.Length); Verified = SlowEquals(hash, computedHash); } } else { Verified = false; } }
private void Verify(object item, ToVerify toVerify = ToVerify.None) { if (toVerify.HasFlag(ToVerify.AsCoroutine)) { Assert.IsInstanceOfType(item, typeof(ICoroutineThread)); return; } var frb = item as FluentResultBuilder; if (frb == null) { throw new AssertFailedException("Not a fluent result builder"); } if (toVerify.HasFlag(ToVerify.AndWait)) { Assert.IsTrue(frb.Type.HasFlag(FluentResultType.Waiting)); } if (toVerify.HasFlag(ToVerify.Do)) { //Assert.IsTrue(frb.Type.HasFlag(FluentResultType.ForeachFunction)); Assert.IsNotNull(frb.OnEachItem);; } if (toVerify.HasFlag(ToVerify.OnComplete)) { //Assert.IsTrue(frb.Type.HasFlag(FluentResultType.FunctionWithoutResult)); Assert.IsNotNull(frb.OnCompleteWithoutResultDo);; } if (toVerify.HasFlag(ToVerify.OnCompleteWithResults)) { //Assert.IsTrue(frb.Type.HasFlag(FluentResultType.FunctionWithResult)); Assert.IsNotNull(frb.OnCompleteWithResults);; } if (toVerify.HasFlag(ToVerify.OnError)) { Assert.IsTrue(frb.Type.HasFlag(FluentResultType.WithOnError)); Assert.IsNotNull(frb.OnErrorDo);; } if (toVerify.HasFlag(ToVerify.Timeout)) { Assert.IsTrue(frb.Type.HasFlag(FluentResultType.WithTimeout)); Assert.AreEqual(10, frb.Timeout.TotalMilliseconds); } if (toVerify.HasFlag(ToVerify.OnEach)) { Assert.IsTrue(frb.Type.HasFlag(FluentResultType.ForeachFunction)); Assert.IsNotNull(frb.OnEachItem);; } }