| 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 | } |