primeiter: New functions for iterating over small primes.
[u/mdw/catacomb] / square.c
index 5111a3d..6ed8d86 100644 (file)
--- a/square.c
+++ b/square.c
@@ -1,13 +1,13 @@
 /* -*-c-*-
  *
- * $Id: square.c,v 1.1 2000/07/15 20:51:58 mdw Exp $
+ * $Id: square.c,v 1.3 2004/04/08 01:36:15 mdw Exp $
  *
  * The Square block cipher
  *
  * (c) 2000 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Catacomb.
  *
  * it under the terms of the GNU Library General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * Catacomb is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Library General Public
  * License along with Catacomb; if not, write to the Free
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: square.c,v $
- * Revision 1.1  2000/07/15 20:51:58  mdw
- * New block cipher.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <assert.h>
@@ -61,10 +53,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
@@ -119,7 +107,7 @@ void square_init(square_ctx *k, const void *buf, size_t sz)
 
   for (i = 0; i < nr * 4; i++) {
     uint32 w = kk[i];
-    k->w[i] = (U[0][U8(w >>  0)] ^ U[1][U8(w >>  8)] ^
+    k->w[i] = (U[0][U8(w >>  0)] ^ U[1][U8(w >>         8)] ^
               U[2][U8(w >> 16)] ^ U[3][U8(w >> 24)]);
   }
   for (; i < nw; i++)
@@ -148,52 +136,37 @@ 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)
 {
   uint32 a = s[0], b = s[1], c = s[2], d = s[3];
   uint32 aa, bb, cc, dd;
-  uint32 *w = k->w;
+  const uint32 *w = k->w;
 
   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;
 }
@@ -202,26 +175,18 @@ void square_dblk(const square_ctx *k, const uint32 *s, uint32 *dst)
 {
   uint32 a = s[0], b = s[1], c = s[2], d = s[3];
   uint32 aa, bb, cc, dd;
-  uint32 *w = k->wi;
+  const uint32 *w = k->wi;
 
   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;
 }