Exemple #1
0
        public byte[] Wrap(byte[] input, int inOff, int length)
        {
            if (!forWrapping)
            {
                throw new InvalidOperationException("Not set for wrapping");
            }

            if (length % blockSize != 0)
            {
                throw new ArgumentException("Padding not supported");
            }

            int n = 2 * (1 + length / blockSize);
            int V = (n - 1) * 6;

            byte[] buffer = new byte[length + blockSize];
            Array.Copy(input, inOff, buffer, 0, length);
            //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));

            byte[] B = new byte[blockSize / 2];
            Array.Copy(buffer, 0, B, 0, blockSize / 2);
            //Console.WriteLine("B0: "+ Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));

            IList bTemp          = Platform.CreateArrayList();
            int   bHalfBlocksLen = buffer.Length - blockSize / 2;
            int   bufOff         = blockSize / 2;

            while (bHalfBlocksLen != 0)
            {
                byte[] temp = new byte[blockSize / 2];
                Array.Copy(buffer, bufOff, temp, 0, blockSize / 2);
                //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
                //Console.WriteLine(buffer.Length);
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(temp));

                bTemp.Add(temp);

                bHalfBlocksLen -= blockSize / 2;
                bufOff         += blockSize / 2;
            }

            for (int j = 0; j < V; j++)
            {
                Array.Copy(B, 0, buffer, 0, blockSize / 2);
                Array.Copy((byte[])bTemp[0], 0, buffer, blockSize / 2, blockSize / 2);

                engine.ProcessBlock(buffer, 0, buffer, 0);

                byte[] intArray = Pack.UInt32_To_LE((uint)(j + 1));
                for (int byteNum = 0; byteNum < intArray.Length; byteNum++)
                {
                    buffer[byteNum + blockSize / 2] ^= intArray[byteNum];
                }

                Array.Copy(buffer, blockSize / 2, B, 0, blockSize / 2);

                for (int i = 2; i < n; i++)
                {
                    Array.Copy((byte[])bTemp[i - 1], 0, (byte[])bTemp[i - 2], 0, blockSize / 2);
                }

                Array.Copy(buffer, 0, (byte[])bTemp[n - 2], 0, blockSize / 2);

                //Console.WriteLine("B" + j.ToString() + ": " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[0]));
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[1]));
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[2]));

                //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
            }

            Array.Copy(B, 0, buffer, 0, blockSize / 2);
            bufOff = blockSize / 2;

            for (int i = 0; i < n - 1; i++)
            {
                Array.Copy((byte[])bTemp[i], 0, buffer, bufOff, blockSize / 2);
                bufOff += blockSize / 2;
            }

            return(buffer);
        }
        public byte[] Wrap(byte[] input, int inOff, int length)
        {
            if (!forWrapping)
            {
                throw new InvalidOperationException("Not set for wrapping");
            }

            if ((input.Length - inOff) % blockSize != 0)
            {
                throw new ArgumentException("Padding not supported");
            }

            Check.DataLength(input, inOff, length, "input buffer too short");

            int n = 2 * (1 + length / blockSize);

            int V = (n - 1) * 6;

            buffer = new byte[input.Length - inOff + blockSize];
            Array.Copy(input, inOff, buffer, 0, input.Length - inOff);

            Array.Copy(buffer, 0, B, 0, blockSize / 2);

            bTemp.Clear();

            int bHalfBlocksLen = buffer.Length - blockSize / 2;
            int bufOff         = blockSize / 2;

            while (bHalfBlocksLen != 0)
            {
                byte[] temp = new byte[blockSize / 2];
                Array.Copy(buffer, bufOff, temp, 0, blockSize / 2);

                bTemp.Add(temp);

                bHalfBlocksLen -= blockSize / 2;
                bufOff         += blockSize / 2;
            }

            for (int j = 0; j < V; j++)
            {
                Array.Copy(B, 0, buffer, 0, blockSize / 2);
                Array.Copy(bTemp[0], 0, buffer, blockSize / 2, blockSize / 2);

                engine.ProcessBlock(buffer, 0, buffer, 0);

                intTobytes(j + 1, intArray, 0);
                for (int byteNum = 0; byteNum < BYTES_IN_INTEGER; byteNum++)
                {
                    buffer[byteNum + blockSize / 2] ^= intArray[byteNum];
                }

                Array.Copy(buffer, blockSize / 2, B, 0, blockSize / 2);

                for (int i = 2; i < n; i++)
                {
                    Array.Copy(bTemp[i - 1], 0, bTemp[i - 2], 0, blockSize / 2);
                }

                Array.Copy(buffer, 0, bTemp[n - 2], 0, blockSize / 2);
            }


            Array.Copy(B, 0, buffer, 0, blockSize / 2);
            bufOff = blockSize / 2;

            for (int i = 0; i < n - 1; i++)
            {
                Array.Copy(bTemp[i], 0, buffer, bufOff, blockSize / 2);
                bufOff += blockSize / 2;
            }

            return(buffer);
        }
Exemple #3
0
        public byte[] Wrap(byte[] input, int inOff, int length)
        {
            if (!forWrapping)
            {
                throw new InvalidOperationException("Not set for wrapping");
            }

            if ((input.Length - inOff) % blockSize != 0)
            {
                throw new ArgumentException("Padding not supported");
            }

            int n = 2 * (1 + input.Length / blockSize);

            int V = (n - 1) * 6;

            buffer = new byte[input.Length - inOff + blockSize];
            Array.Copy(input, inOff, buffer, 0, input.Length - inOff);
            //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));



            byte[] B = new byte[blockSize / 2];
            Array.Copy(buffer, 0, B, 0, blockSize / 2);
            //Console.WriteLine("B0: "+ Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));


            List <byte[]> bTemp = new List <byte[]>();

            int bHalfBlocksLen = buffer.Length - blockSize / 2;
            int bufOff         = blockSize / 2;

            while (bHalfBlocksLen != 0)
            {
                byte[] temp = new byte[blockSize / 2];
                Array.Copy(buffer, bufOff, temp, 0, blockSize / 2);
                //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
                //Console.WriteLine(buffer.Length);
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(temp));

                bTemp.Add(temp);

                bHalfBlocksLen -= blockSize / 2;
                bufOff         += blockSize / 2;
            }



            for (int j = 0; j < V; j++)
            {
                Array.Copy(B, 0, buffer, 0, blockSize / 2);
                Array.Copy(bTemp[0], 0, buffer, blockSize / 2, blockSize / 2);

                engine.ProcessBlock(buffer, 0, buffer, 0);

                intTobytes(j + 1, intArray, 0);
                for (int byteNum = 0; byteNum < BYTES_IN_INTEGER; byteNum++)
                {
                    buffer[byteNum + blockSize / 2] ^= intArray[byteNum];
                }

                Array.Copy(buffer, blockSize / 2, B, 0, blockSize / 2);

                for (int i = 2; i < n; i++)
                {
                    Array.Copy(bTemp[i - 1], 0, bTemp[i - 2], 0, blockSize / 2);
                }

                Array.Copy(buffer, 0, bTemp[n - 2], 0, blockSize / 2);

                //Console.WriteLine("B" + j.ToString() + ": " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[0]));
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[1]));
                //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[2]));

                //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
            }


            Array.Copy(B, 0, buffer, 0, blockSize / 2);
            bufOff = blockSize / 2;

            for (int i = 0; i < n - 1; i++)
            {
                Array.Copy(bTemp[i], 0, buffer, bufOff, blockSize / 2);
                bufOff += blockSize / 2;
            }

            return(buffer);
        }