untermud/DOC/
untermud/DOC/U/
untermud/DOC/U/U-examples/
untermud/DOC/internals/
untermud/DOC/wizard/
untermud/MISC/
untermud/MISC/dbchk/
untermud/RWHO/
untermud/RWHO/rwhod/
/*
    Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

/* configure all options BEFORE including system stuff. */
#include    "config.h"

/*
just jiggle the text around a little to make it hard to read at a
glance. not a real encryption by any stretch of the imagination.

grabbed from some code off the net, originally by a Molly Kolodny
*/



/* boundaries of the printable set */
#define LO  ' '
#define HI  '~'

/* size of our cryptospace */
#define SIZ (HI - LO)

/* number of rotating knives */
#define NROT    9
static int rot[NROT];


/*
stir the rotating knives.

some kind of hash would make the stirring a lot nicer, but this needs
to be done in a fairly limited manner to prevent it from becoming machine
specific. IE: beware of overflows, and whatnot. any key should always
give the same set of rotation pointers or the objects with anything
encrypted in them will be unusable.
*/
void rot_init (key)
char *key;
{
  int x = 0;
  int ki = 0;
  int ri = 0;
  int hash;
  char *kp = key;

  for (x = 0; x < NROT; x++)
    rot[x] = 0;

  if (key == (char *) 0)
    kp = "otters";

  x = 0;
  hash = *kp;

  while (ri == 0 || ki == 0) {
    if (*kp == '\0')
      ki++, kp = key;
    if (x == NROT)
      ri++, x = 0;

    hash = *kp + (659 * hash) % SIZ;
    rot[x] = (rot[x] + hash) % SIZ;

    x++, kp++;
  }
}




/* stir the text through the rotating knives */
void rot_encode (s1, s2)
char *s1;
char *s2;
{
  int x, j;

  while (*s1 != '\0') {
    if (*s1 < LO || *s1 > HI) {
      *s2++ = *s1++;
      continue;
    }

    j = *s1 - LO;

    for (x = 0; x < NROT; x++) {
      if ((j = j + rot[x]) >= SIZ)
        j = j - SIZ;

      if ((rot[x] = rot[x] + (j / 3)) >= SIZ)
        rot[x] = rot[x] - SIZ;
    }

    *s2 = j + LO;
    s1++, s2++;
  }
  *s2 = *s1;
}




/* invert the stirring */
void rot_decode (s1, s2)
char *s1;
char *s2;
{
  int x, j, sj;

  while (*s1 != '\0') {
    if (*s1 < LO || *s1 > HI) {
      *s2++ = *s1++;
      continue;
    }

    j = *s1 - LO;

    for (x = NROT - 1; x != -1; x--) {
      sj = j;
      if ((j = j - rot[x]) < 0)
        j = j + SIZ;

      if ((rot[x] = rot[x] + (sj / 3)) >= SIZ)
        rot[x] = rot[x] - SIZ;
    }

    *s2 = j + LO;
    s1++, s2++;
  }
  *s2 = *s1;
}