Ejemplo n.º 1
0
        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");
        }
Ejemplo n.º 2
0
        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);
        }