public int Transform(Buffer buffer, int length) { Trace.Log("BlockCipher.Transform: input length {0}", length); using (var encryptor = algorithm.CreateEncryptor(encryptionKey, encryptionIV)) using (var ms = new MemoryStream(length + BlockSizeInBytes)) using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { #if (UNITY_WORKAROUND && UNITY_MONO) // Workaround for ancient mono 2.0 of Unity3D // Multiple Write() calls are not properly handled there. byte[] plaintext = buffer.ToArray(); if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("BlockCipher.Transform: input {0}", BitConverter.ToString(plaintext, plaintext.Length - length, length)); } cs.Write(plaintext, plaintext.Length - length, length); #else var buffers = new List <ArraySegment <byte> >(); buffer.ListEndingSegments(buffers, length); for (var i = 0; i < buffers.Count; ++i) { var segment = buffers[i]; if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("BlockCipher.Transform: input block {0}", BitConverter.ToString(segment.Array, segment.Offset, segment.Count)); } cs.Write(segment.Array, segment.Offset, segment.Count); } #endif cs.FlushFinalBlock(); int result = (int)ms.Length; var streamBuffer = ms.GetBuffer(); if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("BlockCipher.Transform: output {0} {1}", result, BitConverter.ToString(streamBuffer, 0, result)); } buffer.Rewind(); buffer.CopyFrom(streamBuffer, 0, result); // Store the last ciphertext block as a next encryption IV. System.Buffer.BlockCopy(streamBuffer, result - BlockSizeInBytes, encryptionIV, 0, BlockSizeInBytes); return(result); } }
public int InverseTransform(Buffer buffer, int length) { Trace.Log("SimpleCipher.InverseTransform: input length {0}", length); using (var decryptor = algorithm.CreateDecryptor(settings.Key, settings.IV)) using (var ms = new MemoryStream(length)) using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) { #if (UNITY_WORKAROUND && UNITY_MONO) // Workaround for ancient mono 2.0 of Unity3D // Multiple Write() calls are not properly handled there. byte[] ciphertext = buffer.ToArray(); if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("SimpleCipher.InverseTransform: input {0}", BitConverter.ToString(ciphertext, 0, length)); } cs.Write(ciphertext, 0, length); #else var buffers = new List <ArraySegment <byte> >(); buffer.ListStartingSegments(buffers, length); for (var i = 0; i < buffers.Count; ++i) { var segment = buffers[i]; if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("SimpleCipher.InverseTransform: input block {0}", BitConverter.ToString(segment.Array, segment.Offset, segment.Count)); } cs.Write(segment.Array, segment.Offset, segment.Count); } #endif cs.FlushFinalBlock(); int result = (int)ms.Length; var streamBuffer = ms.GetBuffer(); if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("SimpleCipher.InverseTransform: output {0} {1}", result, BitConverter.ToString(streamBuffer, 0, result)); } buffer.Rewind(); buffer.CopyFrom(streamBuffer, 0, result); return(result); } }
public int InverseTransform(Buffer buffer, int length) { Trace.Log("BlockCipher.InverseTransform: input length {0}", length); using (var decryptor = algorithm.CreateDecryptor(decryptionKey, decryptionIV)) using (var ms = new MemoryStream(length)) using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) { byte[] nextIV = new byte[BlockSizeInBytes]; #if (UNITY_WORKAROUND && UNITY_MONO) // Workaround for ancient mono 2.0 of Unity3D // Multiple Write() calls are not properly handled there. byte[] ciphertext = buffer.ToArray(); System.Buffer.BlockCopy(ciphertext, length - BlockSizeInBytes, nextIV, 0, BlockSizeInBytes); if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("BlockCipher.InverseTransform: input {0}", BitConverter.ToString(ciphertext, 0, length)); } cs.Write(ciphertext, 0, length); #else var buffers = new List <ArraySegment <byte> >(); buffer.ListStartingSegments(buffers, length); // Capture the last ciphertext block. int bytesCopied = 0; for (var i = buffers.Count - 1; bytesCopied < BlockSizeInBytes && i >= 0; --i) { var segment = buffers[i]; int bytesToCopy = Math.Min(segment.Count, BlockSizeInBytes); System.Buffer.BlockCopy(segment.Array, segment.Offset + segment.Count - bytesToCopy, nextIV, BlockSizeInBytes - bytesCopied - bytesToCopy, bytesToCopy); bytesCopied += bytesToCopy; } for (var i = 0; i < buffers.Count; ++i) { var segment = buffers[i]; if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("BlockCipher.InverseTransform: input block {0}", BitConverter.ToString(segment.Array, segment.Offset, segment.Count)); } cs.Write(segment.Array, segment.Offset, segment.Count); } #endif cs.FlushFinalBlock(); int result = (int)ms.Length; var streamBuffer = ms.GetBuffer(); if (Config.TraceLevel <= TraceLevel.Trace) { Trace.Log("BlockCipher.InverseTransform: output {0} {1}", result, BitConverter.ToString(streamBuffer, 0, result)); } buffer.Rewind(); buffer.CopyFrom(streamBuffer, 0, result); // Store the last ciphertext block as a next decryption IV. System.Buffer.BlockCopy(nextIV, 0, decryptionIV, 0, BlockSizeInBytes); return(result); } }