Esempio n. 1
0
        private void MonteCarloTest(byte[] Key, byte[] Input, byte[] Output)
        {
            byte[] outBytes = new byte[Input.Length];
            Array.Copy(Input, 0, outBytes, 0, outBytes.Length);

            using (RHX engine = new RHX())
            {
                engine.Initialize(true, new KeyParams(Key));

                for (int i = 0; i != 10000; i++)
                {
                    engine.Transform(outBytes, outBytes);
                }
            }

            if (Evaluate.AreEqual(outBytes, Output) == false)
            {
                throw new Exception("AES MonteCarlo: Arrays are not equal! Expected: " + HexConverter.ToString(Output) + " Received: " + HexConverter.ToString(outBytes));
            }

            using (RHX engine = new RHX())
            {
                engine.Initialize(false, new KeyParams(Key));

                for (int i = 0; i != 10000; i++)
                {
                    engine.Transform(outBytes, outBytes);
                }
            }

            if (Evaluate.AreEqual(outBytes, Input) == false)
            {
                throw new Exception("AES MonteCarlo: Arrays are not equal! Expected: " + HexConverter.ToString(Input) + " Received: " + HexConverter.ToString(outBytes));
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Reinitialize the internal state
        /// </summary>
        public void Reset()
        {
            if (m_rndGenerator != null)
            {
                m_rndGenerator.Dispose();
                m_rndGenerator = null;
            }

            int rds = m_stateSeed.Length == 48 ? 14 : 22;
            RHX eng = new RHX(16, rds);

            m_rndGenerator = new CMG(eng);
            m_rndGenerator.Initialize(m_stateSeed);
        }
Esempio n. 3
0
        private void VectorTest(byte[] Key, byte[] Input, byte[] Output)
        {
            using (RHX engine = new RHX())
            {
                byte[] outBytes = new byte[Input.Length];

                engine.Initialize(true, new KeyParams(Key));
                engine.Transform(Input, outBytes);

                if (Evaluate.AreEqual(outBytes, Output) == false)
                {
                    throw new Exception("AESAVS: Encrypted arrays are not equal! Expected: " + HexConverter.ToString(Output) + " Received: " + HexConverter.ToString(outBytes));
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// I/O and KAT tests run on the base engine accessors
        /// </summary>
        /// <returns>State</returns>
        public string Run()
        {
            byte[]       key  = new byte[32];
            byte[]       iv   = new byte[16];
            byte[]       data = new byte[2048];
            IBlockCipher inCipher;
            IBlockCipher outCipher;

            try
            {
                inCipher  = new RHX();
                outCipher = new RHX();
                // run the AES I/O test vectors
                for (int i = 0; i != _cipherTests.Length; i += 3)
                {
                    TestIO(inCipher, outCipher, HexConverter.Decode(_cipherTests[i]), HexConverter.Decode(_cipherTests[i + 1]), HexConverter.Decode(_cipherTests[i + 2]));
                }

                for (int i = 0; i != _cipherTests.Length; i += 3)
                {
                    TestIO(inCipher, outCipher, HexConverter.Decode(_cipherTests[i]), HexConverter.Decode(_cipherTests[i + 1]), HexConverter.Decode(_cipherTests[i + 2]));
                }

                using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
                {
                    rng.GetBytes(key);
                    rng.GetBytes(data);
                }

                OnProgress(new TestEventArgs("Passed AES known vector method tests.."));

                // test transforms
                TestIO2(new RHX(), key, data);
                TestIO2(new SHX(), key, data);
                TestIO2(new THX(), key, data);

                OnProgress(new TestEventArgs("Passed I/O initialization and access tests.."));

                return(SUCCESS);
            }
            catch (Exception Ex)
            {
                string message = Ex.Message == null ? "" : Ex.Message;
                throw new Exception(FAILURE + message);
            }
        }
Esempio n. 5
0
        private byte[] EncryptRDX(byte[] Key, byte[] Data)
        {
            int blocks = Data.Length / 16;

            byte[] outputData = new byte[Data.Length];

            using (RHX transform = new RHX())
            {
                transform.Initialize(true, new KeyParams(Key));

                for (int i = 0; i < blocks; i++)
                {
                    transform.Transform(Data, i * 16, outputData, i * 16);
                }
            }

            return(outputData);
        }
Esempio n. 6
0
        /// <summary>
        /// Tests the SecureRandom access methods and return ranges
        /// </summary>
        /// <returns>Status</returns>
        public string Run()
        {
            try
            {
                CbcModeTest();
                OnProgress(new TestEventArgs("Passed CBC Mode tests.."));
                CfbModeTest();
                OnProgress(new TestEventArgs("Passed CFB Mode tests.."));
                CtrModeTest();
                OnProgress(new TestEventArgs("Passed CTR Mode tests.."));
                OfbModeTest();
                OnProgress(new TestEventArgs("Passed OFB Mode tests.."));
                StreamTest();
                OnProgress(new TestEventArgs("Passed Stream Cipher tests"));

                SerializeStructTest();
                OnProgress(new TestEventArgs("Passed CipherDescription serialization test.."));
                OnProgress(new TestEventArgs(""));

                OnProgress(new TestEventArgs("***Testing Cipher Parameters***.. "));
                ParametersTest();
                OnProgress(new TestEventArgs("Passed Cipher Parameters test.."));

                RHX eng = new RHX();
                OnProgress(new TestEventArgs("***Testing Padding Modes***.."));
                StreamModesTest(new CBC(eng, false), new X923());
                OnProgress(new TestEventArgs("Passed CBC/X923 CipherStream test.."));
                StreamModesTest(new CBC(eng, false), new PKCS7());
                OnProgress(new TestEventArgs("Passed CBC/PKCS7 CipherStream test.."));
                StreamModesTest(new CBC(eng, false), new TBC());
                OnProgress(new TestEventArgs("Passed CBC/TBC CipherStream test.."));
                StreamModesTest(new CBC(eng, false), new ISO7816());
                OnProgress(new TestEventArgs("Passed CBC/ISO7816 CipherStream test.."));
                OnProgress(new TestEventArgs(""));

                OnProgress(new TestEventArgs("***Testing Cipher Modes***.."));
                StreamModesTest(new CTR(eng, false), new ISO7816());
                OnProgress(new TestEventArgs("Passed CTR CipherStream test.."));
                StreamModesTest(new CFB(eng, 16, false), new ISO7816());
                OnProgress(new TestEventArgs("Passed CFB CipherStream test.."));
                StreamModesTest(new OFB(eng, 16, false), new ISO7816());
                OnProgress(new TestEventArgs("Passed OFB CipherStream test.."));
                OnProgress(new TestEventArgs(""));
                eng.Dispose();

                OnProgress(new TestEventArgs("***Testing Stream Ciphers***.."));
                StreamingTest(new ChaCha20());
                OnProgress(new TestEventArgs("Passed ChaCha CipherStream test.."));
                StreamingTest(new Salsa20());
                OnProgress(new TestEventArgs("Passed Salsa20 CipherStream test.."));
                OnProgress(new TestEventArgs(""));

                OnProgress(new TestEventArgs("***Testing Cipher Description Initialization***.."));
                CipherDescription cd = new CipherDescription(
                    SymmetricEngines.RHX,                               // cipher engine
                    32,                                                 // key size in bytes
                    IVSizes.V128,                                       // cipher iv size
                    CipherModes.CTR,                                    // cipher mode
                    PaddingModes.ISO7816,                               // cipher padding
                    BlockSizes.B128,                                    // cipher block size
                    RoundCounts.R14,                                    // number of transformation rounds
                    Digests.None,                                       // optional key schedule engine (HX ciphers)
                    0,                                                  // optional HMAC size
                    Digests.None);                                      // optional HMAC engine

                DescriptionTest(cd);
                OnProgress(new TestEventArgs("Passed CipherDescription stream test.."));
                OnProgress(new TestEventArgs(""));

                OnProgress(new TestEventArgs("***Testing Block Ciphers***.. "));
                THX tfx = new THX();
                StreamModesTest(new CBC(tfx, false), new ISO7816());
                tfx.Dispose();
                OnProgress(new TestEventArgs("Passed THX CipherStream test.."));
                SHX spx = new SHX();
                StreamModesTest(new CBC(spx, false), new ISO7816());
                spx.Dispose();
                OnProgress(new TestEventArgs("Passed SHX CipherStream test.."));

                Array.Resize(ref _key, 192);
                for (int i = 0; i < 192; i++)
                {
                    _key[i] = (byte)i;
                }

                // test extended ciphers
                RHX rhx = new RHX();
                StreamModesTest(new CBC(rhx, false), new ISO7816());
                rhx.Dispose();
                OnProgress(new TestEventArgs("Passed RHX CipherStream test.."));
                SHX shx = new SHX();
                StreamModesTest(new CBC(shx, false), new ISO7816());
                shx.Dispose();
                OnProgress(new TestEventArgs("Passed SHX CipherStream test.."));
                THX thx = new THX();
                StreamModesTest(new CBC(thx, false), new ISO7816());
                thx.Dispose();
                OnProgress(new TestEventArgs("Passed THX CipherStream test.."));
                OnProgress(new TestEventArgs(""));

                return(SUCCESS);
            }
            catch (Exception Ex)
            {
                string message = Ex.Message == null ? "" : Ex.Message;
                throw new Exception(FAILURE + message);
            }
        }
Esempio n. 7
0
        private void ParametersTest()
        {
            AllocateRandom(ref _iv, 16);
            AllocateRandom(ref _key, 32);
            AllocateRandom(ref _plnText, 1);

            KeyParams kp = new KeyParams(_key, _iv);

            _cmpText = new byte[1];
            _decText = new byte[1];
            _encText = new byte[1];

            RHX engine = new RHX();

            // 1 byte w/ byte arrays
            {
                CTR          cipher = new CTR(engine, false);
                CipherStream cs     = new CipherStream(cipher);

                cs.Initialize(true, kp);
                cs.Write(_plnText, 0, ref _encText, 0);

                cs.Initialize(false, kp);
                cs.Write(_encText, 0, ref _decText, 0);

                if (!Evaluate.AreEqual(_decText, _plnText))
                {
                    throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                }

                cipher.Dispose();
            }
            // 1 byte w/ stream
            {
                CTR          cipher = new CTR(engine, false);
                CipherStream cs     = new CipherStream(cipher);
                cs.Initialize(true, kp);
                AllocateRandom(ref _plnText, 1);
                MemoryStream mIn  = new MemoryStream(_plnText);
                MemoryStream mOut = new MemoryStream();
                cs.Write(mIn, mOut);

                cs.Initialize(false, kp);
                MemoryStream mRes = new MemoryStream();
                mOut.Seek(0, SeekOrigin.Begin);
                cs.Write(mOut, mRes);

                if (!Evaluate.AreEqual(mRes.ToArray(), _plnText))
                {
                    throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                }

                cipher.Dispose();
            }

            // partial block w/ byte arrays
            {
                CTR          cipher = new CTR(engine, false);
                CipherStream cs     = new CipherStream(cipher);
                AllocateRandom(ref _plnText, 15);
                Array.Resize(ref _decText, 15);
                Array.Resize(ref _encText, 15);

                cs.Initialize(true, kp);
                cs.Write(_plnText, 0, ref _encText, 0);

                cs.Initialize(false, kp);
                cs.Write(_encText, 0, ref _decText, 0);

                if (!Evaluate.AreEqual(_decText, _plnText))
                {
                    throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                }

                cipher.Dispose();
            }
            // partial block w/ stream
            {
                CTR          cipher = new CTR(engine, false);
                CipherStream cs     = new CipherStream(cipher);
                AllocateRandom(ref _plnText, 15);
                Array.Resize(ref _decText, 15);
                Array.Resize(ref _encText, 15);

                cs.Initialize(true, kp);
                MemoryStream mIn  = new MemoryStream(_plnText);
                MemoryStream mOut = new MemoryStream();
                cs.Write(mIn, mOut);

                cs.Initialize(false, kp);
                MemoryStream mRes = new MemoryStream();
                mOut.Seek(0, SeekOrigin.Begin);
                cs.Write(mOut, mRes);

                if (!Evaluate.AreEqual(mRes.ToArray(), _plnText))
                {
                    throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                }

                cipher.Dispose();
            }

            // random block sizes w/ byte arrays
            {
                for (int i = 0; i < 100; i++)
                {
                    CTR cipher = new CTR(engine, false);

                    int sze = AllocateRandom(ref _plnText);
                    _decText = new byte[sze];
                    _encText = new byte[sze];

                    CipherStream cs = new CipherStream(cipher);
                    cs.Initialize(true, kp);
                    cs.Write(_plnText, 0, ref _encText, 0);

                    cs.Initialize(false, kp);
                    cs.Write(_encText, 0, ref _decText, 0);

                    if (!Evaluate.AreEqual(_decText, _plnText))
                    {
                        throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                    }

                    cipher.Dispose();
                }
            }
            // random block sizes w/ stream
            {
                for (int i = 0; i < 100; i++)
                {
                    CTR cipher = new CTR(engine, false);
                    int sze    = AllocateRandom(ref _plnText);
                    _decText = new byte[sze];
                    _encText = new byte[sze];

                    CipherStream cs = new CipherStream(cipher);
                    cs.Initialize(true, kp);
                    MemoryStream mIn  = new MemoryStream(_plnText);
                    MemoryStream mOut = new MemoryStream();
                    cs.Write(mIn, mOut);

                    cs.Initialize(false, kp);
                    MemoryStream mRes = new MemoryStream();
                    mOut.Seek(0, SeekOrigin.Begin);
                    cs.Write(mOut, mRes);

                    if (!Evaluate.AreEqual(mRes.ToArray(), _plnText))
                    {
                        throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                    }

                    cipher.Dispose();
                }
            }

            engine.Dispose();
        }
Esempio n. 8
0
        private void OfbModeTest()
        {
            AllocateRandom(ref _iv, 16);
            AllocateRandom(ref _key, 32);

            KeyParams kp      = new KeyParams(_key, _iv);
            RHX       eng     = new RHX();
            OFB       cipher  = new OFB(eng);
            OFB       cipher2 = new OFB(eng);
            ISO7816   padding = new ISO7816();

            cipher.IsParallel = false;
            CipherStream cs = new CipherStream(cipher2, padding);

            for (int i = 0; i < 10; i++)
            {
                int sze      = AllocateRandom(ref _plnText, 0, eng.BlockSize);
                int prlBlock = sze - (sze % (cipher.BlockSize * _processorCount));
                _cmpText = new byte[sze];
                _decText = new byte[sze];
                _encText = new byte[sze];

                MemoryStream mIn  = new MemoryStream(_plnText);
                MemoryStream mOut = new MemoryStream();
                MemoryStream mRes = new MemoryStream();

                // *** Compare encryption output *** //

                // local processor
                cipher.Initialize(true, kp);
                BlockEncrypt(cipher, padding, _plnText, 0, ref _encText, 0);

                // streamcipher linear mode
                cs.IsParallel = false;
                // memorystream interface
                cs.Initialize(true, kp);
                cs.Write(mIn, mOut);

                if (!Evaluate.AreEqual(mOut.ToArray(), _encText))
                {
                    throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                }

                // byte array interface
                cs.Initialize(true, kp);
                cs.Write(_plnText, 0, ref _cmpText, 0);

                if (!Evaluate.AreEqual(_cmpText, _encText))
                {
                    throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
                }

                // ***compare decryption output *** //

                // local processor
                cipher.Initialize(false, kp);
                BlockDecrypt(cipher, padding, _encText, 0, ref _decText, 0);

                if (!Evaluate.AreEqual(_plnText, _decText))
                {
                    throw new Exception("CipherStreamTest: Decrypted arrays are not equal!");
                }

                // decrypt linear mode
                cipher2.IsParallel = false;
                mOut.Seek(0, SeekOrigin.Begin);
                cs.Initialize(false, kp);
                cs.Write(mOut, mRes);

                if (!Evaluate.AreEqual(mRes.ToArray(), _decText))
                {
                    throw new Exception("CipherStreamTest: Decrypted arrays are not equal!");
                }

                // byte array interface
                cs.Initialize(false, kp);
                Array.Resize(ref _cmpText, _encText.Length);
                cs.Write(_encText, 0, ref _cmpText, 0);

                if (!Evaluate.AreEqual(_cmpText, _decText))
                {
                    throw new Exception("CipherStreamTest: Decrypted arrays are not equal!");
                }
            }

            eng.Dispose();
        }