[Mono-bugs] [Bug 49323][Nor] New - TripleDES differences between Mono 0.28 & .NET
bugzilla-daemon@bugzilla.ximian.com
bugzilla-daemon@bugzilla.ximian.com
Fri, 3 Oct 2003 19:41:33 -0400 (EDT)
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by carlosga@telefonica.net.
http://bugzilla.ximian.com/show_bug.cgi?id=49323
--- shadow/49323 2003-10-03 19:41:33.000000000 -0400
+++ shadow/49323.tmp.3168 2003-10-03 19:41:33.000000000 -0400
@@ -0,0 +1,185 @@
+Bug#: 49323
+Product: Mono/Class Libraries
+Version: unspecified
+OS: other
+OS Details: Linux Red Hat 8 & Windows
+Status: NEW
+Resolution:
+Severity:
+Priority: Normal
+Component: System
+AssignedTo: mono-bugs@ximian.com
+ReportedBy: carlosga@telefonica.net
+QAContact: mono-bugs@ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: TripleDES differences between Mono 0.28 & .NET
+
+Hello:
+
+I have made a little test case for test TripleDES using mono & ms.net and
+there are differences in the results.
+
+The test case is based on a piece of code from my TLS Library ( that as i
+said some time ago is working well under Windows with MS.NET but not with
+Mono on Linux ):
+
+Output of the test case using MS.NET:
+
+9c99568e753e02955b5c468bcff82721535f3dd81695823d889b9a47da979086500e48eee79b2541
+1400000cb58608e6b94b1381658e76be
+2a94e53ab9f99a839d4fb0a88f470076050a5f08
+
+
+Output of the Test case using Mono 0.28 (Windows)
+
+9c99568e753e02955b5c468bcff82721535f3dd81695823d889b9a47da9790868f3e78b6ef624695
+1400000cb58608e6b94b1381
+658e76be2a94e53ab9f99a839d4fb0a88f470076
+
+
+Output of the Test case using Mono 0.28 (Linux Red Hat 8)
+
+9c99568e753e02955b5c468bcff82721535f3dd81695823d889b9a47da9790868f3e78b6ef624695
+1400000cb58608e6b94b1381
+658e76be2a94e53ab9f99a839d4fb0a88f470076
+
+
+Output of the case using the exe built with mono 0.28 and the MS .NET
+runtime ( runnig test.exe directly in the console seems to be using the
+MS.NET framework )
+
+9c99568e753e02955b5c468bcff82721535f3dd81695823d889b9a47da979086500e48eee79b2541
+1400000cb58608e6b94b1381658e76be
+2a94e53ab9f99a839d4fb0a88f470076050a5f08
+
+
+
+Test case:
+
+
+using System;
+using System.IO;
+using System.Security.Cryptography;
+
+namespace TripleDESTest
+{
+ class TripleDES
+ {
+ [STAThread]
+ static void Main(string[] args)
+ {
+ byte blockSize = 8;
+ string algName = "3DES";
+ byte keyMaterialSize = 24;
+ byte hashSize = 20;
+ CipherMode cipherMode = CipherMode.CBC;
+
+ SymmetricAlgorithm encryptionAlgorithm = SymmetricAlgorithm.Create(algName);
+
+ // Configure encrypt algorithm
+ encryptionAlgorithm.Mode = cipherMode;
+ encryptionAlgorithm.Padding = PaddingMode.PKCS7;
+ encryptionAlgorithm.KeySize = keyMaterialSize * 8;
+ encryptionAlgorithm.BlockSize = blockSize * 8;
+
+ byte[] clientWriteKey = new byte[]{161, 54, 179, 213, 89, 75, 130, 4,
+186, 99, 158, 127, 19, 195, 175, 143, 79, 109, 25, 202, 237, 235, 62, 170};
+ byte[] clientWriteIV = new byte[]{193, 227, 54, 132, 68, 172, 55, 91};
+
+ // Set the key and IV for the algorithm
+ encryptionAlgorithm.Key = clientWriteKey;
+ encryptionAlgorithm.IV = clientWriteIV;
+
+ // Create encryption cipher
+ ICryptoTransform encryptionCipher = encryptionAlgorithm.CreateEncryptor();
+
+ byte[] fragment = new byte[]{20, 0, 0, 12, 181, 134, 8, 230, 185, 75,
+19, 129, 101, 142, 118, 190};
+ byte[] mac = new byte[]{42, 148, 229, 58, 185, 249, 154, 131, 157, 79,
+176, 168, 143, 71, 0, 118, 5, 10, 95, 8};
+
+ // Encryption ( fragment + mac [+ padding + padding_length] )
+ MemoryStream ms = new MemoryStream();
+ CryptoStream cs = new CryptoStream(ms, encryptionCipher,
+CryptoStreamMode.Write);
+
+ cs.Write(fragment, 0, fragment.Length);
+ cs.Write(mac, 0, mac.Length);
+ if (cipherMode == CipherMode.CBC)
+ {
+ // Calculate padding_length
+ int fragmentLength = fragment.Length + mac.Length + 1;
+ int padding = (((fragmentLength/blockSize)*8) + blockSize) -
+fragmentLength;
+
+ // Write padding length byte
+ cs.WriteByte((byte)padding);
+ }
+ cs.Close();
+
+ // Show result
+ TripleDES.Print(ms.ToArray());
+
+ // Now decrypt result
+
+ // Create decryption cipher
+ encryptionAlgorithm.Padding = PaddingMode.None;
+ ICryptoTransform decryptionCipher = encryptionAlgorithm.CreateDecryptor();
+
+ int fragmentSize = 0;
+ int paddingLength = 0;
+
+ byte[] ecrFragment = ms.ToArray();
+
+ // Decrypt message fragment ( fragment + mac [+ padding + padding_length] )
+ byte[] buffer = new byte[ecrFragment.Length];
+ decryptionCipher.TransformBlock(ecrFragment, 0, ecrFragment.Length,
+buffer, 0);
+
+ // Calculate fragment size
+ if (cipherMode == CipherMode.CBC)
+ {
+ // Calculate padding_length
+ paddingLength = buffer[buffer.Length - 1];
+ for (int i = (buffer.Length - 1); i > (buffer.Length - (paddingLength +
+1)); i--)
+ {
+ if (buffer[i] != paddingLength)
+ {
+ paddingLength = 0;
+ break;
+ }
+ }
+
+ fragmentSize = (buffer.Length - (paddingLength + 1)) - hashSize;
+ }
+ else
+ {
+ fragmentSize = buffer.Length - hashSize;
+ }
+
+ byte[] dcrFragment = new byte[fragmentSize];
+ byte[] dcrMAC = new byte[hashSize];
+
+ Buffer.BlockCopy(buffer, 0, dcrFragment, 0, dcrFragment.Length);
+ Buffer.BlockCopy(buffer, dcrFragment.Length, dcrMAC, 0, dcrMAC.Length);
+
+ TripleDES.Print(dcrFragment);
+ TripleDES.Print(dcrMAC);
+
+ Console.WriteLine("Pulse una tecla para continuar....");
+ Console.ReadLine();
+ }
+
+ public static void Print(byte[] content)
+ {
+ for (int i = 0; i < content.Length; i++)
+ {
+ Console.Write("{0}", content[i].ToString("x2"));
+ }
+ Console.WriteLine();
+ }
+ }
+}