summaryrefslogtreecommitdiffstats
path: root/Modules/rotormodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/rotormodule.c')
-rw-r--r--Modules/rotormodule.c97
1 files changed, 89 insertions, 8 deletions
diff --git a/Modules/rotormodule.c b/Modules/rotormodule.c
index e40615f..e8fec07 100644
--- a/Modules/rotormodule.c
+++ b/Modules/rotormodule.c
@@ -1,6 +1,4 @@
/***********************************************************
-Copyright 1992 by Lance Ellinghouse (lance@markv.com).
-
Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Netherlands.
@@ -23,6 +21,19 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/
+/******************************************************************
+Copyright 1992 by Lance Ellinghouse (lance@markv.com)
+
+All Rights Reserved
+
+Permission to use, copy, distribute for any purpose and without fee
+is hereby granted, provided that this copyright notice appear in
+all copies and that both this copyright notice and this permission
+notice appear in supporting documentation.
+Permission to make any changes is granted on the basis that all
+changes and improvements are also forwarded to Lance Ellinghouse
+before distribution.
+******************************************************************/
/* This creates an encryption and decryption engine I am calling
a rotor due to the original design was a harware rotor with
@@ -35,9 +46,19 @@ Rotor Module:
Rotor Objects:
+- ro.setkey('string') -> None (resets the key as defined in newrotor().
- ro.encrypt('string') -> encrypted string
- ro.decrypt('encrypted string') -> unencrypted string
+- ro.encryptmore('string') -> encrypted string
+- ro.decryptmore('encrypted string') -> unencrypted string
+
+NOTE: the {en,de}cryptmore() methods use the setup that was
+ established via the {en,de}crypt calls. They will NOT
+ re-initalize the rotors unless: 1) They have not been
+ initalized with {en,de}crypt since the last setkey() call;
+ 2) {en,de}crypt has not been called for this rotor yet.
+
NOTE: you MUST use the SAME key in rotor.newrotor()
if you wish to decrypt an encrypted string.
Also, the encrypted string is NOT 0-127 ASCII.
@@ -51,11 +72,14 @@ NOTE: you MUST use the SAME key in rotor.newrotor()
#include "modsupport.h"
#include <stdio.h>
#include <math.h>
+#define TRUE 1
+#define FALSE 0
typedef struct {
OB_HEAD
int seed[3];
short key[5];
+ int isinited;
int size;
int size_mask;
int rotors;
@@ -79,6 +103,7 @@ rotorobject *r;
r->seed[0] = r->key[0];
r->seed[1] = r->key[1];
r->seed[2] = r->key[2];
+ r->isinited = FALSE;
}
/* Return the next random number in the range [0.0 .. 1.0) */
@@ -120,6 +145,7 @@ static short r_rand(r,s)
rotorobject *r;
short s;
{
+ /*short tmp = (short)((int)(r_random(r) * (float)32768.0) % 32768);*/
short tmp = (short)((short)(r_random(r) * (float)s) % s);
return tmp;
}
@@ -360,6 +386,7 @@ static void RTR_init(r)
r->advances[i] = (1+(2*(r_rand(r,r->size/2))));
RTR_permute_rotor(r,&(r->e_rotor[(i*r->size)]),&(r->d_rotor[(i*r->size)]));
}
+ r->isinited = TRUE;
}
/*(defun RTR-advance ()
@@ -497,13 +524,15 @@ static unsigned char RTR_d_char(r, c)
(let ((fc (following-char)))
(insert-char (RTR-e-char fc) 1)
(delete-char 1))))))*/
-static void RTR_e_region(r, beg, len)
+static void RTR_e_region(r, beg, len, doinit)
rotorobject *r;
unsigned char *beg;
int len;
+ int doinit;
{
register int i;
- RTR_init(r);
+ if (doinit || r->isinited == FALSE)
+ RTR_init(r);
for (i=0;i<len;i++) {
beg[i]=RTR_e_char(r,beg[i]);
}
@@ -519,13 +548,15 @@ static void RTR_e_region(r, beg, len)
(let ((fc (following-char)))
(insert-char (RTR-d-char fc) 1)
(delete-char 1))))))*/
-void static RTR_d_region(r, beg, len)
+void static RTR_d_region(r, beg, len, doinit)
rotorobject *r;
unsigned char *beg;
int len;
+ int doinit;
{
register int i;
- RTR_init(r);
+ if (doinit || r->isinited == FALSE)
+ RTR_init(r);
for (i=0;i<len;i++) {
beg[i]=RTR_d_char(r,beg[i]);
}
@@ -605,7 +636,31 @@ rotor_encrypt(self, args)
}
memset(tmp,'\0',len+1);
memcpy(tmp,string,len);
- RTR_e_region(self,tmp,len);
+ RTR_e_region(self,tmp,len, TRUE);
+ rtn = newsizedstringobject(tmp,len);
+ free(tmp);
+ return(rtn);
+}
+
+static object *
+rotor_encryptmore(self, args)
+ rotorobject *self;
+ object *args;
+{
+ char *string = (char *)NULL;
+ int len = 0;
+ object *rtn = (object *)NULL;
+ char *tmp;
+
+ if (!getargs(args,"s#",&string, &len))
+ return NULL;
+ if (!(tmp = (char *)malloc(len+5))) {
+ err_nomem();
+ return NULL;
+ }
+ memset(tmp,'\0',len+1);
+ memcpy(tmp,string,len);
+ RTR_e_region(self,tmp,len, FALSE);
rtn = newsizedstringobject(tmp,len);
free(tmp);
return(rtn);
@@ -629,7 +684,31 @@ rotor_decrypt(self, args)
}
memset(tmp,'\0',len+1);
memcpy(tmp,string,len);
- RTR_d_region(self,tmp,len);
+ RTR_d_region(self,tmp,len, TRUE);
+ rtn = newsizedstringobject(tmp,len);
+ free(tmp);
+ return(rtn);
+}
+
+static object *
+rotor_decryptmore(self, args)
+ rotorobject *self;
+ object *args;
+{
+ char *string = (char *)NULL;
+ int len = 0;
+ object *rtn = (object *)NULL;
+ char *tmp;
+
+ if (!getargs(args,"s#",&string, &len))
+ return NULL;
+ if (!(tmp = (char *)malloc(len+5))) {
+ err_nomem();
+ return NULL;
+ }
+ memset(tmp,'\0',len+1);
+ memcpy(tmp,string,len);
+ RTR_d_region(self,tmp,len, FALSE);
rtn = newsizedstringobject(tmp,len);
free(tmp);
return(rtn);
@@ -651,7 +730,9 @@ rotor_setkey(self, args)
static struct methodlist rotor_methods[] = {
{"encrypt", rotor_encrypt},
+ {"encryptmore", rotor_encryptmore},
{"decrypt", rotor_decrypt},
+ {"decryptmore", rotor_decryptmore},
{"setkey", rotor_setkey},
{NULL, NULL} /* sentinel */
};