Exemplo n.º 1
0
        public void EncryptAndDecryptPaddingZeros()
        {
            Action <byte[]> check = plainText =>
            {
                byte[] cipherText, newPlainText;

                using (var algorithm = new SimpleSymmetricAlgorithm {
                    Mode = CipherMode.ECB, Padding = PaddingMode.Zeros
                })
                {
                    algorithm.GenerateKey();
                    algorithm.GenerateIV();

                    InternalEncryptAndDecrypt(algorithm, plainText, out cipherText, out newPlainText);
                }

                for (int i = 0; i < plainText.Length; i++)
                {
                    Assert.Equal(plainText[i], newPlainText[i]);
                }

                for (int i = plainText.Length; i < newPlainText.Length; i++)
                {
                    Assert.Equal(0, newPlainText[i]);
                }
            };

            foreach (var plainText in BlockSizeMultiplePlainTexts.Union(BlockSizeNonMultiplePlainTexts))
            {
                check(plainText);
            }
        }
Exemplo n.º 2
0
        public void EncryptAndDecryptPaddingNone()
        {
            Action <byte[]> check = plainText =>
            {
                byte[] cipherText, newPlainText;

                using (var algorithm = new SimpleSymmetricAlgorithm {
                    Mode = CipherMode.ECB, Padding = PaddingMode.None
                })
                {
                    algorithm.GenerateKey();
                    algorithm.GenerateIV();

                    InternalEncryptAndDecrypt(algorithm, plainText, out cipherText, out newPlainText);
                }

                Assert.Equal(plainText, newPlainText);
            };

            foreach (var plainText in BlockSizeMultiplePlainTexts)
            {
                check(plainText);
            }

            foreach (var plainText in BlockSizeNonMultiplePlainTexts)
            {
                Assert.Throws <CryptographicException>(() => check(plainText));
            }
        }
Exemplo n.º 3
0
        public void TransformBlock_Throws_IfParametersAreInvalid()
        {
            var inputBuffer  = new byte[BlockSizeBytes];
            var outputBuffer = new byte[BlockSizeBytes];
            var inputOffset  = 0;
            var inputCount   = BlockSizeBytes;
            var outputOffset = 0;

            using var transform = new SimpleSymmetricAlgorithm();
            using var encryptor = transform.CreateEncryptor();

            Assert.Throws <ArgumentNullException>(nameof(inputBuffer),
                                                  () => encryptor.TransformBlock(null !, inputOffset, inputCount, outputBuffer, outputOffset));
            Assert.Throws <ArgumentNullException>(nameof(outputBuffer),
                                                  () => encryptor.TransformBlock(inputBuffer, inputOffset, inputCount, null !, outputOffset));
            Assert.Throws <ArgumentOutOfRangeException>(nameof(inputOffset),
                                                        () => encryptor.TransformBlock(inputBuffer, -1, inputCount, outputBuffer, outputOffset));
            Assert.Throws <ArgumentOutOfRangeException>(nameof(outputOffset),
                                                        () => encryptor.TransformBlock(inputBuffer, inputOffset, inputCount, outputBuffer, -1));
            Assert.Throws <ArgumentOutOfRangeException>(nameof(inputCount),
                                                        () => encryptor.TransformBlock(inputBuffer, inputOffset, 0, outputBuffer, outputOffset));
            Assert.Throws <ArgumentException>(null,
                                              () => encryptor.TransformBlock(inputBuffer, inputCount, inputCount, outputBuffer, outputOffset));
            Assert.Throws <CryptographicException>(
                () => encryptor.TransformBlock(inputBuffer, inputOffset, inputCount - 1, outputBuffer, outputOffset));
        }
Exemplo n.º 4
0
        public void EncryptAndDecryptPaddingPKCS7()
        {
            Action <byte[]> check = plainText =>
            {
                byte[] cipherText, newPlainText, newPlainTextNoDepad;

                using (var algorithm = new SimpleSymmetricAlgorithm {
                    Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7
                })
                {
                    algorithm.GenerateKey();
                    algorithm.GenerateIV();

                    InternalEncryptAndDecrypt(algorithm, plainText, out cipherText, out newPlainText);

                    algorithm.Padding = PaddingMode.None;

                    newPlainTextNoDepad = InternalTransform(algorithm.CreateDecryptor, cipherText);
                }

                int padCount = newPlainTextNoDepad.Length - newPlainText.Length;

                byte[] padding = new byte[padCount];
                BlockCopy(newPlainTextNoDepad, newPlainText.Length, padding, 0, padCount);

                Assert.Equal(plainText, newPlainText);

                for (int i = 0; i < plainText.Length; i++)
                {
                    Assert.Equal(plainText[i], newPlainTextNoDepad[i]);
                }

                if (padCount > 0)
                {
                    Assert.Equal(padCount, padding[padCount - 1]);

                    for (int i = 0; i < padCount - 1; i++)
                    {
                        Assert.Equal(padCount, padding[i]);
                    }
                }
            };

            foreach (var plainText in BlockSizeMultiplePlainTexts.Union(BlockSizeNonMultiplePlainTexts))
            {
                check(plainText);
            }
        }
