public AddSeedMaterial ( byte inSeed ) : void | ||
inSeed | byte | |
return | void |
private void doExpectedTest(IDigest digest, int seed, byte[] expected, byte[] noCycle) { DigestRandomGenerator rGen = new DigestRandomGenerator(digest); byte[] output = new byte[digest.GetDigestSize()]; rGen.AddSeedMaterial(seed); for (int i = 0; i != 1024; i++) { rGen.NextBytes(output); } if (noCycle != null) { if (Arrays.AreEqual(noCycle, output)) { Fail("seed not being cycled!"); } } if (!Arrays.AreEqual(expected, output)) { Fail("expected output doesn't match"); } }
public DTLSContext(bool client, Version version, HandshakeInfo handshakeInfo) { IsServer = !client; if (version == DTLSRecord.Version1_2) { ClientVersion = ProtocolVersion.DTLSv12; ServerVersion = ProtocolVersion.DTLSv12; } else { ClientVersion = ProtocolVersion.DTLSv10; ServerVersion = ProtocolVersion.DTLSv10; } SecurityParameters = new DTLSSecurityParameters(version, handshakeInfo); NonceRandomGenerator = new DigestRandomGenerator(TlsUtilities.CreateHash(HashAlgorithm.sha256)); NonceRandomGenerator.AddSeedMaterial(Times.NanoTime()); }
private void doCountTest(IDigest digest, byte[] seed, byte[] expectedXors) { DigestRandomGenerator rGen = new DigestRandomGenerator(digest); byte[] output = new byte[digest.GetDigestSize()]; int[] averages = new int[digest.GetDigestSize()]; byte[] ands = new byte[digest.GetDigestSize()]; byte[] xors = new byte[digest.GetDigestSize()]; byte[] ors = new byte[digest.GetDigestSize()]; rGen.AddSeedMaterial(seed); for (int i = 0; i != 1000000; i++) { rGen.NextBytes(output); for (int j = 0; j != output.Length; j++) { averages[j] += output[j] & 0xff; ands[j] &= output[j]; xors[j] ^= output[j]; ors[j] |= output[j]; } } for (int i = 0; i != output.Length; i++) { if ((averages[i] / 1000000) != 127) { Fail("average test failed for " + digest.AlgorithmName); } if (ands[i] != 0) { Fail("and test failed for " + digest.AlgorithmName); } if ((ors[i] & 0xff) != 0xff) { Fail("or test failed for " + digest.AlgorithmName); } if (xors[i] != expectedXors[i]) { Fail("xor test failed for " + digest.AlgorithmName); } } }
/// <summary> /// Note: Clears pool contents before returning /// </summary> private void CreateNewPRNG(byte[] pool) { if (pool == null) { throw new CryptographicException("Refusing to reseed with null pool"); } try { if (pool.Length != PoolSize) { throw new CryptographicException("Refusing to reseed with invalid pool"); } // Now, pool has been seeded, file operations are all completed, it's time to create my internal PRNG IDigest digest; switch (this.myRNGAlgorithm) { case PrngAlgorithm.MD5_128bit: digest = new MD5Digest(); break; case PrngAlgorithm.RIPEMD128_128bit: digest = new RipeMD128Digest(); break; case PrngAlgorithm.RIPEMD160_160bit: digest = new RipeMD160Digest(); break; case PrngAlgorithm.RIPEMD256_256bit: digest = new RipeMD256Digest(); break; case PrngAlgorithm.RIPEMD320_320bit: digest = new RipeMD320Digest(); break; case PrngAlgorithm.SHA1_160bit: digest = new Sha1Digest(); break; case PrngAlgorithm.SHA256_256bit: digest = new Sha256Digest(); break; case PrngAlgorithm.SHA512_512bit: digest = new Sha512Digest(); break; case PrngAlgorithm.Tiger_192bit: digest = new TigerDigest(); break; case PrngAlgorithm.Whirlpool_512bit: digest = new WhirlpoolDigest(); break; default: throw new CryptographicException("Unknown prngAlgorithm specified: " + this.myRNGAlgorithm.ToString()); } var drng = new DigestRandomGenerator(digest); drng.AddSeedMaterial(pool); this.myRNG = drng; } finally { Array.Clear(pool, 0, pool.Length); } }