Merged blowfish branch into trunk.
[become] / src / icrypt.c
index 589c5a5..de1d508 100644 (file)
@@ -1,8 +1,8 @@
 /* -*-c-*-
  *
- * $Id: icrypt.c,v 1.2 1997/08/04 10:24:22 mdw Exp $
+ * $Id: icrypt.c,v 1.3 1997/09/26 09:14:58 mdw Exp $
  *
- * Higher level IDEA encryption
+ * Higher level encryption functions
  *
  * (c) 1997 Mark Wooding
  */
 /*----- Revision history --------------------------------------------------*
  *
  * $Log: icrypt.c,v $
+ * Revision 1.3  1997/09/26 09:14:58  mdw
+ * Merged blowfish branch into trunk.
+ *
+ * Revision 1.2.2.1  1997/09/26 09:08:07  mdw
+ * Use the Blowfish encryption algorithm instead of IDEA.  This is partly
+ * because I prefer Blowfish (without any particularly strong evidence) but
+ * mainly because IDEA is patented and Blowfish isn't.
+ *
  * Revision 1.2  1997/08/04 10:24:22  mdw
  * Sources placed under CVS control.
  *
@@ -47,9 +55,9 @@
 
 /* --- Local headers --- */
 
+#include "blowfish.h"
 #include "config.h"
 #include "icrypt.h"
-#include "idea.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -57,6 +65,7 @@
  *
  * Arguments:  @icrypt_job *j@ = pointer to job context block
  *             @unsigned char *k@ = pointer to key data
+ *             @size_t sz@ = size of the key data
  *             @const unsigned char *iv@ = pointer to IV
  *
  * Returns:    ---
  * Use:                Primes the context block ready for encryption.
  */
 
-void icrypt_init(icrypt_job *j, unsigned char *k, const unsigned char *iv)
+void icrypt_init(icrypt_job *j, unsigned char *k,
+                size_t sz, const unsigned char *iv)
 {
-  idea_ekeys(&j->k, k);
+  blowfish_setKey(&j->k, k, sz);
   if (iv)
-    memcpy(j->iv, iv, IDEA_BLKSIZE);
+    memcpy(j->iv, iv, BLOWFISH_BLKSIZE);
   else
-    memset(j->iv, 0, IDEA_BLKSIZE);
+    memset(j->iv, 0, BLOWFISH_BLKSIZE);
   j->i = 8;
 }
 
