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 --- */
#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)
#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@ --- *
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@ --- *