Files
pvvmud/common/lib/crypto/crypto.C
2025-03-05 08:37:43 +01:00

189 lines
5.0 KiB
C

/*
* PVVMUD a 3D MUD
* Copyright (C) 1998-1999 Programvareverkstedet (pvv@pvv.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "crypto.H"
#include <errno.h>
#define MAXCRYPTSIZE 1024
#define int32 int
CCrypto::CCrypto(void) {
// Common
cryptKey=(BF_KEY *)malloc(sizeof(BF_KEY));
BF_set_key(cryptKey,19,(unsigned char *)"This is just a test");
// Reading part of the code
cryptBuf_r=(unsigned char *)malloc(4);
cryptSize_r=0;
cryptPos_r=0;
cryptState_r=0;
cryptN_r=0;
cryptIV_r[0]=0xfe;
cryptIV_r[1]=0xdc;
cryptIV_r[2]=0xba;
cryptIV_r[3]=0x98;
cryptIV_r[4]=0x76;
cryptIV_r[5]=0x54;
cryptIV_r[6]=0x32;
cryptIV_r[7]=0x10;
// Writing part of the code
cryptTempBuf=(unsigned char *)malloc(4);
cryptSize_w=0;
cryptPos_w=0;
cryptState_w=0;
cryptN_w=0;
cryptIV_w[0]=0xfe;
cryptIV_w[1]=0xdc;
cryptIV_w[2]=0xba;
cryptIV_w[3]=0x98;
cryptIV_w[4]=0x76;
cryptIV_w[5]=0x54;
cryptIV_w[6]=0x32;
cryptIV_w[7]=0x10;
}
CCrypto::~CCrypto(void) {
if (cryptBuf_r != NULL) free(cryptBuf_r);
if (cryptBuf_w != NULL) free(cryptTempBuf);
if (cryptKey != NULL) free(cryptKey);
};
ssize_t CCrypto::read(int fd, char **buf, size_t count) {
ssize_t bRead;
unsigned char *tempBuf;
int i,j;
while (1)
switch (cryptState_r) {
case 0:
bRead=::read(fd,(cryptBuf_r+cryptPos_r),(4-cryptPos_r));
if (bRead > 0) cryptPos_r+=bRead;
if (cryptPos_r < 4) return (-2);
cryptSize_r=*(int32 *)cryptBuf_r;
free(cryptBuf_r);
cryptBuf_r=(unsigned char *)malloc(cryptSize_r);
if (cryptBuf_r==NULL) printf("Couldn't allocate memory \n");
bRead=0;
cryptPos_r=0;
cryptState_r=1;
case 1:
bRead=::read(fd,(cryptBuf_r+cryptPos_r),(cryptSize_r-cryptPos_r));
if (bRead > 0) {
cryptPos_r+=bRead;
};
if (cryptPos_r < cryptSize_r) return (-2);
tempBuf=cryptBuf_r;
cryptBuf_r=(unsigned char *)malloc(cryptSize_r);
BF_cfb64_encrypt(tempBuf,cryptBuf_r,cryptSize_r,cryptKey,
cryptIV_r,&cryptN_r,BF_DECRYPT);
printf("Decrypting ... %i bytes ...\n",cryptSize_r);
free(tempBuf);
cryptPos_r=0;
cryptState_r=2;
case 2:
*buf=(char *)(cryptBuf_r+cryptPos_r);
j=MIN(cryptSize_r-cryptPos_r,count);
cryptPos_r+=j;
if (cryptPos_r==cryptSize_r) cryptState_r=3;
if (j==0) j=-2;
return(j);
case 3:
free(cryptBuf_r);
cryptBuf_r=(unsigned char *)malloc(4);
cryptPos_r=0;
cryptState_r=0;
};
}
ssize_t CCrypto::write(int fd, void *buf, size_t count) {
ssize_t bWrote;
int32 length,j;
unsigned char *tempBuf;
int i=0;
if (count == 0) return (0);
while(1)
switch(cryptState_w) {
case 0:
cryptSize_w = count;
cryptBuf_w = (unsigned char *)buf;
cryptTempPos = 0;
cryptPos_w = 0;
*(int32 *)(cryptTempBuf) = cryptSize_w;
cryptState_w = 1;
break;
case 1:
bWrote=1;
while (bWrote>0) {
bWrote=::write(fd,(cryptTempBuf+cryptTempPos),(4-cryptTempPos));
if (bWrote>0) cryptTempPos+=bWrote;;
};
if (cryptTempPos<4) return (0);
free(cryptTempBuf);
cryptTempBuf=(unsigned char *)malloc(cryptSize_w);
BF_cfb64_encrypt(cryptBuf_w, cryptTempBuf, cryptSize_w,
cryptKey, cryptIV_w, &cryptN_w, BF_ENCRYPT);
cryptPos_w = 0;
cryptState_w = 2;
break;
case 2:
cryptTempSize = MIN(cryptSize_w-cryptPos_w,MAXCRYPTSIZE);
cryptTempPos = 0;
cryptState_w = 3;
break;
case 3:
bWrote=1;
while(bWrote>0) {
bWrote=::write(fd,(void *)(cryptTempBuf+cryptPos_w+cryptTempPos),
(cryptTempSize-cryptTempPos));
if (bWrote>0) cryptTempPos+=bWrote;
};
if (cryptTempPos<cryptTempSize) return (0);
cryptPos_w+=cryptTempPos;
cryptState_w = 2;
if (cryptPos_w<cryptSize_w) break;
free(cryptTempBuf);
cryptTempBuf = (unsigned char *)malloc(4);
cryptState_w = 0;
printf("Encrypting : ... %i bytes ...\n",cryptSize_w);
return(cryptPos_w);
};
};