
#include "lclient.h"

#if CRYPT_TYPE == MD5_CRYPT
#include "md5.h"

/* This implementation is not secure:
   . it uses the same 128 bit pattern repeated to encrypt large blocks
   . if you know the first pattern, you can derive all subsequent patterns
 */

void lclient_md5_xor(unsigned char *key, unsigned char *data,
		     unsigned int length, int encrypt)
{
  int i;
  MD5_CTX md5ctx;

  MD5Init(&md5ctx);
  MD5Update(&md5ctx, key, KEY_SIZE);
  MD5Final(&md5ctx);
  memcpy(key, md5ctx.digest, KEY_SIZE);
#ifdef DEBUG
  printf("key: %x %x %x %x\n", ((int *)key)[0],  ((int *)key)[1],
	 ((int *)key)[2],  ((int *)key)[3]);
#endif
  for (i = 0; i < length / KEY_SIZE; i++)
    {
      register int j;
      register unsigned char *tmp = data + i * KEY_SIZE;
      for (j = 0; j < KEY_SIZE; j++)
	tmp[j] ^= key[j];
    }
}
#endif
