progs/perftest.c: Use from Glibc syscall numbers.
[catacomb] / symm / sha.c
index e4b5023..3520727 100644 (file)
 void sha_compress(sha_ctx *ctx, const void *sbuf)
 {
   uint32 a, b, c, d, e;
-  uint32 buf[80];
+  uint32 m[16];
+  const octet *p;
+  int i;
 
-  /* --- Fetch the chaining variables --- */
-
-  a = ctx->a;
-  b = ctx->b;
-  c = ctx->c;
-  d = ctx->d;
-  e = ctx->e;
-
-  /* --- Fetch and expand the buffer contents --- */
-
-  {
-    int i;
-    const octet *p;
-
-    for (i = 0, p = sbuf; i < 16; i++, p += 4)
-      buf[i] = LOAD32(p);
-    for (i = 16; i < 80; i++) {
-      uint32 x = buf[i - 3] ^ buf[i - 8] ^ buf[i - 14] ^ buf[i - 16];
-      buf[i] = ROL32(x, 1);
-    }
-  }
+  a  = ctx->a; b  = ctx->b; c  = ctx->c; d  = ctx->d; e  = ctx->e;
+  for (p = sbuf, i = 0; i < 16; i++, p += 4) m[i] = LOAD32(p);
 
   /* --- Definitions for round functions --- */
 
@@ -80,7 +63,7 @@ void sha_compress(sha_ctx *ctx, const void *sbuf)
 #define H(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
 
 #define T(v, w, x, y, z, i, f, k) do {                                 \
-  z = ROL32(v, 5) + f(w, x, y) + z + buf[i] + k;                       \
+  z = ROL32(v, 5) + f(w, x, y) + z + m[i] + k;                         \
   w = ROR32(w, 2);                                                     \
 } while (0)
 
@@ -89,99 +72,99 @@ void sha_compress(sha_ctx *ctx, const void *sbuf)
 #define HH(v, w, x, y, z, i) T(v, w, x, y, z, i, H, 0x8f1bbcdc)
 #define II(v, w, x, y, z, i) T(v, w, x, y, z, i, G, 0xca62c1d6)
 
+  /* --- Message scheduling --- */
+
+#define M(i, i3, i8, i14) do {                                         \
+  uint32 t = m[i] ^ m[i3] ^ m[i8] ^ m[i14];                            \
+  m[i] = ROL32(t, 1);                                                  \
+} while (0)
+
   /* --- The main compression function --- */
 
-  FF(a, b, c, d, e,  0);
-  FF(e, a, b, c, d,  1);
-  FF(d, e, a, b, c,  2);
-  FF(c, d, e, a, b,  3);
-  FF(b, c, d, e, a,  4);
-  FF(a, b, c, d, e,  5);
-  FF(e, a, b, c, d,  6);
-  FF(d, e, a, b, c,  7);
-  FF(c, d, e, a, b,  8);
-  FF(b, c, d, e, a,  9);
-  FF(a, b, c, d, e, 10);
-  FF(e, a, b, c, d, 11);
-  FF(d, e, a, b, c, 12);
-  FF(c, d, e, a, b, 13);
-  FF(b, c, d, e, a, 14);
-  FF(a, b, c, d, e, 15);
-  FF(e, a, b, c, d, 16);
-  FF(d, e, a, b, c, 17);
-  FF(c, d, e, a, b, 18);
-  FF(b, c, d, e, a, 19);
-
-  GG(a, b, c, d, e, 20);
-  GG(e, a, b, c, d, 21);
-  GG(d, e, a, b, c, 22);
-  GG(c, d, e, a, b, 23);
-  GG(b, c, d, e, a, 24);
-  GG(a, b, c, d, e, 25);
-  GG(e, a, b, c, d, 26);
-  GG(d, e, a, b, c, 27);
-  GG(c, d, e, a, b, 28);
-  GG(b, c, d, e, a, 29);
-  GG(a, b, c, d, e, 30);
-  GG(e, a, b, c, d, 31);
-  GG(d, e, a, b, c, 32);
-  GG(c, d, e, a, b, 33);
-  GG(b, c, d, e, a, 34);
-  GG(a, b, c, d, e, 35);
-  GG(e, a, b, c, d, 36);
-  GG(d, e, a, b, c, 37);
-  GG(c, d, e, a, b, 38);
-  GG(b, c, d, e, a, 39);
-
-  HH(a, b, c, d, e, 40);
-  HH(e, a, b, c, d, 41);
-  HH(d, e, a, b, c, 42);
-  HH(c, d, e, a, b, 43);
-  HH(b, c, d, e, a, 44);
-  HH(a, b, c, d, e, 45);
-  HH(e, a, b, c, d, 46);
-  HH(d, e, a, b, c, 47);
-  HH(c, d, e, a, b, 48);
-  HH(b, c, d, e, a, 49);
-  HH(a, b, c, d, e, 50);
-  HH(e, a, b, c, d, 51);
-  HH(d, e, a, b, c, 52);
-  HH(c, d, e, a, b, 53);
-  HH(b, c, d, e, a, 54);
-  HH(a, b, c, d, e, 55);
-  HH(e, a, b, c, d, 56);
-  HH(d, e, a, b, c, 57);
-  HH(c, d, e, a, b, 58);
-  HH(b, c, d, e, a, 59);
-
-  II(a, b, c, d, e, 60);
-  II(e, a, b, c, d, 61);
-  II(d, e, a, b, c, 62);
-  II(c, d, e, a, b, 63);
-  II(b, c, d, e, a, 64);
-  II(a, b, c, d, e, 65);
-  II(e, a, b, c, d, 66);
-  II(d, e, a, b, c, 67);
-  II(c, d, e, a, b, 68);
-  II(b, c, d, e, a, 69);
-  II(a, b, c, d, e, 70);
-  II(e, a, b, c, d, 71);
-  II(d, e, a, b, c, 72);
-  II(c, d, e, a, b, 73);
-  II(b, c, d, e, a, 74);
-  II(a, b, c, d, e, 75);
-  II(e, a, b, c, d, 76);
-  II(d, e, a, b, c, 77);
-  II(c, d, e, a, b, 78);
-  II(b, c, d, e, a, 79);
+  FF(a, b, c, d, e,  0);       M( 0, 13,  8,  2);
+  FF(e, a, b, c, d,  1);       M( 1, 14,  9,  3);
+  FF(d, e, a, b, c,  2);       M( 2, 15, 10,  4);
+  FF(c, d, e, a, b,  3);       M( 3,  0, 11,  5);
+  FF(b, c, d, e, a,  4);       M( 4,  1, 12,  6);
+  FF(a, b, c, d, e,  5);       M( 5,  2, 13,  7);
+  FF(e, a, b, c, d,  6);       M( 6,  3, 14,  8);
+  FF(d, e, a, b, c,  7);       M( 7,  4, 15,  9);
+  FF(c, d, e, a, b,  8);       M( 8,  5,  0, 10);
+  FF(b, c, d, e, a,  9);       M( 9,  6,  1, 11);
+  FF(a, b, c, d, e, 10);       M(10,  7,  2, 12);
+  FF(e, a, b, c, d, 11);       M(11,  8,  3, 13);
+  FF(d, e, a, b, c, 12);       M(12,  9,  4, 14);
+  FF(c, d, e, a, b, 13);       M(13, 10,  5, 15);
+  FF(b, c, d, e, a, 14);       M(14, 11,  6,  0);
+  FF(a, b, c, d, e, 15);       M(15, 12,  7,  1);
+  FF(e, a, b, c, d,  0);       M( 0, 13,  8,  2);
+  FF(d, e, a, b, c,  1);       M( 1, 14,  9,  3);
+  FF(c, d, e, a, b,  2);       M( 2, 15, 10,  4);
+  FF(b, c, d, e, a,  3);       M( 3,  0, 11,  5);
+  GG(a, b, c, d, e,  4);       M( 4,  1, 12,  6);
+  GG(e, a, b, c, d,  5);       M( 5,  2, 13,  7);
+  GG(d, e, a, b, c,  6);       M( 6,  3, 14,  8);
+  GG(c, d, e, a, b,  7);       M( 7,  4, 15,  9);
+  GG(b, c, d, e, a,  8);       M( 8,  5,  0, 10);
+  GG(a, b, c, d, e,  9);       M( 9,  6,  1, 11);
+  GG(e, a, b, c, d, 10);       M(10,  7,  2, 12);
+  GG(d, e, a, b, c, 11);       M(11,  8,  3, 13);
+  GG(c, d, e, a, b, 12);       M(12,  9,  4, 14);
+  GG(b, c, d, e, a, 13);       M(13, 10,  5, 15);
+  GG(a, b, c, d, e, 14);       M(14, 11,  6,  0);
+  GG(e, a, b, c, d, 15);       M(15, 12,  7,  1);
+  GG(d, e, a, b, c,  0);       M( 0, 13,  8,  2);
+  GG(c, d, e, a, b,  1);       M( 1, 14,  9,  3);
+  GG(b, c, d, e, a,  2);       M( 2, 15, 10,  4);
+  GG(a, b, c, d, e,  3);       M( 3,  0, 11,  5);
+  GG(e, a, b, c, d,  4);       M( 4,  1, 12,  6);
+  GG(d, e, a, b, c,  5);       M( 5,  2, 13,  7);
+  GG(c, d, e, a, b,  6);       M( 6,  3, 14,  8);
+  GG(b, c, d, e, a,  7);       M( 7,  4, 15,  9);
+  HH(a, b, c, d, e,  8);       M( 8,  5,  0, 10);
+  HH(e, a, b, c, d,  9);       M( 9,  6,  1, 11);
+  HH(d, e, a, b, c, 10);       M(10,  7,  2, 12);
+  HH(c, d, e, a, b, 11);       M(11,  8,  3, 13);
+  HH(b, c, d, e, a, 12);       M(12,  9,  4, 14);
+  HH(a, b, c, d, e, 13);       M(13, 10,  5, 15);
+  HH(e, a, b, c, d, 14);       M(14, 11,  6,  0);
+  HH(d, e, a, b, c, 15);       M(15, 12,  7,  1);
+  HH(c, d, e, a, b,  0);       M( 0, 13,  8,  2);
+  HH(b, c, d, e, a,  1);       M( 1, 14,  9,  3);
+  HH(a, b, c, d, e,  2);       M( 2, 15, 10,  4);
+  HH(e, a, b, c, d,  3);       M( 3,  0, 11,  5);
+  HH(d, e, a, b, c,  4);       M( 4,  1, 12,  6);
+  HH(c, d, e, a, b,  5);       M( 5,  2, 13,  7);
+  HH(b, c, d, e, a,  6);       M( 6,  3, 14,  8);
+  HH(a, b, c, d, e,  7);       M( 7,  4, 15,  9);
+  HH(e, a, b, c, d,  8);       M( 8,  5,  0, 10);
+  HH(d, e, a, b, c,  9);       M( 9,  6,  1, 11);
+  HH(c, d, e, a, b, 10);       M(10,  7,  2, 12);
+  HH(b, c, d, e, a, 11);       M(11,  8,  3, 13);
+  II(a, b, c, d, e, 12);       M(12,  9,  4, 14);
+  II(e, a, b, c, d, 13);       M(13, 10,  5, 15);
+  II(d, e, a, b, c, 14);       M(14, 11,  6,  0);
+  II(c, d, e, a, b, 15);       M(15, 12,  7,  1);
+  II(b, c, d, e, a,  0);
+  II(a, b, c, d, e,  1);
+  II(e, a, b, c, d,  2);
+  II(d, e, a, b, c,  3);
+  II(c, d, e, a, b,  4);
+  II(b, c, d, e, a,  5);
+  II(a, b, c, d, e,  6);
+  II(e, a, b, c, d,  7);
+  II(d, e, a, b, c,  8);
+  II(c, d, e, a, b,  9);
+  II(b, c, d, e, a, 10);
+  II(a, b, c, d, e, 11);
+  II(e, a, b, c, d, 12);
+  II(d, e, a, b, c, 13);
+  II(c, d, e, a, b, 14);
+  II(b, c, d, e, a, 15);
 
   /* --- Update the chaining variables --- */
 
-  ctx->a += a;
-  ctx->b += b;
-  ctx->c += c;
-  ctx->d += d;
-  ctx->e += e;
+  ctx->a += a; ctx->b += b; ctx->c += c; ctx->d += d; ctx->e += e;
 }
 
 /* --- @sha_init@ --- *
@@ -227,7 +210,7 @@ void sha_set(sha_ctx *ctx, const void *buf, unsigned long count)
   ctx->e = LOAD32(p + 16);
   ctx->off = 0;
   ctx->nl = U32(count);
-  ctx->nh = U32(((count & ~MASK32) >> 16) >> 16);
+  ctx->nh = U32(((count & ~(unsigned long)MASK32) >> 16) >> 16);
 }
 
 /* --- @sha_hash@ --- *