/* XXX: this needs testing */
#include "surf.h"
#include "surfpcs.h"
void surfpcs_init(s,k)
surfpcs *s;
uint32 k[32];
{
int i;
for (i = 0;i < 32;++i) s->seed[i] = k[i];
for (i = 0;i < 8;++i) s->sum[i] = 0;
for (i = 0;i < 12;++i) s->in[i] = 0;
s->todo = 0;
}
static uint32 littleendian[8] = {
50462976, 117835012, 185207048, 252579084,
319951120, 387323156, 454695192, 522067228
} ;
#define end ((unsigned char *) &littleendian)
#define data ((unsigned char *) s->in)
#define outdata ((unsigned char *) s->out)
void surfpcs_add(s,x,n)
surfpcs *s;
unsigned char *x;
unsigned int n;
{
int i;
while (n--) {
data[end[s->todo++]] = *x++;
if (s->todo == 32) {
s->todo = 0;
if (!++s->in[8])
if (!++s->in[9])
if (!++s->in[10])
++s->in[11];
surf(s->out,s->in,s->seed);
for (i = 0;i < 8;++i)
s->sum[i] += s->out[i];
}
}
}
void surfpcs_out(s,h)
surfpcs *s;
unsigned char h[32];
{
int i;
surfpcs_add(s,".",1);
while (s->todo) surfpcs_add(s,"",1);
for (i = 0;i < 8;++i) s->in[i] = s->sum[i];
for (;i < 12;++i) s->in[i] = 0;
surf(s->out,s->in,s->seed);
for (i = 0;i < 32;++i) h[i] = outdata[end[i]];
}
syntax highlighted by Code2HTML, v. 0.9.1