/* sakura4.c - Don Yang (uguu.org) Preprocess 4: replace names 02/08/01 */ #include #include typedef unsigned int D; typedef unsigned char B; D T[68], s[2], S[4] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476}, x[16], *a, *b, *c, *d, y, z, Y, Z, j, i; B p[64], q[1024], r[8]; FILE *f; R(D *x, D n, D *u) { *x = ((*x << n) | (*x >> (32 - n))) + *u; } F(D *a, D *b, D *c, D *d, D u, D s, D v) { *a += x[u] + T[v] + ( (*b & *c) | (~*b & *d) ); R(a, s, b); } G(D *a, D *b, D *c, D *d, D u, D s, D v) { *a += x[u] + T[v] + ( (*b & *d) | (*c & ~*d) ); R(a, s, b); } H(D *a, D *b, D *c, D *d, D u, D s, D v) { *a += x[u] + T[v] + ( *b ^ *c ^ *d ); R(a, s, b); } I(D *a, D *b, D *c, D *d, D u, D s, D v) { *a += x[u] + T[v] + ( *c ^ (*b | ~*d) ); R(a, s, b); } E(B *u, D *v, D e) { for(y = z = 0; z < e;) { u[z++] = v[y] & 255; u[z++] = (v[y] >> 8) & 255; u[z++] = (v[y] >> 16) & 255; u[z++] = (v[y++] >> 24) & 255; } } V(B *u) { *a = *S; *b = S[1]; *c = S[2]; *d = S[3]; for(y = z = 0; z < 64; z += 4) x[y++] = ((D)u[z]) | (((D)u[z + 1]) << 8) | (((D)u[z + 2]) << 16) | (((D)u[z + 3]) << 24); F(a, b, c, d, 0, 7, 0); F(d, a, b, c, 1, 12, 1); F(c, d, a, b, 2, 17, 2); F(b, c, d, a, 3, 22, 3); F(a, b, c, d, 4, 7, 4); F(d, a, b, c, 5, 12, 5); F(c, d, a, b, 6, 17, 6); F(b, c, d, a, 7, 22, 7); F(a, b, c, d, 8, 7, 8); F(d, a, b, c, 9, 12, 9); F(c, d, a, b, 10, 17, 10); F(b, c, d, a, 11, 22, 11); F(a, b, c, d, 12, 7, 12); F(d, a, b, c, 13, 12, 13); F(c, d, a, b, 14, 17, 14); F(b, c, d, a, 15, 22, 15); G(a, b, c, d, 1, 5, 16); G(d, a, b, c, 6, 9, 17); G(c, d, a, b, 11, 14, 18); G(b, c, d, a, 0, 20, 19); G(a, b, c, d, 5, 5, 20); G(d, a, b, c, 10, 9, 21); G(c, d, a, b, 15, 14, 22); G(b, c, d, a, 4, 20, 23); G(a, b, c, d, 9, 5, 24); G(d, a, b, c, 14, 9, 25); G(c, d, a, b, 3, 14, 26); G(b, c, d, a, 8, 20, 27); G(a, b, c, d, 13, 5, 28); G(d, a, b, c, 2, 9, 29); G(c, d, a, b, 7, 14, 30); G(b, c, d, a, 12, 20, 31); H(a, b, c, d, 5, 4, 32); H(d, a, b, c, 8, 11, 33); H(c, d, a, b, 11, 16, 34); H(b, c, d, a, 14, 23, 35); H(a, b, c, d, 1, 4, 36); H(d, a, b, c, 4, 11, 37); H(c, d, a, b, 7, 16, 38); H(b, c, d, a, 10, 23, 39); H(a, b, c, d, 13, 4, 40); H(d, a, b, c, 0, 11, 41); H(c, d, a, b, 3, 16, 42); H(b, c, d, a, 6, 23, 43); H(a, b, c, d, 9, 4, 44); H(d, a, b, c, 12, 11, 45); H(c, d, a, b, 15, 16, 46); H(b, c, d, a, 2, 23, 47); I(a, b, c, d, 0, 6, 48); I(d, a, b, c, 7, 10, 49); I(c, d, a, b, 14, 15, 50); I(b, c, d, a, 5, 21, 51); I(a, b, c, d, 12, 6, 52); I(d, a, b, c, 3, 10, 53); I(c, d, a, b, 10, 15, 54); I(b, c, d, a, 1, 21, 55); I(a, b, c, d, 8, 6, 56); I(d, a, b, c, 15, 10, 57); I(c, d, a, b, 6, 15, 58); I(b, c, d, a, 13, 21, 59); I(a, b, c, d, 4, 6, 60); I(d, a, b, c, 11, 10, 61); I(c, d, a, b, 2, 15, 62); I(b, c, d, a, 9, 21, 63); *S += *a; S[1] += *b; S[2] += *c; S[3] += *d; } U(B *u) { i = ((*s >> 3) & 63); if( (*s += (j << 3)) < (j << 3) ) s[1]++; s[1] += j >> 29; Z = 64 - i; if( j >= Z ) { memcpy(p + i, u, Z); V(p); for(Y = Z; Y + 63 < j; Y += 64) V(u + Y); i = 0; } else { Y = 0; } memcpy(p + i, u + Y, j - Y); } main(D u, char **v) { if( u < 2 ) { printf("%s \n", *v); } else if( !(f = fopen(v[1], "rb")) ) { printf("Can not open %s\n", v[1]); } else { for(u = 1; u < 65; u++) T[u - 1] = (4294967296 * fabs(sin((double)u))); a = &T[64]; b = &T[65]; c = &T[66]; d = &T[67]; *s = s[1] = 0; for(; (j = fread(q, 1, 1024, f)); U(q)); E(r, s, 8); i = (*s >> 3) & 63; j = (i < 56) ? (56 - i) : (120 - i); memset(q, 0, 64); *q = 128; U(q); j = 8; U(r); E(q, S, 16); for(u = 0; u < 16; printf("%02x", q[u++])); putchar(10); fclose(f); } }