Commit | Line | Data |
---|---|---|
5b62e993 MW |
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 | } |