|  | @@ -1,15 +1,77 @@
 | 
	
		
			
				|  |  | -using Renci.SshNet.Security.Cryptography;
 | 
	
		
			
				|  |  | +using System;
 | 
	
		
			
				|  |  | +using System.Linq;
 | 
	
		
			
				|  |  |  using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
	
		
			
				|  |  | +using Renci.SshNet.Security.Cryptography;
 | 
	
		
			
				|  |  | +using Renci.SshNet.Security.Cryptography.Ciphers;
 | 
	
		
			
				|  |  | +using Renci.SshNet.Security.Cryptography.Ciphers.Paddings;
 | 
	
		
			
				|  |  |  using Renci.SshNet.Tests.Common;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -namespace Renci.SshNet.Tests
 | 
	
		
			
				|  |  | +namespace Renci.SshNet.Tests.Classes.Security.Cryptography
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    /// <summary>
 | 
	
		
			
				|  |  | -    ///This is a test class for BlockCipherTest and is intended
 | 
	
		
			
				|  |  | -    ///to contain all BlockCipherTest Unit Tests
 | 
	
		
			
				|  |  | -    ///</summary>
 | 
	
		
			
				|  |  | -    [TestClass()]
 | 
	
		
			
				|  |  | +    [TestClass]
 | 
	
		
			
				|  |  |      public class BlockCipherTest  : TestBase
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void EncryptShouldTakeIntoAccountPaddingForLengthOfOutputBufferPassedToEncryptBlock()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var input = new byte[] { 0x2c, 0x1a, 0x05, 0x00, 0x68 };
 | 
	
		
			
				|  |  | +            var output = new byte[] { 0x0a, 0x00, 0x03, 0x02, 0x06, 0x08, 0x07, 0x05 };
 | 
	
		
			
				|  |  | +            var key = new byte[] { 0x17, 0x78, 0x56, 0xe1, 0x3e, 0xbd, 0x3e, 0x50, 0x1d, 0x79, 0x3f, 0x0f, 0x55, 0x37, 0x45, 0x54 };
 | 
	
		
			
				|  |  | +            var blockCipher = new BlockCipherStub(key, 8, null, new PKCS5Padding())
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    EncryptBlockDelegate = (inputBuffer, inputOffset, inputCount, outputBuffer, outputOffset) =>
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            Assert.AreEqual(8, outputBuffer.Length);
 | 
	
		
			
				|  |  | +                            Buffer.BlockCopy(output, 0, outputBuffer, 0, output.Length);
 | 
	
		
			
				|  |  | +                            return inputBuffer.Length;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var actual = blockCipher.Encrypt(input);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.IsTrue(output.SequenceEqual(actual));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void DecryptShouldTakeIntoAccountPaddingForLengthOfOutputBufferPassedToDecryptBlock()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var input = new byte[] { 0x2c, 0x1a, 0x05, 0x00, 0x68 };
 | 
	
		
			
				|  |  | +            var output = new byte[] { 0x0a, 0x00, 0x03, 0x02, 0x06, 0x08, 0x07, 0x05 };
 | 
	
		
			
				|  |  | +            var key = new byte[] { 0x17, 0x78, 0x56, 0xe1, 0x3e, 0xbd, 0x3e, 0x50, 0x1d, 0x79, 0x3f, 0x0f, 0x55, 0x37, 0x45, 0x54 };
 | 
	
		
			
				|  |  | +            var blockCipher = new BlockCipherStub(key, 8, null, new PKCS5Padding())
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    DecryptBlockDelegate = (inputBuffer, inputOffset, inputCount, outputBuffer, outputOffset) =>
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            Assert.AreEqual(8, outputBuffer.Length);
 | 
	
		
			
				|  |  | +                            Buffer.BlockCopy(output, 0, outputBuffer, 0, output.Length);
 | 
	
		
			
				|  |  | +                            return inputBuffer.Length;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var actual = blockCipher.Decrypt(input);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.IsTrue(output.SequenceEqual(actual));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private class BlockCipherStub : BlockCipher
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            public Func<byte[], int, int, byte[], int, int> EncryptBlockDelegate;
 | 
	
		
			
				|  |  | +            public Func<byte[], int, int, byte[], int, int> DecryptBlockDelegate;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            public BlockCipherStub(byte[] key, byte blockSize, CipherMode mode, CipherPadding padding) : base(key, blockSize, mode, padding)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            public override int EncryptBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return EncryptBlockDelegate(inputBuffer, inputOffset, inputCount, outputBuffer, outputOffset);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            public override int DecryptBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return DecryptBlockDelegate(inputBuffer, inputOffset, inputCount, outputBuffer, outputOffset);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |