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 }