Simplify implementation.
authormdw <mdw>
Mon, 7 May 2001 15:44:02 +0000 (15:44 +0000)
committermdw <mdw>
Mon, 7 May 2001 15:44:02 +0000 (15:44 +0000)
square.c

index 5111a3d..c0b2d76 100644 (file)
--- a/square.c
+++ b/square.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: square.c,v 1.1 2000/07/15 20:51:58 mdw Exp $
+ * $Id: square.c,v 1.2 2001/05/07 15:44:02 mdw Exp $
  *
  * The Square block cipher
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: square.c,v $
+ * Revision 1.2  2001/05/07 15:44:02  mdw
+ * Simplify implementation.
+ *
  * Revision 1.1  2000/07/15 20:51:58  mdw
  * New block cipher.
  *
@@ -61,10 +64,6 @@ static const octet rcon[] = SQUARE_RCON;
 
 /*----- Main code ---------------------------------------------------------*/
 
-#define BYTESUB(x, s)                                                  \
-  (s[U8((x) >> 24)] << 24 | s[U8((x) >> 16)] << 16 |                   \
-   s[U8((x) >>  8)] <<  8 | s[U8((x) >>  0)] <<  0)
-
 /* --- @square_init@ --- *
  *
  * Arguments:  @square_ctx *k@ = pointer to context to initialize
@@ -148,26 +147,19 @@ void square_init(square_ctx *k, const void *buf, size_t sz)
  * Use:                Low-level block encryption and decryption.
  */
 
-#define EROUND(aa, bb, cc, dd, a, b, c, d, w) do {                     \
-  aa = (T[0][U8(a >>  0)] ^ T[1][U8(b >>  0)] ^                                \
-       T[2][U8(c >>  0)] ^ T[3][U8(d >>  0)]) ^ *w++;                  \
-  bb = (T[0][U8(a >>  8)] ^ T[1][U8(b >>  8)] ^                                \
-       T[2][U8(c >>  8)] ^ T[3][U8(d >>  8)]) ^ *w++;                  \
-  cc = (T[0][U8(a >> 16)] ^ T[1][U8(b >> 16)] ^                                \
-       T[2][U8(c >> 16)] ^ T[3][U8(d >> 16)]) ^ *w++;                  \
-  dd = (T[0][U8(a >> 24)] ^ T[1][U8(b >> 24)] ^                                \
-       T[2][U8(c >> 24)] ^ T[3][U8(d >> 24)]) ^ *w++;                  \
-} while (0)
+#define SUB(s, sh, a, b, c, d)                                         \
+  (s[U8((a) >> sh)] <<  0 | s[U8((b) >> sh)] <<  8 |                   \
+   s[U8((c) >> sh)] << 16 | s[U8((d) >> sh)] << 24)
+
+#define MIX(t, sh, a, b, c, d)                                         \
+  (t[0][U8((a) >> sh)] ^ t[1][U8((b) >> sh)] ^                         \
+   t[2][U8((c) >> sh)] ^ t[3][U8((d) >> sh)])
 
-#define DROUND(aa, bb, cc, dd, a, b, c, d, w) do {                     \
-  aa = (TI[0][U8(a >>  0)] ^ TI[1][U8(b >>  0)] ^                      \
-       TI[2][U8(c >>  0)] ^ TI[3][U8(d >>  0)]) ^ *w++;                \
-  bb = (TI[0][U8(a >>  8)] ^ TI[1][U8(b >>  8)] ^                      \
-       TI[2][U8(c >>  8)] ^ TI[3][U8(d >>  8)]) ^ *w++;                \
-  cc = (TI[0][U8(a >> 16)] ^ TI[1][U8(b >> 16)] ^                      \
-       TI[2][U8(c >> 16)] ^ TI[3][U8(d >> 16)]) ^ *w++;                \
-  dd = (TI[0][U8(a >> 24)] ^ TI[1][U8(b >> 24)] ^                      \
-       TI[2][U8(c >> 24)] ^ TI[3][U8(d >> 24)]) ^ *w++;                \
+#define DO(what, t, aa, bb, cc, dd, a, b, c, d, w) do {                        \
+  aa = what(t,  0, a, b, c, d) ^ *w++;                                 \
+  bb = what(t,  8, a, b, c, d) ^ *w++;                                 \
+  cc = what(t, 16, a, b, c, d) ^ *w++;                                 \
+  dd = what(t, 24, a, b, c, d) ^ *w++;                                 \
 } while (0)
 
 void square_eblk(const square_ctx *k, const uint32 *s, uint32 *dst)
