private void SaveSettings(string keyPass) { var saltBytes = new byte[16]; if (String.IsNullOrEmpty(_userSettings.PasswordSalt)) { saltBytes = RNGExtensions.GetRandomBytes(16); } else { saltBytes = Convert.FromBase64String(_userSettings.PasswordSalt); } if (_userSettings.AESKeyType != Core.FileManagers.KeyType.Password) { var keyExists = File.Exists(AESKeyPath); if (keyPass == null && !keyExists) { MessengerInstance.Send <Boolean>(true, "GetPassword"); return; } if (!keyExists) { var k = new byte[32]; if (UseFileKey.HasValue && UseFileKey.Value) { k = RNGExtensions.GetRandomBytes(32); if (!String.IsNullOrEmpty(keyPass)) { k = k.Encrypt(keyPass.GetKeyFromPassphrase(32, saltBytes)); } File.WriteAllBytes(AESKeyPath, k); } } } _userSettings.AESKeyPath = AESKeyPath; _userSettings.FirstLaunch = false; _userSettings.PasswordSalt = Convert.ToBase64String(saltBytes); _userSettings.Save(); MessengerInstance.Send <Boolean>(true, "SaveComplete"); }
public static void FillTest() { Assert.Throws <ArgumentNullException>(() => DefaultRNG.I32.Fill(null)); Assert.Throws <ArgumentNullException>(() => DefaultRNG.U64.Fill(null)); Assert.Throws <ArgumentNullException>(() => DefaultRNG.I32.Fill(null, 0, 0)); Assert.Throws <ArgumentNullException>(() => DefaultRNG.U64.Fill(null, 0, 0)); Assert.Throws <ArgumentNullException>(() => RNGExtensions.Fill((IRNG <int>)null, new byte[0])); Assert.Throws <ArgumentNullException>(() => RNGExtensions.Fill((IRNG <ulong>)null, new byte[0])); const int length = 2048; const int fillTimes = 4096; var bufL = new byte[fillTimes * length]; var buffer = new byte[length]; var another = new byte[length]; var shouldFilledCount = 0; var actuallyFilledCount = 0; DefaultRNG.I32.Fill(bufL); TestRandomByteArray(bufL.AsSpan()); DefaultRNG.U64.Fill(bufL); TestRandomByteArray(bufL.AsSpan()); for (int i = 0; i < fillTimes; ++i) { Array.Copy(buffer, another, length); var s = DefaultRNG.I32.Next(-length / 16, length + length / 16); var l = DefaultRNG.I32.Next(-length / 16, length); if (s >= length || s < 0 || l < 0 || s + l > length) { Assert.Throws <ArgumentOutOfRangeException>(() => DefaultRNG.I32.Fill(buffer, s, l)); } else { shouldFilledCount += l; DefaultRNG.I32.Fill(buffer, s, l); for (int p = 0; p < length; ++p) { if (p >= s && p < s + l) { if (another[p] != buffer[p]) { ++actuallyFilledCount; } } else { Assert.Equal(another[p], buffer[p]); } } } Array.Copy(buffer, another, length); s = DefaultRNG.I32.Next(0, length + length / 16); l = DefaultRNG.I32.Next(-length / 16, length); if (s >= length || s < 0 || l < 0 || s + l > length) { Assert.Throws <ArgumentOutOfRangeException>(() => DefaultRNG.I32.Fill(buffer, s, l)); } else { shouldFilledCount += l; DefaultRNG.U64.Fill(buffer, s, l); for (int p = 0; p < length; ++p) { if (p >= s && p < s + l) { if (another[p] != buffer[p]) { ++actuallyFilledCount; } } else { Assert.Equal(another[p], buffer[p]); } } } } Assert.True((double)actuallyFilledCount / shouldFilledCount > 0.98); }