Exemple #1
0
        public void ToBuffer_ShouldReturnValidResult()
        {
            // Arrange.
            var cascadingKeyLengthInBytes = 1666;
            var derivationMode            = SecureSymmetricKeyDerivationMode.Truncation;
            var firstLayerAlgorithm       = SymmetricAlgorithmSpecification.Aes128Cbc;
            var secondLayerAlgorithm      = SymmetricAlgorithmSpecification.Aes128Cbc;
            var thirdLayerAlgorithm       = SymmetricAlgorithmSpecification.Aes128Cbc;
            var fourthLayerAlgorithm      = SymmetricAlgorithmSpecification.Aes128Cbc;

            using (var target = CascadingSymmetricKey.New(derivationMode, firstLayerAlgorithm, secondLayerAlgorithm, thirdLayerAlgorithm, fourthLayerAlgorithm))
            {
                // Act.
                using (var buffer = target.ToBuffer())
                {
                    buffer.Access(plaintext =>
                    {
                        // Assert.
                        plaintext.Should().NotBeNullOrEmpty();
                        plaintext.Length.Should().Be(cascadingKeyLengthInBytes);
                        plaintext.Count(value => value == 0x00).Should().NotBe(plaintext.Length);
                    });
                }
            }
        }
        private static void Encrypt_ShouldBeReversible_UsingCascadingSymmetricKey(CascadingSymmetricKey key)
        {
            using (var randomnessProvider = RandomNumberGenerator.Create())
            {
                // Arrange.
                var target          = new SymmetricStringProcessor(randomnessProvider);
                var plaintextObject = "䆟`ಮ䷆ʘ‣⦸⏹ⰄͶa✰ṁ亡Zᨖ0༂⽔9㗰";

                // Act.
                var ciphertextResult = target.Encrypt(plaintextObject, key);

                // Assert.
                ciphertextResult.Should().NotBeNullOrEmpty();
                ciphertextResult.Count(value => value == 0x00).Should().NotBe(ciphertextResult.Length);

                // Act.
                var plaintextResult = target.Decrypt(ciphertextResult, key);

                // Assert.
                plaintextResult.Should().NotBeNullOrEmpty();
                plaintextResult.Length.Should().Be(plaintextObject.Length);
                plaintextResult.Count(value => value == 0x00).Should().NotBe(plaintextResult.Length);

                for (var i = 0; i < plaintextResult.Length; i++)
                {
                    // Assert.
                    plaintextResult[i].Should().Be(plaintextObject[i]);
                }
            }
        }
Exemple #3
0
 private static void Encrypt_ShouldBeReversible_UsingCascadingSymmetricKey_WithTwoLayers(SecureSymmetricKeyDerivationMode derivationMode, SymmetricAlgorithmSpecification firstLayerAlgorithm, SymmetricAlgorithmSpecification secondLayerAlgorithm)
 {
     using (var key = CascadingSymmetricKey.New(derivationMode, firstLayerAlgorithm, secondLayerAlgorithm))
     {
         Encrypt_ShouldBeReversible_UsingCascadingSymmetricKey(key);
     }
 }
Exemple #4
0
        /* =================================================================================================================
         * Twofish and Threefish are out-of-scope for MVP-01.
         * =================================================================================================================
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForThreefish1024Cbc_InTruncationMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Threefish1024Cbc;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.Truncation;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForThreefish1024Cbc_InXorLayeringMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Threefish1024Cbc;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayering;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForThreefish1024Cbc_InXorLayeringWithSubstitutionMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Threefish1024Cbc;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayeringWithSubstitution;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForThreefish256Ecb_InTruncationMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Threefish256Ecb;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.Truncation;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForThreefish256Ecb_InXorLayeringMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Threefish256Ecb;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayering;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForThreefish256Ecb_InXorLayeringWithSubstitutionMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Threefish256Ecb;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayeringWithSubstitution;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForTwofish128Cbc_InTruncationMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Twofish128Cbc;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.Truncation;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForTwofish128Cbc_InXorLayeringMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Twofish128Cbc;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayering;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForTwofish128Cbc_InXorLayeringWithSubstitutionMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Twofish128Cbc;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayeringWithSubstitution;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForTwofish192Ecb_InTruncationMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Twofish192Ecb;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.Truncation;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForTwofish192Ecb_InXorLayeringMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Twofish192Ecb;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayering;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }
         *
         * [TestMethod]
         * public void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey_ForTwofish192Ecb_InXorLayeringWithSubstitutionMode()
         * {
         *  // Arrange.
         *  var algorithm = SymmetricAlgorithmSpecification.Twofish192Ecb;
         *  var derivationMode = SecureSymmetricKeyDerivationMode.XorLayeringWithSubstitution;
         *
         *  // Assert.
         *  Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(algorithm, derivationMode);
         * }*/

        private static void Encrypt_ShouldBeReversible_UsingCascadingSymmetricKey(CascadingSymmetricKey key)
        {
            using (var randomnessProvider = RandomNumberGenerator.Create())
            {
                // Arrange.
                var binarySerializer = new BinaryPassThroughSerializer();
                var target           = new SymmetricProcessor <Byte[]>(randomnessProvider, binarySerializer);
                var plaintextObject  = new Byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 };

                // Act.
                var ciphertextResult = target.Encrypt(plaintextObject, key);

                // Assert.
                ciphertextResult.Should().NotBeNullOrEmpty();
                ciphertextResult.Count(value => value == 0x00).Should().NotBe(ciphertextResult.Length);

                // Act.
                var plaintextResult = target.Decrypt(ciphertextResult, key);

                // Assert.
                plaintextResult.Should().NotBeNullOrEmpty();
                plaintextResult.Length.Should().Be(plaintextObject.Length);
                plaintextResult.Count(value => value == 0x00).Should().NotBe(plaintextResult.Length);

                for (var i = 0; i < plaintextResult.Length; i++)
                {
                    // Assert.
                    plaintextResult[i].Should().Be(plaintextObject[i]);
                }
            }
        }
        public void Encrypt_ShouldBeReversible_UsingCascadingSymmetricKey_WithTwoLayers()
        {
            // Arrange.
            var derivationMode       = SecureSymmetricKeyDerivationMode.XorLayering;
            var firstLayerAlgorithm  = SymmetricAlgorithmSpecification.Aes128Cbc;
            var secondLayerAlgorithm = SymmetricAlgorithmSpecification.Aes256Cbc;

            using (var key = CascadingSymmetricKey.New(derivationMode, firstLayerAlgorithm, secondLayerAlgorithm))
            {
                // Assert.
                Encrypt_ShouldBeReversible_UsingCascadingSymmetricKey(key);
            }
        }
