private int AllocateRandom(ref byte[] Data, int Size = 0, int NonAlign = 0) { CSPPrng rng = new CSPPrng(); if (Size != 0) { Data = new byte[Size]; } else { int sze = 0; if (NonAlign != 0) { while ((sze = rng.Next(MIN_ALLOC, MAX_ALLOC)) % NonAlign == 0) { ; } } else { sze = rng.Next(MIN_ALLOC, MAX_ALLOC); } Data = new byte[sze]; } rng.GetBytes(Data); return(Data.Length); }
private void ParallelTest() { CSPPrng rng = new CSPPrng(); byte[] key = rng.GetBytes(32); byte[] iv = rng.GetBytes(8); byte[] data = rng.GetBytes(2048); byte[] enc = new byte[2048]; byte[] dec = new byte[2048]; rng.Dispose(); using (ChaCha20 chacha = new ChaCha20(10)) { // encrypt linear chacha.Initialize(new KeyParams(key, iv)); chacha.IsParallel = false; chacha.Transform(data, enc); // decrypt parallel chacha.Initialize(new KeyParams(key, iv)); chacha.IsParallel = true; chacha.ParallelBlockSize = 2048; chacha.Transform(enc, dec); } if (!Evaluate.AreEqual(data, dec)) { throw new Exception("ChaCha: Decrypted arrays are not equal!"); } }
// tests key pair generation from a passphrase private void GenerateKeyPair() { NTRUParameters param = (NTRUParameters)NTRUParamSets.EES1087EP2FAST.DeepCopy(); byte[] passphrase = Encoding.Unicode.GetBytes("password123"); byte[] salt = new CSPPrng().GetBytes(16); NTRUKeyPair kp1; using (NTRUKeyGenerator kg = new NTRUKeyGenerator(param, false)) // note: parallel must be turned off with passphrase prng kp1 = (NTRUKeyPair)kg.GenerateKeyPair(passphrase, salt); NTRUKeyPair kp2; using (NTRUKeyGenerator kg = new NTRUKeyGenerator(param, false)) kp2 = (NTRUKeyPair)kg.GenerateKeyPair(passphrase, salt); NTRUEncrypt ntru = new NTRUEncrypt(param); NTRUEncrypt ntru2 = new NTRUEncrypt(NTRUParamSets.EES1087EP2FAST); if (!kp1.Equals(kp2)) { throw new Exception("NtruEncryptTest: key pair generation test failed!"); } salt = ntru.GenerateSalt(); NTRUKeyPair kp3; using (NTRUKeyGenerator kg = new NTRUKeyGenerator(param, false)) kp3 = (NTRUKeyPair)kg.GenerateKeyPair(passphrase, salt); if (!Evaluate.False(kp1.Equals(kp3))) { throw new Exception("NtruEncryptTest: key pair generation test failed!"); } }
private void TestCompression() { Compressor cmp = new Compressor(); MemoryStream cstm; /*string folder = @"C:\Tests\Compression Test"; * cstm = cmp.CompressArchive(folder); * cstm.Position = 0; * cmp.DeCompressArchive(cstm, folder + @"\Out");*/ byte[] data = new CSPPrng().GetBytes(1000); cstm = cmp.CompressStream(new MemoryStream(data)); cstm.Position = 0; MemoryStream cmp2 = cmp.DeCompressStream(cstm); cmp2.Position = 0; if (!Evaluate.AreEqual(data, cmp2.ToArray())) { throw new Exception("CompressionTest: decompressed array is not equal!"); } cmp.CompressionFormat = Compressor.CompressionFormats.GZip; cstm = cmp.CompressStream(new MemoryStream(data)); cstm.Position = 0; cmp2 = cmp.DeCompressStream(cstm); cmp2.Position = 0; if (!Evaluate.AreEqual(data, cmp2.ToArray())) { throw new Exception("CompressionTest: decompressed array is not equal!"); } }
private void MacTests() { string path = CreateTempFile(117674); byte[] Ikm = new CSPPrng().GetBytes(32); byte[] x1 = MacTest1(path, Ikm); byte[] y1 = MacTest2(path, Ikm); if (File.Exists(path)) { File.Delete(path); } if ((Evaluate.AreEqual(x1, y1) == false)) { throw new Exception("Failed! Mac outputs are not equal"); } OnProgress(new TestEventArgs("Passed round 1 comparisons..")); path = CreateTempFile(69041); x1 = MacTest1(path, Ikm); y1 = MacTest2(path, Ikm); if (File.Exists(path)) { File.Delete(path); } if ((Evaluate.AreEqual(x1, y1) == false)) { throw new Exception("Failed! Mac outputs are not equal"); } OnProgress(new TestEventArgs("Passed round 2 comparisons..")); path = CreateTempFile(65536); x1 = MacTest1(path, Ikm); y1 = MacTest2(path, Ikm); if (File.Exists(path)) { File.Delete(path); } if ((Evaluate.AreEqual(x1, y1) == false)) { throw new Exception("Failed! Mac outputs are not equal"); } OnProgress(new TestEventArgs("Passed round 3 comparisons..")); if (!MacTest3(Ikm)) { throw new Exception("Failed! Mac outputs are not equal"); } OnProgress(new TestEventArgs("Passed round 4 comparisons..")); }
private void ParallelTest() { CSPPrng rng = new CSPPrng(); byte[] key = rng.GetBytes(32); byte[] iv = rng.GetBytes(8); byte[] data = rng.GetBytes(2048); byte[] enc = new byte[2048]; byte[] dec = new byte[2048]; byte[] enc2 = new byte[2048]; byte[] dec2 = new byte[2048]; rng.Dispose(); using (Salsa20 salsa = new Salsa20(10)) { // encrypt linear salsa.Initialize(new KeyParams(key, iv)); salsa.IsParallel = false; salsa.Transform(data, enc); // encrypt parallel salsa.Initialize(new KeyParams(key, iv)); salsa.IsParallel = true; salsa.ParallelBlockSize = 2048; salsa.Transform(data, enc2); if (!Evaluate.AreEqual(enc, enc2)) { throw new Exception("Salsa20: Encrypted arrays are not equal!"); } // decrypt linear salsa.Initialize(new KeyParams(key, iv)); salsa.IsParallel = false; salsa.Transform(enc, dec); // decrypt parallel salsa.Initialize(new KeyParams(key, iv)); salsa.IsParallel = true; salsa.ParallelBlockSize = 2048; salsa.Transform(enc2, dec2); if (!Evaluate.AreEqual(dec, dec2)) { throw new Exception("Salsa20: Decrypted arrays are not equal!"); } if (!Evaluate.AreEqual(dec, data)) { throw new Exception("Salsa20: Decrypted arrays are not equal!"); } if (!Evaluate.AreEqual(dec2, data)) { throw new Exception("Salsa20: Decrypted arrays are not equal!"); } } }
private string CreateTempFile(int Size) { string path = Path.GetTempFileName(); byte[] data = new CSPPrng().GetBytes(Size); File.WriteAllBytes(path, data); return(path); }
private void PackageKeyTest() { CipherDescription cd1 = new CipherDescription( SymmetricEngines.RHX, 192, IVSizes.V128, CipherModes.CTR, PaddingModes.None, BlockSizes.B128, RoundCounts.R22); CSPPrng rnd = new CSPPrng(); byte[] di = new byte[16]; byte[] oi = new byte[16]; byte[] pi = new byte[16]; byte[] pd = new byte[32]; byte[] ti = new byte[16]; rnd.GetBytes(di); rnd.GetBytes(oi); rnd.GetBytes(pi); rnd.GetBytes(pd); rnd.GetBytes(ti); KeyAuthority ka1 = new KeyAuthority(di, oi, pi, pd, KeyPolicies.IdentityRestrict | KeyPolicies.NoExport | KeyPolicies.NoNarrative, 1, ti); MemoryStream mk = new MemoryStream(); PackageKey pk1 = new PackageKey(ka1, cd1, 100); PackageFactory pf = new PackageFactory(mk, ka1); pf.Create(pk1); byte[] bpk = pk1.ToBytes(); PackageKey pk2 = new PackageKey(bpk); if (!pk1.Equals(pk2)) { throw new Exception("KeyFactoryTest: PackageKey serialization has failed!"); } PackageKey pk3 = new PackageKey(mk); if (!pk1.Equals(pk3)) { throw new Exception("KeyFactoryTest: PackageKey serialization has failed!"); } if (pk1.GetHashCode() != pk2.GetHashCode() || pk1.GetHashCode() != pk3.GetHashCode()) { throw new Exception("KeyFactoryTest: PackageKey hash code test has failed!"); } pf.Dispose(); }
void CompareOutput(IPadding Padding) { CSPPrng rng = new CSPPrng(); byte[] fill = new byte[16]; rng.GetBytes(fill); const int BLOCK = 16; for (int i = 0; i < BLOCK; i++) { byte[] data = new byte[BLOCK]; // fill with rand if (i > 0) { Array.Copy(fill, data, BLOCK - i); } // pad array Padding.AddPadding(data, i); // verify length int len = Padding.GetPaddingLength(data); if (len == 0 && i != 0) { throw new Exception("PaddingTest: Failed the padding value return check!"); } else if (i != 0 && len != BLOCK - i) { throw new Exception("PaddingTest: Failed the padding value return check!"); } // test offset method if (i > 0 && i < 15) { len = Padding.GetPaddingLength(data, i); if (len == 0 && i != 0) { throw new Exception("PaddingTest: Failed the padding value return check!"); } else if (i != 0 && len != BLOCK - i) { throw new Exception("PaddingTest: Failed the padding value return check!"); } } } rng.Dispose(); }
/// <summary> /// Initialize an empty VolumeKey structure /// </summary> /// /// <param name="Tag">The volume tag; a 32 byte field identifying this volume</param> /// <param name="Description">The cipher description</param> /// <param name="Count">The number of key/vector pairs</param> public VolumeKey(byte[] Tag, CipherDescription Description, int Count) { this.Tag = new byte[TAG_SIZE]; Array.Copy(Tag, this.Tag, Math.Min(Tag.Length, TAG_SIZE)); this.Description = Description; this.Count = Count; this.FileId = new int[Count]; this.State = new byte[Count]; int id = new CSPPrng().Next(); for (int i = 0; i < Count; ++i) { this.State[i] = (byte)VolumeKeyStates.Unassigned; this.FileId[i] = id + i; } }
private bool MacTest3(byte[] IKm) { byte[] data = new CSPPrng().GetBytes(33033); byte[] hash1; byte[] hash2; using (MacStream mac1 = new MacStream(new HMAC(new SHA512(), IKm))) { mac1.Initialize(new MemoryStream(data)); mac1.IsConcurrent = false; hash1 = mac1.ComputeMac(); } using (HMAC mac2 = new HMAC(new SHA512(), IKm)) hash2 = mac2.ComputeMac(data); return(Evaluate.AreEqual(hash1, hash2)); }
private bool HashTest3() { byte[] data = new CSPPrng().GetBytes(33033); byte[] hash1; byte[] hash2; using (DigestStream dgt1 = new DigestStream(new SHA512())) { dgt1.Initialize(new MemoryStream(data)); // run concurrent mode dgt1.IsConcurrent = true; hash1 = dgt1.ComputeHash(); } using (SHA512 dgt2 = new SHA512()) hash2 = dgt2.ComputeHash(data); return(Evaluate.AreEqual(hash1, hash2)); }
/// <summary> /// Tests the SecureRandom access methods and return ranges /// </summary> /// <returns>Status</returns> public string Run() { try { SecRandTest(); RandRangeTest(new BBSG(), 10); OnProgress(new TestEventArgs("Passed BBSG threshhold tests..")); RandRangeTest(new CCG(), 10); OnProgress(new TestEventArgs("Passed CCG threshhold tests..")); RandRangeTest(new CSPPrng()); OnProgress(new TestEventArgs("Passed CSPPrng threshhold tests..")); RandRangeTest(new CTRPrng()); OnProgress(new TestEventArgs("Passed CTRPrng threshhold tests..")); RandRangeTest(new DGCPrng()); OnProgress(new TestEventArgs("Passed DGCPrng threshhold tests..")); RandRangeTest(new MODEXPG(), 10); OnProgress(new TestEventArgs("Passed MODEXPG threshhold tests..")); RandRangeTest(new QCG1(), 10); OnProgress(new TestEventArgs("Passed QCG1 threshhold tests..")); RandRangeTest(new QCG2(), 10); OnProgress(new TestEventArgs("Passed QCG2 threshhold tests..")); RandRangeTest(new SP20Prng(), 10); OnProgress(new TestEventArgs("Passed SP20Prng threshhold tests..")); byte[] pass, salt; CSPPrng rand = new CSPPrng(); pass = rand.GetBytes(23); salt = rand.GetBytes(256); rand.Dispose(); RandRangeTest(new PBPRng(new SHA512(), pass, salt)); OnProgress(new TestEventArgs("Passed PBPRng threshhold tests..")); return(SUCCESS); } catch (Exception Ex) { string message = Ex.Message == null ? "" : Ex.Message; throw new Exception(FAILURE + message); } }
/// <remarks> /// 4 stage overwrite: random, reverse random, ones, zeros. /// Last overwrite stage is zeros in Extract() method. /// </remarks> private void Erase(MemoryStream KeyStream, long Offset, long Length) { byte[] buffer = new byte[Length]; // get p-rand buffer using (CSPPrng csp = new CSPPrng()) csp.GetBytes(buffer); // rand Overwrite(KeyStream, buffer, Offset, Length); // reverse rand Array.Reverse(buffer); Overwrite(KeyStream, buffer, Offset, Length); // ones for (int i = 0; i < buffer.Length; i++) { buffer[i] = (byte)255; } Overwrite(KeyStream, buffer, Offset, Length); }
private void HmacDescriptionTest() { CSPPrng rng = new CSPPrng(); byte[] data = rng.GetBytes(rng.Next(100, 400)); byte[] key = rng.GetBytes(64); HMAC mac = new HMAC(Digests.SHA256); mac.Initialize(key); byte[] c1 = mac.ComputeMac(data); MacDescription mds = new MacDescription(64, Digests.SHA256); MacStream mst = new MacStream(mds, new KeyParams(key)); mst.Initialize(new MemoryStream(data)); byte[] c2 = mst.ComputeMac(); if (!Evaluate.AreEqual(c1, c2)) { throw new Exception("MacStreamTest: HMAC code arrays are not equal!"); } }
/// <summary> /// Initialize an empty VolumeKey structure; generates a random key tag identifier /// </summary> /// /// <param name="Description">The cipher description</param> /// <param name="Count">The number of key/vector pairs</param> public VolumeKey(CipherDescription Description, int Count) { this.Description = Description; this.Count = Count; this.FileId = new int[Count]; this.State = new byte[Count]; this.Tag = new CSPPrng().GetBytes(TAG_SIZE); int id = 0; using (CSPPrng rng = new CSPPrng()) { this.Tag = rng.GetBytes(TAG_SIZE); id = rng.Next(); } for (int i = 0; i < Count; ++i) { this.State[i] = (byte)VolumeKeyStates.Unassigned; this.FileId[i] = id + i; } }
private void KeyParamsTest() { CSPPrng rnd = new CSPPrng(); KeyGenerator kg = new KeyGenerator(); for (int i = 0; i < 10; ++i) { // out-bound funcs return pointer to obj KeyParams kp1 = kg.GetKeyParams(rnd.Next(1, 1024), rnd.Next(1, 128), rnd.Next(1, 128)); MemoryStream m = (MemoryStream)KeyParams.Serialize(kp1); KeyParams kp2 = KeyParams.DeSerialize(m); if (!kp1.Equals(kp2)) { throw new Exception("KeyFactoryTest: KeyParams serialization test has failed!"); } if (kp1.GetHashCode() != kp2.GetHashCode()) { throw new Exception("KeyFactoryTest: KeyAuthority hash code test has failed!"); } } }
private void CmacDescriptionTest() { CSPPrng rng = new CSPPrng(); byte[] data = rng.GetBytes(rng.Next(100, 400)); byte[] key = rng.GetBytes(32); byte[] iv = rng.GetBytes(16); CMAC mac = new CMAC(BlockCiphers.Rijndael); mac.Initialize(key, iv); byte[] c1 = mac.ComputeMac(data); MacDescription mds = new MacDescription(32, BlockCiphers.Rijndael, IVSizes.V128, BlockSizes.B128, RoundCounts.R14); MacStream mst = new MacStream(mds, new KeyParams(key, iv)); mst.Initialize(new MemoryStream(data)); byte[] c2 = mst.ComputeMac(); if (!Evaluate.AreEqual(c1, c2)) { throw new Exception("MacStreamTest: CMAC code arrays are not equal!"); } }
private void KeyAuthorityTest() { CSPPrng rnd = new CSPPrng(); byte[] di = new byte[16]; byte[] oi = new byte[16]; byte[] pi = new byte[16]; byte[] pd = new byte[32]; byte[] ti = new byte[16]; rnd.GetBytes(di); rnd.GetBytes(oi); rnd.GetBytes(pi); rnd.GetBytes(pd); rnd.GetBytes(ti); KeyAuthority ka1 = new KeyAuthority(di, oi, pi, pd, KeyPolicies.IdentityRestrict | KeyPolicies.NoExport | KeyPolicies.NoNarrative, 1, ti); byte[] bcd = ka1.ToBytes(); KeyAuthority ka2 = new KeyAuthority(bcd); if (!ka1.Equals(ka2)) { throw new Exception("KeyFactoryTest: KeyAuthority serialization has failed!"); } MemoryStream mcd = ka2.ToStream(); KeyAuthority ka3 = new KeyAuthority(mcd); if (!ka1.Equals(ka3)) { throw new Exception("KeyFactoryTest: KeyAuthority serialization has failed!"); } int x = ka1.GetHashCode(); if (x != ka2.GetHashCode() || x != ka3.GetHashCode()) { throw new Exception("KeyFactoryTest: KeyAuthority hash code test has failed!"); } }
private void DigestTest() { CSPPrng rng = new CSPPrng(); NTRUParameters param = (NTRUParameters)NTRUParamSets.EES1087EP2.DeepCopy(); for (int i = 0; i < 3; i++) { if (i == 0) { param.Digest = Digests.Blake2B512;//blake512 } else if (i == 1) { param.Digest = Digests.Keccak512;//keccak512 } else { param.Digest = Digests.Skein512;//skein512 } NTRUKeyPair kp; using (NTRUKeyGenerator kg = new NTRUKeyGenerator(param)) kp = (NTRUKeyPair)kg.GenerateKeyPair(); using (NTRUEncrypt ntru = new NTRUEncrypt(param)) { byte[] plainText = rng.GetBytes(32); ntru.Initialize(kp.PublicKey); byte[] encrypted = ntru.Encrypt(plainText); ntru.Initialize(kp); byte[] decrypted = ntru.Decrypt(encrypted); if (!Evaluate.AreEqual(plainText, decrypted)) { throw new Exception("NtruEncryptTest: digest test failed!"); } } } }
private void MessageHeaderTest() { CSPPrng rnd = new CSPPrng(); byte[] id = new byte[16]; byte[] ex = new byte[16]; rnd.GetBytes(id); rnd.GetBytes(ex); // test serialization /*MessageHeader mh = new MessageHeader(id, ex, 0); * byte[] sk = mh.ToBytes(); * MessageHeader mh2 = new MessageHeader(sk); * if (!mh.Equals(mh2)) * throw new Exception("KeyFactoryTest: MessageHeader serialization has failed!"); * * MemoryStream mk = mh.ToStream(); * MessageHeader mh3 = new MessageHeader(mk); * if (!mh.Equals(mh3)) * throw new Exception("KeyFactoryTest: MessageHeader serialization has failed!"); * * byte[] id2 = MessageHeader.GetKeyId(mk); * if (!Evaluate.AreEqual(id, id2)) * throw new Exception("KeyFactoryTest: MessageHeader access has failed!"); * * byte[] ex2 = MessageHeader.GetExtension(mk); * if (!Evaluate.AreEqual(ex, ex2)) * throw new Exception("KeyFactoryTest: MessageHeader access has failed!"); * * string ext1 = "test"; * byte[] enc = MessageHeader.EncryptExtension(ext1, MessageHeader.GetExtension(mk)); * string ext2 = MessageHeader.DecryptExtension(enc, MessageHeader.GetExtension(mk)); * if (ext1 != ext2) * throw new Exception("KeyFactoryTest: MessageHeader access has failed!");*/ }
private void CipherKeyTest() { CipherDescription ds = new CipherDescription( SymmetricEngines.RHX, 192, IVSizes.V128, CipherModes.CTR, PaddingModes.PKCS7, BlockSizes.B128, RoundCounts.R22, Digests.Skein512, 64, Digests.SHA512); CSPPrng rnd = new CSPPrng(); byte[] id = new byte[16]; byte[] ek = new byte[16]; rnd.GetBytes(id); rnd.GetBytes(ek); // test serialization CipherKey ck = new CipherKey(ds, id, ek); byte[] sk = ck.ToBytes(); CipherKey ck2 = new CipherKey(sk); if (!ck.Equals(ck2)) { throw new Exception("KeyFactoryTest: CipherKey serialization has failed!"); } MemoryStream mk = ck.ToStream(); CipherKey ck3 = new CipherKey(mk); if (!ck.Equals(ck3)) { throw new Exception("KeyFactoryTest: CipherKey serialization has failed!"); } // test access funcs CipherKey.SetCipherDescription(mk, ds); CipherDescription ds2 = CipherKey.GetCipherDescription(mk); if (!ck.Description.Equals(ds2)) { throw new Exception("KeyFactoryTest: CipherKey access has failed!"); } rnd.GetBytes(ek); CipherKey.SetExtensionKey(mk, ek); if (!Evaluate.AreEqual(CipherKey.GetExtensionKey(mk), ek)) { throw new Exception("KeyFactoryTest: CipherKey access has failed!"); } rnd.GetBytes(id); CipherKey.SetKeyId(mk, id); if (!Evaluate.AreEqual(CipherKey.GetKeyId(mk), id)) { throw new Exception("KeyFactoryTest: CipherKey access has failed!"); } }