@@ -89,13 +99,13 @@ void icrypt_init(icrypt_job *j, unsigned char *k, const unsigned char *iv)
 
 void icrypt_encrypt(icrypt_job *j, const void *src, void *dest, size_t sz)
 {
-  const char *s = src;
-  char *d = dest;
+  const unsigned char *s = src;
+  unsigned char *d = dest;
   int i;
 
   /* --- First, use up bytes in the buffer --- */
 
-  while (j->i < IDEA_BLKSIZE && sz > 0) {
+  while (j->i < BLOWFISH_BLKSIZE && sz > 0) {
     *d++ = j->iv[j->i++] ^= *s++;
     sz--;
   }
@@ -103,24 +113,24 @@ void icrypt_encrypt(icrypt_job *j, const void *src, void *dest, size_t sz)
 
   /* --- Now encrypt larger chunks at a time --- */
 
-  while (sz >= IDEA_BLKSIZE) {
+  while (sz >= BLOWFISH_BLKSIZE) {
 
     /* --- Freshen the IV --- */
 
-    idea_encrypt(&j->k, j->iv, j->iv);
+    blowfish_encrypt(&j->k, j->iv, j->iv);
 
     /* --- Now encrypt some more bytes --- */
 
-    for (i = 0; i < IDEA_BLKSIZE; i++) {
+    for (i = 0; i < BLOWFISH_BLKSIZE; i++) {
       *d++ = j->iv[i] ^= *s++;
     }
-    sz -= IDEA_BLKSIZE;
+    sz -= BLOWFISH_BLKSIZE;
   }
   if (!sz) return;
 
   /* --- Do the tail-end bits --- */
 
-  idea_encrypt(&j->k, j->iv, j->iv);
+  blowfish_encrypt(&j->k, j->iv, j->iv);
   j->i = 0;
   while (sz) {
     *d++ = j->iv[j->i++] ^= *s++;
@@ -143,14 +153,14 @@ void icrypt_encrypt(icrypt_job *j, const void *src, void *dest, size_t sz)
 
 void icrypt_decrypt(icrypt_job *j, const void *src, void *dest, size_t sz)
 {
-  const char *s = src;
-  char *d = dest;
+  unsigned const char *s = src;
+  unsigned char *d = dest;
   int i;
-  char c;
+  unsigned char c;
 
   /* --- First, use up bytes in the buffer --- */
 
-  while (j->i < IDEA_BLKSIZE && sz > 0) {
+  while (j->i < BLOWFISH_BLKSIZE && sz > 0) {
     c = *s++;
     *d++ = j->iv[j->i] ^ c;
     j->iv[j->i++] = c;
@@ -160,26 +170,26 @@ void icrypt_decrypt(icrypt_job *j, const void *src, void *dest, size_t sz)
 
   /* --- Now encrypt larger chunks at a time --- */
 
-  while (sz >= IDEA_BLKSIZE) {
+  while (sz >= BLOWFISH_BLKSIZE) {
 
     /* --- Freshen the IV --- */
 
-    idea_encrypt(&j->k, j->iv, j->iv);
+    blowfish_encrypt(&j->k, j->iv, j->iv);
 
     /* --- Now encrypt some more bytes --- */
 
-    for (i = 0; i < IDEA_BLKSIZE; i++) {
+    for (i = 0; i < BLOWFISH_BLKSIZE; i++) {
       c = *s++;
       *d++ = j->iv[i] ^ c;
       j->iv[i] = c;
     }
-    sz -= IDEA_BLKSIZE;
+    sz -= BLOWFISH_BLKSIZE;
   }
   if (!sz) return;
 
   /* --- Do the tail-end bits --- */
 
-  idea_encrypt(&j->k, j->iv, j->iv);
+  blowfish_encrypt(&j->k, j->iv, j->iv);
   j->i = 0;
   while (sz) {
     c = *s++;
@@ -194,6 +204,7 @@ void icrypt_decrypt(icrypt_job *j, const void *src, void *dest, size_t sz)
  * Arguments:  @icrypt_job *j@ = pointer to job context block
  *             @unsigned char *k@ = pointer to key data, or zero for
  *                     no change
+ *             @size_t sz@ = size of the key in bytes
  *             @const unsigned char *iv@ = pointer to IV, or zero
  *
  * Returns:    ---
@@ -202,15 +213,16 @@ void icrypt_decrypt(icrypt_job *j, const void *src, void *dest, size_t sz)
  *             of a session key, for example.
  */
 
-void icrypt_reset(icrypt_job *j, unsigned char *k, const unsigned char *iv)
+void icrypt_reset(icrypt_job *j, unsigned char *k,
+                 size_t sz, const unsigned char *iv)
 {
   if (k)
-    idea_ekeys(&j->k, k);
+    blowfish_setKey(&j->k, k, sz);
   if (iv)
-    memcpy(j->iv, iv, IDEA_BLKSIZE);
+    memcpy(j->iv, iv, BLOWFISH_BLKSIZE);
   else {
-    unsigned char b[IDEA_BLKSIZE];
-    int n = j->i, o = IDEA_BLKSIZE - j->i;
+    unsigned char b[BLOWFISH_BLKSIZE];
+    int n = j->i, o = BLOWFISH_BLKSIZE - j->i;
 
     memcpy(b, j->iv, sizeof(b));
     memcpy(j->iv, b + n, o);
@@ -231,11 +243,11 @@ void icrypt_reset(icrypt_job *j, unsigned char *k, const unsigned char *iv)
 
 void icrypt_saveIV(icrypt_job *j, unsigned char *iv)
 {
-  int n = j->i, o = IDEA_BLKSIZE - j->i;
+  int n = j->i, o = BLOWFISH_BLKSIZE - j->i;
 
   memcpy(j->iv, iv + n, o);
   memcpy(j->iv + o, iv, n);
-  idea_encrypt(&j->k, iv, iv);
+  blowfish_encrypt(&j->k, iv, iv);
 }
 
 /*----- Test rig ----------------------------------------------------------*/
@@ -245,6 +257,7 @@ void icrypt_saveIV(icrypt_job *j, unsigned char *iv)
 #include <errno.h>
 #include <pwd.h>
 #include <unistd.h>
+#include "crypt.h"
 #include "mdwopt.h"
 #include "md5.h"
 #include "utils.h"
@@ -288,13 +301,13 @@ int main(int argc, char *argv[])
 
   {
     char *pass = getpass("Password: ");
-    unsigned char k[IDEA_KEYSIZE];
+    unsigned char k[BLOWFISH_KEYSIZE];
     md5_init(&md);
     md5_buffer(&md, pass, strlen(pass));
     memset(pass, 0, strlen(pass));
     md5_final(&md, k);
 
-    icrypt_init(&j, k, 0);
+    icrypt_init(&j, k, BLOWFISH_KEYSIZE, 0);
   }
 
   if (optind >= argc)