/// <summary> /// Reset the RNGCryptoServiceProvider instance. /// </summary> public void Reset() { if (_digestEngine != null) { _digestEngine.Dispose(); _digestEngine = null; } if (_seedGenerator != null) { _seedGenerator.Dispose(); _seedGenerator = null; } _digestEngine = GetDigest(_digestType); _rngGenerator = new DGCDrbg(_digestEngine); if (_stateSeed != null) { _rngGenerator.Initialize(_stateSeed); } else { _seedGenerator = GetSeedGenerator(_seedType); _rngGenerator.Initialize(_seedGenerator.GetSeed((_digestEngine.BlockSize * 2) + 8)); // 2 * block + counter (2*bs+8) } _rngGenerator.Generate(_byteBuffer); _bufferIndex = 0; }
/// <summary> /// Fill an array with pseudo random bytes /// </summary> /// /// <param name="Data">Array to fill with random bytes</param> public void GetBytes(byte[] Data) { lock (_objLock) { if (_byteBuffer.Length - _bufferIndex < Data.Length) { int bufSize = _byteBuffer.Length - _bufferIndex; // copy remaining bytes Buffer.BlockCopy(_byteBuffer, _bufferIndex, Data, 0, bufSize); int rem = Data.Length - bufSize; while (rem > 0) { // fill buffer _rngGenerator.Generate(_byteBuffer); if (rem > _byteBuffer.Length) { Buffer.BlockCopy(_byteBuffer, 0, Data, bufSize, _byteBuffer.Length); bufSize += _byteBuffer.Length; rem -= _byteBuffer.Length; } else { Buffer.BlockCopy(_byteBuffer, 0, Data, bufSize, rem); _bufferIndex = rem; rem = 0; } } } else { Buffer.BlockCopy(_byteBuffer, _bufferIndex, Data, 0, Data.Length); _bufferIndex += Data.Length; } } }