chiark / gitweb /
base/permute.h, utils/permute.lisp, symm/...: Formalize bit permutations.
[catacomb] / symm / t / tea-test.c
1 #include <stdio.h>
2 #include <catacomb/fibrand.h>
3
4 /* --- Needham and Wheeler's original code --- *
5  *
6  * Almost.  I changed the types from long to unsigned long.
7  */
8
9 void code(unsigned long* v, unsigned long* k)  {
10 unsigned long y=v[0],z=v[1], sum=0,   /* set up */
11  delta=0x9e3779b9, n=32 ;             /* a key schedule constant */
12 while (n-->0) {                       /* basic cycle start */
13   sum += delta ;
14     y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ;
15     z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ;   /* end cycle */
16               }
17 v[0]=y ; v[1]=z ; }
18
19 int main(void)
20 {
21   unsigned long k[4] = { 0x00112233, 0x44556677, 0x8899aabb, 0xccddeeff };
22   unsigned long p[2] = { 0x01234567, 0x89abcdef };
23   fibrand f;
24
25   int i;
26
27   printf("  %08lx%08lx%08lx%08lx %08lx%08lx ",
28          k[0], k[1], k[2], k[3], p[0], p[1]);
29   code(p, k);
30   printf("%08lx%08lx;\n", p[0], p[1]);
31
32   fibrand_lcseed(&f, 0);
33   for (i = 1; i < 64; i++) {
34     k[0] = fibrand_step(&f);
35     k[1] = fibrand_step(&f);
36     k[2] = fibrand_step(&f);
37     k[3] = fibrand_step(&f);
38     p[0] = fibrand_step(&f);
39     p[1] = fibrand_step(&f);
40     printf("  %08lx%08lx%08lx%08lx %08lx%08lx ",
41            k[0], k[1], k[2], k[3], p[0], p[1]);
42     code(p, k);
43     printf("%08lx%08lx;\n", p[0], p[1]);
44   }
45
46   return (0);
47 }