chiark / gitweb /
Import ezmlm 0.53
[ezmlm] / surfpcs.c
1 /* XXX: this needs testing */
2
3 #include "surf.h"
4 #include "surfpcs.h"
5
6 void surfpcs_init(s,k)
7 surfpcs *s;
8 uint32 k[32];
9 {
10   int i;
11   for (i = 0;i < 32;++i) s->seed[i] = k[i];
12   for (i = 0;i < 8;++i) s->sum[i] = 0;
13   for (i = 0;i < 12;++i) s->in[i] = 0;
14   s->todo = 0;
15 }
16
17 static uint32 littleendian[8] = {
18   50462976, 117835012, 185207048, 252579084,
19   319951120, 387323156, 454695192, 522067228
20 } ;
21 #define end ((unsigned char *) &littleendian)
22
23 #define data ((unsigned char *) s->in)
24 #define outdata ((unsigned char *) s->out)
25
26 void surfpcs_add(s,x,n)
27 surfpcs *s;
28 unsigned char *x;
29 unsigned int n;
30 {
31   int i;
32   while (n--) {
33     data[end[s->todo++]] = *x++;
34     if (s->todo == 32) {
35       s->todo = 0;
36       if (!++s->in[8])
37         if (!++s->in[9])
38           if (!++s->in[10])
39             ++s->in[11];
40       surf(s->out,s->in,s->seed);
41       for (i = 0;i < 8;++i)
42         s->sum[i] += s->out[i];
43     }
44   }
45 }
46
47 void surfpcs_out(s,h)
48 surfpcs *s;
49 unsigned char h[32];
50 {
51   int i;
52   surfpcs_add(s,".",1);
53   while (s->todo) surfpcs_add(s,"",1);
54   for (i = 0;i < 8;++i) s->in[i] = s->sum[i];
55   for (;i < 12;++i) s->in[i] = 0;
56   surf(s->out,s->in,s->seed);
57   for (i = 0;i < 32;++i) h[i] = outdata[end[i]];
58 }