/*
 *  cryptsay.c -- handling encrypted conversation
 *
 *  PMF -- Padrone's MudFrontend, a frontend for (maybe mostly LP-)mud
 *  Thomas Padron-McCarthy (Email: padrone@lysator.liu.se), 1990, 1991
 *  Share and enjoy, but be nice: don't steal my program! Hugo is watching!
 *  This file latest updated: Sept 21, 1991
 *
 */

#include <strings.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <errno.h>
#include "safe_malloc.h"
#include "config.h"
#include "pmf.h"
#include "globals.h"

extern void do_remote_command();

/*---------------------------------------------------------------------------*/

char *cryptsay_handle_line(mudline)
char *mudline;
{
    static char *kx_buffer = NULL;
    register char *cp;
    register int offset;

    ASSERT(cryptkey && cryptkey[0]);

    USER_DEBUG(("cryptsay_handle_line: \"%s\"", mudline));
    USER_DEBUG(("Key is: \"%s\"", cryptkey));

    if (!cryptkey)
	return mudline;
    else {
	cp = mudline;
	offset = 0;
	while (*cp) {
	    if (*cp == 'P' && strncmp(cp, "PMF_CRYPTSAY: ", 14) == 0) {
		message("An encrypted line was received and de-crypted by PMF:");
		cp += 14; /* Skip the "PMF_CRYPTSAY: " */
		if (kx_buffer)
		    safe_free(kx_buffer);
		kx_buffer = safe_malloc(strlen(mudline) - 14 + 1);
		strncpy(kx_buffer, mudline, offset);
		pmf_decrypt(kx_buffer + offset, cp);

		USER_DEBUG(("cryptsay_handle_line returns decrypted: \"%s\"", kx_buffer));
		return kx_buffer;
	    }
	    ++cp;
	    ++offset;
	}
    }

    USER_DEBUG(("cryptsay_handle_line returns same: \"%s\"", mudline));
    return mudline;
} /* cryptsay_handle_line */

cmd_cryptsay(str)
char *str;
{
    register char *kx_cp, *ky_cp, *ky_buffer;

    if (cryptkey == NULL)
	error("You tried to \"cryptsay\" with no \"cryptkey\" defined.");

    /* strlen("say PMF_CRYPTSAY: ") == 18 */
    ky_buffer = safe_malloc(strlen(str) + 18 + 1);
    strcpy(ky_buffer, "say PMF_CRYPTSAY: ");
    ky_cp = ky_buffer + 18;
    kx_cp = str;
    pmf_encrypt(ky_cp, kx_cp);
    queue_mudline(ky_buffer, "");
    safe_free(ky_buffer);
} /* cmd_cryptsay */

cmd_crypttell(player, str)
char *player, *str;
{
    register char *kx_cp, *ky_cp, *ky_buffer;

    if (cryptkey == NULL)
	error("You tried to \"cryptrell\" with no \"cryptkey\" defined.");

    /* strlen("tell " + " PMF_CRYPTSAY: ") == 20 */
    ky_buffer = safe_malloc(strlen(player) + strlen(str) + 20 + 1);
    ky_cp = safe_malloc(strlen(str) + 1);
    pmf_encrypt(ky_cp, str);
    sprintf(ky_buffer, "tell %s PMF_CRYPTSAY: %s", player, ky_cp);
    queue_mudline(ky_buffer, "");
    safe_free(ky_buffer);
} /* cmd_crypttell */

pmf_encrypt(ky_cp, kx_cp)
register char *ky_cp, *kx_cp;
{
    register char *key_cp;
    char *ky_start;

    ky_start = ky_cp;
    USER_DEBUG(("Going to encrypt: \"%s\"", kx_cp));
    USER_DEBUG(("Key is: \"%s\"", cryptkey));

    key_cp = cryptkey;
    while (*kx_cp){ 
	if (isprint(*kx_cp))
	    *ky_cp = ((*kx_cp - 040) + (*key_cp - 040)) % (0176 - 040 + 1) + 040;
	else
	    *ky_cp = *kx_cp;
	++kx_cp;
	++ky_cp;
	++key_cp;
	if (!*key_cp)
	    key_cp = cryptkey;
    }
    *ky_cp = '\0';

    USER_DEBUG(("Encrypted result: \"%s\"", ky_start));
} /* pmf_encrypt */


pmf_decrypt(kx_cp, ky_cp)
register char *kx_cp, *ky_cp;
{
    register char *key_cp;
    char *kx_start;

    kx_start = kx_cp;
    USER_DEBUG(("Going to decrypt: \"%s\"", ky_cp));
    USER_DEBUG(("Key is: \"%s\"", cryptkey));

    key_cp = cryptkey;
    while (*ky_cp){ 
	if (isprint(*ky_cp))
	    *kx_cp = ((*ky_cp - 040) - (*key_cp - 040) + (0176 - 040 + 1)) % (0176 - 040 + 1) + 040;
	else
	    *kx_cp = *ky_cp;
	++ky_cp;
	++kx_cp;
	++key_cp;
	if (!*key_cp)
	    key_cp = cryptkey;
    }
    *kx_cp = '\0';

    USER_DEBUG(("Decrypted result: \"%s\"", kx_start));
} /* pmf_decrypt */


syntax highlighted by Code2HTML, v. 0.9.1