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