summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crypto/crypto.csproj105
-rw-r--r--crypto/src/crypto/prng/BasicEntropySourceProvider.cs70
-rw-r--r--crypto/src/crypto/prng/IDrbgProvider.cs11
-rw-r--r--crypto/src/crypto/prng/IEntropySource.cs4
-rw-r--r--crypto/src/crypto/prng/IEntropySourceProvider.cs4
-rw-r--r--crypto/src/crypto/prng/SP800SecureRandom.cs82
-rw-r--r--crypto/src/crypto/prng/SP800SecureRandomBuilder.cs208
-rw-r--r--crypto/src/crypto/prng/X931Rng.cs141
-rw-r--r--crypto/src/crypto/prng/X931SecureRandom.cs72
-rw-r--r--crypto/src/crypto/prng/X931SecureRandomBuilder.cs87
-rw-r--r--crypto/src/crypto/prng/drbg/CtrSP800Drbg.cs275
-rw-r--r--crypto/src/crypto/prng/drbg/DrbgUtilities.cs42
-rw-r--r--crypto/src/crypto/prng/drbg/HMacSP800Drbg.cs126
-rw-r--r--crypto/src/crypto/prng/drbg/HashSP800Drbg.cs240
-rw-r--r--crypto/src/crypto/prng/drbg/ISP80090Drbg.cs4
-rw-r--r--crypto/src/security/SecureRandom.cs35
-rw-r--r--crypto/src/util/Arrays.cs64
-rw-r--r--crypto/test/src/crypto/prng/test/CtrDrbgTest.cs662
-rw-r--r--crypto/test/src/crypto/prng/test/DrbgTestVector.cs90
-rw-r--r--crypto/test/src/crypto/prng/test/HMacDrbgTest.cs465
-rw-r--r--crypto/test/src/crypto/prng/test/HashDrbgTest.cs696
-rw-r--r--crypto/test/src/crypto/prng/test/TestEntropySourceProvider.cs21
-rw-r--r--crypto/test/src/crypto/prng/test/X931Test.cs137
-rw-r--r--crypto/test/src/crypto/prng/test/X931TestVector.cs55
24 files changed, 2297 insertions, 1399 deletions
diff --git a/crypto/crypto.csproj b/crypto/crypto.csproj
index 28d0b19b3..0c6dba76c 100644
--- a/crypto/crypto.csproj
+++ b/crypto/crypto.csproj
@@ -4314,6 +4314,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "src\crypto\prng\BasicEntropySourceProvider.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "src\crypto\prng\CryptoApiRandomGenerator.cs"
                     SubType = "Code"
                     BuildAction = "Compile"
@@ -4324,6 +4329,21 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "src\crypto\prng\IDrbgProvider.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\IEntropySource.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\IEntropySourceProvider.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "src\crypto\prng\IRandomGenerator.cs"
                     SubType = "Code"
                     BuildAction = "Compile"
@@ -4334,6 +4354,16 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "src\crypto\prng\SP800SecureRandom.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\SP800SecureRandomBuilder.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "src\crypto\prng\ThreadedSeedGenerator.cs"
                     SubType = "Code"
                     BuildAction = "Compile"
@@ -4344,6 +4374,46 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "src\crypto\prng\X931Rng.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\X931SecureRandom.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\X931SecureRandomBuilder.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\drbg\CtrSP800Drbg.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\drbg\DrbgUtilities.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\drbg\HashSP800Drbg.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\drbg\HMacSP800Drbg.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "src\crypto\prng\drbg\ISP80090Drbg.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "src\crypto\signers\DSADigestSigner.cs"
                     SubType = "Code"
                     BuildAction = "Compile"
@@ -11070,6 +11140,41 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "test\src\crypto\prng\test\CtrDrbgTest.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "test\src\crypto\prng\test\DrbgTestVector.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "test\src\crypto\prng\test\HashDrbgTest.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "test\src\crypto\prng\test\HMacDrbgTest.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "test\src\crypto\prng\test\TestEntropySourcProvider.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "test\src\crypto\prng\test\X931Test.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "test\src\crypto\prng\test\X931TestVector.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "test\src\crypto\test\AeadTestUtilities.cs"
                     SubType = "Code"
                     BuildAction = "Compile"
diff --git a/crypto/src/crypto/prng/BasicEntropySourceProvider.cs b/crypto/src/crypto/prng/BasicEntropySourceProvider.cs
new file mode 100644
index 000000000..0e929e0fd
--- /dev/null
+++ b/crypto/src/crypto/prng/BasicEntropySourceProvider.cs
@@ -0,0 +1,70 @@
+using System;
+
+using Org.BouncyCastle.Security;
+
+namespace Org.BouncyCastle.Crypto.Prng
+{
+    /**
+     * An EntropySourceProvider where entropy generation is based on a SecureRandom output using SecureRandom.generateSeed().
+     */
+    public class BasicEntropySourceProvider
+        :   IEntropySourceProvider
+    {
+        private readonly SecureRandom   mSecureRandom;
+        private readonly bool           mPredictionResistant;
+
+        /**
+         * Create a entropy source provider based on the passed in SecureRandom.
+         *
+         * @param secureRandom the SecureRandom to base EntropySource construction on.
+         * @param isPredictionResistant boolean indicating if the SecureRandom is based on prediction resistant entropy or not (true if it is).
+         */
+        public BasicEntropySourceProvider(SecureRandom secureRandom, bool isPredictionResistant)
+        {
+            mSecureRandom = secureRandom;
+            mPredictionResistant = isPredictionResistant;
+        }
+
+        /**
+         * Return an entropy source that will create bitsRequired bits of entropy on
+         * each invocation of getEntropy().
+         *
+         * @param bitsRequired size (in bits) of entropy to be created by the provided source.
+         * @return an EntropySource that generates bitsRequired bits of entropy on each call to its getEntropy() method.
+         */
+        public IEntropySource Get(int bitsRequired)
+        {
+            return new BasicEntropySource(mSecureRandom, mPredictionResistant, bitsRequired);
+        }
+
+        private class BasicEntropySource
+            :   IEntropySource
+        {
+            private readonly SecureRandom   mSecureRandom;
+            private readonly bool           mPredictionResistant;
+            private readonly int            mEntropySize;
+
+            internal BasicEntropySource(SecureRandom secureRandom, bool predictionResistant, int entropySize)
+            {
+                this.mSecureRandom = secureRandom;
+                this.mPredictionResistant = predictionResistant;
+                this.mEntropySize = entropySize;
+            }
+
+            bool IEntropySource.IsPredictionResistant
+            {
+                get { return mPredictionResistant; }
+            }
+
+            byte[] IEntropySource.GetEntropy()
+            {
+                return mSecureRandom.GenerateSeed((mEntropySize + 7) / 8);
+            }
+
+            int IEntropySource.EntropySize
+            {
+                get { return mEntropySize; }
+            }
+        }
+    }
+}
diff --git a/crypto/src/crypto/prng/IDrbgProvider.cs b/crypto/src/crypto/prng/IDrbgProvider.cs
new file mode 100644
index 000000000..5ebf5fd8d
--- /dev/null
+++ b/crypto/src/crypto/prng/IDrbgProvider.cs
@@ -0,0 +1,11 @@
+using System;
+
+using Org.BouncyCastle.Crypto.Prng.Drbg;
+
+namespace Org.BouncyCastle.Crypto.Prng
+{
+    internal interface IDrbgProvider
+    {
+        ISP80090Drbg Get(IEntropySource entropySource);
+    }
+}
diff --git a/crypto/src/crypto/prng/IEntropySource.cs b/crypto/src/crypto/prng/IEntropySource.cs
index 33ce1b801..90b9e61af 100644
--- a/crypto/src/crypto/prng/IEntropySource.cs
+++ b/crypto/src/crypto/prng/IEntropySource.cs
@@ -1,9 +1,9 @@
 using System;
 
