#include <stdio.h>
#include <string.h>

#include "misc.h"

unsigned char *crypt(unsigned char *dest,unsigned char *source)
{	register int i,j,len=strlen(source);
	char text[10];
	static const unsigned char ar[16]={2,11,0,3,12,5,7,14,8,10,1,4,15,6,13,0};

	for(i=0;i<8;text[i++]=0);

	if(len>8)
	{
		for(i=0;i<len;i++)
			text[i%8]^=((16*ar[(source[i]%16+i)%16]+ar[(source[i]/16+(16-i))%16])^(1<<(i%8)));
	}
	else
	if(len)
	{
		for(i=0;i<8;i++)
			text[i]=((16*ar[(source[i%len]%16+i)%16]+ar[(source[i%len]/16+(16-i))%16])^(1<<(i%8)));
	}

	for(i=0;i<8;dest[i++]=0);

	for(j=0;j<8;j++)
	{
		for(i=0;i<8;i++)
		{
			if(text[j] & (1<<i))
				dest[i]|=(1<<j);
		}
	}

	for(i=0;i<8;i++)
	{
		if(!(dest[i]=~(dest[i]^text[i])))
			dest[i]=239;
	}
	dest[8]=0;

	return dest;
}

