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]);