From 8b8824dca09a57b165ea6956d57d3dc255d0c136 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius Date: Sat, 19 Aug 2017 20:35:39 +0300 Subject: [PATCH] Add support for cryptografic PRNG in netstandard1.6 Use a different way to initialize the PRNG creation for the .NET framework as described on this SO answer: https://stackoverflow.com/a/38644970 Add System.Security.Cryptography.Algorithms NuGet on netstandard1.6. --- src/Numerics/Numerics-2017.csproj | 7 +++---- src/Numerics/Random/CryptoRandomSource.cs | 12 ++++++------ src/Numerics/Random/RandomSeed.cs | 6 +++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/Numerics/Numerics-2017.csproj b/src/Numerics/Numerics-2017.csproj index d810d513..45933ab2 100644 --- a/src/Numerics/Numerics-2017.csproj +++ b/src/Numerics/Numerics-2017.csproj @@ -22,10 +22,9 @@ - - 4.3.0 - + + - \ No newline at end of file + diff --git a/src/Numerics/Random/CryptoRandomSource.cs b/src/Numerics/Random/CryptoRandomSource.cs index d3b310b7..2b56f384 100644 --- a/src/Numerics/Random/CryptoRandomSource.cs +++ b/src/Numerics/Random/CryptoRandomSource.cs @@ -27,7 +27,7 @@ // OTHER DEALINGS IN THE SOFTWARE. // -#if !PORTABLE && !NETSTANDARD1_6 +#if !PORTABLE using System; using System.Collections.Generic; @@ -51,7 +51,7 @@ namespace MathNet.Numerics.Random /// to set whether the instance is thread safe. public CryptoRandomSource() { - _crypto = new RNGCryptoServiceProvider(); + _crypto = RandomNumberGenerator.Create(); } /// @@ -71,7 +71,7 @@ namespace MathNet.Numerics.Random /// if set to true , the class is thread safe. public CryptoRandomSource(bool threadSafe) : base(threadSafe) { - _crypto = new RNGCryptoServiceProvider(); + _crypto = RandomNumberGenerator.Create(); } /// @@ -135,12 +135,12 @@ namespace MathNet.Numerics.Random var bytes = new byte[values.Length*4]; #if !NET35 - using (var rnd = new RNGCryptoServiceProvider()) + using (var rnd = RandomNumberGenerator.Create()) { rnd.GetBytes(bytes); } #else - var rnd = new RNGCryptoServiceProvider(); + var rnd = RandomNumberGenerator.Create(); rnd.GetBytes(bytes); #endif @@ -168,7 +168,7 @@ namespace MathNet.Numerics.Random /// Supports being called in parallel from multiple threads. public static IEnumerable DoubleSequence() { - var rnd = new RNGCryptoServiceProvider(); + var rnd = RandomNumberGenerator.Create(); var buffer = new byte[1024*4]; while (true) diff --git a/src/Numerics/Random/RandomSeed.cs b/src/Numerics/Random/RandomSeed.cs index 1e7cad9a..df2a1df6 100644 --- a/src/Numerics/Random/RandomSeed.cs +++ b/src/Numerics/Random/RandomSeed.cs @@ -6,10 +6,10 @@ namespace MathNet.Numerics.Random { static readonly object Lock = new object(); -#if PORTABLE || NETSTANDARD1_6 +#if PORTABLE static readonly System.Random MasterRng = new System.Random(); #else - static readonly System.Security.Cryptography.RandomNumberGenerator MasterRng = new System.Security.Cryptography.RNGCryptoServiceProvider(); + static readonly System.Security.Cryptography.RandomNumberGenerator MasterRng = System.Security.Cryptography.RandomNumberGenerator.Create(); #endif /// @@ -41,7 +41,7 @@ namespace MathNet.Numerics.Random { lock (Lock) { -#if PORTABLE || NETSTANDARD1_6 +#if PORTABLE return MasterRng.NextFullRangeInt32() ^ Environment.TickCount ^ System.Guid.NewGuid().GetHashCode(); #else var bytes = new byte[4];