/* bell5.c - Don Yang (uguu.org) 03/16/01 */ #include #include typedef unsigned int D; typedef unsigned char B; typedef union { B c[64]; D l[16]; } C; C *o; D i, j, k, r[5], s[5], d[2]; B a[1<<15], b[64], f[8]; #define L(u, v) (((u) << v) | ((u) >> (32 - v))) #define A D *v, D *w, D *x, D *y, D *z #define E L(*v,5); *w = L(*w,30);} void #ifndef WORDS_BIGENDIAN #define G(i) (o->l[i] = (L(o->l[i],24)&0xff00ff00) \ |(L(o->l[i],8)&0x00ff00ff)) #else #define G(i) o->l[i] #endif #define F(i) (o->l[i&15] = L(o->l[(i+13)&15]^o->l[(i+8)&15] \ ^o->l[(i+2)&15]^o->l[i&15],1)) void V(A) { *z += (((*w)&((*x)^(*y)))^(*y))+G(k)+0x5a827999+E W(A) { *z += (((*w)&((*x)^(*y)))^(*y))+F(k)+0x5a827999+E X(A) { *z += ((*w)^(*x)^(*y))+F(k)+0x6ed9eba1+E Y(A) { *z += ((((*w)|(*x))&(*y))|((*w)&(*x)))+F(k)+0x8f1bbcdc+E Z(A) { *z += ((*w)^(*x)^(*y))+F(k)+0xca62c1d6+E (*R)(A); void T(B e[64]) { o = (C*)e; for(k = 0; k < 5; k++) r[k] = s[k]; for(k = 0; k < 80; k++) { R = k < 40 ? k < 20 ? k < 16 ? V : W : X : k < 60 ? Y : Z; R(&r[(80 - k) % 5], &r[(81 - k) % 5], &r[(82 - k) % 5], &r[(83 - k) % 5], &r[(84 - k) % 5]); } for(k = 0; k < 5; k++) s[k] += r[k]; } void U(B *e, D u) { j = (d[0] >> 3) & 63; if( (d[0] += u << 3) < (u << 3) ) d[1]++; d[1] += (u >> 29); if( (j + u) > 63 ) { memmove(&b[j], e, i = 64 - j); for(T(b); i + 63 < u; i += 64) T((B*)&e[i]); j = 0; } else { i = 0; } memmove(&b[j], &e[i], u - i); } int main(int u, char **v) { FILE *e; if( u > 1 && (e = fopen(v[1], "rb")) ) { s[d[0] = d[1] = 0] = 0x67452301; s[1] = 0xefcdab89; s[2] = 0x98badcfe; s[3] = 0x10325476; for(s[4] = 0xc3d2e1f0; !feof(e); U(a, k)) k = fread(a, 1, 1<<14, e); for(k = 0; k < 8; k++) f[k] = (B) ((d[(k >= 4 ? 0 : 1)] >> ((3 - (k & 3)) * 8)) & 255); for(U((B*) "\x80", 1); (d[0] & 504) != 448; U((B*) "\0", 1)); U(f, 8); for(k = 0; k < 20; k++) a[k] = (B)((s[k >> 2] >> ((3 - (k & 3)) * 8)) & 255); for(i = 0; i < 20; i += 4) printf("%02x%02x%02x%02x ", a[i], a[i + 1], a[i + 2], a[i + 3]); putchar(10); fclose(e); } return 0; }