summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Hook <dgh@bouncycastle.org>2017-07-06 19:51:10 +1000
committerDavid Hook <dgh@bouncycastle.org>2017-07-06 19:51:10 +1000
commit7ea555ece02dc76d2e668f1f4fcc7a9bc6a736ed (patch)
tree3ef85e5c93961e7a83a7c76ba696d45931dc3d5d
parentadded KCTR (diff)
downloadBouncyCastle.NET-ed25519-7ea555ece02dc76d2e668f1f4fcc7a9bc6a736ed.tar.xz
refactored out key size
-rw-r--r--crypto/src/crypto/engines/Dstu7624Engine.cs285
-rw-r--r--crypto/src/crypto/engines/Dstu7624WrapEngine.cs4
-rw-r--r--crypto/src/crypto/macs/DSTU7624Mac.cs4
-rw-r--r--crypto/src/crypto/util/Pack.cs9
-rw-r--r--crypto/test/src/crypto/test/DSTU7624Test.cs68
5 files changed, 186 insertions, 184 deletions
diff --git a/crypto/src/crypto/engines/Dstu7624Engine.cs b/crypto/src/crypto/engines/Dstu7624Engine.cs
index 4699ee5bd..422b5574a 100644
--- a/crypto/src/crypto/engines/Dstu7624Engine.cs
+++ b/crypto/src/crypto/engines/Dstu7624Engine.cs
@@ -3,6 +3,7 @@ using System.Collections;
 
 using Org.BouncyCastle.Crypto.Parameters;
 using Org.BouncyCastle.Utilities;