-namespace Org.BouncyCastle.Crypto
+namespace Org.BouncyCastle.Crypto.Prng
 {
 	/// <summary>
-	/// Base interface describing an entropy source for a DRGB.
+	/// Base interface describing an entropy source for a DRBG.
 	/// </summary>
 	public interface IEntropySource
 	{
diff --git a/crypto/src/crypto/prng/IEntropySourceProvider.cs b/crypto/src/crypto/prng/IEntropySourceProvider.cs
index 990c6497b..643f92ef8 100644
--- a/crypto/src/crypto/prng/IEntropySourceProvider.cs
+++ b/crypto/src/crypto/prng/IEntropySourceProvider.cs
@@ -1,8 +1,6 @@
 using System;
-using System.Collections.Generic;
-using System.Text;
 
-namespace Org.BouncyCastle.Crypto
+namespace Org.BouncyCastle.Crypto.Prng
 {
     /// <summary>
     /// Base interface describing a provider of entropy sources.
diff --git a/crypto/src/crypto/prng/SP800SecureRandom.cs b/crypto/src/crypto/prng/SP800SecureRandom.cs
new file mode 100644
index 000000000..996ba0846
--- /dev/null
+++ b/crypto/src/crypto/prng/SP800SecureRandom.cs
@@ -0,0 +1,82 @@
+using System;
+
+using Org.BouncyCastle.Crypto.Prng.Drbg;
+using Org.BouncyCastle.Security;
+
+namespace Org.BouncyCastle.Crypto.Prng
+{
+    public class SP800SecureRandom
+        :   SecureRandom
+    {
+        private readonly IDrbgProvider  mDrbgProvider;
+        private readonly bool           mPredictionResistant;
+        private readonly SecureRandom   mRandomSource;
+        private readonly IEntropySource mEntropySource;
+
+        private ISP80090Drbg mDrbg;
+
+        internal SP800SecureRandom(SecureRandom randomSource, IEntropySource entropySource, IDrbgProvider drbgProvider, bool predictionResistant)
+            : base((IRandomGenerator)null)
+        {
+            this.mRandomSource = randomSource;
+            this.mEntropySource = entropySource;
+            this.mDrbgProvider = drbgProvider;
+            this.mPredictionResistant = predictionResistant;
+        }
+
+        public override void SetSeed(byte[] seed)
+        {
+            lock (this)
+            {
+                if (mRandomSource != null)
+                {
+                    this.mRandomSource.SetSeed(seed);
+                }
+            }
+        }
+
+        public override void SetSeed(long seed)
+        {
+            lock (this)
+            {
+                // this will happen when SecureRandom() is created
+                if (mRandomSource != null)
+                {
+                    this.mRandomSource.SetSeed(seed);
+                }
+            }
+        }
+
+        public override void NextBytes(byte[] bytes)
+        {
+            lock (this)
+            {
+                if (mDrbg == null)
+                {
+                    mDrbg = mDrbgProvider.Get(mEntropySource);
+                }
+
+                // check if a reseed is required...
+                if (mDrbg.Generate(bytes, null, mPredictionResistant) < 0)
+                {
+                    mDrbg.Reseed(null);
+                    mDrbg.Generate(bytes, null, mPredictionResistant);
+                }
+            }
+        }
+
+        public override void NextBytes(byte[] buf, int off, int len)
+        {
+            byte[] bytes = new byte[len];
+            NextBytes(bytes);
+            Array.Copy(bytes, 0, buf, off, len);
+        }
+
+        public override byte[] GenerateSeed(int numBytes)
+        {
+            byte[] bytes = new byte[numBytes];
+            NextBytes(bytes);
+            return bytes;
+        }
+    }
+}
diff --git a/crypto/src/crypto/prng/SP800SecureRandomBuilder.cs b/crypto/src/crypto/prng/SP800SecureRandomBuilder.cs
new file mode 100644
index 000000000..7199f1ae7
--- /dev/null
+++ b/crypto/src/crypto/prng/SP800SecureRandomBuilder.cs
@@ -0,0 +1,208 @@
+using System;
+
+using Org.BouncyCastle.Crypto.Prng.Drbg;
+using Org.BouncyCastle.Security;
+
+namespace Org.BouncyCastle.Crypto.Prng
+{
+    /**
+     * Builder class for making SecureRandom objects based on SP 800-90A Deterministic Random Bit Generators (DRBG).
+     */
+    public class SP800SecureRandomBuilder
+    {
+        private readonly SecureRandom mRandom;
+        private readonly IEntropySourceProvider mEntropySourceProvider;
+
+        private byte[] mPersonalizationString = null;
+        private int mSecurityStrength = 256;
+        private int mEntropyBitsRequired = 256;
+
+        /**
+         * Basic constructor, creates a builder using an EntropySourceProvider based on the default SecureRandom with
+         * predictionResistant set to false.
+         * <p>
+         * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
+         * the default SecureRandom does for its generateSeed() call.
+         * </p>
+         */
+        public SP800SecureRandomBuilder()
+            : this(new SecureRandom(), false)
+        {
+        }
+
+        /**
+         * Construct a builder with an EntropySourceProvider based on the passed in SecureRandom and the passed in value
+         * for prediction resistance.
+         * <p>
+         * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
+         * the passed in SecureRandom does for its generateSeed() call.
+         * </p>
+         * @param entropySource
+         * @param predictionResistant
+         */
+        public SP800SecureRandomBuilder(SecureRandom entropySource, bool predictionResistant)
+        {
+            this.mRandom = entropySource;
+            this.mEntropySourceProvider = new BasicEntropySourceProvider(entropySource, predictionResistant);
+        }
+
+        /**
+         * Create a builder which makes creates the SecureRandom objects from a specified entropy source provider.
+         * <p>
+         * <b>Note:</b> If this constructor is used any calls to setSeed() in the resulting SecureRandom will be ignored.
+         * </p>
+         * @param entropySourceProvider a provider of EntropySource objects.
+         */
+        public SP800SecureRandomBuilder(IEntropySourceProvider entropySourceProvider)
+        {
+            this.mRandom = null;
+            this.mEntropySourceProvider = entropySourceProvider;
+        }
+
+        /**
+         * Set the personalization string for DRBG SecureRandoms created by this builder
+         * @param personalizationString  the personalisation string for the underlying DRBG.
+         * @return the current builder.
+         */
+        public SP800SecureRandomBuilder SetPersonalizationString(byte[] personalizationString)
+        {
+            this.mPersonalizationString = personalizationString;
+            return this;
+        }
+
+        /**
+         * Set the security strength required for DRBGs used in building SecureRandom objects.
+         *
+         * @param securityStrength the security strength (in bits)
+         * @return the current builder.
+         */
+        public SP800SecureRandomBuilder SetSecurityStrength(int securityStrength)
+        {
+            this.mSecurityStrength = securityStrength;
+            return this;
+        }
+
+        /**
+         * Set the amount of entropy bits required for seeding and reseeding DRBGs used in building SecureRandom objects.
+         *
+         * @param entropyBitsRequired the number of bits of entropy to be requested from the entropy source on each seed/reseed.
+         * @return the current builder.
+         */
+        public SP800SecureRandomBuilder SetEntropyBitsRequired(int entropyBitsRequired)
+        {
+            this.mEntropyBitsRequired = entropyBitsRequired;
+            return this;
+        }
+
+        /**
+         * Build a SecureRandom based on a SP 800-90A Hash DRBG.
+         *
+         * @param digest digest algorithm to use in the DRBG underneath the SecureRandom.
+         * @param nonce  nonce value to use in DRBG construction.
+         * @param predictionResistant specify whether the underlying DRBG in the resulting SecureRandom should reseed on each request for bytes.
+         * @return a SecureRandom supported by a Hash DRBG.
+         */
+        public SP800SecureRandom BuildHash(IDigest digest, byte[] nonce, bool predictionResistant)
+        {
+            return new SP800SecureRandom(mRandom, mEntropySourceProvider.Get(mEntropyBitsRequired),
+                new HashDrbgProvider(digest, nonce, mPersonalizationString, mSecurityStrength), predictionResistant);
+        }
+
+        /**
+         * Build a SecureRandom based on a SP 800-90A CTR DRBG.
+         *
+         * @param cipher the block cipher to base the DRBG on.
+         * @param keySizeInBits key size in bits to be used with the block cipher.
+         * @param nonce nonce value to use in DRBG construction.
+         * @param predictionResistant  specify whether the underlying DRBG in the resulting SecureRandom should reseed on each request for bytes.
+         * @return  a SecureRandom supported by a CTR DRBG.
+         */
+        public SP800SecureRandom BuildCtr(IBlockCipher cipher, int keySizeInBits, byte[] nonce, bool predictionResistant)
+        {
+            return new SP800SecureRandom(mRandom, mEntropySourceProvider.Get(mEntropyBitsRequired),
+                new CtrDrbgProvider(cipher, keySizeInBits, nonce, mPersonalizationString, mSecurityStrength), predictionResistant);
+        }
+
+        /**
+         * Build a SecureRandom based on a SP 800-90A HMAC DRBG.
+         *
+         * @param hMac HMAC algorithm to use in the DRBG underneath the SecureRandom.
+         * @param nonce  nonce value to use in DRBG construction.
+         * @param predictionResistant specify whether the underlying DRBG in the resulting SecureRandom should reseed on each request for bytes.
+         * @return a SecureRandom supported by a HMAC DRBG.
+         */
+        public SP800SecureRandom BuildHMac(IMac hMac, byte[] nonce, bool predictionResistant)
+        {
+            return new SP800SecureRandom(mRandom, mEntropySourceProvider.Get(mEntropyBitsRequired),
+                new HMacDrbgProvider(hMac, nonce, mPersonalizationString, mSecurityStrength), predictionResistant);
+        }
+
+        private class HashDrbgProvider
+            :   IDrbgProvider
+        {
+            private readonly IDigest mDigest;
+            private readonly byte[] mNonce;
+            private readonly byte[] mPersonalizationString;
+            private readonly int mSecurityStrength;
+
+            public HashDrbgProvider(IDigest digest, byte[] nonce, byte[] personalizationString, int securityStrength)
+            {
+                this.mDigest = digest;
+                this.mNonce = nonce;
+                this.mPersonalizationString = personalizationString;
+                this.mSecurityStrength = securityStrength;
+            }
+
+            public ISP80090Drbg Get(IEntropySource entropySource)
+            {
+                return new HashSP800Drbg(mDigest, mSecurityStrength, entropySource, mPersonalizationString, mNonce);
+            }
+        }
+
+        private class HMacDrbgProvider
+            :   IDrbgProvider
+        {
+            private readonly IMac mHMac;
+            private readonly byte[] mNonce;
+            private readonly byte[] mPersonalizationString;
+            private readonly int mSecurityStrength;
+
+            public HMacDrbgProvider(IMac hMac, byte[] nonce, byte[] personalizationString, int securityStrength)
+            {
+                this.mHMac = hMac;
+                this.mNonce = nonce;
+                this.mPersonalizationString = personalizationString;
+                this.mSecurityStrength = securityStrength;
+            }
+
+            public ISP80090Drbg Get(IEntropySource entropySource)
+            {
+                return new HMacSP800Drbg(mHMac, mSecurityStrength, entropySource, mPersonalizationString, mNonce);
+            }
+        }
+
+        private class CtrDrbgProvider
+            :   IDrbgProvider
+        {
+            private readonly IBlockCipher mBlockCipher;
+            private readonly int mKeySizeInBits;
+            private readonly byte[] mNonce;
+            private readonly byte[] mPersonalizationString;
+            private readonly int mSecurityStrength;
+
+            public CtrDrbgProvider(IBlockCipher blockCipher, int keySizeInBits, byte[] nonce, byte[] personalizationString, int securityStrength)
+            {
+                this.mBlockCipher = blockCipher;
+                this.mKeySizeInBits = keySizeInBits;
+                this.mNonce = nonce;
+                this.mPersonalizationString = personalizationString;
+                this.mSecurityStrength = securityStrength;
+            }
+
+            public ISP80090Drbg Get(IEntropySource entropySource)
+            {
+                return new CtrSP800Drbg(mBlockCipher, mKeySizeInBits, mSecurityStrength, entropySource, mPersonalizationString, mNonce);
+            }
+        }
+    }
+}
diff --git a/crypto/src/crypto/prng/X931Rng.cs b/crypto/src/crypto/prng/X931Rng.cs
new file mode 100644
index 000000000..d09cc6618
--- /dev/null
+++ b/crypto/src/crypto/prng/X931Rng.cs
@@ -0,0 +1,141 @@
+using System;
+
+namespace Org.BouncyCastle.Crypto.Prng
+{
+    internal class X931Rng
+    {
+        private const long  BLOCK64_RESEED_MAX = 1L << (16 - 1);
+        private const long  BLOCK128_RESEED_MAX = 1L << (24 - 1);
+        private const int   BLOCK64_MAX_BITS_REQUEST = 1 << (13 - 1);
+        private const int   BLOCK128_MAX_BITS_REQUEST = 1 << (19 - 1);
+
+        private readonly IBlockCipher mEngine;
+        private readonly IEntropySource mEntropySource;
+
+        private readonly byte[] mDT;
+        private readonly byte[] mI;
+        private readonly byte[] mR;
+
+        private byte[] mV;
+
+        private long mReseedCounter = 1;
+
+        /**
+         *
+         * @param engine
+         * @param entropySource
+         */
+        internal X931Rng(IBlockCipher engine, byte[] dateTimeVector, IEntropySource entropySource)
+        {
+            this.mEngine = engine;
+            this.mEntropySource = entropySource;
+
+            this.mDT = new byte[engine.GetBlockSize()];
+
+            Array.Copy(dateTimeVector, 0, mDT, 0, mDT.Length);
+
+            this.mI = new byte[engine.GetBlockSize()];
+            this.mR = new byte[engine.GetBlockSize()];
+        }
+
+        /**
+         * Populate a passed in array with random data.
+         *
+         * @param output output array for generated bits.
+         * @param predictionResistant true if a reseed should be forced, false otherwise.
+         *
+         * @return number of bits generated, -1 if a reseed required.
+         */
+        internal int Generate(byte[] output, bool predictionResistant)
+        {
+            if (mR.Length == 8) // 64 bit block size
+            {
+                if (mReseedCounter > BLOCK64_RESEED_MAX)
+                    return -1;
+
+                if (IsTooLarge(output, BLOCK64_MAX_BITS_REQUEST / 8))
+                    throw new ArgumentException("Number of bits per request limited to " + BLOCK64_MAX_BITS_REQUEST, "output");
+            }
+            else
+            {
+                if (mReseedCounter > BLOCK128_RESEED_MAX)
+                    return -1;
+
+                if (IsTooLarge(output, BLOCK128_MAX_BITS_REQUEST / 8))
+                    throw new ArgumentException("Number of bits per request limited to " + BLOCK128_MAX_BITS_REQUEST, "output");
+            }
+
+            if (predictionResistant || mV == null)
+            {
+                mV = mEntropySource.GetEntropy();
+                if (mV.Length != mEngine.GetBlockSize())
+                    throw new InvalidOperationException("Insufficient entropy returned");
+            }
+
+            int m = output.Length / mR.Length;
+
+            for (int i = 0; i < m; i++)
+            {
+                mEngine.ProcessBlock(mDT, 0, mI, 0);
+                Process(mR, mI, mV);
+                Process(mV, mR, mI);
+
+                Array.Copy(mR, 0, output, i * mR.Length, mR.Length);
+
+                Increment(mDT);
+            }
+
+            int bytesToCopy = (output.Length - m * mR.Length);
+
+            if (bytesToCopy > 0)
+            {
+                mEngine.ProcessBlock(mDT, 0, mI, 0);
+                Process(mR, mI, mV);
+                Process(mV, mR, mI);
+
+                Array.Copy(mR, 0, output, m * mR.Length, bytesToCopy);
+
+                Increment(mDT);
+            }
+
+            mReseedCounter++;
+
+            return output.Length;
+        }
+
+        /**
+         * Reseed the RNG.
+         */
+        internal void Reseed()
+        {
+            mV = mEntropySource.GetEntropy();
+            if (mV.Length != mEngine.GetBlockSize())
+                throw new InvalidOperationException("Insufficient entropy returned");
+            mReseedCounter = 1;
+        }
+
+        private void Process(byte[] res, byte[] a, byte[] b)
+        {
+            for (int i = 0; i != res.Length; i++)
+            {
+                res[i] = (byte)(a[i] ^ b[i]);
+            }
+
+            mEngine.ProcessBlock(res, 0, res, 0);
+        }
+
+        private void Increment(byte[] val)
+        {
+            for (int i = val.Length - 1; i >= 0; i--)
+            {
+                if (++val[i] != 0)
+                    break;
+            }
+        }
+
+        private static bool IsTooLarge(byte[] bytes, int maxBytes)
+        {
+            return bytes != null && bytes.Length > maxBytes;
+        }
+    }
+}
diff --git a/crypto/src/crypto/prng/X931SecureRandom.cs b/crypto/src/crypto/prng/X931SecureRandom.cs
new file mode 100644
index 000000000..a87bf1567
--- /dev/null
+++ b/crypto/src/crypto/prng/X931SecureRandom.cs
@@ -0,0 +1,72 @@
+using System;
+
+using Org.BouncyCastle.Security;
+
+namespace Org.BouncyCastle.Crypto.Prng
+{
+    public class X931SecureRandom
+        :   SecureRandom
+    {
+        private readonly bool           mPredictionResistant;
+        private readonly SecureRandom   mRandomSource;
+        private readonly X931Rng        mDrbg;
+
+        internal X931SecureRandom(SecureRandom randomSource, X931Rng drbg, bool predictionResistant)
+            : base((IRandomGenerator)null)
+        {
+            this.mRandomSource = randomSource;
+            this.mDrbg = drbg;
+            this.mPredictionResistant = predictionResistant;
+        }
+
+        public override void SetSeed(byte[] seed)
+        {
+            lock (this)
+            {
+                if (mRandomSource != null)
+                {
+                    this.mRandomSource.SetSeed(seed);
+                }
+            }
+        }
+
+        public override void SetSeed(long seed)
+        {
+            lock (this)
+            {
+                // this will happen when SecureRandom() is created
+                if (mRandomSource != null)
+                {
+                    this.mRandomSource.SetSeed(seed);
+                }
+            }
+        }
+
+        public override void NextBytes(byte[] bytes)
+        {
+            lock (this)
+            {
+                // check if a reseed is required...
+                if (mDrbg.Generate(bytes, mPredictionResistant) < 0)
+                {
+                    mDrbg.Reseed();
+                    mDrbg.Generate(bytes, mPredictionResistant);
+                }
+            }
+        }
+
+        public override void NextBytes(byte[] buf, int off, int len)
+        {
+            byte[] bytes = new byte[len];
+            NextBytes(bytes);
+            Array.Copy(bytes, 0, buf, off, len);
+        }
+
+        public override byte[] GenerateSeed(int numBytes)
+        {
+            byte[] bytes = new byte[numBytes];
+            NextBytes(bytes);
+            return bytes;
+        }
+    }
+}
diff --git a/crypto/src/crypto/prng/X931SecureRandomBuilder.cs b/crypto/src/crypto/prng/X931SecureRandomBuilder.cs
new file mode 100644
index 000000000..31e94312e
--- /dev/null
+++ b/crypto/src/crypto/prng/X931SecureRandomBuilder.cs
@@ -0,0 +1,87 @@
+using System;
+
+using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Crypto.Utilities;
+using Org.BouncyCastle.Security;
+using Org.BouncyCastle.Utilities.Date;
+
+namespace Org.BouncyCastle.Crypto.Prng
+{
+    public class X931SecureRandomBuilder
+    {
+        private readonly SecureRandom mRandom;          // JDK 1.1 complains on final.
+
+        private IEntropySourceProvider mEntropySourceProvider;
+        private byte[] mDateTimeVector;
+
+        /**
+         * Basic constructor, creates a builder using an EntropySourceProvider based on the default SecureRandom with
+         * predictionResistant set to false.
+         * <p>
+         * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
+         * the default SecureRandom does for its generateSeed() call.
+         * </p>
+         */
+        public X931SecureRandomBuilder()
+            : this(new SecureRandom(), false)
+        {
+        }
+
+        /**
+         * Construct a builder with an EntropySourceProvider based on the passed in SecureRandom and the passed in value
+         * for prediction resistance.
+         * <p>
+         * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
+         * the passed in SecureRandom does for its generateSeed() call.
+         * </p>
+         * @param entropySource
+         * @param predictionResistant
+         */
+        public X931SecureRandomBuilder(SecureRandom entropySource, bool predictionResistant)
+        {
+            this.mRandom = entropySource;
+            this.mEntropySourceProvider = new BasicEntropySourceProvider(mRandom, predictionResistant);
+        }
+
+        /**
+         * Create a builder which makes creates the SecureRandom objects from a specified entropy source provider.
+         * <p>
+         * <b>Note:</b> If this constructor is used any calls to setSeed() in the resulting SecureRandom will be ignored.
+         * </p>
+         * @param entropySourceProvider a provider of EntropySource objects.
+         */
+        public X931SecureRandomBuilder(IEntropySourceProvider entropySourceProvider)
+        {
+            this.mRandom = null;
+            this.mEntropySourceProvider = entropySourceProvider;
+        }
+
+        public X931SecureRandomBuilder SetDateTimeVector(byte[] dateTimeVector)
+        {
+            this.mDateTimeVector = dateTimeVector;
+            return this;
+        }
+
+        /**
+         * Construct a X9.31 secure random generator using the passed in engine and key. If predictionResistant is true the
+         * generator will be reseeded on each request.
+         *
+         * @param engine a block cipher to use as the operator.
+         * @param key the block cipher key to initialise engine with.
+         * @param predictionResistant true if engine to be reseeded on each use, false otherwise.
+         * @return a SecureRandom.
+         */
+        public X931SecureRandom Build(IBlockCipher engine, KeyParameter key, bool predictionResistant)
+        {
+            if (mDateTimeVector == null)
+            {
+                mDateTimeVector = new byte[engine.GetBlockSize()];
+                Pack.UInt64_To_BE((ulong)DateTimeUtilities.CurrentUnixMs(), mDateTimeVector, 0);
+            }
+
+            engine.Init(true, key);
+
+            return new X931SecureRandom(mRandom, new X931Rng(engine, mDateTimeVector, mEntropySourceProvider.Get(engine.GetBlockSize() * 8)), predictionResistant);
+        }
+    }
+}
diff --git a/crypto/src/crypto/prng/drbg/CtrSP800Drbg.cs b/crypto/src/crypto/prng/drbg/CtrSP800Drbg.cs
index d9595d530..2e4fbe4ed 100644
--- a/crypto/src/crypto/prng/drbg/CtrSP800Drbg.cs
+++ b/crypto/src/crypto/prng/drbg/CtrSP800Drbg.cs
@@ -1,5 +1,6 @@
 using System;
 
+using Org.BouncyCastle.Crypto.Parameters;
 using Org.BouncyCastle.Utilities;
 using Org.BouncyCastle.Utilities.Encoders;
 
@@ -8,24 +9,25 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	/**
 	 * A SP800-90A CTR DRBG.
 	 */
-	public class CTRSP800Drbg: SP80090Drbg
+	public class CtrSP800Drbg
+        :   ISP80090Drbg
 	{
-	    private static readonly long       TDEA_RESEED_MAX = 1L << (32 - 1);
-		private static readonly long       AES_RESEED_MAX = 1L << (48 - 1);
-		private static readonly int        TDEA_MAX_BITS_REQUEST = 1 << (13 - 1);
-		private static readonly int        AES_MAX_BITS_REQUEST = 1 << (19 - 1);
-
-	    private IEntropySource        _entropySource;
-	    private IBlockCipher          _engine;
-	    private int                   _keySizeInBits;
-	    private int                   _seedLength;
-	    private int                   _securityStrength;
-
-	    // internal state
-	    private byte[]                _Key;
-	    private byte[]                _V;
-	    private long                  _reseedCounter = 0;
-	    private bool                  _isTDEA = false;
+	    private static readonly long TDEA_RESEED_MAX = 1L << (32 - 1);
+		private static readonly long AES_RESEED_MAX = 1L << (48 - 1);
+		private static readonly int TDEA_MAX_BITS_REQUEST = 1 << (13 - 1);
+		private static readonly int AES_MAX_BITS_REQUEST = 1 << (19 - 1);
+
+        private readonly IEntropySource  mEntropySource;
+	    private readonly IBlockCipher    mEngine;
+	    private readonly int             mKeySizeInBits;
+	    private readonly int             mSeedLength;
+	    private readonly int             mSecurityStrength;
+
+        // internal state
+	    private byte[]                mKey;
+	    private byte[]                mV;
+	    private long                  mReseedCounter = 0;
+	    private bool                  mIsTdea = false;
 
 	    /**
 	     * Construct a SP800-90A CTR DRBG.
@@ -39,66 +41,58 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     * @param personalizationString personalization string to distinguish this DRBG (may be null).
 	     * @param nonce nonce to further distinguish this DRBG (may be null).
 	     */
-	    public CTRSP800Drbg(IBlockCipher engine, int keySizeInBits, int securityStrength, IEntropySource entropySource, byte[] personalizationString, byte[] nonce)
+	    public CtrSP800Drbg(IBlockCipher engine, int keySizeInBits, int securityStrength, IEntropySource entropySource,
+            byte[] personalizationString, byte[] nonce)
 	    {
-	        _entropySource = entropySource;
-	        _engine = engine;     
-	        
-	        _keySizeInBits = keySizeInBits;
-	        _securityStrength = securityStrength;
-	        _seedLength = keySizeInBits + engine.getBlockSize() * 8;
-	        _isTDEA = isTDEA(engine);
-
 	        if (securityStrength > 256)
-	        {
 	            throw new ArgumentException("Requested security strength is not supported by the derivation function");
-	        }
-
-	        if (getMaxSecurityStrength(engine, keySizeInBits) < securityStrength)
-	        {
+	        if (GetMaxSecurityStrength(engine, keySizeInBits) < securityStrength)
 	            throw new ArgumentException("Requested security strength is not supported by block cipher and key size");
-	        }
-
 	        if (entropySource.EntropySize < securityStrength)
-	        {
 	            throw new ArgumentException("Not enough entropy for security strength required");
-	        }
 
-	        byte[] entropy = getEntropy();  // Get_entropy_input
+            mEntropySource = entropySource;
+	        mEngine = engine;     
+
+            mKeySizeInBits = keySizeInBits;
+	        mSecurityStrength = securityStrength;
+	        mSeedLength = keySizeInBits + engine.GetBlockSize() * 8;
+	        mIsTdea = IsTdea(engine);
+
+	        byte[] entropy = GetEntropy();  // Get_entropy_input
 
-	        CTR_DRBG_Instantiate_algorithm(entropy, nonce, personalizationString);
+            CTR_DRBG_Instantiate_algorithm(entropy, nonce, personalizationString);
 	    }
 
-	    private void CTR_DRBG_Instantiate_algorithm(byte[] entropy, byte[] nonce,
-	            byte[] personalisationString)
+        private void CTR_DRBG_Instantiate_algorithm(byte[] entropy, byte[] nonce, byte[] personalisationString)
 	    {
-	        byte[] seedMaterial = Arrays.Concatenate(entropy, nonce, personalisationString);
-	        byte[] seed = Block_Cipher_df(seedMaterial, _seedLength);
+	        byte[] seedMaterial = Arrays.ConcatenateAll(entropy, nonce, personalisationString);
+	        byte[] seed = Block_Cipher_df(seedMaterial, mSeedLength);
 
-	        int outlen = _engine.getBlockSize();
+            int outlen = mEngine.GetBlockSize();
 
-	        _Key = new byte[(_keySizeInBits + 7) / 8];
-	        _V = new byte[outlen];
+            mKey = new byte[(mKeySizeInBits + 7) / 8];
+	        mV = new byte[outlen];
 
-	         // _Key & _V are modified by this call
-	        CTR_DRBG_Update(seed, _Key, _V); 
+	        // mKey & mV are modified by this call
+	        CTR_DRBG_Update(seed, mKey, mV); 
 
-	        _reseedCounter = 1;
+            mReseedCounter = 1;
 	    }
 
-	    private void CTR_DRBG_Update(byte[] seed, byte[] key, byte[] v)
+        private void CTR_DRBG_Update(byte[] seed, byte[] key, byte[] v)
 	    {
 	        byte[] temp = new byte[seed.Length];
-	        byte[] outputBlock = new byte[_engine.getBlockSize()];
-	        
-	        int i=0;
-	        int outLen = _engine.getBlockSize();
+	        byte[] outputBlock = new byte[mEngine.GetBlockSize()];
+
+            int i = 0;
+	        int outLen = mEngine.GetBlockSize();
 
-	        _engine.init(true, new KeyParameter(expandKey(key)));
+            mEngine.Init(true, new KeyParameter(ExpandKey(key)));
 	        while (i*outLen < seed.Length)
 	        {
-	            addOneTo(v);
-	            _engine.processBlock(v, 0, outputBlock, 0);
+	            AddOneTo(v);
+	            mEngine.ProcessBlock(v, 0, outputBlock, 0);
 
 	            int bytesToCopy = ((temp.Length - i * outLen) > outLen)
 	                    ? outLen : (temp.Length - i * outLen);
@@ -115,49 +109,48 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	    
 	    private void CTR_DRBG_Reseed_algorithm(byte[] additionalInput)
 	    {
-	        byte[] seedMaterial = Arrays.Concatenate(getEntropy(), additionalInput);
+	        byte[] seedMaterial = Arrays.Concatenate(GetEntropy(), additionalInput);
 
-	        seedMaterial = Block_Cipher_df(seedMaterial, _seedLength);
+	        seedMaterial = Block_Cipher_df(seedMaterial, mSeedLength);
 
-	        CTR_DRBG_Update(seedMaterial, _Key, _V);
+            CTR_DRBG_Update(seedMaterial, mKey, mV);
 
-	        _reseedCounter = 1;
+            mReseedCounter = 1;
 	    }
 
-	    private void XOR(byte[] output, byte[] a, byte[] b, int bOff)
+        private void XOR(byte[] output, byte[] a, byte[] b, int bOff)
 	    {
-				for (int i=0; i< output.Length; i++) 
+            for (int i = 0; i < output.Length; i++) 
 	        {
-					output[i] = (byte)(a[i] ^ b[i+bOff]);
+                output[i] = (byte)(a[i] ^ b[bOff + i]);
 	        }
 	    }
-	    
-	    private void addOneTo(byte[] longer)
+
+        private void AddOneTo(byte[] longer)
 	    {
-	        int carry = 1;
-	        for (int i = 1; i <= longer.Length; i++) // warning
-	        {
-	            int res = (longer[longer.Length - i] & 0xff) + carry;
-	            carry = (res > 0xff) ? 1 : 0;
-	            longer[longer.Length - i] = (byte)res;
-	        }
+	        uint carry = 1;
+            int i = longer.Length;
+            while (--i >= 0)
+            {
+                carry += longer[i];
+                longer[i] = (byte)carry;
+                carry >>= 8;
+            }
 	    } 
 
-	    private byte[] getEntropy()
+        private byte[] GetEntropy()
 	    {
-	        byte[] entropy = _entropySource.getEntropy();
-	        if (entropy.Length < (_securityStrength + 7) / 8)
-	        {
-	            throw new IllegalStateException("Insufficient entropy provided by entropy source");
-	        }
+	        byte[] entropy = mEntropySource.GetEntropy();
+	        if (entropy.Length < (mSecurityStrength + 7) / 8)
+	            throw new InvalidOperationException("Insufficient entropy provided by entropy source");
 	        return entropy;
 	    }
 
 	    // -- Internal state migration ---
-	    
-	    private static final byte[] K_BITS = Hex.decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");
 
-	    // 1. If (number_of_bits_to_return > max_number_of_bits), then return an
+        private static readonly byte[] K_BITS = Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");
+
+        // 1. If (number_of_bits_to_return > max_number_of_bits), then return an
 	    // ERROR_FLAG.
 	    // 2. L = len (input_string)/8.
 	    // 3. N = number_of_bits_to_return/8.
@@ -219,7 +212,7 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	    // 15. Return SUCCESS and requested_bits.
 	    private byte[] Block_Cipher_df(byte[] inputString, int bitLength)
 	    {
-	        int outLen = _engine.getBlockSize();
+	        int outLen = mEngine.GetBlockSize();
 	        int L = inputString.Length; // already in bytes
 	        int N = bitLength / 8;
 	        // 4 S = L || N || inputstring || 0x80
@@ -232,16 +225,16 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        S[8 + L] = (byte)0x80;
 	        // S already padded with zeros
 
-	        byte[] temp = new byte[_keySizeInBits / 8 + outLen];
+	        byte[] temp = new byte[mKeySizeInBits / 8 + outLen];
 	        byte[] bccOut = new byte[outLen];
 
 	        byte[] IV = new byte[outLen]; 
 	        
 	        int i = 0;
-	        byte[] K = new byte[_keySizeInBits / 8];
+	        byte[] K = new byte[mKeySizeInBits / 8];
 	        Array.Copy(K_BITS, 0, K, 0, K.Length);
 
-	        while (i*outLen*8 < _keySizeInBits + outLen *8)
+	        while (i*outLen*8 < mKeySizeInBits + outLen *8)
 	        {
 	            copyIntToByteArray(IV, i, 0);
 	            BCC(bccOut, K, IV, S);
@@ -261,11 +254,11 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        temp = new byte[bitLength / 2];
 
 	        i = 0;
-	        _engine.init(true, new KeyParameter(expandKey(K)));
+	        mEngine.Init(true, new KeyParameter(ExpandKey(K)));
 
 	        while (i * outLen < temp.Length)
 	        {
-	            _engine.processBlock(X, 0, X, 0);
+	            mEngine.ProcessBlock(X, 0, X, 0);
 
 	            int bytesToCopy = ((temp.Length - i * outLen) > outLen)
 	                    ? outLen
@@ -292,23 +285,23 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     */
 	    private void BCC(byte[] bccOut, byte[] k, byte[] iV, byte[] data)
 	    {
-	        int outlen = _engine.getBlockSize();
+	        int outlen = mEngine.GetBlockSize();
 	        byte[] chainingValue = new byte[outlen]; // initial values = 0
 	        int n = data.Length / outlen;
 
 	        byte[] inputBlock = new byte[outlen];
 
-	        _engine.init(true, new KeyParameter(expandKey(k)));
+	        mEngine.Init(true, new KeyParameter(ExpandKey(k)));
 
-	        _engine.processBlock(iV, 0, chainingValue, 0);
+            mEngine.ProcessBlock(iV, 0, chainingValue, 0);
 
-	        for (int i = 0; i < n; i++)
+            for (int i = 0; i < n; i++)
 	        {
 	            XOR(inputBlock, chainingValue, data, i*outlen);
-	            _engine.processBlock(inputBlock, 0, chainingValue, 0);
+	            mEngine.ProcessBlock(inputBlock, 0, chainingValue, 0);
 	        }
 
-	        Array.Copy(chainingValue, 0, bccOut, 0, bccOut.Length);
+            Array.Copy(chainingValue, 0, bccOut, 0, bccOut.Length);
 	    }
 
 	    private void copyIntToByteArray(byte[] buf, int value, int offSet)
@@ -326,9 +319,7 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     */
 	    public int BlockSize
 	    {
-			get {
-				return _V.Length * 8;
-			}
+			get { return mV.Length * 8; }
 	    }
 
 	    /**
@@ -342,32 +333,24 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     */
 	    public int Generate(byte[] output, byte[] additionalInput, bool predictionResistant)
 	    {
-	        if (_isTDEA)
+	        if (mIsTdea)
 	        {
-	            if (_reseedCounter > TDEA_RESEED_MAX)
-	            {
+	            if (mReseedCounter > TDEA_RESEED_MAX)
 	                return -1;
-	            }
 
-	            if (Utils.isTooLarge(output, TDEA_MAX_BITS_REQUEST / 8))
-	            {
-	                throw new ArgumentException("Number of bits per request limited to " + TDEA_MAX_BITS_REQUEST);
-	            }
+                if (DrbgUtilities.IsTooLarge(output, TDEA_MAX_BITS_REQUEST / 8))
+	                throw new ArgumentException("Number of bits per request limited to " + TDEA_MAX_BITS_REQUEST, "output");
 	        }
 	        else
 	        {
-	            if (_reseedCounter > AES_RESEED_MAX)
-	            {
+	            if (mReseedCounter > AES_RESEED_MAX)
 	                return -1;
-	            }
 
-	            if (Utils.isTooLarge(output, AES_MAX_BITS_REQUEST / 8))
-	            {
-	                throw new ArgumentException("Number of bits per request limited to " + AES_MAX_BITS_REQUEST);
-	            }
+                if (DrbgUtilities.IsTooLarge(output, AES_MAX_BITS_REQUEST / 8))
+	                throw new ArgumentException("Number of bits per request limited to " + AES_MAX_BITS_REQUEST, "output");
 	        }
 
-	        if (predictionResistant)
+            if (predictionResistant)
 	        {
 	            CTR_DRBG_Reseed_algorithm(additionalInput);
 	            additionalInput = null;
@@ -375,39 +358,39 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 
 	        if (additionalInput != null)
 	        {
-	            additionalInput = Block_Cipher_df(additionalInput, _seedLength);
-	            CTR_DRBG_Update(additionalInput, _Key, _V);
+	            additionalInput = Block_Cipher_df(additionalInput, mSeedLength);
+	            CTR_DRBG_Update(additionalInput, mKey, mV);
 	        }
 	        else
 	        {
-	            additionalInput = new byte[_seedLength];
+	            additionalInput = new byte[mSeedLength];
 	        }
 
-	        byte[] tmp = new byte[_V.Length];
+            byte[] tmp = new byte[mV.Length];
 
-	        _engine.init(true, new KeyParameter(expandKey(_Key)));
+            mEngine.Init(true, new KeyParameter(ExpandKey(mKey)));
 
-				for (int i = 0; i <= output.Length / tmp.Length; i++)
+            for (int i = 0; i <= output.Length / tmp.Length; i++)
 	        {
-					int bytesToCopy = ((output.Length - i * tmp.Length) > tmp.Length)
-						? tmp.Length
-	                    : (output.Length - i * _V.Length);
+				int bytesToCopy = ((output.Length - i * tmp.Length) > tmp.Length)
+					? tmp.Length
+	                : (output.Length - i * mV.Length);
 
-	            if (bytesToCopy != 0)
+                if (bytesToCopy != 0)
 	            {
-	                addOneTo(_V);
+	                AddOneTo(mV);
 
-						_engine.processBlock(_V, 0, tmp, 0);
+                    mEngine.ProcessBlock(mV, 0, tmp, 0);
 
-						Array.Copy(tmp, 0, output, i * tmp.Length, bytesToCopy);
+                    Array.Copy(tmp, 0, output, i * tmp.Length, bytesToCopy);
 	            }
 	        }
 
-	        CTR_DRBG_Update(additionalInput, _Key, _V);
+            CTR_DRBG_Update(additionalInput, mKey, mV);
 
-	        _reseedCounter++;
+            mReseedCounter++;
 
-	        return output.Length * 8;
+            return output.Length * 8;
 	    }
 
 	    /**
@@ -420,14 +403,14 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        CTR_DRBG_Reseed_algorithm(additionalInput);
 	    }
 
-	    private boolean isTDEA(BlockCipher cipher)
+        private bool IsTdea(IBlockCipher cipher)
 	    {
 	        return cipher.AlgorithmName.Equals("DESede") || cipher.AlgorithmName.Equals("TDEA");
 	    }
 
-	    private int getMaxSecurityStrength(BlockCipher cipher, int keySizeInBits)
+	    private int GetMaxSecurityStrength(IBlockCipher cipher, int keySizeInBits)
 	    {
-	        if (isTDEA(cipher) && keySizeInBits == 168)
+	        if (IsTdea(cipher) && keySizeInBits == 168)
 	        {
 	            return 112;
 	        }
@@ -436,19 +419,19 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	            return keySizeInBits;
 	        }
 
-	        return -1;
+            return -1;
 	    }
 
-	    byte[] expandKey(byte[] key)
+        private byte[] ExpandKey(byte[] key)
 	    {
-	        if (_isTDEA)
+	        if (mIsTdea)
 	        {
 	            // expand key to 192 bits.
 	            byte[] tmp = new byte[24];
 
-	            padKey(key, 0, tmp, 0);
-	            padKey(key, 7, tmp, 8);
-	            padKey(key, 14, tmp, 16);
+                PadKey(key, 0, tmp, 0);
+                PadKey(key, 7, tmp, 8);
+                PadKey(key, 14, tmp, 16);
 
 	            return tmp;
 	        }
@@ -466,7 +449,7 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     * @param tmp
 	     * @param tmpOff
 	     */
-	    private void padKey(byte[] keyMaster, int keyOff, byte[] tmp, int tmpOff)
+        private void PadKey(byte[] keyMaster, int keyOff, byte[] tmp, int tmpOff)
 	    {
 	        tmp[tmpOff + 0] = (byte)(keyMaster[keyOff + 0] & 0xfe);
 	        tmp[tmpOff + 1] = (byte)((keyMaster[keyOff + 0] << 7) | ((keyMaster[keyOff + 1] & 0xfc) >> 1));
@@ -479,15 +462,15 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 
 	        for (int i = tmpOff; i <= tmpOff + 7; i++)
 	        {
-	            int b = tmp[i];
-	            tmp[i] = (byte)((b & 0xfe) |
-	                            ((((b >> 1) ^
-	                            (b >> 2) ^
-	                            (b >> 3) ^
-	                            (b >> 4) ^
-	                            (b >> 5) ^
-	                            (b >> 6) ^
-	                            (b >> 7)) ^ 0x01) & 0x01));
+                uint b = tmp[i];
+
+                uint parity = b ^ 1U;
+                parity ^= (parity >> 4);
+                parity ^= (parity >> 2);
+                parity ^= (parity >> 1);
+                parity &= 1U;
+
+                tmp[i] = (byte)(b ^ parity);
 	        }
 	    }
 	}
diff --git a/crypto/src/crypto/prng/drbg/DrbgUtilities.cs b/crypto/src/crypto/prng/drbg/DrbgUtilities.cs
index b5f3b5830..d9a1c439c 100644
--- a/crypto/src/crypto/prng/drbg/DrbgUtilities.cs
+++ b/crypto/src/crypto/prng/drbg/DrbgUtilities.cs
@@ -5,39 +5,39 @@ using Org.BouncyCastle.Utilities;
 
 namespace Org.BouncyCastle.Crypto.Prng.Drbg
 {
-	internal class Utils
+	internal class DrbgUtilities
 	{
 		private static readonly IDictionary maxSecurityStrengths = Platform.CreateHashtable();
 
-		static Utils()
+        static DrbgUtilities()
 	    {
-	        maxSecurityStrengths.put("SHA-1", 128);
+	        maxSecurityStrengths.Add("SHA-1", 128);
 
-	        maxSecurityStrengths.put("SHA-224", 192);
-	        maxSecurityStrengths.put("SHA-256", 256);
-	        maxSecurityStrengths.put("SHA-384", 256);
-	        maxSecurityStrengths.put("SHA-512", 256);
+	        maxSecurityStrengths.Add("SHA-224", 192);
+	        maxSecurityStrengths.Add("SHA-256", 256);
+	        maxSecurityStrengths.Add("SHA-384", 256);
+	        maxSecurityStrengths.Add("SHA-512", 256);
 
-	        maxSecurityStrengths.put("SHA-512/224", 192);
-	        maxSecurityStrengths.put("SHA-512/256", 256);
+	        maxSecurityStrengths.Add("SHA-512/224", 192);
+	        maxSecurityStrengths.Add("SHA-512/256", 256);
 	    }
 
-	    internal static int getMaxSecurityStrength(IDigest d)
+        internal static int GetMaxSecurityStrength(IDigest d)
 	    {
 	        return (int)maxSecurityStrengths[d.AlgorithmName];
 	    }
 
-		internal static int getMaxSecurityStrength(IMac m)
+        internal static int GetMaxSecurityStrength(IMac m)
 	    {
-	        String name = m.getAlgorithmName();
+	        string name = m.AlgorithmName;
 
-	        return (int)maxSecurityStrengths[name.substring(0, name.indexOf("/"))];
+            return (int)maxSecurityStrengths[name.Substring(0, name.IndexOf("/"))];
 	    }
 
 	    /**
 	     * Used by both Dual EC and Hash.
 	     */
-	    internal static byte[] hash_df(Digest digest, byte[] seedMaterial, int seedLength)
+	    internal static byte[] HashDF(IDigest digest, byte[] seedMaterial, int seedLength)
 	    {
 	         // 1. temp = the Null string.
 	        // 2. .
@@ -52,10 +52,10 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        // 6. Return SUCCESS and requested_bits.
 	        byte[] temp = new byte[(seedLength + 7) / 8];
 
-	        int len = temp.Length / digest.getDigestSize();
+	        int len = temp.Length / digest.GetDigestSize();
 	        int counter = 1;
 
-	        byte[] dig = new byte[digest.getDigestSize()];
+	        byte[] dig = new byte[digest.GetDigestSize()];
 
 	        for (int i = 0; i <= len; i++)
 	        {
@@ -82,20 +82,20 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        if (seedLength % 8 != 0)
 	        {
 	            int shift = 8 - (seedLength % 8);
-	            int carry = 0;
+	            uint carry = 0;
 
-	            for (int i = 0; i != temp.Length; i++)
+                for (int i = 0; i != temp.Length; i++)
 	            {
-	                uint b = temp[i] & 0xff;
+	                uint b = temp[i];
 	                temp[i] = (byte)((b >> shift) | (carry << (8 - shift)));
 	                carry = b;
 	            }
 	        }
 
-	        return temp;
+            return temp;
 	    }
 
-	    internal static boolean isTooLarge(byte[] bytes, int maxBytes)
+        internal static bool IsTooLarge(byte[] bytes, int maxBytes)
 	    {
 	        return bytes != null && bytes.Length > maxBytes;
 	    }
diff --git a/crypto/src/crypto/prng/drbg/HMacSP800Drbg.cs b/crypto/src/crypto/prng/drbg/HMacSP800Drbg.cs
index 78a710097..78331705e 100644
--- a/crypto/src/crypto/prng/drbg/HMacSP800Drbg.cs
+++ b/crypto/src/crypto/prng/drbg/HMacSP800Drbg.cs
@@ -8,19 +8,21 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	/**
 	 * A SP800-90A HMAC DRBG.
 	 */
-	public class HMacSP800Drbg: SP80090Drbg
+	public class HMacSP800Drbg
+        :   ISP80090Drbg
 	{
-	    private readonly static long       RESEED_MAX = 1L << (48 - 1);
-		private readonly static int        MAX_BITS_REQUEST = 1 << (19 - 1);
+	    private readonly static long RESEED_MAX = 1L << (48 - 1);
+		private readonly static int MAX_BITS_REQUEST = 1 << (19 - 1);
 
-	    private byte[] _K;
-	    private byte[] _V;
-	    private long   _reseedCounter;
-	    private EntropySource _entropySource;
-	    private Mac _hMac;
-	    private int _securityStrength;
+        private readonly byte[]         mK;
+        private readonly byte[]         mV;
+        private readonly IEntropySource mEntropySource;
+        private readonly IMac           mHMac;
+        private readonly int            mSecurityStrength;
 
-	    /**
+        private long mReseedCounter;
+
+        /**
 	     * Construct a SP800-90A Hash DRBG.
 	     * <p>
 	     * Minimum entropy requirement is the security strength requested.
@@ -33,33 +35,28 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     */
 	    public HMacSP800Drbg(IMac hMac, int securityStrength, IEntropySource entropySource, byte[] personalizationString, byte[] nonce)
 	    {
-	        if (securityStrength > Utils.getMaxSecurityStrength(hMac))
-	        {
+	        if (securityStrength > DrbgUtilities.GetMaxSecurityStrength(hMac))
 	            throw new ArgumentException("Requested security strength is not supported by the derivation function");
-	        }
-
 	        if (entropySource.EntropySize < securityStrength)
-	        {
 	            throw new ArgumentException("Not enough entropy for security strength required");
-	        }
 
-	        _securityStrength = securityStrength;
-	        _entropySource = entropySource;
-	        _hMac = hMac;
+            mHMac = hMac;
+            mSecurityStrength = securityStrength;
+	        mEntropySource = entropySource;
 
-	        byte[] entropy = getEntropy();
-	        byte[] seedMaterial = Arrays.Concatenate(entropy, nonce, personalizationString);
+            byte[] entropy = GetEntropy();
+	        byte[] seedMaterial = Arrays.ConcatenateAll(entropy, nonce, personalizationString);
 
-	        _K = new byte[hMac.GetMacSize()];
-	        _V = new byte[_K.Length];
-	        Arrays.fill(_V, (byte)1);
+            mK = new byte[hMac.GetMacSize()];
+	        mV = new byte[mK.Length];
+	        Arrays.Fill(mV, (byte)1);
 
-	        hmac_DRBG_Update(seedMaterial);
+            hmac_DRBG_Update(seedMaterial);
 
-	        _reseedCounter = 1;
+            mReseedCounter = 1;
 	    }
 
-	    private void hmac_DRBG_Update(byte[] seedMaterial)
+        private void hmac_DRBG_Update(byte[] seedMaterial)
 	    {
 	        hmac_DRBG_Update_Func(seedMaterial, (byte)0x00);
 	        if (seedMaterial != null)
@@ -70,22 +67,22 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 
 	    private void hmac_DRBG_Update_Func(byte[] seedMaterial, byte vValue)
 	    {
-	        _hMac.Init(new KeyParameter(_K));
+	        mHMac.Init(new KeyParameter(mK));
 
-	        _hMac.BlockUpdate(_V, 0, _V.Length);
-	        _hMac.Update(vValue);
+            mHMac.BlockUpdate(mV, 0, mV.Length);
+            mHMac.Update(vValue);
 
 	        if (seedMaterial != null)
 	        {
-	            _hMac.update(seedMaterial, 0, seedMaterial.Length);
+                mHMac.BlockUpdate(seedMaterial, 0, seedMaterial.Length);
 	        }
 
-	        _hMac.DoFinal(_K, 0);
+            mHMac.DoFinal(mK, 0);
 
-	        _hMac.Init(new KeyParameter(_K));
-	        _hMac.BlockUpdate(_V, 0, _V.Length);
+            mHMac.Init(new KeyParameter(mK));
+            mHMac.BlockUpdate(mV, 0, mV.Length);
 
-	        _hMac.DoFinal(_V, 0);
+            mHMac.DoFinal(mV, 0);
 	    }
 
 	    /**
@@ -95,9 +92,7 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     */
 	    public int BlockSize
 	    {
-			get {
-				return _V.Length * 8;
-			}
+			get { return mV.Length * 8; }
 	    }
 
 	    /**
@@ -109,23 +104,21 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     *
 	     * @return number of bits generated, -1 if a reseed required.
 	     */
-	    public int Generate(byte[] output, byte[] additionalInput, boolean predictionResistant)
+	    public int Generate(byte[] output, byte[] additionalInput, bool predictionResistant)
 	    {
 	        int numberOfBits = output.Length * 8;
 
-	        if (numberOfBits > MAX_BITS_REQUEST)
-	        {
-	            throw new IllegalArgumentException("Number of bits per request limited to " + MAX_BITS_REQUEST);
-	        }
+            if (numberOfBits > MAX_BITS_REQUEST)
+	            throw new ArgumentException("Number of bits per request limited to " + MAX_BITS_REQUEST, "output");
 
-	        if (_reseedCounter > RESEED_MAX)
+            if (mReseedCounter > RESEED_MAX)
 	        {
 	            return -1;
 	        }
 
-	        if (predictionResistant)
+            if (predictionResistant)
 	        {
-	            reseed(additionalInput);
+	            Reseed(additionalInput);
 	            additionalInput = null;
 	        }
 
@@ -135,36 +128,36 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	            hmac_DRBG_Update(additionalInput);
 	        }
 
-	        // 3.
+            // 3.
 	        byte[] rv = new byte[output.Length];
 
-	        int m = output.Length / _V.Length;
+            int m = output.Length / mV.Length;
 
-	        _hMac.Init(new KeyParameter(_K));
+            mHMac.Init(new KeyParameter(mK));
 
 	        for (int i = 0; i < m; i++)
 	        {
-	            _hMac.BlockUpdate(_V, 0, _V.Length);
-	            _hMac.DoFinal(_V, 0);
+	            mHMac.BlockUpdate(mV, 0, mV.Length);
+                mHMac.DoFinal(mV, 0);
 
-	            Array.Copy(_V, 0, rv, i * _V.Length, _V.Length);
+                Array.Copy(mV, 0, rv, i * mV.Length, mV.Length);
 	        }
 
-	        if (m * _V.Length < rv.Length)
+            if (m * mV.Length < rv.Length)
 	        {
-					_hMac.BlockUpdate(_V, 0, _V.Length);
-	            _hMac.DoFinal(_V, 0);
+                mHMac.BlockUpdate(mV, 0, mV.Length);
+                mHMac.DoFinal(mV, 0);
 
-	            Array.Copy(_V, 0, rv, m * _V.Length, rv.Length - (m * _V.Length));
+	            Array.Copy(mV, 0, rv, m * mV.Length, rv.Length - (m * mV.Length));
 	        }
 
-	        hmac_DRBG_Update(additionalInput);
+            hmac_DRBG_Update(additionalInput);
 
-	        _reseedCounter++;
+	        mReseedCounter++;
 
 	        Array.Copy(rv, 0, output, 0, output.Length);
 
-	        return numberOfBits;
+            return numberOfBits;
 	    }
 
 	    /**
@@ -174,22 +167,19 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	      */
 	    public void Reseed(byte[] additionalInput)
 	    {
-	        byte[] entropy = getEntropy();
+	        byte[] entropy = GetEntropy();
 	        byte[] seedMaterial = Arrays.Concatenate(entropy, additionalInput);
 
 	        hmac_DRBG_Update(seedMaterial);
 
-	        _reseedCounter = 1;
+	        mReseedCounter = 1;
 	    }
 
-	    private byte[] getEntropy()
+        private byte[] GetEntropy()
 	    {
-	        byte[] entropy = _entropySource.GetEntropy();
-
-	        if (entropy.Length < (_securityStrength + 7) / 8)
-	        {
-	            throw new IllegalStateException("Insufficient entropy provided by entropy source");
-	        }
+	        byte[] entropy = mEntropySource.GetEntropy();
+	        if (entropy.Length < (mSecurityStrength + 7) / 8)
+	            throw new InvalidOperationException("Insufficient entropy provided by entropy source");
 	        return entropy;
 	    }
 	}
diff --git a/crypto/src/crypto/prng/drbg/HashSP800Drbg.cs b/crypto/src/crypto/prng/drbg/HashSP800Drbg.cs
index 868778817..493da5a75 100644
--- a/crypto/src/crypto/prng/drbg/HashSP800Drbg.cs
+++ b/crypto/src/crypto/prng/drbg/HashSP800Drbg.cs
@@ -8,36 +8,37 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	/**
 	 * A SP800-90A Hash DRBG.
 	 */
-	public class HashSP800Drbg: SP80090Drbg
+	public class HashSP800Drbg
+        :   ISP80090Drbg
 	{
-	    private readonly static byte[]     ONE = { 0x01 };
+	    private readonly static byte[] ONE = { 0x01 };
 
-		private readonly static long       RESEED_MAX = 1L << (48 - 1);
-		private readonly static int        MAX_BITS_REQUEST = 1 << (19 - 1);
+		private readonly static long RESEED_MAX = 1L << (48 - 1);
+		private readonly static int MAX_BITS_REQUEST = 1 << (19 - 1);
 
 		private static readonly IDictionary seedlens = Platform.CreateHashtable();
 
 		static HashSP800Drbg()
 	    {
-				seedlens.Add("SHA-1", 440);
-				seedlens.Add("SHA-224", 440);
-				seedlens.Add("SHA-256", 440);
-				seedlens.Add("SHA-512/256", 440);
-				seedlens.Add("SHA-512/224", 440);
-				seedlens.Add("SHA-384", 888);
-				seedlens.Add("SHA-512", 888);
-
+            seedlens.Add("SHA-1", 440);
+            seedlens.Add("SHA-224", 440);
+            seedlens.Add("SHA-256", 440);
+            seedlens.Add("SHA-512/256", 440);
+            seedlens.Add("SHA-512/224", 440);
+            seedlens.Add("SHA-384", 888);
+            seedlens.Add("SHA-512", 888);
 	    }
 
-	    private IDigest        _digest;
-	    private byte[]         _V;
-	    private byte[]         _C;
-	    private long           _reseedCounter;
-	    private IEntropySource _entropySource;
-	    private int            _securityStrength;
-	    private int            _seedLength;
+        private readonly IDigest        mDigest;
+        private readonly IEntropySource mEntropySource;
+        private readonly int            mSecurityStrength;
+        private readonly int            mSeedLength;
 
-	    /**
+        private byte[] mV;
+        private byte[] mC;
+        private long mReseedCounter;
+
+        /**
 	     * Construct a SP800-90A Hash DRBG.
 	     * <p>
 	     * Minimum entropy requirement is the security strength requested.
@@ -50,22 +51,17 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     */
 	    public HashSP800Drbg(IDigest digest, int securityStrength, IEntropySource entropySource, byte[] personalizationString, byte[] nonce)
 	    {
-	        if (securityStrength > Utils.getMaxSecurityStrength(digest))
-	        {
+	        if (securityStrength > DrbgUtilities.GetMaxSecurityStrength(digest))
 	            throw new ArgumentException("Requested security strength is not supported by the derivation function");
-	        }
-
 	        if (entropySource.EntropySize < securityStrength)
-	        {
 	            throw new ArgumentException("Not enough entropy for security strength required");
-	        }
 
-	        _digest = digest;
-	        _entropySource = entropySource;
-	        _securityStrength = securityStrength;
-	        _seedLength = ((Integer)seedlens.get(digest.getAlgorithmName())).intValue();
+            mDigest = digest;
+	        mEntropySource = entropySource;
+	        mSecurityStrength = securityStrength;
+            mSeedLength = (int)seedlens[digest.AlgorithmName];
 
-	        // 1. seed_material = entropy_input || nonce || personalization_string.
+            // 1. seed_material = entropy_input || nonce || personalization_string.
 	        // 2. seed = Hash_df (seed_material, seedlen).
 	        // 3. V = seed.
 	        // 4. C = Hash_df ((0x00 || V), seedlen). Comment: Preceed V with a byte
@@ -73,16 +69,16 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        // 5. reseed_counter = 1.
 	        // 6. Return V, C, and reseed_counter as the initial_working_state
 
-	        byte[] entropy = getEntropy();
-	        byte[] seedMaterial = Arrays.Concatenate(entropy, nonce, personalizationString);
-	        byte[] seed = Utils.hash_df(_digest, seedMaterial, _seedLength);
+	        byte[] entropy = GetEntropy();
+	        byte[] seedMaterial = Arrays.ConcatenateAll(entropy, nonce, personalizationString);
+	        byte[] seed = DrbgUtilities.HashDF(mDigest, seedMaterial, mSeedLength);
 
-	        _V = seed;
-	        byte[] subV = new byte[_V.Length + 1];
-	        Array.Copy(_V, 0, subV, 1, _V.Length);
-	        _C = Utils.hash_df(_digest, subV, _seedLength);
+            mV = seed;
+	        byte[] subV = new byte[mV.Length + 1];
+	        Array.Copy(mV, 0, subV, 1, mV.Length);
+	        mC = DrbgUtilities.HashDF(mDigest, subV, mSeedLength);
 
-	        _reseedCounter = 1;
+            mReseedCounter = 1;
 	    }
 
 	    /**
@@ -92,9 +88,7 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	     */
 	    public int BlockSize
 	    {
-			get {
-				return _digest.GetDigestSize () * 8;
-			}
+			get { return mDigest.GetDigestSize () * 8; }
 	    }
 
 	    /**
@@ -121,97 +115,95 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        // 6. reseed_counter = reseed_counter + 1.
 	        // 7. Return SUCCESS, returned_bits, and the new values of V, C, and
 	        // reseed_counter for the new_working_state.
-	        int numberOfBits = output.Length*8;
+	        int numberOfBits = output.Length * 8;
 
 	        if (numberOfBits > MAX_BITS_REQUEST)
-	        {
-	            throw new ArgumentException("Number of bits per request limited to " + MAX_BITS_REQUEST);
-	        }
+	            throw new ArgumentException("Number of bits per request limited to " + MAX_BITS_REQUEST, "output");
 
-	        if (_reseedCounter > RESEED_MAX)
-	        {
+            if (mReseedCounter > RESEED_MAX)
 	            return -1;
-	        }
 
-	        if (predictionResistant)
+            if (predictionResistant)
 	        {   
-	            reseed(additionalInput);
+	            Reseed(additionalInput);
 	            additionalInput = null;
 	        }
 
 	        // 2.
 	        if (additionalInput != null)
 	        {
-	            byte[] newInput = new byte[1 + _V.Length + additionalInput.Length];
+	            byte[] newInput = new byte[1 + mV.Length + additionalInput.Length];
 	            newInput[0] = 0x02;
-	            Array.Copy(_V, 0, newInput, 1, _V.Length);
+	            Array.Copy(mV, 0, newInput, 1, mV.Length);
 	            // TODO: inOff / inLength
-	            Array.Copy(additionalInput, 0, newInput, 1 + _V.Length, additionalInput.Length);
-	            byte[] w = hash(newInput);
+	            Array.Copy(additionalInput, 0, newInput, 1 + mV.Length, additionalInput.Length);
+	            byte[] w = Hash(newInput);
 
-	            addTo(_V, w);
+                AddTo(mV, w);
 	        }
-	        
-	        // 3.
-	        byte[] rv = hashgen(_V, numberOfBits);
-	        
-	        // 4.
-	        byte[] subH = new byte[_V.Length + 1];
-	        Array.Copy(_V, 0, subH, 1, _V.Length);
+
+            // 3.
+	        byte[] rv = hashgen(mV, numberOfBits);
+
+            // 4.
+	        byte[] subH = new byte[mV.Length + 1];
+	        Array.Copy(mV, 0, subH, 1, mV.Length);
 	        subH[0] = 0x03;
-	        
-	        byte[] H = hash(subH);
-	        
-	        // 5.
-	        addTo(_V, H);
-	        addTo(_V, _C);
+
+            byte[] H = Hash(subH);
+
+            // 5.
+	        AddTo(mV, H);
+	        AddTo(mV, mC);
 	        byte[] c = new byte[4];
-	        c[0] = (byte)(_reseedCounter >> 24);
-	        c[1] = (byte)(_reseedCounter >> 16);
-	        c[2] = (byte)(_reseedCounter >> 8);
-	        c[3] = (byte)_reseedCounter;
-	        
-	        addTo(_V, c);
+	        c[0] = (byte)(mReseedCounter >> 24);
+	        c[1] = (byte)(mReseedCounter >> 16);
+	        c[2] = (byte)(mReseedCounter >> 8);
+	        c[3] = (byte)mReseedCounter;
+
+	        AddTo(mV, c);
 
-	        _reseedCounter++;
+	        mReseedCounter++;
 
 	        Array.Copy(rv, 0, output, 0, output.Length);
 
 	        return numberOfBits;
 	    }
 
-	    private byte[] getEntropy()
+	    private byte[] GetEntropy()
 	    {
-	        byte[] entropy = _entropySource.getEntropy();
-	        if (entropy.Length < (_securityStrength + 7) / 8)
-	        {
-	            throw new IllegalStateException("Insufficient entropy provided by entropy source");
-	        }
+	        byte[] entropy = mEntropySource.GetEntropy();
+	        if (entropy.Length < (mSecurityStrength + 7) / 8)
+	            throw new InvalidOperationException("Insufficient entropy provided by entropy source");
 	        return entropy;
 	    }
 
 	    // this will always add the shorter length byte array mathematically to the
 	    // longer length byte array.
 	    // be careful....
-	    private void addTo(byte[] longer, byte[] shorter)
+	    private void AddTo(byte[] longer, byte[] shorter)
 	    {
-	        int carry = 0;
-	        for (int i=1;i <= shorter.Length; i++) // warning
-	        {
-	            int res = (longer[longer.Length-i] & 0xff) + (shorter[shorter.Length-i] & 0xff) + carry;
-	            carry = (res > 0xff) ? 1 : 0;
-	            longer[longer.Length-i] = (byte)res;
-	        }
-	        
-	        for (int i=shorter.Length+1;i <= longer.Length; i++) // warning
-	        {
-	            int res = (longer[longer.Length-i] & 0xff) + carry;
-	            carry = (res > 0xff) ? 1 : 0;
-	            longer[longer.Length-i] = (byte)res;
-	        }
+            int off = longer.Length - shorter.Length;
+
+            uint carry = 0;
+            int i = shorter.Length;
+            while (--i >= 0)
+            {
+                carry += (uint)longer[off + i] + (uint)shorter[i];
+                longer[off + i] = (byte)carry;
+                carry >>= 8;
+            }
+
+            i = off;
+            while (--i >= 0)
+            {
+                carry += longer[i];
+                longer[i] = (byte)carry;
+                carry >>= 8;
+            }
 	    }
 
-	    /**
+        /**
 	      * Reseed the DRBG.
 	      *
 	      * @param additionalInput additional input to be added to the DRBG in this step.
@@ -231,33 +223,33 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	        // 6. Return V, C, and reseed_counter for the new_working_state.
 	        //
 	        // Comment: Precede with a byte of all zeros.
-	        byte[] entropy = getEntropy();
-	        byte[] seedMaterial = Arrays.Concatenate(ONE, _V, entropy, additionalInput);
-	        byte[] seed = Utils.hash_df(_digest, seedMaterial, _seedLength);
+	        byte[] entropy = GetEntropy();
+	        byte[] seedMaterial = Arrays.ConcatenateAll(ONE, mV, entropy, additionalInput);
+	        byte[] seed = DrbgUtilities.HashDF(mDigest, seedMaterial, mSeedLength);
 
-	        _V = seed;
-	        byte[] subV = new byte[_V.Length + 1];
+            mV = seed;
+	        byte[] subV = new byte[mV.Length + 1];
 	        subV[0] = 0x00;
-	        Array.Copy(_V, 0, subV, 1, _V.Length);
-	        _C = Utils.hash_df(_digest, subV, _seedLength);
+	        Array.Copy(mV, 0, subV, 1, mV.Length);
+	        mC = DrbgUtilities.HashDF(mDigest, subV, mSeedLength);
 
-	        _reseedCounter = 1;
-	    }
-	    
-	    private byte[] hash(byte[] input)
-	    {
-	        byte[] hash = new byte[_digest.GetDigestSize()];
-	        doHash(input, hash);
-	        return hash;
+            mReseedCounter = 1;
 	    }
 
-	    private void doHash(byte[] input, byte[] output)
-	    {
-	        _digest.BlockUpdate(input, 0, input.Length);
-	        _digest.DoFinal(output, 0);
-	    }
+        private byte[] Hash(byte[] input)
+        {
+            byte[] hash = new byte[mDigest.GetDigestSize()];
+            DoHash(input, hash);
+            return hash;
+        }
+
+        private void DoHash(byte[] input, byte[] output)
+        {
+            mDigest.BlockUpdate(input, 0, input.Length);
+            mDigest.DoFinal(output, 0);
+        }
 
-	    // 1. m = [requested_number_of_bits / outlen]
+        // 1. m = [requested_number_of_bits / outlen]
 	    // 2. data = V.
 	    // 3. W = the Null string.
 	    // 4. For i = 1 to m
@@ -268,25 +260,25 @@ namespace Org.BouncyCastle.Crypto.Prng.Drbg
 	    // 5. returned_bits = Leftmost (requested_no_of_bits) bits of W.
 	    private byte[] hashgen(byte[] input, int lengthInBits)
 	    {
-	        int digestSize = _digest.GetDigestSize();
+	        int digestSize = mDigest.GetDigestSize();
 	        int m = (lengthInBits / 8) / digestSize;
 
-	        byte[] data = new byte[input.Length];
+            byte[] data = new byte[input.Length];
 	        Array.Copy(input, 0, data, 0, input.Length);
 
 	        byte[] W = new byte[lengthInBits / 8];
 
-	        byte[] dig = new byte[_digest.GetDigestSize()];
+            byte[] dig = new byte[mDigest.GetDigestSize()];
 	        for (int i = 0; i <= m; i++)
 	        {
-	            doHash(data, dig);
+	            DoHash(data, dig);
 
 	            int bytesToCopy = ((W.Length - i * dig.Length) > dig.Length)
 	                    ? dig.Length
 	                    : (W.Length - i * dig.Length);
 	            Array.Copy(dig, 0, W, i * dig.Length, bytesToCopy);
 
-	            addTo(data, ONE);
+                AddTo(data, ONE);
 	        }
 
 	        return W;
diff --git a/crypto/src/crypto/prng/drbg/ISP80090Drbg.cs b/crypto/src/crypto/prng/drbg/ISP80090Drbg.cs
index c39cf365f..0e398209e 100644
--- a/crypto/src/crypto/prng/drbg/ISP80090Drbg.cs
+++ b/crypto/src/crypto/prng/drbg/ISP80090Drbg.cs
@@ -1,9 +1,11 @@
+using System;
+
 namespace Org.BouncyCastle.Crypto.Prng.Drbg
 {
 	/**
 	 * Interface to SP800-90A deterministic random bit generators.
 	 */
-	public interface SP80090Drbg
+	public interface ISP80090Drbg
 	{
 	    /**
 	     * Return the block size of the DRBG.
diff --git a/crypto/src/security/SecureRandom.cs b/crypto/src/security/SecureRandom.cs
index 4894a93e6..875709e57 100644
--- a/crypto/src/security/SecureRandom.cs
+++ b/crypto/src/security/SecureRandom.cs
@@ -164,13 +164,7 @@ namespace Org.BouncyCastle.Security
 
         public override int Next()
         {
-            for (;;)
-            {
-                int i = NextInt() & int.MaxValue;
-
-                if (i != int.MaxValue)
-                    return i;
-            }
+            return NextInt() & int.MaxValue;
         }
 
         public override int Next(int maxValue)
@@ -184,11 +178,9 @@ namespace Org.BouncyCastle.Security
             }
 
             // Test whether maxValue is a power of 2
-            if ((maxValue & -maxValue) == maxValue)
+            if ((maxValue & (maxValue - 1)) == 0)
             {
-                int val = NextInt() & int.MaxValue;
-                long lr = ((long) maxValue * (long) val) >> 31;
-                return (int) lr;
+                return NextInt() & (maxValue - 1);
             }
 
             int bits, result;
@@ -244,16 +236,17 @@ namespace Org.BouncyCastle.Security
 
         public virtual int NextInt()
         {
-            byte[] intBytes = new byte[4];
-            NextBytes(intBytes);
-
-            int result = 0;
-            for (int i = 0; i < 4; i++)
-            {
-                result = (result << 8) + (intBytes[i] & 0xff);
-            }
-
-            return result;
+            byte[] bytes = new byte[4];
+            NextBytes(bytes);
+
+            uint result = bytes[0];
+            result <<= 8;
+            result |= bytes[1];
+            result <<= 8;
+            result |= bytes[2];
+            result <<= 8;
+            result |= bytes[3];
+            return (int)result;
         }
 
         public virtual long NextLong()
diff --git a/crypto/src/util/Arrays.cs b/crypto/src/util/Arrays.cs
index 32c56b8b5..df9b4e7ee 100644
--- a/crypto/src/util/Arrays.cs
+++ b/crypto/src/util/Arrays.cs
@@ -591,57 +591,33 @@ namespace Org.BouncyCastle.Utilities
             return rv;
         }
 
-        public static byte[] Concatenate(byte[] a, byte[] b, byte[] c)
+        public static byte[] ConcatenateAll(params byte[][] vs)
         {
-                if (a != null && b != null && c != null)
-                {
-                        byte[] rv = new byte[a.Length + b.Length + c.Length];
-
-                        Array.Copy(a, 0, rv, 0, a.Length);
-                        Array.Copy(b, 0, rv, a.Length, b.Length);
-                      	Array.Copy(c, 0, rv, a.Length + b.Length, c.Length);
+            byte[][] nonNull = new byte[vs.Length][];
+            int count = 0;
+            int totalLength = 0;
 
-                        return rv;
-                }
-                else if (b == null)
-                {
-                        return Concatenate(a, c);
-	        }
-                else
+            for (int i = 0; i < vs.Length; ++i)
+            {
+                byte[] v = vs[i];
+                if (v != null)
                 {
-                        return Concatenate(a, b);
+                    nonNull[count++] = v;
+                    totalLength += v.Length;
                 }
-        }
+            }
 
-        public static byte[] Concatenate(byte[] a, byte[] b, byte[] c, byte[] d)
-        {
-                if (a != null && b != null && c != null && d != null)
-                {
-                        byte[] rv = new byte[a.Length + b.Length + c.Length + d.Length];
+            byte[] result = new byte[totalLength];
+            int pos = 0;
 
-                        Array.Copy(a, 0, rv, 0, a.Length);
-                        Array.Copy(b, 0, rv, a.Length, b.Length);
-                        Array.Copy(c, 0, rv, a.Length + b.Length, c.Length);
-                        Array.Copy(d, 0, rv, a.Length + b.Length + c.Length, d.Length);
+            for (int j = 0; j < count; ++j)
+            {
+                byte[] v = nonNull[j];
+                Array.Copy(v, 0, result, pos, v.Length);
+                pos += v.Length;
+            }
 
-                        return rv;
-                }
-                else if (d == null)
-                {
-                        return Concatenate(a, b, c);
-                }
-                else if (c == null)
-                {
-                        return Concatenate(a, b, d);
-                }
-                else if (b == null)
-                {
-                        return Concatenate(a, c, d);
-                }
-                else
-                {
-                        return Concatenate(b, c, d);
-                }
+            return result;
         }
 
         public static int[] Concatenate(int[] a, int[] b)
diff --git a/crypto/test/src/crypto/prng/test/CtrDrbgTest.cs b/crypto/test/src/crypto/prng/test/CtrDrbgTest.cs
index e081ec132..44b08f3a6 100644
--- a/crypto/test/src/crypto/prng/test/CtrDrbgTest.cs
+++ b/crypto/test/src/crypto/prng/test/CtrDrbgTest.cs
@@ -1,10 +1,11 @@
 using System;
 
+using NUnit.Framework;
+
 using Org.BouncyCastle.Crypto.Engines;
 using Org.BouncyCastle.Crypto.Prng.Drbg;
 using Org.BouncyCastle.Utilities.Test;
 using Org.BouncyCastle.Utilities.Encoders;
-using NUnit.Framework;
 using Org.BouncyCastle.Utilities;
 using Org.BouncyCastle.Crypto.Parameters;
 
@@ -14,356 +15,365 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
      * CTR DRBG Test
      */
     [TestFixture]
-    public class CtrDrbgTest : SimpleTest
+    public class CtrDrbgTest
+        :   SimpleTest
     {
-        public override String Name {
-            get {
-                return "CTRDRBGTest";
-            }
+        public override string Name
+        {
+            get { return "CTRDRBGTest"; }
         }
 
-        public static void main(String[] args)
+        public static void Main(string[] args)
         {
             RunTest(new CtrDrbgTest());
         }
 
-        private DRBGTestVector[] createTestVectorData()
+        [Test]
+        public void TestFunction()
         {
-            return new DRBGTestVector[]
-                {
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            false,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "ABC88224514D0316EA3D48AEE3C9A2B4",
-                                    "D3D3F372E43E7ABDC4FA293743EED076"
-                                }
-                        ),
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            false,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "D4564EE072ACA5BD279536E14F94CB12",
-                                    "1CCD9AFEF15A9679BA75E35225585DEA"
-                                }
-                        )
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            false,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "760BED7D92B083B10AF31CF0656081EB",
-                                    "FD1AC41482384D823CF3FD6F0E6C88B3"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C"),
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            false,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "7A4C1D7ADC8A67FDB50100ED23583A2C",
-                                    "43044D311C0E07541CA5C8B0916976B2"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C")
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            true,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "8FB78ABCA75C9F284E974E36141866BC",
-                                    "9D9745FF31C42A4488CBB771B13B5D86"
-                                }
-                        ),
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            true,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "0E389920A09B485AA4ABD0CA7E60D89C",
-                                    "F4478EC6659A0D3577625B0C73A211DD"
-                                }
-                        )
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            true,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "64983055D014550B39DE699E43130B64",
-                                    "035FDDA8582A2214EC722C410A8D95D3"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C"),
-                new DRBGTestVector(
-                            new DesEdeEngine(), 168,
-                            new Bit232EntropyProvider().Get(232),
-                            true,
-                            "20212223242526",
-                            112,
-                            new String[]
-                                {
-                                    "A29C1A8C42FBC562D7D1DBA7DC541FFE",
-                                    "0BDA66B049429061C013E4228C2F44C6"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C")
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 128,
-                            new Bit256EntropyProvider().Get(256),
-                            false,
-                            "2021222324252627",
-                            128,
-                            new String[]
-                                {
-                                    "8CF59C8CF6888B96EB1C1E3E79D82387AF08A9E5FF75E23F1FBCD4559B6B997E",
-                                    "69CDEF912C692D61B1DA4C05146B52EB7B8849BD87937835328254EC25A9180E"
-                                }
-                        ),
-                new DRBGTestVector(
-                            new AesFastEngine(), 128,
-                            new Bit256EntropyProvider().Get(256),
-                            false,
-                            "2021222324252627",
-                            128,
-                            new String[]
-                                {
-                                    "E8C74A4B7BFFB53BEB80E78CA86BB6DF70E2032AEB473E0DD54D2339CEFCE9D0",
-                                    "26B3F823B4DBAFC23B141375E10B3AEB7A0B5DEF1C7D760B6F827D01ECD17AC7"
-                                }
-                        )
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"),
-                new DRBGTestVector(
-                           new AesFastEngine(), 128,
-                           new Bit256EntropyProvider().Get(256),
-                           false,
-                           "2021222324252627",
-                           128,
-                           new String[]
-                               {
-                                   "18FDEFBDC43D7A36D5D6D862205765D1D701C9F237007030DF1B8E70EE4EEE29",
-                                   "9888F1D38BB1CCE31B363AA1BD9B39616876C30DEE1FF0B7BD8C4C441715C833"
-                               }
-                       )
-               .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 128,
-                            new Bit256EntropyProvider().Get(256),
-                            true,
-                            "2021222324252627",
-                            128,
-                            new String[]
-                                {
-                                    "BFF4B85D68C84529F24F69F9ACF1756E29BA648DDEB825C225FA32BA490EF4A9",
-                                    "9BD2635137A52AF7D0FCBEFEFB97EA93A0F4C438BD98956C0DACB04F15EE25B3"
-                                }
-                        ),
-                new DRBGTestVector(
-                            new AesFastEngine(), 128,
-                            new Bit256EntropyProvider().Get(256),
-                            true,
-                            "2021222324252627",
-                            128,
-                            new String[]
-                                {
-                                    "4573AC8BBB33D7CC4DBEF3EEDF6EAE748B536C3A1082CEE4948CDB51C83A7F9C",
-                                    "99C628CDD87BD8C2F1FE443AA7F761DA16886436326323354DA6311FFF5BC678"
-                                }
-                        )
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"),
-                new DRBGTestVector(
-                           new AesFastEngine(), 128,
-                           new Bit256EntropyProvider().Get(256),
-                           true,
-                           "2021222324252627",
-                           128,
-                           new String[]
-                               {
-                                   "F324104E2FA14F79D8AA60DF06B93B3BC157324958F0A7EE1E193677A70E0250",
-                                   "78F4C840134F40DC001BFAD3A90B5EF4DEBDBFAC3CFDF0CD69A89DC4FD34713F"
-                               }
-                       )
-               .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 192,
-                            new Bit320EntropyProvider().Get(320),
-                            false,
-                            "202122232425262728292A2B",
-                            192,
-                            new String[]
-                                {
-                                    "E231244B3235B085C81604424357E85201E3828B5C45568679A5555F867AAC8C",
-                                    "DDD0F7BCCADADAA31A67652259CE569A271DD85CF66C3D6A7E9FAED61F38D219"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667"),
-                new DRBGTestVector(
-                        new AesFastEngine(), 192,
-                        new Bit320EntropyProvider().Get(320),
-                        true,
-                        "202122232425262728292A2B",
-                        192,
-                        new String[]
-                            {
-                                "F780D4A2C25CF8EE7407D948EC0B724A4235D8B20E65081392755CA7912AD7C0",
-                                "BA14617F915BA964CB79276BDADC840C14B631BBD1A59097054FA6DFF863B238"
-                            }
-                    )
-            .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 256,
-                            new Bit384EntropyProvider().Get(384),
-                            false,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                                {
-                                    "47111E146562E9AA2FB2A1B095D37A8165AF8FC7CA611D632BE7D4C145C83900",
-                                    "98A28E3B1BA363C9DAF0F6887A1CF52B833D3354D77A7C10837DD63DD2E645F8"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F")
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 256,
-                            new Bit384EntropyProvider().Get(384),
-                            true,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                                {
-                                    "71BB3F9C9CEAF4E6C92A83EB4C7225010EE150AC75E23F5F77AD5073EF24D88A",
-                                    "386DEBBBF091BBF0502957B0329938FB836B82E594A2F5FDD5EB28D4E35528F4"
-                                }
-                        )
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 256,
-                            new Bit384EntropyProvider().Get(384),
-                            true,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                                {
-                                    "1A2E3FEE9056E98D375525FDC2B63B95B47CE51FCF594D804BD5A17F2E01139B",
-                                    "601F95384F0D85946301D1EACE8F645A825CE38F1E2565B0C0C439448E9CA8AC"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 256,
-                            new Bit384EntropyProvider().Get(384),
-                            true,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                                {
-                                    "EAE6BCE781807E524D26605EA198077932D01EEB445B9AC6C5D99C101D29F46E",
-                                    "738E99C95AF59519AAD37FF3D5180986ADEBAB6E95836725097E50A8D1D0BD28"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F")
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"),
-                new DRBGTestVector(
-                            new AesFastEngine(), 256,
-                            new Bit384EntropyProvider().Get(384),
-                            true,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                                {
-                                    "eae6bce781807e524d26605ea198077932d01eeb445b9ac6c5d99c101d29f46e30b27377",
-                                    "ec51b55b49904c3ff9e13939f1cf27398993e1b3acb2b0be0be8761261428f0aa8ba2657"
-                                }
-                        )
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F")
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF")
+            string resultText = Perform().ToString();
+
+            Assert.AreEqual(Name + ": Okay", resultText);
+        }
+
+        private DrbgTestVector[] CreateTestVectorData()
+        {
+            return new DrbgTestVector[]
+            {
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    false,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "ABC88224514D0316EA3D48AEE3C9A2B4",
+                        "D3D3F372E43E7ABDC4FA293743EED076"
+                    }
+                ),
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    false,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "D4564EE072ACA5BD279536E14F94CB12",
+                        "1CCD9AFEF15A9679BA75E35225585DEA"
+                    }
+                )
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    false,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "760BED7D92B083B10AF31CF0656081EB",
+                        "FD1AC41482384D823CF3FD6F0E6C88B3"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C"),
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    false,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "7A4C1D7ADC8A67FDB50100ED23583A2C",
+                        "43044D311C0E07541CA5C8B0916976B2"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C")
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    true,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "8FB78ABCA75C9F284E974E36141866BC",
+                        "9D9745FF31C42A4488CBB771B13B5D86"
+                    }
+                ),
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    true,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "0E389920A09B485AA4ABD0CA7E60D89C",
+                        "F4478EC6659A0D3577625B0C73A211DD"
+                    }
+                )
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    true,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "64983055D014550B39DE699E43130B64",
+                        "035FDDA8582A2214EC722C410A8D95D3"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C"),
+                new DrbgTestVector(
+                    new DesEdeEngine(), 168,
+                    new Bit232EntropyProvider().Get(232),
+                    true,
+                    "20212223242526",
+                    112,
+                    new string[]
+                    {
+                        "A29C1A8C42FBC562D7D1DBA7DC541FFE",
+                        "0BDA66B049429061C013E4228C2F44C6"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C")
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 128,
+                    new Bit256EntropyProvider().Get(256),
+                    false,
+                    "2021222324252627",
+                    128,
+                    new string[]
+                    {
+                        "8CF59C8CF6888B96EB1C1E3E79D82387AF08A9E5FF75E23F1FBCD4559B6B997E",
+                        "69CDEF912C692D61B1DA4C05146B52EB7B8849BD87937835328254EC25A9180E"
+                    }
+                ),
+                new DrbgTestVector(
+                    new AesFastEngine(), 128,
+                    new Bit256EntropyProvider().Get(256),
+                    false,
+                    "2021222324252627",
+                    128,
+                    new string[]
+                    {
+                        "E8C74A4B7BFFB53BEB80E78CA86BB6DF70E2032AEB473E0DD54D2339CEFCE9D0",
+                        "26B3F823B4DBAFC23B141375E10B3AEB7A0B5DEF1C7D760B6F827D01ECD17AC7"
+                    }
+                )
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 128,
+                    new Bit256EntropyProvider().Get(256),
+                    false,
+                    "2021222324252627",
+                    128,
+                    new string[]
+                    {
+                        "18FDEFBDC43D7A36D5D6D862205765D1D701C9F237007030DF1B8E70EE4EEE29",
+                        "9888F1D38BB1CCE31B363AA1BD9B39616876C30DEE1FF0B7BD8C4C441715C833"
+                    }
+                )
+               .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 128,
+                    new Bit256EntropyProvider().Get(256),
+                    true,
+                    "2021222324252627",
+                    128,
+                    new string[]
+                    {
+                        "BFF4B85D68C84529F24F69F9ACF1756E29BA648DDEB825C225FA32BA490EF4A9",
+                        "9BD2635137A52AF7D0FCBEFEFB97EA93A0F4C438BD98956C0DACB04F15EE25B3"
+                    }
+                ),
+                new DrbgTestVector(
+                    new AesFastEngine(), 128,
+                    new Bit256EntropyProvider().Get(256),
+                    true,
+                    "2021222324252627",
+                    128,
+                    new string[]
+                    {
+                        "4573AC8BBB33D7CC4DBEF3EEDF6EAE748B536C3A1082CEE4948CDB51C83A7F9C",
+                        "99C628CDD87BD8C2F1FE443AA7F761DA16886436326323354DA6311FFF5BC678"
+                    }
+                )
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 128,
+                    new Bit256EntropyProvider().Get(256),
+                    true,
+                    "2021222324252627",
+                    128,
+                    new string[]
+                    {
+                        "F324104E2FA14F79D8AA60DF06B93B3BC157324958F0A7EE1E193677A70E0250",
+                        "78F4C840134F40DC001BFAD3A90B5EF4DEBDBFAC3CFDF0CD69A89DC4FD34713F"
+                    }
+                )
+               .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 192,
+                    new Bit320EntropyProvider().Get(320),
+                    false,
+                    "202122232425262728292A2B",
+                    192,
+                    new string[]
+                    {
+                        "E231244B3235B085C81604424357E85201E3828B5C45568679A5555F867AAC8C",
+                        "DDD0F7BCCADADAA31A67652259CE569A271DD85CF66C3D6A7E9FAED61F38D219"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 192,
+                    new Bit320EntropyProvider().Get(320),
+                    true,
+                    "202122232425262728292A2B",
+                    192,
+                    new string[]
+                    {
+                        "F780D4A2C25CF8EE7407D948EC0B724A4235D8B20E65081392755CA7912AD7C0",
+                        "BA14617F915BA964CB79276BDADC840C14B631BBD1A59097054FA6DFF863B238"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 256,
+                    new Bit384EntropyProvider().Get(384),
+                    false,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "47111E146562E9AA2FB2A1B095D37A8165AF8FC7CA611D632BE7D4C145C83900",
+                        "98A28E3B1BA363C9DAF0F6887A1CF52B833D3354D77A7C10837DD63DD2E645F8"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F")
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 256,
+                    new Bit384EntropyProvider().Get(384),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "71BB3F9C9CEAF4E6C92A83EB4C7225010EE150AC75E23F5F77AD5073EF24D88A",
+                        "386DEBBBF091BBF0502957B0329938FB836B82E594A2F5FDD5EB28D4E35528F4"
+                    }
+                )
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 256,
+                    new Bit384EntropyProvider().Get(384),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "1A2E3FEE9056E98D375525FDC2B63B95B47CE51FCF594D804BD5A17F2E01139B",
+                        "601F95384F0D85946301D1EACE8F645A825CE38F1E2565B0C0C439448E9CA8AC"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 256,
+                    new Bit384EntropyProvider().Get(384),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "EAE6BCE781807E524D26605EA198077932D01EEB445B9AC6C5D99C101D29F46E",
+                        "738E99C95AF59519AAD37FF3D5180986ADEBAB6E95836725097E50A8D1D0BD28"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F")
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"),
+                new DrbgTestVector(
+                    new AesFastEngine(), 256,
+                    new Bit384EntropyProvider().Get(384),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "eae6bce781807e524d26605ea198077932d01eeb445b9ac6c5d99c101d29f46e30b27377",
+                        "ec51b55b49904c3ff9e13939f1cf27398993e1b3acb2b0be0be8761261428f0aa8ba2657"
+                    }
+                )
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F")
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF")
                 };
         }
 
         public override void PerformTest()
         {
-            DRBGTestVector[] tests = createTestVectorData();
-            SP80090Drbg d;
-            DRBGTestVector tv;
+            DrbgTestVector[] tests = CreateTestVectorData();
+            ISP80090Drbg d;
+            DrbgTestVector tv;
             byte[] output;
 
             for (int i = 0; i != tests.Length; i++)
             {
                 tv = tests[i];
 
-                byte[] nonce = tv.nonce();
-                byte[] personalisationString = tv.personalizationString();
+                byte[] nonce = tv.GetNonce();
+                byte[] personalisationString = tv.GetPersonalizationString();
 
-                d = new CtrSP800Drbg(tv.getCipher(), tv.keySizeInBits(), tv.securityStrength(), tv.entropySource(), personalisationString, nonce);
+                d = new CtrSP800Drbg(tv.Cipher, tv.KeySizeInBits, tv.SecurityStrength, tv.EntropySource, personalisationString, nonce);
 
-                output = new byte[tv.expectedValue(0).Length];
+                output = new byte[tv.GetExpectedValue(0).Length];
 
-                d.Generate(output, tv.additionalInput(0), tv.predictionResistance());
+                d.Generate(output, tv.GetAdditionalInput(0), tv.PredictionResistance);
 
-                byte[] expected = tv.expectedValue(0);
+                byte[] expected = tv.GetExpectedValue(0);
 
                 if (!AreEqual(expected, output))
                 {
-                    Fail("Test #" + (i + 1) + ".1 failed, expected " + Hex.ToHexString(tv.expectedValue(0)) + " got " + Hex.ToHexString(output));
+                    Fail("Test #" + (i + 1) + ".1 failed, expected " + Hex.ToHexString(tv.GetExpectedValue(0)) + " got " + Hex.ToHexString(output));
                 }
 
-                output = new byte[tv.expectedValue(0).Length];
+                output = new byte[tv.GetExpectedValue(0).Length];
 
-                d.Generate(output, tv.additionalInput(1), tv.predictionResistance());
+                d.Generate(output, tv.GetAdditionalInput(1), tv.PredictionResistance);
 
-                expected = tv.expectedValue(1);
+                expected = tv.GetExpectedValue(1);
                 if (!AreEqual(expected, output))
                 {
-                    Fail("Test #" + (i + 1) + ".2 failed, expected " + Hex.ToHexString(tv.expectedValue(1)) + " got " + Hex.ToHexString(output));
+                    Fail("Test #" + (i + 1) + ".2 failed, expected " + Hex.ToHexString(tv.GetExpectedValue(1)) + " got " + Hex.ToHexString(output));
                 }
             }
 
             // DESede/TDEA key parity test
             tv = tests[0];
 
-            SP80090Drbg drbg = new CtrSP800Drbg(new KeyParityCipher(tv.getCipher()), tv.keySizeInBits(), tv.securityStrength(), tv.entropySource(), tv.personalizationString(), tv.nonce());
+            ISP80090Drbg drbg = new CtrSP800Drbg(new KeyParityCipher(tv.Cipher), tv.KeySizeInBits, tv.SecurityStrength, tv.EntropySource,
+                tv.GetPersonalizationString(), tv.GetNonce());
 
-            output = new byte[tv.expectedValue(0).Length];
+            output = new byte[tv.GetExpectedValue(0).Length];
 
-            drbg.Generate(output, tv.additionalInput(0), tv.predictionResistance());
+            drbg.Generate(output, tv.GetAdditionalInput(0), tv.PredictionResistance);
 
             // Exception tests
             try
@@ -422,21 +432,21 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
         internal class Bit232EntropyProvider : TestEntropySourceProvider
         {
             internal Bit232EntropyProvider() : base(Hex.Decode(
-                   "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C" +
-                   "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C" +
-                   "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDC"), true)
+                "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C" +
+                "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C" +
+                "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDC"), true)
             { }
         }
 
         internal class Bit256EntropyProvider : TestEntropySourceProvider
         {
             internal Bit256EntropyProvider(): base(Hex.Decode(
-                    "0001020304050607" +
-                    "08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F" +
-                    "8081828384858687" +
-                    "88898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F" +
-                    "C0C1C2C3C4C5C6C7" +
-                    "C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"), true)
+                "0001020304050607" +
+                "08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F" +
+                "8081828384858687" +
+                "88898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F" +
+                "C0C1C2C3C4C5C6C7" +
+                "C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"), true)
             { }
        }
 
