/**
* \file mycrypt.c
*
* \brief Password encryption for PennMUSH
*
* This file defines the function mush_crypt(key) used for password
* encryption, depending on the system. Actually, we pretty much
* expect to use SHS.
*/
#include "config.h"
#include <stdio.h>
#include <string.h>
#include "conf.h"
#ifdef HAS_OPENSSL
#include <openssl/sha.h>
#else
#include "shs.h"
#endif
#include "confmagic.h"
char *mush_crypt(const char *key);
/** Encrypt a password and return ciphertext.
* \param key plaintext to encrypt.
* \return encrypted password.
*/
char *
mush_crypt(const char *key)
{
static char crypt_buff[70];
#ifdef HAS_OPENSSL
char hash[SHA_DIGEST_LENGTH];
unsigned int a, b;
SHA(key, strlen(key), hash);
memcpy(&a, hash, sizeof a);
memcpy(&b, hash + sizeof a, sizeof b);
if (options.reverse_shs) {
int ra, rb;
ra = (a << 16) | (a >> 16);
rb = (b << 16) | (b >> 16);
a = ((ra & 0xFF00FF00L) >> 8) | ((ra & 0x00FF00FFL) << 8);
b = ((rb & 0xFF00FF00L) >> 8) | ((rb & 0x00FF00FFL) << 8);
}
sprintf(crypt_buff, "XX%u%u", a, b);
#else
SHS_INFO shsInfo;
shsInfo.reverse_wanted = (BYTE) options.reverse_shs;
shsInit(&shsInfo);
shsUpdate(&shsInfo, (const BYTE *) key, strlen(key));
shsFinal(&shsInfo);
sprintf(crypt_buff, "XX%lu%lu", shsInfo.digest[0], shsInfo.digest[1]);
#endif
return crypt_buff;
}