Exemple #6
0
        public void ToBuffer_ShouldBeReversible_WithTwoLayers()
        {
            // Arrange.
            var depth                = 2;
            var derivationMode       = SecureSymmetricKeyDerivationMode.Truncation;
            var firstLayerAlgorithm  = SymmetricAlgorithmSpecification.Aes128Cbc;
            var secondLayerAlgorithm = SymmetricAlgorithmSpecification.Aes128Cbc;

            using (var target = CascadingSymmetricKey.New(derivationMode, firstLayerAlgorithm, secondLayerAlgorithm))
            {
                // Assert.
                ToBuffer_ShouldBeReversible(target, depth);
            }
        }
Exemple #7
0
        public void New_ShouldReturnValidKey_ForValidArguments()
        {
            // Arrange.
            var derivationMode       = SecureSymmetricKeyDerivationMode.Truncation;
            var firstLayerAlgorithm  = SymmetricAlgorithmSpecification.Aes128Cbc;
            var secondLayerAlgorithm = SymmetricAlgorithmSpecification.Aes128Cbc;
            var thirdLayerAlgorithm  = SymmetricAlgorithmSpecification.Aes128Cbc;
            var fourthLayerAlgorithm = SymmetricAlgorithmSpecification.Aes128Cbc;

            using (var target = CascadingSymmetricKey.New(derivationMode, firstLayerAlgorithm, secondLayerAlgorithm, thirdLayerAlgorithm, fourthLayerAlgorithm))
            {
                // Assert.
                target.Should().NotBeNull();
            }
        }
Exemple #8
0
        public void New_ShouldRaiseArgumentOutOfRangeException_ForUnspecifiedDerivationMode()
        {
            // Arrange.
            var derivationMode       = SecureSymmetricKeyDerivationMode.Unspecified;
            var firstLayerAlgorithm  = SymmetricAlgorithmSpecification.Aes128Cbc;
            var secondLayerAlgorithm = SymmetricAlgorithmSpecification.Aes128Cbc;
            var thirdLayerAlgorithm  = SymmetricAlgorithmSpecification.Aes128Cbc;
            var fourthLayerAlgorithm = SymmetricAlgorithmSpecification.Aes128Cbc;

            // Act.
            var action = new Action(() =>
            {
                using (var target = CascadingSymmetricKey.New(derivationMode, firstLayerAlgorithm, secondLayerAlgorithm, thirdLayerAlgorithm, fourthLayerAlgorithm))
                {
                    return;
                }
            });

            // Assert.
            action.Should().Throw <ArgumentOutOfRangeException>();
        }
Exemple #9
0
        private static void ToBuffer_ShouldBeReversible(CascadingSymmetricKey target, Int32 depth)
        {
            using (var randomnessProvider = RandomNumberGenerator.Create())
            {
                // Arrange.
                var processor       = new SymmetricStringProcessor(randomnessProvider);
                var plaintextObject = "䆟`ಮ䷆ʘ‣⦸⏹ⰄͶa✰ṁ亡Zᨖ0༂⽔9㗰";
                var ciphertext      = processor.Encrypt(plaintextObject, target);

                // Act.
                using (var buffer = target.ToBuffer())
                {
                    using (var parityKey = CascadingSymmetricKey.FromBuffer(buffer))
                    {
                        // Arrange.
                        var result = processor.Decrypt(ciphertext, parityKey);

                        // Assert.
                        result.Should().Be(plaintextObject);
                    }
                }
            }
        }