10 #define uint32 uint32_t
16 unsigned data[16/sizeof(unsigned)];
22 static struct md4_result results[1<<HASH_BITS][BUCKETS];
29 struct md4_result zero;
31 fd = open("/dev/urandom", O_RDONLY);
33 perror("/dev/urandom");
37 memset(zero.data, 0, 16);
43 size_t size = 200 + random() % (sizeof(buf)-200);
44 if (read(fd, buf, size) != size) {
45 printf("failed to init random bytes\n");
49 mdfour((unsigned char *)r.data, buf, size);
51 i = r.data[0] & ((1<<HASH_BITS)-1);
52 for (b=0;b<BUCKETS;b++) {
53 struct md4_result *old = &results[i][b];
54 if (memcmp(old->data, zero.data, 16) == 0) {
57 } else if (memcmp(old->data, r.data, 16) == 0) {
58 printf("\nfound a collision after %d calls! (%d/%d)\n",
64 printf("\nout of buckets at %d\n", i);
69 if (count % 1000 == 0) {
70 printf("%7d\r", count);