@@ -178,22 +170,14 @@ void square_eblk(const square_ctx *k, const uint32 *s, uint32 *dst)
 
   a ^= *w++; b ^= *w++; c ^= *w++; d ^= *w++;
 
-  EROUND(aa, bb, cc, dd, a, b, c, d, w);
-  EROUND(a, b, c, d, aa, bb, cc, dd, w);
-  EROUND(aa, bb, cc, dd, a, b, c, d, w);
-  EROUND(a, b, c, d, aa, bb, cc, dd, w);
-  EROUND(aa, bb, cc, dd, a, b, c, d, w);
-  EROUND(a, b, c, d, aa, bb, cc, dd, w);
-  EROUND(aa, bb, cc, dd, a, b, c, d, w);
-
-  a = ((S[U8(aa >>  0)] <<  0) ^ (S[U8(bb >>  0)] <<  8) ^
-       (S[U8(cc >>  0)] << 16) ^ (S[U8(dd >>  0)] << 24)) ^ *w++;
-  b = ((S[U8(aa >>  8)] <<  0) ^ (S[U8(bb >>  8)] <<  8) ^     
-       (S[U8(cc >>  8)] << 16) ^ (S[U8(dd >>  8)] << 24)) ^ *w++;
-  c = ((S[U8(aa >> 16)] <<  0) ^ (S[U8(bb >> 16)] <<  8) ^
-       (S[U8(cc >> 16)] << 16) ^ (S[U8(dd >> 16)] << 24)) ^ *w++;
-  d = ((S[U8(aa >> 24)] <<  0) ^ (S[U8(bb >> 24)] <<  8) ^
-       (S[U8(cc >> 24)] << 16) ^ (S[U8(dd >> 24)] << 24)) ^ *w++;
+  DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w);
+  DO(MIX, T, a, b, c, d, aa, bb, cc, dd, w);
+  DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w);
+  DO(MIX, T, a, b, c, d, aa, bb, cc, dd, w);
+  DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w);
+  DO(MIX, T, a, b, c, d, aa, bb, cc, dd, w);
+  DO(MIX, T, aa, bb, cc, dd, a, b, c, d, w);
+  DO(SUB, S, a, b, c, d, aa, bb, cc, dd, w);
 
   dst[0] = a; dst[1] = b; dst[2] = c; dst[3] = d;
 }
@@ -206,22 +190,14 @@ void square_dblk(const square_ctx *k, const uint32 *s, uint32 *dst)
 
   a ^= *w++; b ^= *w++; c ^= *w++; d ^= *w++;
 
-  DROUND(aa, bb, cc, dd, a, b, c, d, w);
-  DROUND(a, b, c, d, aa, bb, cc, dd, w);
-  DROUND(aa, bb, cc, dd, a, b, c, d, w);
-  DROUND(a, b, c, d, aa, bb, cc, dd, w);
-  DROUND(aa, bb, cc, dd, a, b, c, d, w);
-  DROUND(a, b, c, d, aa, bb, cc, dd, w);
-  DROUND(aa, bb, cc, dd, a, b, c, d, w);
-
-  a = ((SI[U8(aa >>  0)] <<  0) ^ (SI[U8(bb >>  0)] <<  8) ^
-       (SI[U8(cc >>  0)] << 16) ^ (SI[U8(dd >>  0)] << 24)) ^ *w++;
-  b = ((SI[U8(aa >>  8)] <<  0) ^ (SI[U8(bb >>  8)] <<  8) ^
-       (SI[U8(cc >>  8)] << 16) ^ (SI[U8(dd >>  8)] << 24)) ^ *w++;
-  c = ((SI[U8(aa >> 16)] <<  0) ^ (SI[U8(bb >> 16)] <<  8) ^
-       (SI[U8(cc >> 16)] << 16) ^ (SI[U8(dd >> 16)] << 24)) ^ *w++;
-  d = ((SI[U8(aa >> 24)] <<  0) ^ (SI[U8(bb >> 24)] <<  8) ^
-       (SI[U8(cc >> 24)] << 16) ^ (SI[U8(dd >> 24)] << 24)) ^ *w++;
+  DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w);
+  DO(MIX, TI, a, b, c, d, aa, bb, cc, dd, w);
+  DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w);
+  DO(MIX, TI, a, b, c, d, aa, bb, cc, dd, w);
+  DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w);
+  DO(MIX, TI, a, b, c, d, aa, bb, cc, dd, w);
+  DO(MIX, TI, aa, bb, cc, dd, a, b, c, d, w);
+  DO(SUB, SI, a, b, c, d, aa, bb, cc, dd, w);
 
   dst[0] = a; dst[1] = b; dst[2] = c; dst[3] = d;
 }