protected void processBlock()
    {
        //
        // expand 16 word block into 64 word blocks.
        //
        for (int t = 16; t <= 63; t++)
        {
            X[t] = Theta1(X[t - 2]) + X[t - 7] + Theta0(X[t - 15]) + X[t - 16];
        }

        //
        // set up working variables.
        //
        int     a = H1;
        int     b = H2;
        int     c = H3;
        int     d = H4;
        int     e = H5;
        int     f = H6;
        int     g = H7;
        int     h = H8;


        int t = 0;     
        for(int i = 0; i < 8; i ++)
        {
            // t = 8 * i
            h += Sum1(e) + Ch(e, f, g) + K[t] + X[t++];
            d += h;
            h += Sum0(a) + Maj(a, b, c);

            // t = 8 * i + 1
            g += Sum1(d) + Ch(d, e, f) + K[t] + X[t++];
            c += g;
            g += Sum0(h) + Maj(h, a, b);

            // t = 8 * i + 2
            f += Sum1(c) + Ch(c, d, e) + K[t] + X[t++];
            b += f;
            f += Sum0(g) + Maj(g, h, a);

            // t = 8 * i + 3
            e += Sum1(b) + Ch(b, c, d) + K[t] + X[t++];
            a += e;
            e += Sum0(f) + Maj(f, g, h);

            // t = 8 * i + 4
            d += Sum1(a) + Ch(a, b, c) + K[t] + X[t++];
            h += d;
            d += Sum0(e) + Maj(e, f, g);

            // t = 8 * i + 5
            c += Sum1(h) + Ch(h, a, b) + K[t] + X[t++];
            g += c;
            c += Sum0(d) + Maj(d, e, f);

            // t = 8 * i + 6
            b += Sum1(g) + Ch(g, h, a) + K[t] + X[t++];
            f += b;
            b += Sum0(c) + Maj(c, d, e);

            // t = 8 * i + 7
            a += Sum1(f) + Ch(f, g, h) + K[t] + X[t++];
            e += a;
            a += Sum0(b) + Maj(b, c, d);
        }

        H1 += a;
        H2 += b;
        H3 += c;
        H4 += d;
        H5 += e;
        H6 += f;
        H7 += g;
        H8 += h;

        //
        // reset the offset and clean out the word buffer.
        //
        xOff = 0;
        for (int i = 0; i < 16; i++)
        {
            X[i] = 0;
        }
    }