+using Org.BouncyCastle.Crypto.Utilities;
 
 namespace Org.BouncyCastle.Crypto.Engines
 {
@@ -12,133 +13,124 @@ namespace Org.BouncyCastle.Crypto.Engines
     public class Dstu7624Engine
          : IBlockCipher
     {
-        private const int BITS_IN_WORD = 64;
-        private const int BITS_IN_BYTE = 8;
+        private static readonly int BITS_IN_WORD = 64;
+        private static readonly int BITS_IN_BYTE = 8;
 
-        /* Block words size. */
-        private const int kNB_128 = 2;
-        private const int kNB_256 = 4;
-        private const int kNB_512 = 8;
+        private static readonly int REDUCTION_POLYNOMIAL = 0x011d; /* x^8 + x^4 + x^3 + x^2 + 1 */
 
-        /* Key words size. */
-        private const int kNK_128 = 2;
-        private const int kNK_256 = 4;
-        private const int kNK_512 = 8;
+        private ulong[] internalState;
+        private ulong[] workingKey;
+        private ulong[][] roundKeys;
 
-        /* Block bits size. */
-        private const int kBLOCK_128 = kNB_128 * BITS_IN_WORD;
-        private const int kBLOCK_256 = kNB_256 * BITS_IN_WORD;
-        private const int kBLOCK_512 = kNB_512 * BITS_IN_WORD;
+        /* Number of 64-bit words in block */
+        private int wordsInBlock;
 
-        /* Block bits size. */
-        private const int kKEY_128 = kNK_128 * BITS_IN_WORD;
-        private const int kKEY_256 = kNK_256 * BITS_IN_WORD;
-        private const int kKEY_512 = kNK_512 * BITS_IN_WORD;
-
-        /* Number of enciphering rounds size depending on key length. */
-        private const int kNR_128 = 10;
-        private const int kNR_256 = 14;
-        private const int kNR_512 = 18;
-
-        private const int REDUCTION_POLYNOMIAL = 0x011d;  /* x^8 + x^4 + x^3 + x^2 + 1 */
-
-
-        private int nb;  /* Number of 64-bit words in enciphering block. */
-        private int nk;  /*< Number of 64-bit words in key. */
-        private int roundKeysAmount;  /*< Number of enciphering rounds. */
-
-        private ulong[] internalState = null;  /*< Current cipher state. */
-
-
-        private ulong[] workingKey = null;
-        private ulong[][] roundKeys = null;  /*< Round key computed from enciphering key. */
+        /* Number of 64-bit words in key */
+        private int wordsInKey;
 
+        /* Number of encryption rounds depending on key length */
+        private static int ROUNDS_128 = 10;
+        private static int ROUNDS_256 = 14;
+        private static int ROUNDS_512 = 18;
 
         private int blockSizeBits;
-        private int keySizeBits;
+        private int roundsAmount;
 
         private bool forEncryption;
 
+        private byte[] internalStateBytes;
+        private byte[] tempInternalStateBytes;
 
-        public Dstu7624Engine(int blockSizeBits, int keySizeBits)
+        public Dstu7624Engine(int blockSizeBits)
         {
-            this.blockSizeBits = blockSizeBits;
-            this.keySizeBits = keySizeBits;
-
-            if (blockSizeBits == kBLOCK_128)
+            /* DSTU7624 supports 128 | 256 | 512 key/block sizes */
+            if (blockSizeBits != 128 && blockSizeBits != 256 && blockSizeBits != 512)
             {
-                nb = kBLOCK_128 / BITS_IN_WORD;
-                if (keySizeBits == kKEY_128)
-                {
-                    nk = kKEY_128 / BITS_IN_WORD;
-                    roundKeysAmount = kNR_128;
-                }
-                else if (keySizeBits == kKEY_256)
-                {
-                    nk = kKEY_256 / BITS_IN_WORD;
-                    roundKeysAmount = kNR_256;
-                }
-                else
-                {
-                    throw new ArgumentException("Unsupported key size");
-                }
+                throw new ArgumentException("Unsupported block length: only 128/256/512 are allowed");
             }
-            else if (blockSizeBits == 256)
+            this.blockSizeBits = blockSizeBits;
+
+            wordsInBlock = blockSizeBits / BITS_IN_WORD;
+            internalState = new ulong[wordsInBlock];
+
+            internalStateBytes = new byte[internalState.Length * 64 / BITS_IN_BYTE];
+            tempInternalStateBytes = new byte[internalState.Length * 64 / BITS_IN_BYTE];
+        }
+
+        #region INITIALIZATION
+        public virtual void Init(bool forEncryption, ICipherParameters parameters)
+        {
+            if (parameters is KeyParameter)
             {
-                nb = kBLOCK_256 / BITS_IN_WORD;
-                if (keySizeBits == kKEY_256)
+                this.forEncryption = forEncryption;
+
+                byte[] keyBytes = ((KeyParameter)parameters).GetKey();
+                int keyBitLength = keyBytes.Length * BITS_IN_BYTE;
+                int blockBitLength = wordsInBlock * BITS_IN_WORD;
+
+                if (keyBitLength != 128 && keyBitLength != 256 && keyBitLength != 512)
                 {
-                    nk = kKEY_256 / BITS_IN_WORD;
-                    roundKeysAmount = kNR_256;
+                    throw new ArgumentException("unsupported key length: only 128/256/512 are allowed");
                 }
-                else if (keySizeBits == kKEY_512)
+
+                /* Limitations on key lengths depending on block lengths. See table 6.1 in standard */
+                if (blockBitLength == 128)
                 {
-                    nk = kKEY_512 / BITS_IN_WORD;
-                    roundKeysAmount = kNR_512;
+                    if (keyBitLength == 512)
+                    {
+                        throw new ArgumentException("Unsupported key length");
+                    }
                 }
-                else
+
+                if (blockBitLength == 256)
                 {
-                    throw new ArgumentException("Unsupported key size");
+                    if (keyBitLength == 128)
+                    {
+                        throw new ArgumentException("Unsupported key length");
+                    }
                 }
-            }
-            else if (blockSizeBits == kBLOCK_512)
-            {
-                nb = kBLOCK_512 / BITS_IN_WORD;
-                if (keySizeBits == kKEY_512)
+
+                if (blockBitLength == 512)
                 {
-                    nk = kKEY_512 / BITS_IN_WORD;
-                    roundKeysAmount = kNR_512;
+                    if (keyBitLength != 512)
+                    {
+                        throw new ArgumentException("Unsupported key length");
+                    }
                 }
-                else
+
+                switch (keyBitLength)
                 {
-                    throw new ArgumentException("Unsupported key size");
+                    case 128:
+                        roundsAmount = ROUNDS_128;
+                        break;
+                    case 256:
+                        roundsAmount = ROUNDS_256;
+                        break;
+                    case 512:
+                        roundsAmount = ROUNDS_512;
+                        break;
                 }
-            }
-            else
-            {
-                throw new ArgumentException("Unsupported block size");
-            }
 
-            internalState = new ulong[nb];
+                wordsInKey = keyBitLength / BITS_IN_WORD;
 
-            roundKeys = new ulong[roundKeysAmount + 1][];
-
-            for (int i = 0; i < roundKeysAmount + 1; i++)
-            {
-                roundKeys[i] = new ulong[nb];
-            }
-        }
+                /* +1 round key as defined in standard */
+                roundKeys = new ulong[roundsAmount + 1][];
+                for (int roundKeyIndex = 0; roundKeyIndex < roundKeys.Length; roundKeyIndex++)
+                {
+                    roundKeys[roundKeyIndex] = new ulong[wordsInBlock];
+                }
 
+                workingKey = new ulong[wordsInKey];
 
+                if (keyBytes.Length != wordsInKey * BITS_IN_WORD / BITS_IN_BYTE)
+                {
+                    throw new ArgumentException("Invalid key parameter passed to DSTU7624Engine init");
+                }
 
-        #region INITIALIZATION
-        public virtual void Init(bool forEncryption, ICipherParameters parameters)
-        {
-            if (parameters is KeyParameter)
-            {
-                workingKey = BytesToWords(((KeyParameter)parameters).GetKey());
+                /* Unpack encryption key bytes to words */
+                Pack.LE_To_UInt64(keyBytes, 0, workingKey);
 
-                ulong[] kt = new ulong[nb];
+                ulong[] kt = new ulong[wordsInBlock];
 
                 KeyExpandKT(workingKey, kt);
 
@@ -158,21 +150,21 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void KeyExpandKT(ulong[] key, ulong[] kt)
         {
-            ulong[] k0 = new ulong[nb];
-            ulong[] k1 = new ulong[nb];
+            ulong[] k0 = new ulong[wordsInBlock];
+            ulong[] k1 = new ulong[wordsInBlock];
 
-            internalState = new ulong[nb];
-            internalState[0] += (ulong)(nb + nk + 1);
+            internalState = new ulong[wordsInBlock];
+            internalState[0] += (ulong)(wordsInBlock + wordsInKey + 1);
 
-            if (nb == nk)
+            if (wordsInBlock == wordsInKey)
             {
                 Array.Copy(key, k0, k0.Length);
                 Array.Copy(key, k1, k1.Length);
             }
             else
             {
-                Array.Copy(key, 0, k0, 0, nb);
-                Array.Copy(key, nb, k1, 0, nb);
+                Array.Copy(key, 0, k0, 0, wordsInBlock);
+                Array.Copy(key, wordsInBlock, k1, 0, wordsInBlock);
             }
 
             AddRoundKeyExpand(k0);
@@ -187,33 +179,34 @@ namespace Org.BouncyCastle.Crypto.Engines
 
             EncryptionRound();
 
-            Array.Copy(internalState, kt, nb);
+            Array.Copy(internalState, kt, wordsInBlock);
         }
+
         private void KeyExpandEven(ulong[] key, ulong[] kt)
         {
-            ulong[] initial_data = new ulong[nk];
+            ulong[] initial_data = new ulong[wordsInKey];
 
-            ulong[] kt_round = new ulong[nb];
+            ulong[] kt_round = new ulong[wordsInBlock];
 
-            ulong[] tmv = new ulong[nb];
+            ulong[] tmv = new ulong[wordsInBlock];
 
             int round = 0;
 
-            Array.Copy(key, initial_data, nk);
+            Array.Copy(key, initial_data, wordsInKey);
 
-            for (int i = 0; i < nb; i++)
+            for (int i = 0; i < wordsInBlock; i++)
             {
                 tmv[i] = 0x0001000100010001;
             }
 
             while (true)
             {
-                Array.Copy(kt, internalState, nb);
+                Array.Copy(kt, internalState, wordsInBlock);
 
                 AddRoundKeyExpand(tmv);
 
-                Array.Copy(internalState, kt_round, nb);
-                Array.Copy(initial_data, internalState, nb);
+                Array.Copy(internalState, kt_round, wordsInBlock);
+                Array.Copy(initial_data, internalState, wordsInBlock);
 
                 AddRoundKeyExpand(kt_round);
 
@@ -225,24 +218,24 @@ namespace Org.BouncyCastle.Crypto.Engines
 
                 AddRoundKeyExpand(kt_round);
 
-                Array.Copy(internalState, roundKeys[round], nb);
+                Array.Copy(internalState, roundKeys[round], wordsInBlock);
 
-                if (roundKeysAmount == round)
+                if (roundsAmount == round)
                 {
                     break;
                 }
-                if (nk != nb)
+                if (wordsInKey != wordsInBlock)
                 {
                     round += 2;
 
                     ShiftLeft(tmv);
 
-                    Array.Copy(kt, internalState, nb);
+                    Array.Copy(kt, internalState, wordsInBlock);
 
                     AddRoundKeyExpand(tmv);
 
-                    Array.Copy(internalState, kt_round, nb);
-                    Array.Copy(initial_data, nb, internalState, 0, nb);
+                    Array.Copy(internalState, kt_round, wordsInBlock);
+                    Array.Copy(initial_data, wordsInBlock, internalState, 0, wordsInBlock);
 
                     AddRoundKeyExpand(kt_round);
 
@@ -254,9 +247,9 @@ namespace Org.BouncyCastle.Crypto.Engines
 
                     AddRoundKeyExpand(kt_round);
 
-                    Array.Copy(internalState, roundKeys[round], nb);
+                    Array.Copy(internalState, roundKeys[round], wordsInBlock);
 
-                    if (roundKeysAmount == round)
+                    if (roundsAmount == round)
                     {
                         break;
                     }
@@ -273,9 +266,9 @@ namespace Org.BouncyCastle.Crypto.Engines
         }
         private void KeyExpandOdd()
         {
-            for (int i = 1; i < roundKeysAmount; i += 2)
+            for (int i = 1; i < roundsAmount; i += 2)
             {
-                Array.Copy(roundKeys[i - 1], roundKeys[i], nb);
+                Array.Copy(roundKeys[i - 1], roundKeys[i], wordsInBlock);
                 RotateLeft(roundKeys[i]);
             }
         }
@@ -311,11 +304,11 @@ namespace Org.BouncyCastle.Crypto.Engines
             
             ulong[] plain_ = BytesToWords(plain);
 
-            Array.Copy(plain_, internalState, nb);
+            Array.Copy(plain_, internalState, wordsInBlock);
 
             AddRoundKey(round);
 
-            for (round = 1; round < roundKeysAmount; round++)
+            for (round = 1; round < roundsAmount; round++)
             {
                 EncryptionRound();
 
@@ -324,11 +317,11 @@ namespace Org.BouncyCastle.Crypto.Engines
             }
             EncryptionRound();
 
-            AddRoundKey(roundKeysAmount);
+            AddRoundKey(roundsAmount);
 
             ulong[] cipherText_ = new ulong[internalState.Length];
 
-            Array.Copy(internalState, cipherText_, nb);
+            Array.Copy(internalState, cipherText_, wordsInBlock);
 
             byte[] temp = WordsToBytes(cipherText_);
 
@@ -340,15 +333,15 @@ namespace Org.BouncyCastle.Crypto.Engines
             Array.Copy(cipherText, inOff, cipherText, 0, blockSizeBits / BITS_IN_BYTE);
             Array.Resize(ref cipherText, blockSizeBits / BITS_IN_BYTE);
 
-            int round = roundKeysAmount;
+            int round = roundsAmount;
 
             ulong[] cipherText_ = BytesToWords(cipherText);
 
-            Array.Copy(cipherText_, internalState, nb);
+            Array.Copy(cipherText_, internalState, wordsInBlock);
 
             SubRoundKey(round);
 
-            for (round = roundKeysAmount - 1; round > 0; round--)
+            for (round = roundsAmount - 1; round > 0; round--)
             {
                 DecryptionRound();
                 XorRoundKey(round);
@@ -359,7 +352,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
             ulong[] decryptedText_ = new ulong[internalState.Length];
 
-            Array.Copy(internalState, decryptedText_, nb);
+            Array.Copy(internalState, decryptedText_, wordsInBlock);
 
 
             byte[] temp = WordsToBytes(decryptedText_);
@@ -378,7 +371,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void AddRoundKeyExpand(ulong[] value)
         {
-            for (int i = 0; i < nb; i++)
+            for (int i = 0; i < wordsInBlock; i++)
             {
                 internalState[i] += value[i];
             }
@@ -428,7 +421,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void XorRoundKeyExpand(ulong[] value)
         {
-            for (int i = 0; i < nb; i++)
+            for (int i = 0; i < wordsInBlock; i++)
             {
                 internalState[i] ^= value[i];
             }
@@ -436,7 +429,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void XorRoundKey(int round)
         {
-            for (int i = 0; i < nb; i++)
+            for (int i = 0; i < wordsInBlock; i++)
             {
                 internalState[i] ^= roundKeys[round][i];
             }
@@ -449,18 +442,18 @@ namespace Org.BouncyCastle.Crypto.Engines
 
             byte[] stateBytes = WordsToBytes(internalState);
 
-            byte[] nstate = new byte[nb * sizeof(ulong)];
+            byte[] nstate = new byte[wordsInBlock * sizeof(ulong)];
 
             for (row = 0; row < sizeof(ulong); row++)
             {
-                if (row % (sizeof(ulong) / nb) == 0)
+                if (row % (sizeof(ulong) / wordsInBlock) == 0)
                 {
                     shift += 1;
                 }
 
-                for (col = 0; col < nb; col++)
+                for (col = 0; col < wordsInBlock; col++)
                 {
-                    nstate[row + ((col + shift) % nb) * sizeof(ulong)] = stateBytes[row + col * sizeof(ulong)];
+                    nstate[row + ((col + shift) % wordsInBlock) * sizeof(ulong)] = stateBytes[row + col * sizeof(ulong)];
                 }
             }
 
@@ -474,18 +467,18 @@ namespace Org.BouncyCastle.Crypto.Engines
             int shift = -1;
 
             byte[] stateBytes = WordsToBytes(internalState);
-            byte[] nstate = new byte[nb * sizeof(ulong)];
+            byte[] nstate = new byte[wordsInBlock * sizeof(ulong)];
 
             for (row = 0; row < sizeof(ulong); row++)
             {
-                if (row % (sizeof(ulong) / nb) == 0)
+                if (row % (sizeof(ulong) / wordsInBlock) == 0)
                 {
                     shift += 1;
                 }
 
-                for (col = 0; col < nb; col++)
+                for (col = 0; col < wordsInBlock; col++)
                 {
-                    nstate[row + col * sizeof(ulong)] = stateBytes[row + ((col + shift) % nb) * sizeof(ulong)];
+                    nstate[row + col * sizeof(ulong)] = stateBytes[row + ((col + shift) % wordsInBlock) * sizeof(ulong)];
                 }
             }
 
@@ -537,7 +530,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void AddRoundKey(int round)
         {
-            for (int i = 0; i < nb; ++i)
+            for (int i = 0; i < wordsInBlock; ++i)
             {
                 internalState[i] += roundKeys[round][i];
             }
@@ -545,7 +538,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void SubRoundKey(int round)
         {
-            for (int i = 0; i < nb; ++i)
+            for (int i = 0; i < wordsInBlock; ++i)
             {
                 internalState[i] -= roundKeys[round][i];
             }
@@ -568,7 +561,7 @@ namespace Org.BouncyCastle.Crypto.Engines
             ulong result;
             byte[] stateBytes = WordsToBytes(internalState);
 
-            for (col = 0; col < nb; ++col)
+            for (col = 0; col < wordsInBlock; ++col)
             {
                 result = 0;
                 for (row = sizeof(ulong) - 1; row >= 0; --row)
@@ -611,7 +604,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void SubBytes()
         {
-            for (int i = 0; i < nb; i++)
+            for (int i = 0; i < wordsInBlock; i++)
             {
                 internalState[i] = sboxesForEncryption[0][internalState[i] & 0x00000000000000FF] |
                            ((ulong)sboxesForEncryption[1][(internalState[i] & 0x000000000000FF00) >> 8] << 8) |
@@ -626,7 +619,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
         private void InvSubBytes()
         {
-            for (int i = 0; i < nb; i++)
+            for (int i = 0; i < wordsInBlock; i++)
             {
                 internalState[i] = sboxesForDecryption[0][internalState[i] & 0x00000000000000FF] |
                            ((ulong)sboxesForDecryption[1][(internalState[i] & 0x000000000000FF00) >> 8] << 8) |
diff --git a/crypto/src/crypto/engines/Dstu7624WrapEngine.cs b/crypto/src/crypto/engines/Dstu7624WrapEngine.cs
index bfe8d9c1c..5d21f6e85 100644
--- a/crypto/src/crypto/engines/Dstu7624WrapEngine.cs
+++ b/crypto/src/crypto/engines/Dstu7624WrapEngine.cs
@@ -21,9 +21,9 @@ namespace Org.BouncyCastle.Crypto.Engines
           private readonly byte[] checkSumArray, zeroArray;
 
 
-          public Dstu7624WrapEngine(int blockSizeBits, int keySizeBits)
+          public Dstu7624WrapEngine(int blockSizeBits)
           {
-               engine = new Dstu7624Engine(blockSizeBits, keySizeBits);
+               engine = new Dstu7624Engine(blockSizeBits);
                param = null;
            
                blockSize = blockSizeBits / 8;
diff --git a/crypto/src/crypto/macs/DSTU7624Mac.cs b/crypto/src/crypto/macs/DSTU7624Mac.cs
index a189e8638..953d8164f 100644
--- a/crypto/src/crypto/macs/DSTU7624Mac.cs
+++ b/crypto/src/crypto/macs/DSTU7624Mac.cs
@@ -22,9 +22,9 @@ namespace Org.BouncyCastle.Crypto.Macs
           private byte[] buf;
           private int bufOff;
 
-          public Dstu7624Mac(int blockSizeBits, int keySizeBits, int q)
+          public Dstu7624Mac(int blockSizeBits, int q)
           {
-               engine = new Dstu7624Engine(blockSizeBits, keySizeBits);
+               engine = new Dstu7624Engine(blockSizeBits);
 
                blockSize = blockSizeBits / 8;
 
diff --git a/crypto/src/crypto/util/Pack.cs b/crypto/src/crypto/util/Pack.cs
index 96f293d72..ebe5b7af1 100644
--- a/crypto/src/crypto/util/Pack.cs
+++ b/crypto/src/crypto/util/Pack.cs
@@ -298,5 +298,14 @@ namespace Org.BouncyCastle.Crypto.Utilities
             uint hi = LE_To_UInt32(bs, off + 4);
             return ((ulong)hi << 32) | (ulong)lo;
         }
+
+        internal static void LE_To_UInt64(byte[] bs, int off, ulong[] ns)
+        {
+            for (int i = 0; i < ns.Length; ++i)
+            {
+                ns[i] = LE_To_UInt64(bs, off);
+                off += 8;
+            }
+        }
     }
 }
diff --git a/crypto/test/src/crypto/test/DSTU7624Test.cs b/crypto/test/src/crypto/test/DSTU7624Test.cs
index baced41fd..67dcd4420 100644
--- a/crypto/test/src/crypto/test/DSTU7624Test.cs
+++ b/crypto/test/src/crypto/test/DSTU7624Test.cs
@@ -19,7 +19,7 @@ namespace Org.BouncyCastle.Crypto.Tests
     public class Dstu7624Test : CipherTest
     {
         public Dstu7624Test()
-            : base(tests, new Dstu7624Engine(256, 256), new KeyParameter(new byte[32])) { }
+            : base(tests, new Dstu7624Engine(256), new KeyParameter(new byte[32])) { }
 
 
 
@@ -48,32 +48,32 @@ namespace Org.BouncyCastle.Crypto.Tests
                new KBlockCipherVectorTest(13, new KCfbBlockCipher(new Dstu7624Engine(512, 512), 512), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "06C061A4A66DFC0910034B3CFBDC4206D8908241C56BF41C4103CFD6DF322210B87F57EAE9F9AD815E606a7D1E8E6BD7CB1EBFBDBCB085C2D06BF3CC1586CB2E88C9155E95B4872D86B49D80F5745B605EAF488AA520A717A92F4D68838E42C995", "EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F"),
                */
                //CBC mode (PADDING NOT SUPPORTED)
-               new BlockCipherVectorTest(14, new CbcBlockCipher(new Dstu7624Engine(128, 128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "A73625D7BE994E85469A9FAABCEDAAB6DBC5F65DD77BB35E06BD7D1D8EAFC8624D6CB31CE189C82B8979F2936DE9BF14"),
-               new BlockCipherVectorTest(15, new CbcBlockCipher(new Dstu7624Engine(128, 128)), new ParametersWithIV(new KeyParameter(Hex.Decode("0F0E0D0C0B0A09080706050403020100")), Hex.Decode("1F1E1D1C1B1A19181716151413121110")), "88F2F048BA696170E3818915E0DBC0AFA6F141FEBC2F817138DA4AAB2DBF9CE490A488C9C82AC83FB0A6C0EEB64CFD22", "4F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A29282726252423222120"),
-               new BlockCipherVectorTest(16, new CbcBlockCipher(new Dstu7624Engine(128, 256)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")), Hex.Decode("202122232425262728292A2B2C2D2E2F")), "303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D8000", "13EA15843AD14C50BC03ECEF1F43E398E4217752D3EB046AC393DACC5CA1D6FA0EB9FCEB229362B4F1565527EE3D8433"),
-               new BlockCipherVectorTest(17, new CbcBlockCipher(new Dstu7624Engine(128, 256)), new ParametersWithIV(new KeyParameter(Hex.Decode("1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("2F2E2D2C2B2A29282726252423222120")), "BC8F026FC603ECE05C24FDE87542730999B381870882AC0535D4368C4BABD81B884E96E853EE7E055262D9D204FBE212", "5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39383736353433323130"),
-               new BlockCipherVectorTest(18, new CbcBlockCipher(new Dstu7624Engine(256, 256)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")), Hex.Decode("202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), "404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F", "9CDFDAA75929E7C2A5CFC1BF16B42C5AE3886D0258E8C577DC01DAF62D185FB999B9867736B87110F5F1BC7481912C593F48FF79E2AFDFAB9F704A277EC3E557B1B0A9F223DAE6ED5AF591C4F2D6FB22E48334F5E9B96B1A2EA5200F30A406CE"),
-               new BlockCipherVectorTest(19, new CbcBlockCipher(new Dstu7624Engine(256, 512)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F")), "606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF", "B8A2474578C2FEBF3F94703587BD5FDC3F4A4D2F43575B6144A1E1031FB3D1452B7FD52F5E3411461DAC506869FF8D2FAEF4FEE60379AE00B33AA3EAF911645AF8091CD8A45D141D1FB150E5A01C1F26FF3DBD26AC4225EC7577B2CE57A5B0FF"),
-               new BlockCipherVectorTest(20, new CbcBlockCipher(new Dstu7624Engine(256, 512)), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "C69A59E10D00F087319B62288A57417C074EAD07C732A87055F0A5AD2BB288105705C45E091A9A6726E9672DC7D8C76FC45C782BCFEF7C39D94DEB84B17035BC8651255A0D34373451B6E1A2C827DB97566C9FF5506C5579F982A0EFC5BA7C28", "BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160"),
-               new BlockCipherVectorTest(21, new CbcBlockCipher(new Dstu7624Engine(512, 512)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")), "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF", "D4739B829EF901B24C1162AE4FDEF897EDA41FAC7F5770CDC90E1D1CDF124E8D7831E06B4498A4B6F6EC815DF2461DC99BB0449B0F09FCAA2C84090534BCC9329626FD74EF8F0A0BCB5765184629C3CBF53B0FB134F6D0421174B1C4E884D1CD1069A7AD19752DCEBF655842E79B7858BDE01390A760D85E88925BFE38B0FA57"),
-               new BlockCipherVectorTest(22, new CbcBlockCipher(new Dstu7624Engine(512, 512)), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "5D5B3E3DE5BAA70E0A0684D458856CE759C6018D0B3F087FC1DAC101D380236DD934F2880B02D56A575BCA35A0CE4B0D9BA1F4A39C16CA7D80D59956630F09E54EC91E32B6830FE08323ED393F8028D150BF03CAD0629A5AFEEFF6E44257980618DB2F32B7B2B65B96E8451F1090829D2FFFC615CC1581E9221438DCEAD1FD12", "FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A89888786858483828180"),
+               new BlockCipherVectorTest(14, new CbcBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "A73625D7BE994E85469A9FAABCEDAAB6DBC5F65DD77BB35E06BD7D1D8EAFC8624D6CB31CE189C82B8979F2936DE9BF14"),
+               new BlockCipherVectorTest(15, new CbcBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("0F0E0D0C0B0A09080706050403020100")), Hex.Decode("1F1E1D1C1B1A19181716151413121110")), "88F2F048BA696170E3818915E0DBC0AFA6F141FEBC2F817138DA4AAB2DBF9CE490A488C9C82AC83FB0A6C0EEB64CFD22", "4F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A29282726252423222120"),
+               new BlockCipherVectorTest(16, new CbcBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")), Hex.Decode("202122232425262728292A2B2C2D2E2F")), "303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D8000", "13EA15843AD14C50BC03ECEF1F43E398E4217752D3EB046AC393DACC5CA1D6FA0EB9FCEB229362B4F1565527EE3D8433"),
+               new BlockCipherVectorTest(17, new CbcBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("2F2E2D2C2B2A29282726252423222120")), "BC8F026FC603ECE05C24FDE87542730999B381870882AC0535D4368C4BABD81B884E96E853EE7E055262D9D204FBE212", "5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39383736353433323130"),
+               new BlockCipherVectorTest(18, new CbcBlockCipher(new Dstu7624Engine(256)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")), Hex.Decode("202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), "404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F", "9CDFDAA75929E7C2A5CFC1BF16B42C5AE3886D0258E8C577DC01DAF62D185FB999B9867736B87110F5F1BC7481912C593F48FF79E2AFDFAB9F704A277EC3E557B1B0A9F223DAE6ED5AF591C4F2D6FB22E48334F5E9B96B1A2EA5200F30A406CE"),
+               new BlockCipherVectorTest(19, new CbcBlockCipher(new Dstu7624Engine(256)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F")), "606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF", "B8A2474578C2FEBF3F94703587BD5FDC3F4A4D2F43575B6144A1E1031FB3D1452B7FD52F5E3411461DAC506869FF8D2FAEF4FEE60379AE00B33AA3EAF911645AF8091CD8A45D141D1FB150E5A01C1F26FF3DBD26AC4225EC7577B2CE57A5B0FF"),
+               new BlockCipherVectorTest(20, new CbcBlockCipher(new Dstu7624Engine(256)), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "C69A59E10D00F087319B62288A57417C074EAD07C732A87055F0A5AD2BB288105705C45E091A9A6726E9672DC7D8C76FC45C782BCFEF7C39D94DEB84B17035BC8651255A0D34373451B6E1A2C827DB97566C9FF5506C5579F982A0EFC5BA7C28", "BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160"),
+               new BlockCipherVectorTest(21, new CbcBlockCipher(new Dstu7624Engine(512)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")), "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF", "D4739B829EF901B24C1162AE4FDEF897EDA41FAC7F5770CDC90E1D1CDF124E8D7831E06B4498A4B6F6EC815DF2461DC99BB0449B0F09FCAA2C84090534BCC9329626FD74EF8F0A0BCB5765184629C3CBF53B0FB134F6D0421174B1C4E884D1CD1069A7AD19752DCEBF655842E79B7858BDE01390A760D85E88925BFE38B0FA57"),
+               new BlockCipherVectorTest(22, new CbcBlockCipher(new Dstu7624Engine(512)), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "5D5B3E3DE5BAA70E0A0684D458856CE759C6018D0B3F087FC1DAC101D380236DD934F2880B02D56A575BCA35A0CE4B0D9BA1F4A39C16CA7D80D59956630F09E54EC91E32B6830FE08323ED393F8028D150BF03CAD0629A5AFEEFF6E44257980618DB2F32B7B2B65B96E8451F1090829D2FFFC615CC1581E9221438DCEAD1FD12", "FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A89888786858483828180"),
 
                //OFB mode
-               new BlockCipherVectorTest(23, new OfbBlockCipher(new Dstu7624Engine(128, 128), 128), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "A19E3E5E53BE8A07C9E0C01298FF832953205C661BD85A51F3A94113BC785CAB634B36E89A8FDD16A12E4467F5CC5A26"),
-               new BlockCipherVectorTest(24, new OfbBlockCipher(new Dstu7624Engine(128, 128), 128), new ParametersWithIV(new KeyParameter(Hex.Decode("0F0E0D0C0B0A09080706050403020100")), Hex.Decode("1F1E1D1C1B1A19181716151413121110")), "649A1EAAE160AF20F5B3EF2F58D66C1178B82E00D26F30689C8EC22E8E86E9CBB0BD4FFEE39EB13C2311276A906DD636", "4F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A29282726252423222120"),
-               new BlockCipherVectorTest(25, new OfbBlockCipher(new Dstu7624Engine(128, 256), 128), new ParametersWithIV(new KeyParameter(Hex.Decode("1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("2F2E2D2C2B2A29282726252423222120")), "1A66CFBFEC00C6D52E39923E858DD64B214AB787798D3D5059A6B498AD66B34EAC48C4074BEC0D98C6", "5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837"),
-               new BlockCipherVectorTest(26, new OfbBlockCipher(new Dstu7624Engine(256, 256), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")), Hex.Decode("202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), "404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90", "B62F7F144A8C6772E693A96890F064C3F06831BF743F5B0DD061067F3D22877331AA6A99D939F05B7550E9402BD1615CC7B2D4A167E83EC0D8A894F92C72E176F3880B61C311D69CE1210C59184E818E19"),
-               new BlockCipherVectorTest(27, new OfbBlockCipher(new Dstu7624Engine(256, 256), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A29282726252423222120")), "7758A939DD6BD00CAF9153E5A5D5A66129105CA1EA54A97C06FA4A40960A068F55E34F9339A14436216948F92FA2FB5286D3AB1E81543FC0018A0C4E8C493475F4D35DCFB0A7A5377F6669B857CDC978E4", "9F9E9D9C9B9A999897969594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F"),
-               new BlockCipherVectorTest(28, new OfbBlockCipher(new Dstu7624Engine(256, 512), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F")), "606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0", "0008F28A82D2D01D23BFB2F8BB4F06D8FE73BA4F48A2977585570ED3818323A668883C9DCFF610CC7E3EA5C025FBBC5CA6520F8F11CA35CEB9B07031E6DBFABE39001E9A3CC0A24BBC565939592B4DEDBD"),
-               new BlockCipherVectorTest(29, new OfbBlockCipher(new Dstu7624Engine(256, 512), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "98E122708FDABB1B1A5765C396DC79D7573221EC486ADDABD1770B147A6DD00B5FBC4F1EC68C59775B7AAA4D43C4CCE4F396D982DF64D30B03EF6C3B997BA0ED940BBC590BD30D64B5AE207147D71086B5", "BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F"),
-               new BlockCipherVectorTest(30, new OfbBlockCipher(new Dstu7624Engine(512, 512), 512), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")), "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0", "CAA761980599B3ED2E945C41891BAD95F72B11C73ED26536A6847458BC76C827357156B4B3FE0DC1877F5B9F17B866C37B21D89531DB48007D05DEC928B06766C014BB9080385EDF0677E48A0A39B5E7489E28E82FFFD1F84694F17296CB701656"),
-               new BlockCipherVectorTest(31, new OfbBlockCipher(new Dstu7624Engine(512, 512), 512), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "06C061A4A66DFC0910034B3CFBDC4206D8908241C56BF41C4103CFD6DF322210B87F57EAE9F9AD815E606A7D1E8E6BD7CB1EBFBDBCB085C2D06BF3CC1586CB2EE1D81D38437F425131321647E42F5DE309D33F25B89DE37124683E4B44824FC56D", "EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F"),
+               new BlockCipherVectorTest(23, new OfbBlockCipher(new Dstu7624Engine(128), 128), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "A19E3E5E53BE8A07C9E0C01298FF832953205C661BD85A51F3A94113BC785CAB634B36E89A8FDD16A12E4467F5CC5A26"),
+               new BlockCipherVectorTest(24, new OfbBlockCipher(new Dstu7624Engine(128), 128), new ParametersWithIV(new KeyParameter(Hex.Decode("0F0E0D0C0B0A09080706050403020100")), Hex.Decode("1F1E1D1C1B1A19181716151413121110")), "649A1EAAE160AF20F5B3EF2F58D66C1178B82E00D26F30689C8EC22E8E86E9CBB0BD4FFEE39EB13C2311276A906DD636", "4F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A29282726252423222120"),
+               new BlockCipherVectorTest(25, new OfbBlockCipher(new Dstu7624Engine(128), 128), new ParametersWithIV(new KeyParameter(Hex.Decode("1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("2F2E2D2C2B2A29282726252423222120")), "1A66CFBFEC00C6D52E39923E858DD64B214AB787798D3D5059A6B498AD66B34EAC48C4074BEC0D98C6", "5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837"),
+               new BlockCipherVectorTest(26, new OfbBlockCipher(new Dstu7624Engine(256), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")), Hex.Decode("202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), "404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90", "B62F7F144A8C6772E693A96890F064C3F06831BF743F5B0DD061067F3D22877331AA6A99D939F05B7550E9402BD1615CC7B2D4A167E83EC0D8A894F92C72E176F3880B61C311D69CE1210C59184E818E19"),
+               new BlockCipherVectorTest(27, new OfbBlockCipher(new Dstu7624Engine(256), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A29282726252423222120")), "7758A939DD6BD00CAF9153E5A5D5A66129105CA1EA54A97C06FA4A40960A068F55E34F9339A14436216948F92FA2FB5286D3AB1E81543FC0018A0C4E8C493475F4D35DCFB0A7A5377F6669B857CDC978E4", "9F9E9D9C9B9A999897969594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F"),
+               new BlockCipherVectorTest(28, new OfbBlockCipher(new Dstu7624Engine(256), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F")), "606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0", "0008F28A82D2D01D23BFB2F8BB4F06D8FE73BA4F48A2977585570ED3818323A668883C9DCFF610CC7E3EA5C025FBBC5CA6520F8F11CA35CEB9B07031E6DBFABE39001E9A3CC0A24BBC565939592B4DEDBD"),
+               new BlockCipherVectorTest(29, new OfbBlockCipher(new Dstu7624Engine(256), 256), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "98E122708FDABB1B1A5765C396DC79D7573221EC486ADDABD1770B147A6DD00B5FBC4F1EC68C59775B7AAA4D43C4CCE4F396D982DF64D30B03EF6C3B997BA0ED940BBC590BD30D64B5AE207147D71086B5", "BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F"),
+               new BlockCipherVectorTest(30, new OfbBlockCipher(new Dstu7624Engine(512), 512), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F")), Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F")), "808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0", "CAA761980599B3ED2E945C41891BAD95F72B11C73ED26536A6847458BC76C827357156B4B3FE0DC1877F5B9F17B866C37B21D89531DB48007D05DEC928B06766C014BB9080385EDF0677E48A0A39B5E7489E28E82FFFD1F84694F17296CB701656"),
+               new BlockCipherVectorTest(31, new OfbBlockCipher(new Dstu7624Engine(512), 512), new ParametersWithIV(new KeyParameter(Hex.Decode("3F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100")), Hex.Decode("7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746454443424140")), "06C061A4A66DFC0910034B3CFBDC4206D8908241C56BF41C4103CFD6DF322210B87F57EAE9F9AD815E606A7D1E8E6BD7CB1EBFBDBCB085C2D06BF3CC1586CB2EE1D81D38437F425131321647E42F5DE309D33F25B89DE37124683E4B44824FC56D", "EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F"),
 
                //CTR mode
-               new BlockCipherVectorTest(24, new KCtrBlockCipher(new Dstu7624Engine(128, 128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748", "A90A6B9780ABDFDFF64D14F5439E88F266DC50EDD341528DD5E698E2F000CE21F872DAF9FE1811844A"),
-               new BlockCipherVectorTest(25, new KCtrBlockCipher(new Dstu7624Engine(128, 128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "B91A7B8790BBCFCFE65D04E5538E98E216AC209DA33122FDA596E8928070BE51"),
-               new StreamCipherVectorTest(26, new KCtrBlockCipher(new Dstu7624Engine(128, 128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748", "A90A6B9780ABDFDFF64D14F5439E88F266DC50EDD341528DD5E698E2F000CE21F872DAF9FE1811844A"),
-               new StreamCipherVectorTest(27, new KCtrBlockCipher(new Dstu7624Engine(128, 128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "B91A7B8790BBCFCFE65D04E5538E98E216AC209DA33122FDA596E8928070BE51")
+               new BlockCipherVectorTest(24, new KCtrBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748", "A90A6B9780ABDFDFF64D14F5439E88F266DC50EDD341528DD5E698E2F000CE21F872DAF9FE1811844A"),
+               new BlockCipherVectorTest(25, new KCtrBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "B91A7B8790BBCFCFE65D04E5538E98E216AC209DA33122FDA596E8928070BE51"),
+               new StreamCipherVectorTest(26, new KCtrBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748", "A90A6B9780ABDFDFF64D14F5439E88F266DC50EDD341528DD5E698E2F000CE21F872DAF9FE1811844A"),
+               new StreamCipherVectorTest(27, new KCtrBlockCipher(new Dstu7624Engine(128)), new ParametersWithIV(new KeyParameter(Hex.Decode("000102030405060708090A0B0C0D0E0F")), Hex.Decode("101112131415161718191A1B1C1D1E1F")), "303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F", "B91A7B8790BBCFCFE65D04E5538E98E216AC209DA33122FDA596E8928070BE51")
         };
 
         public override ITestResult Perform()
@@ -110,7 +110,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             byte[] mac = new byte[128 / 8];
 
-            Dstu7624Mac dstu7624Mac = new Dstu7624Mac(128, 128, 128);
+            Dstu7624Mac dstu7624Mac = new Dstu7624Mac(128, 128);
             dstu7624Mac.Init(new KeyParameter(key));
             dstu7624Mac.BlockUpdate(authtext, 0, authtext.Length);
             dstu7624Mac.DoFinal(mac, 0);
@@ -140,7 +140,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             expectedMac = Hex.Decode("7279FA6BC8EF7525B2B35260D00A1743");
 
-            dstu7624Mac = new Dstu7624Mac(512, 512, 128);
+            dstu7624Mac = new Dstu7624Mac(512, 128);
             dstu7624Mac.Init(new KeyParameter(key));
             dstu7624Mac.BlockUpdate(authtext, 0, authtext.Length);
             dstu7624Mac.DoFinal(mac, 0);
@@ -164,7 +164,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             byte[] output = new byte[expectedWrappedText.Length];
 
-            Dstu7624WrapEngine wrapper = new Dstu7624WrapEngine(128, 128);
+            Dstu7624WrapEngine wrapper = new Dstu7624WrapEngine(128);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -224,7 +224,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(128, 256);
+            wrapper = new Dstu7624WrapEngine(128);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -253,7 +253,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(128, 256);
+            wrapper = new Dstu7624WrapEngine(128);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -282,7 +282,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(256, 256);
+            wrapper = new Dstu7624WrapEngine(256);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -312,7 +312,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(256, 256);
+            wrapper = new Dstu7624WrapEngine(256);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -342,7 +342,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(256, 512);
+            wrapper = new Dstu7624WrapEngine(256);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -371,7 +371,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(256, 512);
+            wrapper = new Dstu7624WrapEngine(256);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -400,7 +400,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(512, 512);
+            wrapper = new Dstu7624WrapEngine(512);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);
 
@@ -430,7 +430,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             output = new byte[expectedWrappedText.Length];
 
-            wrapper = new Dstu7624WrapEngine(512, 512);
+            wrapper = new Dstu7624WrapEngine(512);
             wrapper.Init(true, new KeyParameter(key));
             output = wrapper.Wrap(textToWrap, 0, textToWrap.Length);