2 #include <catacomb/fibrand.h>
4 /* --- Needham and Wheeler's original code --- *
6 * Almost. I changed the types from long to unsigned long.
9 void tean(unsigned long * v, unsigned long * k, long N) {
10 unsigned long y=v[0], z=v[1], DELTA=0x9e3779b9 ;
13 unsigned long limit=DELTA*N, sum=0 ;
15 y+= (z<<4 ^ z>>5) + z ^ sum + k[sum&3],
17 z+= (y<<4 ^ y>>5) + y ^ sum + k[sum>>11 &3] ;
22 unsigned long sum=DELTA*(-N) ;
24 z-= (y<<4 ^ y>>5) + y ^ sum + k[sum>>11 &3],
26 y-= (z<<4 ^ z>>5) + z ^ sum + k[sum&3];
34 unsigned long k[4] = { 0x00112233, 0x44556677, 0x8899aabb, 0xccddeeff };
35 unsigned long p[2] = { 0x01234567, 0x89abcdef };
40 printf(" %08lx%08lx%08lx%08lx %08lx%08lx ",
41 k[0], k[1], k[2], k[3], p[0], p[1]);
43 printf("%08lx%08lx;\n", p[0], p[1]);
45 fibrand_lcseed(&f, 0);
46 for (i = 1; i < 64; i++) {
47 k[0] = fibrand_step(&f);
48 k[1] = fibrand_step(&f);
49 k[2] = fibrand_step(&f);
50 k[3] = fibrand_step(&f);
51 p[0] = fibrand_step(&f);
52 p[1] = fibrand_step(&f);
53 printf(" %08lx%08lx%08lx%08lx %08lx%08lx ",
54 k[0], k[1], k[2], k[3], p[0], p[1]);
56 printf("%08lx%08lx;\n", p[0], p[1]);