@@ -489,18 +499,12 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
 
             public String AlgorithmName
             {
-                get
-                {
-                    return cipher.AlgorithmName;
-                }
+                get { return cipher.AlgorithmName; }
             }
 
             public bool IsPartialBlockOkay
             {
-                get
-                {
-                    return false;
-                }
+                get { return false; }
             }
 
             public int GetBlockSize()
@@ -518,7 +522,5 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                 cipher.Reset();
             }
         }
-
     }
-
 }
diff --git a/crypto/test/src/crypto/prng/test/DrbgTestVector.cs b/crypto/test/src/crypto/prng/test/DrbgTestVector.cs
index a4129b9f8..e0a8eeaf5 100644
--- a/crypto/test/src/crypto/prng/test/DrbgTestVector.cs
+++ b/crypto/test/src/crypto/prng/test/DrbgTestVector.cs
@@ -1,24 +1,25 @@
-using Org.BouncyCastle.Utilities.Encoders;
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System;
+using System.Collections;
+
+using Org.BouncyCastle.Utilities.Encoders;
 
 namespace Org.BouncyCastle.Crypto.Prng.Test
 {
-    public class DRBGTestVector
+    public class DrbgTestVector
     {
         private IDigest _digest;
         private IBlockCipher _cipher;
         private int _keySizeInBits;
         private IEntropySource _eSource;
         private bool _pr;
-        private String _nonce;
-        private String _personalisation;
+        private string _nonce;
+        private string _personalisation;
         private int _ss;
         private String[] _ev;
-        private List<string> _ai = new List<string>();
+        private IList _ai = new ArrayList();
 
-        public DRBGTestVector(IDigest digest, IEntropySource eSource, bool predictionResistance, String nonce, int securityStrength, String[] expected)
+        public DrbgTestVector(IDigest digest, IEntropySource eSource, bool predictionResistance, string nonce,
+            int securityStrength, string[] expected)
         {
             _digest = digest;
             _eSource = eSource;
@@ -29,7 +30,8 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
             _personalisation = null;
         }
 
-        public DRBGTestVector(IBlockCipher cipher, int keySizeInBits, IEntropySource eSource, bool predictionResistance, String nonce, int securityStrength, String[] expected)
+        public DrbgTestVector(IBlockCipher cipher, int keySizeInBits, IEntropySource eSource, bool predictionResistance,
+            string nonce, int securityStrength, string[] expected)
         {
             _cipher = cipher;
             _keySizeInBits = keySizeInBits;
@@ -41,89 +43,69 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
             _personalisation = null;
         }
 
-        public IDigest getDigest()
+        public IDigest Digest
         {
-            return _digest;
+            get { return _digest; }
         }
 
-        public IBlockCipher getCipher()
+        public IBlockCipher Cipher
         {
-            return _cipher;
+            get { return _cipher; }
         }
 
-        public int keySizeInBits()
+        public int KeySizeInBits
         {
-            return _keySizeInBits;
+            get { return _keySizeInBits; }
         }
 
-        public DRBGTestVector addAdditionalInput(String input)
+        public DrbgTestVector AddAdditionalInput(string input)
         {
             _ai.Add(input);
-
             return this;
         }
 
-        public DRBGTestVector setPersonalizationString(String p)
+        public DrbgTestVector SetPersonalizationString(string p)
         {
             _personalisation = p;
-
             return this;
         }
 
-        public IEntropySource entropySource()
+        public IEntropySource EntropySource
         {
-            return _eSource;
+            get { return _eSource; }
         }
 
-        public bool predictionResistance()
+        public bool PredictionResistance
         {
-            return _pr;
+            get { return _pr; }
         }
 
-        public byte[] nonce()
+        public byte[] GetNonce()
         {
-            if (_nonce == null)
-            {
-                return null;
-            }
-
-            return Hex.Decode(_nonce);
+            return _nonce == null ? null : Hex.Decode(_nonce);
         }
 
-        public byte[] personalizationString()
+        public byte[] GetPersonalizationString()
         {
-            if (_personalisation == null)
-            {
-                return null;
-            }
-
-            return Hex.Decode(_personalisation);
+             return _personalisation == null ? null : Hex.Decode(_personalisation);
         }
 
-        public int securityStrength()
+        public int SecurityStrength
         {
-            return _ss;
+            get { return _ss; }
         }
 
-        public byte[] expectedValue(int index)
+        public byte[] GetExpectedValue(int index)
         {
             return Hex.Decode(_ev[index]);
         }
 
-        public byte[] additionalInput(int position)
+        public byte[] GetAdditionalInput(int position)
         {
-            int len = _ai.Count;
-            byte[] rv;
-            if (position >= len)
-            {
-                rv = null;
-            }
-            else
-            {
-                rv = Hex.Decode((string)(_ai[position]));
-            }
-            return rv;
-        }
+            if (position >= _ai.Count)
+                return null;
 
+            return Hex.Decode((string)_ai[position]);
+        }
     }
 }
