[Mono-bugs] [Bug 71062][Wis] Changed - ABC removal not performed for substitution boxes

bugzilla-daemon@bugzilla.ximian.com bugzilla-daemon@bugzilla.ximian.com
Thu, 6 Jan 2005 14:09:41 -0500 (EST)


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 sebastien@ximian.com.

http://bugzilla.ximian.com/show_bug.cgi?id=71062

--- shadow/71062	2005-01-06 14:07:43.000000000 -0500
+++ shadow/71062.tmp.19735	2005-01-06 14:09:41.000000000 -0500
@@ -2,16 +2,16 @@
 Product: Mono: Runtime
 Version: 1.1
 OS: All
 OS Details: 
 Status: NEW   
 Resolution: 
-Severity: 
+Severity: Unknown
 Priority: Wishlist
 Component: JIT
-AssignedTo: mono-bugs@ximian.com                            
+AssignedTo: massi@ximian.com                            
 ReportedBy: sebastien@ximian.com               
 QAContact: mono-bugs@ximian.com
 TargetMilestone: ---
 URL: 
 Cc: 
 Summary: ABC removal not performed for substitution boxes
@@ -54,6 +54,113 @@
 than under Mono 1.1.x (SVN). But that may not (only) be related to ABC
 removal...
 
 - The sbox is a very common pattern in symmetric and hash algorithms. Very
 similar arrays (but not sboxes) are also used (e.g. RC2 also has it's own
 pitable of 256 elements for it's key setup).
+
+------- Additional Comments From sebastien@ximian.com  2005-01-06 14:09 -------
+using System;
+
+using System.IO;
+
+using System.Security.Cryptography;
+
+
+
+class SBox {
+
+
+	static Int32 SubByte_Int32 (int a)
+	{
+		Int32 value = 0xff & a;
+		Int32 result = sbox [value]; 
+		value = 0xff & (a >> 8);
+		result |= sbox [value] << 8; 
+		value = 0xff & (a >> 16);
+		result |= sbox [value] << 16; 
+		value = 0xff & (a >> 24);
+		return result | (sbox [value] << 24);
+	}
+
+	// this version should be better suited for ABC removal
+	static int SubByte_Byte (int a)
+	{
+		// yuck - but it seems abcrem only works on local arrays :-(
+		byte[] sbox = SBox.sbox;
+		// anyway it gets me (a little) further
+
+		byte val = (byte)a;
+		int result = sbox [val];
+		val = (byte)(a >> 8);
+		result |= sbox [val] << 8;
+		val = (byte)(a >> 16);
+		result |= sbox [val] << 16;
+		val = (byte)(a >> 24);
+		return result | (sbox [val] << 24);
+	}
+
+	// AES sbox
+	static readonly byte[] sbox = {
+		99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215,
+171, 118, 
+		202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 156,
+164, 114, 192, 
+		183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 229, 241, 113,
+216,  49,  21, 
+		4, 199,  35, 195,  24, 150,   5, 154,   7,  18, 128, 226, 235,  39,
+178, 117, 
+		9, 131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,
+ 47, 132, 
+		83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,  57,  74,  76,
+ 88, 207, 
+		208, 239, 170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80, 
+60, 159, 168, 
+		81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255,
+243, 210, 
+		205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100, 
+93,  25, 115, 
+		96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20, 222,  94,
+ 11, 219, 
+		224,  50,  58,  10,  73,   6,  36,  92, 194, 211, 172,  98, 145,
+149, 228, 121, 
+		231, 200,  55, 109, 141, 213,  78, 169, 108,  86, 244, 234, 101,
+122, 174,   8, 
+		186, 120,  37,  46,  28, 166, 180, 198, 232, 221, 116,  31,  75,
+189, 139, 138, 
+		112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134,
+193,  29, 158, 
+		225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206, 
+85,  40, 223, 
+		140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 176, 
+84, 187,  22
+	};
+
+	static void Main (string[] args)
+	{
+		int result = 0;
+		int iter = Int32.MaxValue;
+		if (args.Length > 0)
+			iter = Int32.Parse (args [0]);
+
+		Console.WriteLine ("SBOX {0}", sbox.Length);
+
+		// don't get the JIT time in the measurements
+		SubByte_Int32 (0);
+		SubByte_Byte (0);
+
+		result = 0;
+		DateTime start = DateTime.Now;
+		for (int i=0; i < iter; i++) {
+			result += SubByte_Byte (i);
+		}
+		Console.WriteLine ("Byte:  {0} in {1}", result, (DateTime.Now - start));
+
+		result = 0;
+		start = DateTime.Now;
+		for (int i=0; i < iter; i++) {
+			result += SubByte_Int32 (i);
+		}
+		Console.WriteLine ("Int32: {0} in {1}", result, (DateTime.Now - start));
+	}
+}
+