Import ezmlm 0.53
[ezmlm] / surfpcs.c
CommitLineData
5b62e993
MW
1/* XXX: this needs testing */
2
3#include "surf.h"
4#include "surfpcs.h"
5
6void surfpcs_init(s,k)
7surfpcs *s;
8uint32 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
17static 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
26void surfpcs_add(s,x,n)
27surfpcs *s;
28unsigned char *x;
29unsigned 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
47void surfpcs_out(s,h)
48surfpcs *s;
49unsigned 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}