diff --git a/crypto/test/src/crypto/prng/test/HMacDrbgTest.cs b/crypto/test/src/crypto/prng/test/HMacDrbgTest.cs
index b8d383663..a5ca30836 100644
--- a/crypto/test/src/crypto/prng/test/HMacDrbgTest.cs
+++ b/crypto/test/src/crypto/prng/test/HMacDrbgTest.cs
@@ -1,12 +1,12 @@
-
-using System;
+using System;
+
+using NUnit.Framework;
 
 using Org.BouncyCastle.Crypto.Digests;
 using Org.BouncyCastle.Crypto.Macs;
 using Org.BouncyCastle.Crypto.Prng.Drbg;
 using Org.BouncyCastle.Utilities.Test;
 using Org.BouncyCastle.Utilities.Encoders;
-using NUnit.Framework;
 
 namespace Org.BouncyCastle.Crypto.Prng.Test
 {
@@ -14,142 +14,141 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
      * HMAC SP800-90 DRBG
      */
     [TestFixture]
-    public class HMacDrbgTest : SimpleTest
+    public class HMacDrbgTest
+        :   SimpleTest
     {
-        public override String Name
+        public override string Name
         {
-            get
-            {
-                return "HMacDRBG";
-            }
+            get { return "HMacDRBG"; }
         }
 
-        public static void main(String[] args)
+        public static void Main(string[] args)
         {
             RunTest(new HMacDrbgTest());
         }
 
         [Test]
-        public void HMacDrbgTestFunction()
+        public void TestFunction()
         {
             string resultText = Perform().ToString();
 
             Assert.AreEqual(Name + ": Okay", resultText);
         }
 
-        private DRBGTestVector[] createTestVectorData()
+        private DrbgTestVector[] CreateTestVectorData()
         {
-            return new DRBGTestVector[]
-                {
-                new DRBGTestVector(
+            return new DrbgTestVector[]
+            {
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     false,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "5A7D3B449F481CB38DF79AD2B1FCC01E57F8135E8C0B22CD0630BFB0127FB5408C8EFC17A929896E",
-                            "82cf772ec3e84b00fc74f5df104efbfb2428554e9ce367d03aeade37827fa8e9cb6a08196115d948"
-                        }),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "5A7D3B449F481CB38DF79AD2B1FCC01E57F8135E8C0B22CD0630BFB0127FB5408C8EFC17A929896E",
+                        "82cf772ec3e84b00fc74f5df104efbfb2428554e9ce367d03aeade37827fa8e9cb6a08196115d948"
+                    }),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     false,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "B3BD05246CBA12A64735A4E3FDE599BC1BE30F439BD060208EEA7D71F9D123DF47B3CE069D98EDE6",
-                            "B5DADA380E2872DF935BCA55B882C8C9376902AB639765472B71ACEBE2EA8B1B6B49629CB67317E0"
-                        })
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "B3BD05246CBA12A64735A4E3FDE599BC1BE30F439BD060208EEA7D71F9D123DF47B3CE069D98EDE6",
+                        "B5DADA380E2872DF935BCA55B882C8C9376902AB639765472B71ACEBE2EA8B1B6B49629CB67317E0"
+                    })
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     false,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "C7AAAC583C6EF6300714C2CC5D06C148CFFB40449AD0BB26FAC0497B5C57E161E36681BCC930CE80",
-                            "6EBD2B7B5E0A2AD7A24B1BF9A1DBA47D43271719B9C37B7FE81BA94045A14A7CB514B446666EA5A7"
-                        })
-                .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
-                .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "C7AAAC583C6EF6300714C2CC5D06C148CFFB40449AD0BB26FAC0497B5C57E161E36681BCC930CE80",
+                        "6EBD2B7B5E0A2AD7A24B1BF9A1DBA47D43271719B9C37B7FE81BA94045A14A7CB514B446666EA5A7"
+                    })
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     true,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "FEC4597F06A3A8CC8529D59557B9E661053809C0BC0EFC282ABD87605CC90CBA9B8633DCB1DAE02E",
-                            "84ADD5E2D2041C01723A4DE4335B13EFDF16B0E51A0AD39BD15E862E644F31E4A2D7D843E57C5968"
-                        }),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "FEC4597F06A3A8CC8529D59557B9E661053809C0BC0EFC282ABD87605CC90CBA9B8633DCB1DAE02E",
+                        "84ADD5E2D2041C01723A4DE4335B13EFDF16B0E51A0AD39BD15E862E644F31E4A2D7D843E57C5968"
+                    }),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     true,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "6C37FDD729AA40F80BC6AB08CA7CC649794F6998B57081E4220F22C5C283E2C91B8E305AB869C625",
-                            "CAF57DCFEA393B9236BF691FA456FEA7FDF1DF8361482CA54D5FA723F4C88B4FA504BF03277FA783"
-                        })
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "6C37FDD729AA40F80BC6AB08CA7CC649794F6998B57081E4220F22C5C283E2C91B8E305AB869C625",
+                        "CAF57DCFEA393B9236BF691FA456FEA7FDF1DF8361482CA54D5FA723F4C88B4FA504BF03277FA783"
+                    })
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     true,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "A1BA8FA58BB5013F43F7B6ED52B4539FA16DC77957AEE815B9C07004C7E992EB8C7E591964AFEEA2",
-                            "84264A73A818C95C2F424B37D3CC990B046FB50C2DC64A164211889A010F2471A0912FFEA1BF0195"
-                        })
-                    .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
-                    .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "A1BA8FA58BB5013F43F7B6ED52B4539FA16DC77957AEE815B9C07004C7E992EB8C7E591964AFEEA2",
+                        "84264A73A818C95C2F424B37D3CC990B046FB50C2DC64A164211889A010F2471A0912FFEA1BF0195"
+                    })
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
+                new DrbgTestVector(
                     new Sha256Digest(),
                     new SHA256EntropyProvider().Get(440),
                     false,
                     "2021222324252627",
                     128,
-                    new String[]
-                        {
-                            "D67B8C1734F46FA3F763CF57C6F9F4F2" +
-                                "DC1089BD8BC1F6F023950BFC5617635208C8501238AD7A44" +
-                                "00DEFEE46C640B61AF77C2D1A3BFAA90EDE5D207406E5403",
-                            "8FDAEC20F8B421407059E3588920DA7E" +
-                                "DA9DCE3CF8274DFA1C59C108C1D0AA9B0FA38DA5C792037C" +
-                                "4D33CD070CA7CD0C5608DBA8B885654639DE2187B74CB263"
-                        }),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "D67B8C1734F46FA3F763CF57C6F9F4F2" +
+                        "DC1089BD8BC1F6F023950BFC5617635208C8501238AD7A44" +
+                        "00DEFEE46C640B61AF77C2D1A3BFAA90EDE5D207406E5403",
+                        "8FDAEC20F8B421407059E3588920DA7E" +
+                        "DA9DCE3CF8274DFA1C59C108C1D0AA9B0FA38DA5C792037C" +
+                        "4D33CD070CA7CD0C5608DBA8B885654639DE2187B74CB263"
+                    }),
+                new DrbgTestVector(
                     new Sha256Digest(),
                     new SHA256EntropyProvider().Get(440),
                     true,
                     "2021222324252627",
                     128,
-                    new String[]
-                        {
-                            "FABD0AE25C69DC2EFDEFB7F20C5A31B5" +
-                            "7AC938AB771AA19BF8F5F1468F665C938C9A1A5DF0628A56" +
-                            "90F15A1AD8A613F31BBD65EEAD5457D5D26947F29FE91AA7",
-                            "6BD925B0E1C232EFD67CCD84F722E927" +
-                            "ECB46AB2B740014777AF14BA0BBF53A45BDBB62B3F7D0B9C" +
-                            "8EEAD057C0EC754EF8B53E60A1F434F05946A8B686AFBC7A"
-                        }),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "FABD0AE25C69DC2EFDEFB7F20C5A31B5" +
+                        "7AC938AB771AA19BF8F5F1468F665C938C9A1A5DF0628A56" +
+                        "90F15A1AD8A613F31BBD65EEAD5457D5D26947F29FE91AA7",
+                        "6BD925B0E1C232EFD67CCD84F722E927" +
+                        "ECB46AB2B740014777AF14BA0BBF53A45BDBB62B3F7D0B9C" +
+                        "8EEAD057C0EC754EF8B53E60A1F434F05946A8B686AFBC7A"
+                    }),
+                new DrbgTestVector(
                     new Sha384Digest(),
                     new SHA384EntropyProvider().Get(888),
                     false,
                     "202122232425262728292A2B",
                     192,
-                    new String[]{
+                    new string[]
+                    {
                         "03AB8BCE4D1DBBB636C5C5B7E1C58499FEB1C619CDD11D35" +
                         "CD6CF6BB8F20EF27B6F5F9054FF900DB9EBF7BF30ED4DCBB" +
                         "BC8D5B51C965EA226FFEE2CA5AB2EFD00754DC32F357BF7A" +
@@ -157,20 +156,22 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                         "B907E77144FD55A54E9BA1A6A0EED0AAC780020C41A15DD8" +
                         "9A6C163830BA1D094E6A17100FF71EE30A96E1EE04D2A966" +
                         "03832A4E404F1966C2B5F4CB61B9927E8D12AC1E1A24CF23" +
-                        "88C14E8EC96C35181EAEE32AAA46330DEAAFE5E7CE783C74"})
-                    .setPersonalizationString(
-                        "404142434445464748494A4B4C4D4E" +
-                        "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                        "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                        "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                        "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
-                new DRBGTestVector(
+                        "88C14E8EC96C35181EAEE32AAA46330DEAAFE5E7CE783C74"
+                    })
+                .SetPersonalizationString(
+                    "404142434445464748494A4B4C4D4E" +
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
+                new DrbgTestVector(
                     new Sha384Digest(),
                     new SHA384EntropyProvider().Get(888),
                     true,
                     "202122232425262728292A2B",
                     192,
-                    new String[]{
+                    new string[]
+                    {
                         "804A3AD720F4FCE8738D0632514FEF16430CB7D63A8DF1A5" +
                         "F02A3CE3BD7ED6A668B69E63E2BB93F096EE753D6194A0F1" +
                         "A32711063653009636337D22167CC4402D019AC216FA574F" +
@@ -178,45 +179,49 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                         "73B8E55C753202176A17B9B9754A9FE6F23B01861FCD4059" +
                         "6AEAA301AF1AEF8AF0EAF22FBF34541EFFAB1431666ACACC" +
                         "759338C7E28672819D53CFEF10A3E19DAFBD53295F1980A9" +
-                        "F491504A2725506784B7AC826D92C838A8668171CAAA86E7"})
-                    .setPersonalizationString(
-                        "404142434445464748494A4B4C4D4E" +
-                            "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                            "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                            "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                            "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
-                new DRBGTestVector(
+                        "F491504A2725506784B7AC826D92C838A8668171CAAA86E7"
+                    })
+                .SetPersonalizationString(
+                    "404142434445464748494A4B4C4D4E" +
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
+                new DrbgTestVector(
                     new Sha512Digest(),
                     new SHA512EntropyProvider().Get(888),
                     false,
                     "202122232425262728292A2B2C2D2E2F",
                     256,
-                    new String[]{
+                    new string[]
+                    {
                         "2A5FF6520C20F66E" +
-                            "D5EA431BD4AEAC58F975EEC9A015137D5C94B73AA09CB8B5" +
-                            "9D611DDEECEB34A52BB999424009EB9EAC5353F92A6699D2" +
-                            "0A02164EEBBC6492941E10426323898465DFD731C7E04730" +
-                            "60A5AA8973841FDF3446FB6E72A58DA8BDA2A57A36F3DD98" +
-                            "6DF85C8A5C6FF31CDE660BF8A841B21DD6AA9D3AC356B87B",
+                        "D5EA431BD4AEAC58F975EEC9A015137D5C94B73AA09CB8B5" +
+                        "9D611DDEECEB34A52BB999424009EB9EAC5353F92A6699D2" +
+                        "0A02164EEBBC6492941E10426323898465DFD731C7E04730" +
+                        "60A5AA8973841FDF3446FB6E72A58DA8BDA2A57A36F3DD98" +
+                        "6DF85C8A5C6FF31CDE660BF8A841B21DD6AA9D3AC356B87B",
                         "0EDC8D7D7CEEC7FE" +
-                            "36333FB30C0A9A4B27AA0BECBF075568B006C1C3693B1C29" +
-                            "0F84769C213F98EB5880909EDF068FDA6BFC43503987BBBD" +
-                            "4FC23AFBE982FE4B4B007910CC4874EEC217405421C8D8A1" +
-                            "BA87EC684D0AF9A6101D9DB787AE82C3A6A25ED478DF1B12" +
-                            "212CEC325466F3AC7C48A56166DD0B119C8673A1A9D54F67"})
-                    .setPersonalizationString(
-                        "404142434445464748494A4B4C4D4E" +
-                            "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                            "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                            "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                            "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
-                new DRBGTestVector(
+                        "36333FB30C0A9A4B27AA0BECBF075568B006C1C3693B1C29" +
+                        "0F84769C213F98EB5880909EDF068FDA6BFC43503987BBBD" +
+                        "4FC23AFBE982FE4B4B007910CC4874EEC217405421C8D8A1" +
+                        "BA87EC684D0AF9A6101D9DB787AE82C3A6A25ED478DF1B12" +
+                        "212CEC325466F3AC7C48A56166DD0B119C8673A1A9D54F67"
+                    })
+                .SetPersonalizationString(
+                    "404142434445464748494A4B4C4D4E" +
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
+                new DrbgTestVector(
                     new Sha512Digest(),
                     new SHA512EntropyProvider().Get(888),
                     true,
                     "202122232425262728292A2B2C2D2E2F",
                     256,
-                    new String[]{
+                    new string[]
+                    {
                         "AAE4DC3C9ECC74D9" +
                         "061DD527117EF3D29E1E52B26853C539D6CA797E8DA3D0BB" +
                         "171D8E30B8B194D8C28F7F6BE3B986B88506DC6A01B294A7" +
@@ -228,20 +233,22 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                         "B9D8E5093ECE7B6BF48638D8F704D134ADDEB7F4E9D5C142" +
                         "CD05683E72B516486AF24AEC15D61E81E270DD4EBED91B62" +
                         "12EB8896A6250D5C8BC3A4A12F7E3068FBDF856F47EB23D3" +
-                        "79F82C1EBCD1585FB260B9C0C42625FBCEE68CAD773CD5B1"})
-                .setPersonalizationString(
+                        "79F82C1EBCD1585FB260B9C0C42625FBCEE68CAD773CD5B1"
+                    })
+                .SetPersonalizationString(
                     "404142434445464748494A4B4C4D4E" +
-                        "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                        "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                        "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                        "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
-                new DRBGTestVector(
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
+                new DrbgTestVector(
                     new Sha512Digest(),
                     new SHA512EntropyProvider().Get(888),
                     false,
                     "202122232425262728292A2B2C2D2E2F",
                     256,
-                    new String[]{
+                    new string[]
+                    {
                         "7AE31A2DEC31075F" +
                         "E5972660C16D22ECC0D415C5693001BE5A468B590BC1AE2C" +
                         "43F647F8D681AEEA0D87B79B0B4E5D089CA2C9D327534234" +
@@ -253,51 +260,55 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                         "AB823C29F2EBDEC3EDE962F93D920A1DB59C84E1E879C29F" +
                         "5F9995FC3A6A3AF9B587CA7C13EA197D423E81E1D6469942" +
                         "B6E2CA83A97E91F6B298266AC148A1809776C26AF5E239A5" +
-                        "5A2BEB9E752203A694E1F3FE2B3E6A0C9C314421CDB55FBD "})
-                .setPersonalizationString(
+                        "5A2BEB9E752203A694E1F3FE2B3E6A0C9C314421CDB55FBD "
+                    })
+                .SetPersonalizationString(
                     "404142434445464748494A4B4C4D4E" +
                     "4F505152535455565758595A5B5C5D5E5F60616263646566" +
                     "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
                     "7F808182838485868788898A8B8C8D8E8F90919293949596" +
                     "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE")
-                .addAdditionalInput(
+                .AddAdditionalInput(
                     "606162636465666768696A6B6C6D6E" +
                     "6F707172737475767778797A7B7C7D7E7F80818283848586" +
                     "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
                     "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
                     "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
-                .addAdditionalInput(
+                .AddAdditionalInput(
                     "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
                     "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
                     "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
                     "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
                     "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E"),
-                new DRBGTestVector(
+                new DrbgTestVector(
                     new Sha512Digest(),
                     new SHA512EntropyProvider().Get(888),
                     true,
                     "202122232425262728292A2B2C2D2E2F",
                     256,
-                    new String[]{
+                    new string[]
+                    {
                         "28FD6060C4F35F4D" +
-                            "317AB2060EE32019E0DAA330F3F5650BBCA57CB67EE6AF1C" +
-                            "6F25D1B01F3601EDA85DC2ED29A9B2BA4C85CF491CE7185F" +
-                            "1A2BD9378AE3C655BD1CEC2EE108AE7FC382989F6D4FEA8A" +
-                            "B01499697C2F07945CE02C5ED617D04287FEAF3BA638A4CE" +
-                            "F3BB6B827E40AF16279580FCF1FDAD830930F7FDE341E2AF",
+                        "317AB2060EE32019E0DAA330F3F5650BBCA57CB67EE6AF1C" +
+                        "6F25D1B01F3601EDA85DC2ED29A9B2BA4C85CF491CE7185F" +
+                        "1A2BD9378AE3C655BD1CEC2EE108AE7FC382989F6D4FEA8A" +
+                        "B01499697C2F07945CE02C5ED617D04287FEAF3BA638A4CE" +
+                        "F3BB6B827E40AF16279580FCF1FDAD830930F7FDE341E2AF",
                         "C0B1601AFE39338B" +
-                            "58DC2BE7C256AEBE3C21C5A939BEEC7E97B3528AC420F0C6" +
-                            "341847187666E0FF578A8EB0A37809F877365A28DF2FA0F0" +
-                            "6354A6F02496747369375B9A9D6B756FDC4A8FB308E08256" +
-                            "9D79A85BB960F747256626389A3B45B0ABE7ECBC39D5CD7B" +
-                            "2C18DF2E5FDE8C9B8D43474C54B6F9839468445929B438C7"}),
-                new DRBGTestVector(
+                        "58DC2BE7C256AEBE3C21C5A939BEEC7E97B3528AC420F0C6" +
+                        "341847187666E0FF578A8EB0A37809F877365A28DF2FA0F0" +
+                        "6354A6F02496747369375B9A9D6B756FDC4A8FB308E08256" +
+                        "9D79A85BB960F747256626389A3B45B0ABE7ECBC39D5CD7B" +
+                        "2C18DF2E5FDE8C9B8D43474C54B6F9839468445929B438C7"
+                    }),
+                new DrbgTestVector(
                     new Sha512Digest(),
                     new SHA512EntropyProvider().Get(888),
                     true,
                     "202122232425262728292A2B2C2D2E2F",
                     256,
-                    new String[]{
+                    new string[]
+                    {
                         "72691D2103FB567C" +
                         "CD30370715B36666F63430087B1C688281CA0974DB456BDB" +
                         "A7EB5C48CFF62EA05F9508F3B530CE995A272B11EC079C13" +
@@ -309,26 +320,28 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                         "2F12BEB71D801C0942E7C0864B3DB67A9356DB203490D881" +
                         "24FE86BCE38AC2269B4FDA6ABAA884039DF80A0336A24D79" +
                         "1EB3067C8F5F0CF0F18DD73B66A7B316FB19E02835CC6293" +
-                        "65FCD1D3BE640178ED9093B91B36E1D68135F2785BFF505C"})
-                .addAdditionalInput(
+                        "65FCD1D3BE640178ED9093B91B36E1D68135F2785BFF505C"
+                    })
+                .AddAdditionalInput(
                     "606162636465666768696A6B6C6D6E" +
                     "6F707172737475767778797A7B7C7D7E7F80818283848586" +
                     "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
                     "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
                     "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
-                .addAdditionalInput(
+                .AddAdditionalInput(
                     "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
                     "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
                     "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
                     "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
                     "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E"),
-                new DRBGTestVector(
+                new DrbgTestVector(
                     new Sha512Digest(),
                     new SHA512EntropyProvider().Get(888),
                     true,
                     "202122232425262728292A2B2C2D2E2F",
                     256,
-                    new String[]{
+                    new string[]
+                    {
                         "AAE4DC3C9ECC74D9" +
                         "061DD527117EF3D29E1E52B26853C539D6CA797E8DA3D0BB" +
                         "171D8E30B8B194D8C28F7F6BE3B986B88506DC6A01B294A7" +
@@ -340,20 +353,22 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                         "B9D8E5093ECE7B6BF48638D8F704D134ADDEB7F4E9D5C142" +
                         "CD05683E72B516486AF24AEC15D61E81E270DD4EBED91B62" +
                         "12EB8896A6250D5C8BC3A4A12F7E3068FBDF856F47EB23D3" +
-                        "79F82C1EBCD1585FB260B9C0C42625FBCEE68CAD773CD5B1"})
-                .setPersonalizationString(
+                        "79F82C1EBCD1585FB260B9C0C42625FBCEE68CAD773CD5B1"
+                    })
+                .SetPersonalizationString(
                     "404142434445464748494A4B4C4D4E" +
-                        "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                        "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                        "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                        "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
-                new DRBGTestVector(
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
+                new DrbgTestVector(
                     new Sha512Digest(),
                     new SHA512EntropyProvider().Get(888),
                     true,
                     "202122232425262728292A2B2C2D2E2F",
                     256,
-                    new String[]{
+                    new string[]
+                    {
                         "B8E827652175E6E0" +
                         "6E513C7BE94B5810C14ED94AD903647940CAEB7EE014C848" +
                         "8DCBBE6D4D6616D06656A3DC707CDAC4F02EE6D8408C065F" +
@@ -365,61 +380,62 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
                         "BD1B5C196C57CF759BB9871BE0C163A57315EA96F615136D" +
                         "064572F09F26D659D24211F9610FFCDFFDA8CE23FFA96735" +
                         "7595182660877766035EED800B05364CE324A75EB63FD9B3" +
-                        "EED956D147480B1D0A42DF8AA990BB628666F6F61D60CBE2"})
-                .setPersonalizationString(
+                        "EED956D147480B1D0A42DF8AA990BB628666F6F61D60CBE2"
+                    })
+                .SetPersonalizationString(
                     "404142434445464748494A4B4C4D4E" +
-                        "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                        "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                        "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                        "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE")
-                .addAdditionalInput(
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE")
+                .AddAdditionalInput(
                     "606162636465666768696A6B6C6D6E" +
-                        "6F707172737475767778797A7B7C7D7E7F80818283848586" +
-                        "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
-                        "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
-                        "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
-                .addAdditionalInput(
+                    "6F707172737475767778797A7B7C7D7E7F80818283848586" +
+                    "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
+                    "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
+                    "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
+                .AddAdditionalInput(
                     "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
                     "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
                     "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
                     "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
                     "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E")
-                };
+            };
         }
 
         public override void PerformTest()
         {
-            DRBGTestVector[] tests = createTestVectorData();
-            SP80090Drbg d;
+            DrbgTestVector[] tests = CreateTestVectorData();
+            ISP80090Drbg d;
 
             for (int i = 0; i != tests.Length; i++)
             {
-                DRBGTestVector tv = tests[i];
+                DrbgTestVector tv = tests[i];
 
-                byte[] nonce = tv.nonce();
-                byte[] personalisationString = tv.personalizationString();
+                byte[] nonce = tv.GetNonce();
+                byte[] personalisationString = tv.GetPersonalizationString();
 
-                d = new HMacSP800Drbg(new HMac(tv.getDigest()), tv.securityStrength(), tv.entropySource(), personalisationString, nonce);
+                d = new HMacSP800Drbg(new HMac(tv.Digest), tv.SecurityStrength, tv.EntropySource, personalisationString, nonce);
 
-                byte[] output = new byte[tv.expectedValue(0).Length];
+                byte[] output = new byte[tv.GetExpectedValue(0).Length];
 
-                d.Generate(output, tv.additionalInput(0), tv.predictionResistance());
+                d.Generate(output, tv.GetAdditionalInput(0), tv.PredictionResistance);
 
-                byte[] expected = tv.expectedValue(0);
+                byte[] expected = tv.GetExpectedValue(0);
 
                 if (!AreEqual(expected, output))
                 {
-                    Fail("Test #" + (i + 1) + ".1 failed, expected " + Hex.ToHexString(tv.expectedValue(0)) + " got " + Hex.ToHexString(output));
+                    Fail("Test #" + (i + 1) + ".1 failed, expected " + Hex.ToHexString(tv.GetExpectedValue(0)) + " got " + Hex.ToHexString(output));
                 }
 
-                output = new byte[tv.expectedValue(0).Length];
+                output = new byte[tv.GetExpectedValue(0).Length];
 
-                d.Generate(output, tv.additionalInput(1), tv.predictionResistance());
+                d.Generate(output, tv.GetAdditionalInput(1), tv.PredictionResistance);
 
-                expected = tv.expectedValue(1);
+                expected = tv.GetExpectedValue(1);
                 if (!AreEqual(expected, output))
                 {
-                    Fail("Test #" + (i + 1) + ".2 failed, expected " + Hex.ToHexString(tv.expectedValue(1)) + " got " + Hex.ToHexString(output));
+                    Fail("Test #" + (i + 1) + ".2 failed, expected " + Hex.ToHexString(tv.GetExpectedValue(1)) + " got " + Hex.ToHexString(output));
                 }
             }
 
@@ -441,11 +457,10 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
 
         private class SHA1EntropyProvider : TestEntropySourceProvider
         {
-            internal SHA1EntropyProvider() : base(
-                    Hex.Decode(
-                        "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536"
-                            + "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6"
-                            + "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
+            internal SHA1EntropyProvider() : base(Hex.Decode(
+                "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536" +
+                "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
+                "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
             {
             }
         }
@@ -453,15 +468,15 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
         internal class SHA256EntropyProvider : TestEntropySourceProvider
         {
             internal SHA256EntropyProvider() : base(Hex.Decode(
-                    "00010203040506" +
-                        "0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E" +
-                        "1F202122232425262728292A2B2C2D2E2F30313233343536" +
-                        "80818283848586" +
-                        "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
-                        "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
-                        "C0C1C2C3C4C5C6" +
-                        "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
-                        "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
+                "00010203040506" +
+                "0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E" +
+                "1F202122232425262728292A2B2C2D2E2F30313233343536" +
+                "80818283848586" +
+                "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
+                "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
+                "C0C1C2C3C4C5C6" +
+                "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
+                "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
             {
             }
         }
@@ -469,43 +484,41 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
         internal class SHA384EntropyProvider : TestEntropySourceProvider
         {
             internal SHA384EntropyProvider() : base(Hex.Decode(
-                    "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526"
-                        + "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556"
-                        + "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
-                        "808182838485868788898A8B8C8D8E" +
-                        "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
-                        "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
-                        "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
-                        "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
-                        "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
-                        "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
-                        "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
-                        "FF000102030405060708090A0B0C0D0E0F10111213141516" +
-                        "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
+                "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526" +
+                "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556" +
+                "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
+                "808182838485868788898A8B8C8D8E" +
+                "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
+                "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
+                "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
+                "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
+                "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
+                "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
+                "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
+                "FF000102030405060708090A0B0C0D0E0F10111213141516" +
+                "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
             { }
         }
 
         internal class SHA512EntropyProvider : TestEntropySourceProvider
         {
-            internal SHA512EntropyProvider() :
-                base(Hex.Decode(
-                    "000102030405060708090A0B0C0D0E" +
-                        "0F101112131415161718191A1B1C1D1E1F20212223242526" +
-                        "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E" +
-                        "3F404142434445464748494A4B4C4D4E4F50515253545556" +
-                        "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
-                        "808182838485868788898A8B8C8D8E" +
-                        "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
-                        "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
-                        "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
-                        "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
-                        "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
-                        "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
-                        "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
-                        "FF000102030405060708090A0B0C0D0E0F10111213141516" +
-                        "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
-            {
-            }
+            internal SHA512EntropyProvider() : base(Hex.Decode(
+                "000102030405060708090A0B0C0D0E" +
+                "0F101112131415161718191A1B1C1D1E1F20212223242526" +
+                "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E" +
+                "3F404142434445464748494A4B4C4D4E4F50515253545556" +
+                "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
+                "808182838485868788898A8B8C8D8E" +
+                "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
+                "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
+                "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
+                "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
+                "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
+                "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
+                "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
+                "FF000102030405060708090A0B0C0D0E0F10111213141516" +
+                "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
+            { }
         }
     }
 }
diff --git a/crypto/test/src/crypto/prng/test/HashDrbgTest.cs b/crypto/test/src/crypto/prng/test/HashDrbgTest.cs
index d9776e0d6..892ca74da 100644
--- a/crypto/test/src/crypto/prng/test/HashDrbgTest.cs
+++ b/crypto/test/src/crypto/prng/test/HashDrbgTest.cs
@@ -1,10 +1,11 @@
 using System;
 
+using NUnit.Framework;
+
 using Org.BouncyCastle.Crypto.Digests;
 using Org.BouncyCastle.Crypto.Prng.Drbg;
 using Org.BouncyCastle.Utilities.Test;
 using Org.BouncyCastle.Utilities.Encoders;
-using NUnit.Framework;
 
 namespace Org.BouncyCastle.Crypto.Prng.Test
 {
@@ -12,365 +13,371 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
      * DRBG Test
      */
     [TestFixture]
-    public class HashDrbgTest: SimpleTest
+    public class HashDrbgTest
+        :   SimpleTest
     {
-        public override String Name
-    {
-            get
-            {
-                return "HashDRBG";
-            }
+        public override string Name
+        {
+            get { return "HashDRBG"; }
         }
 
-        public static void main(String[] args)
-    {
+        public static void Main(string[] args)
+        {
             RunTest(new HashDrbgTest());
         }
 
-        private DRBGTestVector[] createTestVectorData()
-    {
-            return new DRBGTestVector[]
-                {
-                new DRBGTestVector(
-                            new Sha1Digest(),
-                            new SHA1EntropyProvider().Get(440),
-                            false,
-                            "2021222324",
-                            80,
-                            new String[]
-                                {
-                                    "9F7CFF1ECA23E750F66326969F11800F12088BA68E441D15D888B3FE12BF66FE057494F4546DE2F1",
-                                    "B77AA5C0CD55BBCEED7574AF223AFD988C7EEC8EFF4A94E5E89D26A04F58FA79F5E0D3702D7A9A6A"
-                                }
-                        ),
-                new DRBGTestVector(
+        [Test]
+        public void TestFunction()
+        {
+            string resultText = Perform().ToString();
+
+            Assert.AreEqual(Name + ": Okay", resultText);
+        }
+
+        private DrbgTestVector[] CreateTestVectorData()
+        {
+            return new DrbgTestVector[]
+            {
+                new DrbgTestVector(
+                    new Sha1Digest(),
+                    new SHA1EntropyProvider().Get(440),
+                    false,
+                    "2021222324",
+                    80,
+                    new string[]
+                    {
+                        "9F7CFF1ECA23E750F66326969F11800F12088BA68E441D15D888B3FE12BF66FE057494F4546DE2F1",
+                        "B77AA5C0CD55BBCEED7574AF223AFD988C7EEC8EFF4A94E5E89D26A04F58FA79F5E0D3702D7A9A6A"
+                    }
+                ),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     false,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "AB438BD3B01A0AF85CFEE29F7D7B71621C4908B909124D430E7B406FB1086EA994C582E0D656D989",
-                            "29D9098F987E7005314A0F51B3DD2B8122F4AED706735DE6AD5DDBF223177C1E5F3AEBC52FAB90B9"
-                        })
-                    .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "AB438BD3B01A0AF85CFEE29F7D7B71621C4908B909124D430E7B406FB1086EA994C582E0D656D989",
+                        "29D9098F987E7005314A0F51B3DD2B8122F4AED706735DE6AD5DDBF223177C1E5F3AEBC52FAB90B9"
+                    })
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     false,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "E76B4EDD5C865BC8AFD809A59B69B429AC7F4352A579BCF3F75E56249A3491F87C3CA6848B0FAB25",
-                            "6577B6B4F87A93240B199FE51A3B335313683103DECE171E3256FB7E803586CA4E45DD242EB01F70"
-                        })
-                    .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
-                    .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "E76B4EDD5C865BC8AFD809A59B69B429AC7F4352A579BCF3F75E56249A3491F87C3CA6848B0FAB25",
+                        "6577B6B4F87A93240B199FE51A3B335313683103DECE171E3256FB7E803586CA4E45DD242EB01F70"
+                    })
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     true,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "56EF4913373994D5539F4D7D17AFE7448CDF5E72416CC6A71A340059FA0D5AE526B23250C46C0944",
-                            "575B37A2739814F966C63B60A2C4F149CA9ACC84FC4B25493289B085C67B2E30F5F0B99A2C349E2A"
-                        }),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "56EF4913373994D5539F4D7D17AFE7448CDF5E72416CC6A71A340059FA0D5AE526B23250C46C0944",
+                        "575B37A2739814F966C63B60A2C4F149CA9ACC84FC4B25493289B085C67B2E30F5F0B99A2C349E2A"
+                    }),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     true,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "532CA1165DCFF21C55592687639884AF4BC4B057DF8F41DE653AB44E2ADEC7C9303E75ABE277EDBF",
-                            "73C2C67C696D686D0C4DBCEB5C2AF7DDF6F020B6874FAE4390F102117ECAAFF54418529A367005A0"
-                        })
-                .setPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "532CA1165DCFF21C55592687639884AF4BC4B057DF8F41DE653AB44E2ADEC7C9303E75ABE277EDBF",
+                        "73C2C67C696D686D0C4DBCEB5C2AF7DDF6F020B6874FAE4390F102117ECAAFF54418529A367005A0"
+                    })
+                .SetPersonalizationString("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576"),
+                new DrbgTestVector(
                     new Sha1Digest(),
                     new SHA1EntropyProvider().Get(440),
                     true,
                     "2021222324",
                     80,
-                    new String[]
-                        {
-                            "183C242A1430E46C4ED70B4DBE1BF9AB0AB8721CDCA2A2D1820AD6F6C956858543B2AA191D8D1287",
-                            "F196F9BD021C745CBD5AC7BFCE48EAAF0D0E7C091FBF436940E63A198EE770D9A4F0718669AF2BC9"
-                        })
-                    .addAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
-                    .addAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
-                new DRBGTestVector(
+                    new string[]
+                    {
+                        "183C242A1430E46C4ED70B4DBE1BF9AB0AB8721CDCA2A2D1820AD6F6C956858543B2AA191D8D1287",
+                        "F196F9BD021C745CBD5AC7BFCE48EAAF0D0E7C091FBF436940E63A198EE770D9A4F0718669AF2BC9"
+                    })
+                .AddAdditionalInput("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596")
+                .AddAdditionalInput("A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6"),
+                new DrbgTestVector(
                     new Sha256Digest(),
                     new SHA256EntropyProvider().Get(440),
                     false,
                     "2021222324252627",
                     128,
-                    new String[]
-                        {
-                            "77E05A0E7DC78AB5D8934D5E93E82C06" +
-                            "A07C04CEE6C9C53045EEB485872777CF3B3E35C474F976B8" +
-                            "94BF301A86FA651F463970E89D4A0534B2ECAD29EC044E7E",
-                            "5FF4BA493C40CFFF3B01E472C575668C" +
-                            "CE3880B9290B05BFEDE5EC96ED5E9B2898508B09BC800EEE" +
-                            "099A3C90602ABD4B1D4F343D497C6055C87BB956D53BF351"
-                        }
+                    new string[]
+                    {
+                        "77E05A0E7DC78AB5D8934D5E93E82C06" +
+                        "A07C04CEE6C9C53045EEB485872777CF3B3E35C474F976B8" +
+                        "94BF301A86FA651F463970E89D4A0534B2ECAD29EC044E7E",
+                        "5FF4BA493C40CFFF3B01E472C575668C" +
+                        "CE3880B9290B05BFEDE5EC96ED5E9B2898508B09BC800EEE" +
+                        "099A3C90602ABD4B1D4F343D497C6055C87BB956D53BF351"
+                    }
                 ),
-                new DRBGTestVector(
+                new DrbgTestVector(
                     new Sha256Digest(),
                     new SHA256EntropyProvider().Get(440),
                     true,
                     "2021222324252627",
                     128,
-                    new String[]
-                        {
-                            "92275523C70E567BCF9B35EC50B933F8" +
-                            "12616DF586B7F72EE1BC7735A5C2654373CBBC72316DFF84" +
-                            "20A33BF02B97AC8D1952583F270ACD7005CC027F4CF1187E",
-                            "681A46B2AA8694A0FE4DEEA720927A84" +
-                            "EAAA985E59C19F8BE0984D8CBEF8C69B754167641946E040" +
-                            "EE2043E1CCB29DCF063C0A50830E428E6DCA262ECD77C542"
-                        }),
-                new DRBGTestVector(
-                            new Sha384Digest(),
-                            new SHA384EntropyProvider().Get(888),
-                            false,
-                            "202122232425262728292A2B",
-                            192,
-                            new String[]
-                                {
-                                    "04FF23AD15E78790ADD36B438BBC097C7A11747CC2CCEEDE" +
-                                    "2C978B23B3DC63B732C953061D7764990ABFEFC47A581B92" +
-                                    "1BC0428C4F12212460E406A0F0651E7F0CB9A90ABFDB07B5" +
-                                    "25565C74F0AA085082F6CF213AAFAD0C0646895078F1E1FE",
-                                    "4F35B85F95DEE3E873054905CFD02341653E18F529930CBE" +
-                                    "14D909F37FEAF2C790D22FAE7516B4590BE35D53E2FE1A35" +
-                                    "AFE4B6607CB358589C3B4D094A1D81FE0717F1DF5BDDEB3E" +
-                                    "114F130BB781E66C22B5B770E8AE115FF39F8ADAF66DEEDF"
-                                }
-                        ),
-                new DRBGTestVector(
-                        new Sha384Digest(),
-                        new SHA384EntropyProvider().Get(888),
-                        true,
-                        "202122232425262728292A2B",
-                        192,
-                        new String[]
-                            {
-                                "97993B78F7C31C0E876DC92EB7D6C408E09D608AD6B99D0E" +
-                                "A2229B05A578C426334FCC8A1C7E676ED2D89A5B4CDF5B3F" +
-                                "4ADF11936BF14F4E10909DBA9C24F4FDFFDE72351DA8E2CC" +
-                                "3B135A395373899E5F1A5955B880CA9B9E9DD4C9CA7FA4D4",
-                                "F5983946320E36C64EF283CA1F65D197CF81624EC6778E77" +
-                                "0E78949D84EF21A45CDD62D1DB76920D4C2836FC6AE5299F" +
-                                "AF1357D9701FAD10FBD88D1E2832239436D76EB271BDC3CA" +
-                                "04425EC88BC0E89A4D5C37FFCE7C6C3ABDE9C413AE6D3FEA"
-                            }
-                    ),
-                new DRBGTestVector(
-                            new Sha512Digest(),
-                            new SHA512EntropyProvider().Get(888),
-                            false,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                            {
-                                "DA126CF95C6BF97E" +
-                                "2F731F2137A907ACC70FD7AC9EBACD1C6E31C74029B052E3" +
-                                "AABC48F3B00993F2B2381F7650A55322A968C86E05DE88E6" +
-                                "367F6EF89A601DB4342E9086C7AC13B5E56C32E9E668040B" +
-                                "73847893C5BFD38A1CF44F348B4EEE4CD68ADB7E7B8C837F" +
-                                "19BC4F902761F7CFF24AB1D704FD11C4E929D8553753B55D",
-                                "400B977CE8A2BB6A" +
-                                "84C6FD1CF901459685ABF5408CFF4588CEDF52E2D2DC300A" +
-                                "A9B4FAED8CD0161C2172B1FD269253195883D6EBF21020F2" +
-                                "C20E5F2C81AE60C8595B834A229B1F5B726C1125717E6207" +
-                                "8886EF38E61E32707AD5F8116C6393DFB6E7C7AE0E8E92BB" +
-                                "D7E0C3D04BBA02F5169F2F569A58158915FEE4C9D28D45DB"
-                            }
-                        )
-                    .setPersonalizationString(
-                        "404142434445464748494A4B4C4D4E" +
-                        "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                        "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                        "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                        "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE")
-                    .addAdditionalInput(
-                        "606162636465666768696A6B6C6D6E" +
-                        "6F707172737475767778797A7B7C7D7E7F80818283848586" +
-                        "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
-                        "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
-                        "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
-                    .addAdditionalInput(
-                        "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
-                        "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
-                        "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
-                        "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
-                        "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E"),
-                new DRBGTestVector(
-                        new Sha512Digest(),
-                        new SHA512EntropyProvider().Get(888),
-                        true,
-                        "202122232425262728292A2B2C2D2E2F",
-                        256,
-                        new String[]
-                        {
-                            "F93CA6855590A77F" +
-                            "07354097E90E026648B6115DF008FFEDBD9D9811F54E8286" +
-                            "EF00FDD6BA1E58DF2535E3FBDD9A9BA3754A97F36EE83322" +
-                            "1582060A1F37FCE4EE8826636B28EAD589593F4CA8B64738" +
-                            "8F24EB3F0A34796968D21BDEE6F81FD5DF93536F935937B8" +
-                            "025EC8CBF57DDB0C61F2E41463CC1516D657DA2829C6BF90",
-                            "4817618F48C60FB1" +
-                            "CE5BFBDA0CAF4591882A31F6EE3FE0F78779992A06EC60F3" +
-                            "7FB9A8D6108C231F0A927754B0599FA4FA27A4E25E065EF0" +
-                            "3085B892979DC0E7A1080883CAEBFDFD3665A8F2D061C521" +
-                            "F7D6E3DA2AF8B97B6B43B6EC831AF515070A83BBB9AC95ED" +
-                            "4EF49B756A2377A5F0833D847E27A88DDB0C2CE4AD782E7B "
-                        }
-                    ),
-                new DRBGTestVector(
-                        new Sha512Digest(),
-                        new SHA512EntropyProvider().Get(888),
-                        true,
-                        "202122232425262728292A2B2C2D2E2F",
-                        256,
-                        new String[]
-                        {
-                            "0455DD4AD7DBACB2" +
-                            "410BE58DF7248D765A4547ABAEE1743B0BCAD37EBD06DA7C" +
-                            "F7CE5E2216E525327E9E2005EBEF2CE53BD733B18128627D" +
-                            "3FD6153089373AF2606A1584646A0EA488BFEF45228699A0" +
-                            "89CEA8AEC44502D86D9591F3552C688B7F7B45FCB0C3C2B9" +
-                            "43C1CD8A6FC63DF4D81C3DA543C9CF2843855EA84E4F959C",
-                            "C047D46D7F614E4E" +
-                            "4A7952C79A451F8F7ACA379967E2977C401C626A2ED70D74" +
-                            "A63660579A354115BC8C8C8CC3AEA3050686A0CFCDB6FA9C" +
-                            "F78D4C2165BAF851C6F9B1CD16A2E14C15C6DAAC56C16E75" +
-                            "FC84A14D58B41622E88B0F1B1995587FD8BAA999CBA98025" +
-                            "4C8AB9A9691DF7B84D88B639A9A3106DEABEB63748B99C09"
-                        }
-                    )
-                .addAdditionalInput(
+                    new string[]
+                    {
+                        "92275523C70E567BCF9B35EC50B933F8" +
+                        "12616DF586B7F72EE1BC7735A5C2654373CBBC72316DFF84" +
+                        "20A33BF02B97AC8D1952583F270ACD7005CC027F4CF1187E",
+                        "681A46B2AA8694A0FE4DEEA720927A84" +
+                        "EAAA985E59C19F8BE0984D8CBEF8C69B754167641946E040" +
+                        "EE2043E1CCB29DCF063C0A50830E428E6DCA262ECD77C542"
+                    }),
+                new DrbgTestVector(
+                    new Sha384Digest(),
+                    new SHA384EntropyProvider().Get(888),
+                    false,
+                    "202122232425262728292A2B",
+                    192,
+                    new string[]
+                    {
+                        "04FF23AD15E78790ADD36B438BBC097C7A11747CC2CCEEDE" +
+                        "2C978B23B3DC63B732C953061D7764990ABFEFC47A581B92" +
+                        "1BC0428C4F12212460E406A0F0651E7F0CB9A90ABFDB07B5" +
+                        "25565C74F0AA085082F6CF213AAFAD0C0646895078F1E1FE",
+                        "4F35B85F95DEE3E873054905CFD02341653E18F529930CBE" +
+                        "14D909F37FEAF2C790D22FAE7516B4590BE35D53E2FE1A35" +
+                        "AFE4B6607CB358589C3B4D094A1D81FE0717F1DF5BDDEB3E" +
+                        "114F130BB781E66C22B5B770E8AE115FF39F8ADAF66DEEDF"
+                    }
+                ),
+                new DrbgTestVector(
+                    new Sha384Digest(),
+                    new SHA384EntropyProvider().Get(888),
+                    true,
+                    "202122232425262728292A2B",
+                    192,
+                    new string[]
+                    {
+                        "97993B78F7C31C0E876DC92EB7D6C408E09D608AD6B99D0E" +
+                        "A2229B05A578C426334FCC8A1C7E676ED2D89A5B4CDF5B3F" +
+                        "4ADF11936BF14F4E10909DBA9C24F4FDFFDE72351DA8E2CC" +
+                        "3B135A395373899E5F1A5955B880CA9B9E9DD4C9CA7FA4D4",
+                        "F5983946320E36C64EF283CA1F65D197CF81624EC6778E77" +
+                        "0E78949D84EF21A45CDD62D1DB76920D4C2836FC6AE5299F" +
+                        "AF1357D9701FAD10FBD88D1E2832239436D76EB271BDC3CA" +
+                        "04425EC88BC0E89A4D5C37FFCE7C6C3ABDE9C413AE6D3FEA"
+                    }
+                ),
+                new DrbgTestVector(
+                    new Sha512Digest(),
+                    new SHA512EntropyProvider().Get(888),
+                    false,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "DA126CF95C6BF97E" +
+                        "2F731F2137A907ACC70FD7AC9EBACD1C6E31C74029B052E3" +
+                        "AABC48F3B00993F2B2381F7650A55322A968C86E05DE88E6" +
+                        "367F6EF89A601DB4342E9086C7AC13B5E56C32E9E668040B" +
+                        "73847893C5BFD38A1CF44F348B4EEE4CD68ADB7E7B8C837F" +
+                        "19BC4F902761F7CFF24AB1D704FD11C4E929D8553753B55D",
+                        "400B977CE8A2BB6A" +
+                        "84C6FD1CF901459685ABF5408CFF4588CEDF52E2D2DC300A" +
+                        "A9B4FAED8CD0161C2172B1FD269253195883D6EBF21020F2" +
+                        "C20E5F2C81AE60C8595B834A229B1F5B726C1125717E6207" +
+                        "8886EF38E61E32707AD5F8116C6393DFB6E7C7AE0E8E92BB" +
+                        "D7E0C3D04BBA02F5169F2F569A58158915FEE4C9D28D45DB"
+                    }
+                )
+                .SetPersonalizationString(
+                    "404142434445464748494A4B4C4D4E" +
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE")
+                .AddAdditionalInput(
                     "606162636465666768696A6B6C6D6E" +
                     "6F707172737475767778797A7B7C7D7E7F80818283848586" +
                     "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
                     "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
                     "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
-                .addAdditionalInput(
+                .AddAdditionalInput(
                     "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
                     "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
                     "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
                     "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
                     "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E"),
-                new DRBGTestVector(
-                            new Sha512Digest(),
-                            new SHA512EntropyProvider().Get(888),
-                            true,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                            {
-                                "22EB93A67911DA73" +
-                                "85D9180C78127DE1A04FF713114C07C9C615F7CC5EF72744" +
-                                "A2DDCD7C3CB85E65DED8EF5F240FBDCBEBBDE2BAAC8ECF7D" +
-                                "CBC8AC333E54607AD41DC495D83DF72A05EF55B127C1441C" +
-                                "9A0EFFDA2C7954DB6C2D04342EB812E5E0B11D6C395F41ED" +
-                                "A2702ECE5BA479E2DFA18F953097492636C12FE30CE5C968",
-                                "E66698CFBF1B3F2E" +
-                                "919C03036E584EAA81CF1C6666240AF05F70637043733954" +
-                                "D8A1E5A66A04C53C6900FDC145D4A3A80A31F5868ACE9AC9" +
-                                "4E14E2051F624A05EEA1F8B684AA5410BCE315E76EA07C71" +
-                                "5D6F34731320FF0DCF78D795E6EFA2DF92B98BE636CDFBA2" +
-                                "9008DD392112AEC202F2E481CB9D83F987FEA69CD1B368BB"
-                            }
-                        )
-                    .setPersonalizationString(
-                        "404142434445464748494A4B4C4D4E" +
-                            "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                            "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                            "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                            "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
-                new DRBGTestVector(
-                            new Sha512Digest(),
-                            new SHA512EntropyProvider().Get(888),
-                            true,
-                            "202122232425262728292A2B2C2D2E2F",
-                            256,
-                            new String[]
-                            {
-                                "7596A76372308BD5" +
-                                "A5613439934678B35521A94D81ABFE63A21ACF61ABB88B61" +
-                                "E86A12C37F308F2BBBE32BE4B38D03AE808386494D70EF52" +
-                                "E9E1365DD18B7784CAB826F31D47579E4D57F69D8BF3152B" +
-                                "95741946CEBE58571DF58ED39980D9AF44E69F01E8989759" +
-                                "8E40171101A0E3302838E0AD9E849C01988993CF9F6E5263",
-                                "DBE5EE36FCD85301" +
-                                "303E1C3617C1AC5E23C08885D0BEFAAD0C85A0D89F85B9F1" +
-                                "6ECE3D88A24EB96504F2F13EFA7049621782F5DE2C416A0D" +
-                                "294CCFE53545C4E309C48E1E285A2B829A574B72B3C2FBE1" +
-                                "34D01E3706B486F2401B9820E17298A342666918E15B8462" +
-                                "87F8C5AF2D96B20FAF3D0BB392E15F4A06CDB0DECD1B6AD7"
-                            }
-                        )
-                    .setPersonalizationString(
-                        "404142434445464748494A4B4C4D4E" +
-                            "4F505152535455565758595A5B5C5D5E5F60616263646566" +
-                            "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
-                            "7F808182838485868788898A8B8C8D8E8F90919293949596" +
-                            "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE")
-                    .addAdditionalInput(
-                        "606162636465666768696A6B6C6D6E" +
-                            "6F707172737475767778797A7B7C7D7E7F80818283848586" +
-                            "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
-                            "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
-                            "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
-                    .addAdditionalInput(
-                        "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
-                            "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
-                            "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
-                            "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
-                            "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E")
+                new DrbgTestVector(
+                    new Sha512Digest(),
+                    new SHA512EntropyProvider().Get(888),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "F93CA6855590A77F" +
+                        "07354097E90E026648B6115DF008FFEDBD9D9811F54E8286" +
+                        "EF00FDD6BA1E58DF2535E3FBDD9A9BA3754A97F36EE83322" +
+                        "1582060A1F37FCE4EE8826636B28EAD589593F4CA8B64738" +
+                        "8F24EB3F0A34796968D21BDEE6F81FD5DF93536F935937B8" +
+                        "025EC8CBF57DDB0C61F2E41463CC1516D657DA2829C6BF90",
+                        "4817618F48C60FB1" +
+                        "CE5BFBDA0CAF4591882A31F6EE3FE0F78779992A06EC60F3" +
+                        "7FB9A8D6108C231F0A927754B0599FA4FA27A4E25E065EF0" +
+                        "3085B892979DC0E7A1080883CAEBFDFD3665A8F2D061C521" +
+                        "F7D6E3DA2AF8B97B6B43B6EC831AF515070A83BBB9AC95ED" +
+                        "4EF49B756A2377A5F0833D847E27A88DDB0C2CE4AD782E7B "
+                    }
+                ),
+                new DrbgTestVector(
+                    new Sha512Digest(),
+                    new SHA512EntropyProvider().Get(888),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "0455DD4AD7DBACB2" +
+                        "410BE58DF7248D765A4547ABAEE1743B0BCAD37EBD06DA7C" +
+                        "F7CE5E2216E525327E9E2005EBEF2CE53BD733B18128627D" +
+                        "3FD6153089373AF2606A1584646A0EA488BFEF45228699A0" +
+                        "89CEA8AEC44502D86D9591F3552C688B7F7B45FCB0C3C2B9" +
+                        "43C1CD8A6FC63DF4D81C3DA543C9CF2843855EA84E4F959C",
+                        "C047D46D7F614E4E" +
+                        "4A7952C79A451F8F7ACA379967E2977C401C626A2ED70D74" +
+                        "A63660579A354115BC8C8C8CC3AEA3050686A0CFCDB6FA9C" +
+                        "F78D4C2165BAF851C6F9B1CD16A2E14C15C6DAAC56C16E75" +
+                        "FC84A14D58B41622E88B0F1B1995587FD8BAA999CBA98025" +
+                        "4C8AB9A9691DF7B84D88B639A9A3106DEABEB63748B99C09"
+                    }
+                )
+                .AddAdditionalInput(
+                    "606162636465666768696A6B6C6D6E" +
+                    "6F707172737475767778797A7B7C7D7E7F80818283848586" +
+                    "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
+                    "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
+                    "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
+                .AddAdditionalInput(
+                    "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
+                    "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
+                    "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
+                    "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
+                    "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E"),
+                new DrbgTestVector(
+                    new Sha512Digest(),
+                    new SHA512EntropyProvider().Get(888),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "22EB93A67911DA73" +
+                        "85D9180C78127DE1A04FF713114C07C9C615F7CC5EF72744" +
+                        "A2DDCD7C3CB85E65DED8EF5F240FBDCBEBBDE2BAAC8ECF7D" +
+                        "CBC8AC333E54607AD41DC495D83DF72A05EF55B127C1441C" +
+                        "9A0EFFDA2C7954DB6C2D04342EB812E5E0B11D6C395F41ED" +
+                        "A2702ECE5BA479E2DFA18F953097492636C12FE30CE5C968",
+                        "E66698CFBF1B3F2E" +
+                        "919C03036E584EAA81CF1C6666240AF05F70637043733954" +
+                        "D8A1E5A66A04C53C6900FDC145D4A3A80A31F5868ACE9AC9" +
+                        "4E14E2051F624A05EEA1F8B684AA5410BCE315E76EA07C71" +
+                        "5D6F34731320FF0DCF78D795E6EFA2DF92B98BE636CDFBA2" +
+                        "9008DD392112AEC202F2E481CB9D83F987FEA69CD1B368BB"
+                    }
+                )
+                .SetPersonalizationString(
+                    "404142434445464748494A4B4C4D4E" +
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE"),
+                new DrbgTestVector(
+                    new Sha512Digest(),
+                    new SHA512EntropyProvider().Get(888),
+                    true,
+                    "202122232425262728292A2B2C2D2E2F",
+                    256,
+                    new string[]
+                    {
+                        "7596A76372308BD5" +
+                        "A5613439934678B35521A94D81ABFE63A21ACF61ABB88B61" +
+                        "E86A12C37F308F2BBBE32BE4B38D03AE808386494D70EF52" +
+                        "E9E1365DD18B7784CAB826F31D47579E4D57F69D8BF3152B" +
+                        "95741946CEBE58571DF58ED39980D9AF44E69F01E8989759" +
+                        "8E40171101A0E3302838E0AD9E849C01988993CF9F6E5263",
+                        "DBE5EE36FCD85301" +
+                        "303E1C3617C1AC5E23C08885D0BEFAAD0C85A0D89F85B9F1" +
+                        "6ECE3D88A24EB96504F2F13EFA7049621782F5DE2C416A0D" +
+                        "294CCFE53545C4E309C48E1E285A2B829A574B72B3C2FBE1" +
+                        "34D01E3706B486F2401B9820E17298A342666918E15B8462" +
+                        "87F8C5AF2D96B20FAF3D0BB392E15F4A06CDB0DECD1B6AD7"
+                    }
+                )
+                .SetPersonalizationString(
+                    "404142434445464748494A4B4C4D4E" +
+                    "4F505152535455565758595A5B5C5D5E5F60616263646566" +
+                    "6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E" +
+                    "7F808182838485868788898A8B8C8D8E8F90919293949596" +
+                    "9798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE")
+                .AddAdditionalInput(
+                    "606162636465666768696A6B6C6D6E" +
+                    "6F707172737475767778797A7B7C7D7E7F80818283848586" +
+                    "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
+                    "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
+                    "B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE")
+                .AddAdditionalInput(
+                    "A0A1A2A3A4A5A6A7A8A9AAABACADAE" +
+                    "AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6" +
+                    "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
+                    "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6" +
+                    "F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E")
                 };
         }
 
         public override void PerformTest()
         {
-            DRBGTestVector[] tests = createTestVectorData();
-            SP80090Drbg d;
+            DrbgTestVector[] tests = CreateTestVectorData();
+            ISP80090Drbg d;
 
             for (int i = 0; i != tests.Length; i++)
             {
-                DRBGTestVector tv = tests[i];
+                DrbgTestVector tv = tests[i];
 
-                byte[] nonce = tv.nonce();
-                byte[] personalisationString = tv.personalizationString();
+                byte[] nonce = tv.GetNonce();
+                byte[] personalisationString = tv.GetPersonalizationString();
 
-                d = new HashSP800Drbg(tv.getDigest(), tv.securityStrength(), tv.entropySource(), personalisationString, nonce);
+                d = new HashSP800Drbg(tv.Digest, tv.SecurityStrength, tv.EntropySource, personalisationString, nonce);
 
-                byte[] output = new byte[tv.expectedValue(0).Length];
+                byte[] output = new byte[tv.GetExpectedValue(0).Length];
 
-                d.Generate(output, tv.additionalInput(0), tv.predictionResistance());
+                d.Generate(output, tv.GetAdditionalInput(0), tv.PredictionResistance);
 
-                byte[] expected = tv.expectedValue(0);
+                byte[] expected = tv.GetExpectedValue(0);
 
                 if (!AreEqual(expected, output))
                 {
-                    Fail("Test #" + (i + 1) + ".1 failed, expected " + Hex.ToHexString(tv.expectedValue(0)) + " got " + Hex.ToHexString(output));
+                    Fail("Test #" + (i + 1) + ".1 failed, expected " + Hex.ToHexString(tv.GetExpectedValue(0)) + " got " + Hex.ToHexString(output));
                 }
 
-                output = new byte[tv.expectedValue(0).Length];
+                output = new byte[tv.GetExpectedValue(0).Length];
 
-                d.Generate(output, tv.additionalInput(1), tv.predictionResistance());
+                d.Generate(output, tv.GetAdditionalInput(1), tv.PredictionResistance);
 
-                expected = tv.expectedValue(1);
+                expected = tv.GetExpectedValue(1);
                 if (!AreEqual(expected, output))
                 {
-                    Fail("Test #" + (i + 1) + ".2 failed, expected " + Hex.ToHexString(tv.expectedValue(1)) + " got " + Hex.ToHexString(output));
+                    Fail("Test #" + (i + 1) + ".2 failed, expected " + Hex.ToHexString(tv.GetExpectedValue(1)) + " got " + Hex.ToHexString(output));
                 }
             }
 
@@ -403,69 +410,68 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
             }
         }
 
-    internal class SHA1EntropyProvider: TestEntropySourceProvider
-    {
-        internal SHA1EntropyProvider(): base(
-                Hex.Decode(
-                    "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536"
-                        + "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6"
-                        + "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
-        {}
-    }
+        internal class SHA1EntropyProvider : TestEntropySourceProvider
+        {
+            internal SHA1EntropyProvider() : base(Hex.Decode(
+                "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536" +
+                "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
+                "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
+            {}
+        }
 
-    internal class SHA256EntropyProvider: TestEntropySourceProvider
-    {
-        internal SHA256EntropyProvider(): base(Hex.Decode(
+        internal class SHA256EntropyProvider : TestEntropySourceProvider
+        {
+            internal SHA256EntropyProvider() : base(Hex.Decode(
                 "00010203040506" +
-                    "0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E" +
-                    "1F202122232425262728292A2B2C2D2E2F30313233343536" +
-                    "80818283848586" +
-                    "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
-                    "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
-                    "C0C1C2C3C4C5C6" +
-                    "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
-                    "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
-        { }
-    }
+                "0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E" +
+                "1F202122232425262728292A2B2C2D2E2F30313233343536" +
+                "80818283848586" +
+                "8788898A8B8C8D8E8F909192939495969798999A9B9C9D9E" +
+                "9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6" +
+                "C0C1C2C3C4C5C6" +
+                "C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE" +
+                "DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6"), true)
+            { }
+        }
 
-    internal class SHA384EntropyProvider: TestEntropySourceProvider
-    {
-        internal SHA384EntropyProvider(): base(Hex.Decode(
-                "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526"
-                    + "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556"
-                    + "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
-                    "808182838485868788898A8B8C8D8E" +
-                    "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
-                    "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
-                    "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
-                    "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
-                    "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
-                    "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
-                    "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
-                    "FF000102030405060708090A0B0C0D0E0F10111213141516" +
-                    "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
-        {}
-    }
+        internal class SHA384EntropyProvider : TestEntropySourceProvider
+        {
+            internal SHA384EntropyProvider() : base(Hex.Decode(
+                "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526" +
+                "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556" +
+                "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
+                "808182838485868788898A8B8C8D8E" +
+                "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
+                "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
+                "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
+                "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
+                "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
+                "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
+                "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
+                "FF000102030405060708090A0B0C0D0E0F10111213141516" +
+                "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
+            {}
+        }
 
-    internal class SHA512EntropyProvider: TestEntropySourceProvider
-    {
-        internal SHA512EntropyProvider(): base(Hex.Decode(
+        internal class SHA512EntropyProvider : TestEntropySourceProvider
+        {
+            internal SHA512EntropyProvider() : base(Hex.Decode(
                 "000102030405060708090A0B0C0D0E" +
-                    "0F101112131415161718191A1B1C1D1E1F20212223242526" +
-                    "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E" +
-                    "3F404142434445464748494A4B4C4D4E4F50515253545556" +
-                    "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
-                    "808182838485868788898A8B8C8D8E" +
-                    "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
-                    "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
-                    "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
-                    "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
-                    "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
-                    "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
-                    "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
-                    "FF000102030405060708090A0B0C0D0E0F10111213141516" +
-                    "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
-        { }
+                "0F101112131415161718191A1B1C1D1E1F20212223242526" +
+                "2728292A2B2C2D2E2F303132333435363738393A3B3C3D3E" +
+                "3F404142434445464748494A4B4C4D4E4F50515253545556" +
+                "5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E" +
+                "808182838485868788898A8B8C8D8E" +
+                "8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6" +
+                "A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE" +
+                "BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6" +
+                "D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE" +
+                "C0C1C2C3C4C5C6C7C8C9CACBCCCDCE" +
+                "CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6" +
+                "E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE" +
+                "FF000102030405060708090A0B0C0D0E0F10111213141516" +
+                "1718191A1B1C1D1E1F202122232425262728292A2B2C2D2E"), true)
+            { }
+        }
     }
 }
-}
diff --git a/crypto/test/src/crypto/prng/test/TestEntropySourceProvider.cs b/crypto/test/src/crypto/prng/test/TestEntropySourceProvider.cs
index a37bcd844..647799630 100644
--- a/crypto/test/src/crypto/prng/test/TestEntropySourceProvider.cs
+++ b/crypto/test/src/crypto/prng/test/TestEntropySourceProvider.cs
@@ -2,7 +2,8 @@
 
 namespace Org.BouncyCastle.Crypto.Prng.Test
 {
-    public class TestEntropySourceProvider: IEntropySourceProvider
+    public class TestEntropySourceProvider
+        :   IEntropySourceProvider
     {
         private readonly byte[] data;
         private readonly bool isPredictionResistant;
@@ -18,7 +19,8 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
             return new EntropySource(bitsRequired, data, isPredictionResistant);
         }
 
-        internal class EntropySource: IEntropySource
+        internal class EntropySource
+            :   IEntropySource
         {
             private readonly int bitsRequired;
             private readonly byte[] data;
@@ -35,30 +37,21 @@ namespace Org.BouncyCastle.Crypto.Prng.Test
 
             public bool IsPredictionResistant
             {
-                get
-                {
-                    return isPredictionResistant;
-                }
+                get { return isPredictionResistant; }
             }
 
             public byte[] GetEntropy()
             {
                 byte[] rv = new byte[bitsRequired / 8];
-
                 Array.Copy(data, index, rv, 0, rv.Length);
-
                 index += bitsRequired / 8;
-
                 return rv;
             }
 
             public int EntropySize
             {
-                get
-                {
-                    return bitsRequired;
-                }
+                get { return bitsRequired; }
             }
+        }
     }
 }
-}
diff --git a/crypto/test/src/crypto/prng/test/X931Test.cs b/crypto/test/src/crypto/prng/test/X931Test.cs
new file mode 100644
index 000000000..1132ea34a
--- /dev/null
+++ b/crypto/test/src/crypto/prng/test/X931Test.cs
@@ -0,0 +1,137 @@
+using System;
+
+using NUnit.Framework;
+
+using Org.BouncyCastle.Crypto.Engines;
+using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Security;
+using Org.BouncyCastle.Utilities;
+using Org.BouncyCastle.Utilities.Encoders;
+using Org.BouncyCastle.Utilities.Test;
+
+namespace Org.BouncyCastle.Crypto.Prng.Test
+{
+    /**
+     * HMAC SP800-90 DRBG
+     */
+    [TestFixture]
+    public class X931Test
+        :   SimpleTest
+    {
+        public override string Name
+        {
+            get { return "X931"; }
+        }
+
+        public static void Main(string[] args)
+        {
+            RunTest(new X931Test());
+        }
+
+        [Test]
+        public void TestFunction()
+        {
+            string resultText = Perform().ToString();
+
+            Assert.AreEqual(Name + ": Okay", resultText);
+        }
+
+        private X931TestVector[] CreateTestVectorData()
+        {
+            return new X931TestVector[]
+            {
+                new X931TestVector(
+                    new AesEngine(),
+                    new Aes128EntropyProvider(),
+                    "f7d36762b9915f1ed585eb8e91700eb2",
+                    "259e67249288597a4d61e7c0e690afae",
+                    false,
+                    new string[]
+                    {
+                        "15f013af5a8e9df9a8e37500edaeac43",
+                        "a9d74bb1c90a222adc398546d64879cf",
+                        "0379e404042d58180764fb9e6c5d94bb",
+                        "3c74603e036d28c79947ffb56fee4e51",
+                        "e872101a4df81ebbe1e632fc87195d52",
+                        "26a6b3d33b8e7e68b75d9630ec036314"
+                    }),
+                new X931TestVector(
+                    new DesEdeEngine(),
+                    new TDesEntropyProvider(),
+                    "ef16ec643e5db5892cbc6eabba310b3410e6f8759e3e382c",
+                    "55df103deaf68dc4",
+                    false,
+                    new string[]
+                    {
+                        "9c960bb9662ce6de",
+                        "d9d0e527fd0931da",
+                        "3e2db9994e9e6995",
+                        "0e3868aef8218cf7",
+                        "7b0b0ca137f8fd81",
+                        "f657df270ad12265"
+                    })
+            };
+        }
+
+        public override void PerformTest()
+        {
+            X931TestVector[] vectors = CreateTestVectorData();
+
+            for (int i = 0; i != vectors.Length; i++)
+            {
+                X931TestVector tv = vectors[i];
+                X931SecureRandomBuilder bld = new X931SecureRandomBuilder(tv.EntropyProvider);
+
+                bld.SetDateTimeVector(Hex.Decode(tv.DateTimeVector));
+
+                SecureRandom rand = bld.Build(tv.Engine, new KeyParameter(Hex.Decode(tv.Key)), tv.IsPredictionResistant);
+
+                for (int j = 0; j != tv.Expected.Length - 1; j++)
+                {
+                    byte[] expected = Hex.Decode(tv.Expected[j]);
+                    byte[] res = new byte[expected.Length];
+
+                    rand.NextBytes(res);
+
+                    if (!Arrays.AreEqual(expected, res))
+                    {
+                        Fail("expected output wrong [" + j + "] got : " + Strings.FromByteArray(Hex.Encode(res)));
+                    }
+                }
+
+                {
+                    byte[] expected = Hex.Decode(tv.Expected[tv.Expected.Length - 1]);
+                    byte[] res = new byte[expected.Length];
+
+                    for (int j = tv.Expected.Length - 1; j != 10000; j++)
+                    {
+                        rand.NextBytes(res);
+                    }
+
+                    if (!Arrays.AreEqual(expected, res))
+                    {
+                        Fail("expected output wrong [" + 10000 + "] got : " + Strings.FromByteArray(Hex.Encode(res)));
+                    }
+                }
+            }
+        }
+
+        private class Aes128EntropyProvider
+            :   TestEntropySourceProvider
+        {
+            internal Aes128EntropyProvider()
+                : base(Hex.Decode("35cc0ea481fc8a4f5f05c7d4667233b2"), true)
+            {
+            }
+        }
+
+        private class TDesEntropyProvider
+            :   TestEntropySourceProvider
+        {
+            internal TDesEntropyProvider()
+                : base(Hex.Decode("96d872b9122c5e74"), true)
+            {
+            }
+        }
+    }
+}
diff --git a/crypto/test/src/crypto/prng/test/X931TestVector.cs b/crypto/test/src/crypto/prng/test/X931TestVector.cs
new file mode 100644
index 000000000..e641b0a66
--- /dev/null
+++ b/crypto/test/src/crypto/prng/test/X931TestVector.cs
@@ -0,0 +1,55 @@
+using System;
+
+namespace Org.BouncyCastle.Crypto.Prng.Test
+{
+    public class X931TestVector
+    {
+        private readonly IBlockCipher engine;
+        private readonly IEntropySourceProvider entropyProvider;
+        private readonly string key;
+        private readonly string dateTimeVector;
+        private readonly bool predictionResistant;
+        private readonly string[] expected;
+
+        public X931TestVector(IBlockCipher engine, IEntropySourceProvider entropyProvider, string key, string dateTimeVector,
+            bool predictionResistant, string[] expected)
+        {
+            this.engine = engine;
+            this.entropyProvider = entropyProvider;
+            this.key = key;
+            this.dateTimeVector = dateTimeVector;
+            this.predictionResistant = predictionResistant;
+            this.expected = expected;
+        }
+
+        public string DateTimeVector
+        {
+            get { return dateTimeVector; }
+        }
+
+        public IBlockCipher Engine
+        {
+            get { return engine; }
+        }
+
+        public IEntropySourceProvider EntropyProvider
+        {
+            get { return entropyProvider; }
+        }
+
+        public string[] Expected
+        {
+            get { return expected; }
+        }
+
+        public string Key
+        {
+            get { return key; }
+        }
+
+        public bool IsPredictionResistant
+        {
+            get { return predictionResistant; }
+        }
+    }
+}