コード例 #1
0
ファイル: CipherStreamTest.cs プロジェクト: todoasap/CEX-NET
        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);
        }
コード例 #2
0
ファイル: ChaChaTest.cs プロジェクト: todoasap/CEX-NET
        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!");
            }
        }
コード例 #3
0
ファイル: NtruEncryptTest.cs プロジェクト: todoasap/CEX-NET
        // 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!");
            }
        }
コード例 #4
0
ファイル: CompressionTest.cs プロジェクト: todoasap/CEX-NET
        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!");
            }
        }
コード例 #5
0
        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.."));
        }
コード例 #6
0
ファイル: SalsaTest.cs プロジェクト: todoasap/CEX-NET
        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!");
                }
            }
        }
コード例 #7
0
        private string CreateTempFile(int Size)
        {
            string path = Path.GetTempFileName();

            byte[] data = new CSPPrng().GetBytes(Size);

            File.WriteAllBytes(path, data);

            return(path);
        }
コード例 #8
0
        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();
        }
コード例 #9
0
ファイル: PaddingTest.cs プロジェクト: todoasap/CEX-NET
        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();
        }
コード例 #10
0
ファイル: VolumeKey.cs プロジェクト: todoasap/CEX-NET
        /// <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;
            }
        }
コード例 #11
0
        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));
        }
コード例 #12
0
        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));
        }
コード例 #13
0
        /// <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);
            }
        }
コード例 #14
0
ファイル: PackageFactory.cs プロジェクト: todoasap/CEX-NET
        /// <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);
        }
コード例 #15
0
        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!");
            }
        }
コード例 #16
0
ファイル: VolumeKey.cs プロジェクト: todoasap/CEX-NET
        /// <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;
            }
        }
コード例 #17
0
        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!");
                }
            }
        }
コード例 #18
0
        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!");
            }
        }
コード例 #19
0
        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!");
            }
        }
コード例 #20
0
ファイル: NtruEncryptTest.cs プロジェクト: todoasap/CEX-NET
        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!");
                    }
                }
            }
        }
コード例 #21
0
        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!");*/
        }
コード例 #22
0
        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!");
            }
        }