static void FT(Int32 n, ref ShaTransf t) { t.A = T32(R32(t.B, 5) + f(n, t.C, t.D, t.E) + t.T + t.W[t.idxW++] + CONST[n-1]); t.C = R32(t.C, 30); }
private void sha_transform() { int i, idx = 0; ShaTransf tf = new ShaTransf(); tf.W = new long[80]; /* SHA_BYTE_ORDER == 12345678 */ // for (i = 0; i < 16; i += 2) // { // tf.T = data[idx]; // idx += 8; // tf.W[i] = ((tf.T << 24) & 0xff000000) | ((tf.T << 8) & 0x00ff0000) | // ((tf.T >> 8) & 0x0000ff00) | ((tf.T >> 24) & 0x000000ff); // tf.T >>= 32; // tf.W[i+1] = ((tf.T << 24) & 0xff000000) | ((tf.T << 8) & 0x00ff0000) | // ((tf.T >> 8) & 0x0000ff00) | ((tf.T >> 24) & 0x000000ff); // } /* SHA_BYTE_ORDER == 1234 */ for (i = 0; i < 16; ++i) { tf.T = ((long) data[idx++]) & 0x000000ff; tf.T += (((long) data[idx++]) << 8) & 0x0000ff00; tf.T += (((long) data[idx++]) << 16) & 0x00ff0000; tf.T += (((long) data[idx++]) << 24) & 0xff000000; tf.W[i] = ((tf.T << 24) & 0xff000000) | ((tf.T << 8) & 0x00ff0000) | ((tf.T >> 8) & 0x0000ff00) | ((tf.T >> 24) & 0x000000ff); } for (i = 16; i < 80; ++i) { tf.W[i] = tf.W[i-3] ^ tf.W[i-8] ^ tf.W[i-14] ^ tf.W[i-16]; tf.W[i] = R32(tf.W[i], 1); } tf.A = digest[0]; tf.B = digest[1]; tf.C = digest[2]; tf.D = digest[3]; tf.E = digest[4]; tf.idxW = 0; // UNRAVEL FA(1, ref tf); FB(1, ref tf); FC(1, ref tf); FD(1, ref tf); FE(1, ref tf); FT(1, ref tf); FA(1, ref tf); FB(1, ref tf); FC(1, ref tf); FD(1, ref tf); FE(1, ref tf); FT(1, ref tf); FA(1, ref tf); FB(1, ref tf); FC(1, ref tf); FD(1, ref tf); FE(1, ref tf); FT(1, ref tf); FA(1, ref tf); FB(1, ref tf); FC(2, ref tf); FD(2, ref tf); FE(2, ref tf); FT(2, ref tf); FA(2, ref tf); FB(2, ref tf); FC(2, ref tf); FD(2, ref tf); FE(2, ref tf); FT(2, ref tf); FA(2, ref tf); FB(2, ref tf); FC(2, ref tf); FD(2, ref tf); FE(2, ref tf); FT(2, ref tf); FA(2, ref tf); FB(2, ref tf); FC(2, ref tf); FD(2, ref tf); FE(3, ref tf); FT(3, ref tf); FA(3, ref tf); FB(3, ref tf); FC(3, ref tf); FD(3, ref tf); FE(3, ref tf); FT(3, ref tf); FA(3, ref tf); FB(3, ref tf); FC(3, ref tf); FD(3, ref tf); FE(3, ref tf); FT(3, ref tf); FA(3, ref tf); FB(3, ref tf); FC(3, ref tf); FD(3, ref tf); FE(3, ref tf); FT(3, ref tf); FA(4, ref tf); FB(4, ref tf); FC(4, ref tf); FD(4, ref tf); FE(4, ref tf); FT(4, ref tf); FA(4, ref tf); FB(4, ref tf); FC(4, ref tf); FD(4, ref tf); FE(4, ref tf); FT(4, ref tf); FA(4, ref tf); FB(4, ref tf); FC(4, ref tf); FD(4, ref tf); FE(4, ref tf); FT(4, ref tf); FA(4, ref tf); FB(4, ref tf); digest[0] = T32(digest[0] + tf.E); digest[1] = T32(digest[1] + tf.T); digest[2] = T32(digest[2] + tf.A); digest[3] = T32(digest[3] + tf.B); digest[4] = T32(digest[4] + tf.C); }
static void FE(Int32 n, ref ShaTransf t) { t.B = T32(R32(t.C, 5) + f(n, t.D, t.E, t.T) + t.A + t.W[t.idxW++] + CONST[n-1]); t.D = R32(t.D,30); }
static void FD(Int32 n, ref ShaTransf t) { t.C = T32(R32(t.D, 5) + f(n, t.E, t.T, t.A) + t.B + t.W[t.idxW++] + CONST[n-1]); t.E = R32(t.E, 30); }
static void FC(Int32 n, ref ShaTransf t) { t.D = T32(R32(t.E, 5) + f(n, t.T, t.A, t.B) + t.C + t.W[t.idxW++] + CONST[n-1]); t.T = R32(t.T,30); }
static void FB(Int32 n, ref ShaTransf t) { t.E = T32(R32(t.T,5) + f(n, t.A, t.B, t.C) + t.D + t.W[t.idxW++] + CONST[n-1]); t.A = R32(t.A,30); }
static void FA(Int32 n, ref ShaTransf t) { t.T = T32(R32(t.A, 5) + f(n, t.B, t.C, t.D) + t.E + t.W[t.idxW++] + CONST[n-1]); t.B = R32(t.B,30); }