Exemple #1
0
        /// <summary>
        /// Returns data from generator, reseeds every time pool 0 has enough entropy or
        /// a set amount of time (100ms according to spec) has passed between reseeds
        /// </summary>
        public override void GetBytes(byte[] data)
        {
            lock (syncRoot)
            {
                var timeSinceLastReseed = DateTime.UtcNow - lastReseedTime;

                if (accumulator.HasEnoughEntropy && timeSinceLastReseed > MaximumTimeSpanBetweenReseeds)
                {
                    reseedCounter++;
                    Reseed(accumulator.GetRandomDataFromPools(reseedCounter));
                    Debug.WriteLine($"Reseeding completed! Counter: {reseedCounter}");
                }

                if (reseedCounter == 0)
                {
                    throw new GeneratorSeedException("Generator not seeded yet!");
                }

                generator.GenerateData(data);
            }
        }