Exemplo n.º 5
0
 public void TransformBlockInvalidArgumentsTest()
 {
     using (var transform = new SimpleSymmetricAlgorithm())
     {
         using (var encryptor = transform.CreateEncryptor())
         {
             Assert.Throws <ArgumentNullException>(() => encryptor.TransformBlock(null, 0, BlockSizeBytes, new byte[BlockSizeBytes], 0));
             Assert.Throws <ArgumentNullException>(() => encryptor.TransformBlock(new byte[BlockSizeBytes], 0, BlockSizeBytes, null, 0));
             Assert.Throws <ArgumentOutOfRangeException>(() => encryptor.TransformBlock(new byte[BlockSizeBytes], -1, BlockSizeBytes, new byte[BlockSizeBytes], 0));
             Assert.Throws <ArgumentOutOfRangeException>(() => encryptor.TransformBlock(new byte[BlockSizeBytes], 0, BlockSizeBytes, new byte[BlockSizeBytes], -1));
             Assert.Throws <ArgumentOutOfRangeException>(() => encryptor.TransformBlock(new byte[BlockSizeBytes], 0, 0, new byte[BlockSizeBytes], 0));
             Assert.Throws <ArgumentException>(() => encryptor.TransformBlock(new byte[BlockSizeBytes], BlockSizeBytes, BlockSizeBytes, new byte[BlockSizeBytes], 0));
             Assert.Throws <CryptographicException>(() => encryptor.TransformBlock(new byte[BlockSizeBytes], 0, BlockSizeBytes - 1, new byte[BlockSizeBytes], 0));
         }
     }
 }
Exemplo n.º 6
0
        public void CheckLifecycle()
        {
            var crossPaddingTransformParameters =
                from p in PaddingModes
                from t in TransformModes
                select new { PaddingMode = p, TransformMode = t };

            var allSupportedParameters =
                from c in SupportedCipherModes
                from pt in crossPaddingTransformParameters
                select new { CipherMode = c, pt.PaddingMode, pt.TransformMode };

            var reqiresIVParameters =
                from c in CipherModesReqiresIV
                from pt in crossPaddingTransformParameters
                select new { CipherMode = c, pt.PaddingMode, pt.TransformMode };

            using var algorithm = new SimpleSymmetricAlgorithm();
Exemplo n.º 7
0
        public void CheckLifecycle()
        {
            var crossPaddingTransformParameters =
                from p in PaddingModes
                from t in TransformModes
                select new { PaddingMode = p, TransformMode = t };

            var allSupportedParameters =
                from c in SupportedCipherModes
                from pt in crossPaddingTransformParameters
                select new { CipherMode = c, PaddingMode = pt.PaddingMode, TransformMode = pt.TransformMode };

            var reqiresIVParameters =
                from c in CipherModesReqiresIV
                from pt in crossPaddingTransformParameters
                select new { CipherMode = c, PaddingMode = pt.PaddingMode, TransformMode = pt.TransformMode };

            using (var algorithm = new SimpleSymmetricAlgorithm())
            {
                Action <Func <SimpleSymmetricTransform> > checkValid = factory =>
                {
                    var transform = factory();
                    using (transform)
                    {
                        Assert.False(transform.DisposeCalled);
                    }
                    Assert.True(transform.DisposeCalled);
                };

                Action <Type, Func <SimpleSymmetricTransform> > checkInvalid =
                    (expectedExceptionType, factory) => Assert.Throws(expectedExceptionType, factory);

                // All ctor parameters (without CTS)
                foreach (var p in allSupportedParameters)
                {
                    checkValid(() =>
                               new SimpleSymmetricTransform(algorithm.Key, algorithm.IV, algorithm.BlockSize, CipherMode.ECB, p.PaddingMode, p.TransformMode));
                }

                // IV is null (ECB)
                foreach (var p in crossPaddingTransformParameters)
                {
                    checkValid(() =>
                               new SimpleSymmetricTransform(algorithm.Key, null, algorithm.BlockSize, CipherMode.ECB, p.PaddingMode, p.TransformMode));
                }

                // CTS is invalid
                foreach (var p in crossPaddingTransformParameters)
                {
                    checkInvalid(typeof(CryptographicException), () =>
                                 new SimpleSymmetricTransform(algorithm.Key, algorithm.IV, algorithm.BlockSize, CipherMode.CTS, p.PaddingMode, p.TransformMode));
                }

                // Key is null
                foreach (var p in allSupportedParameters)
                {
                    checkInvalid(typeof(ArgumentNullException), () =>
                                 new SimpleSymmetricTransform(null, algorithm.IV, algorithm.BlockSize, p.CipherMode, p.PaddingMode, p.TransformMode));
                }

                // IV is null (CBC, CFB, OFB)
                foreach (var p in reqiresIVParameters)
                {
                    checkInvalid(typeof(ArgumentNullException), () =>
                                 new SimpleSymmetricTransform(algorithm.Key, null, algorithm.BlockSize, p.CipherMode, p.PaddingMode, p.TransformMode));
                }
            }
        }