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); }
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); }