using System; using System.Security.Cryptography; namespace Shadowsocks.Encryption { public static class RNG { private static RNGCryptoServiceProvider _rng = null; public static void Init() { _rng = _rng ?? new RNGCryptoServiceProvider(); } public static void Close() { _rng?.Dispose(); _rng = null; } public static void Reload() { Close(); Init(); } public static void GetBytes(byte[] buf) { GetBytes(buf, buf.Length); } public static void GetBytes(byte[] buf, int len) { if (_rng == null) Init(); try { _rng.GetBytes(buf, 0, len); } catch { // the backup way byte[] tmp = new byte[len]; _rng.GetBytes(tmp); Buffer.BlockCopy(tmp, 0, buf, 0, len); } } } }