Fixed partial encryption in CTR mode. Does not affect interop
authorPekka Riikonen <priikone@silcnet.org>
Fri, 22 Feb 2008 14:29:58 +0000 (14:29 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Fri, 22 Feb 2008 14:29:58 +0000 (14:29 +0000)
in SILC.

CHANGES
lib/silccrypt/aes.c
lib/silccrypt/rijndael_internal.h

diff --git a/CHANGES b/CHANGES
index 5d9787addd81e105ff8cd67bdfb13938ef3c1ede..e6d976c80ddef1dd7420bec490c0d6d31f7aa29f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,10 @@
+Fri Feb 22 16:12:27 EET 2008  Pekka Riikonen <priikone@silcnet.org>
+
+       * Fixed partial encryption in CTR mode in AES.  Change does not
+         affect interoperability in SILC due to the way CTR is used in
+         SILC.  But, fixed anyway.  Affected files are
+         lib/silccrypt/aes.c and rijndael_internal.h.
+
 Tue Jan  8 09:41:57 EET 2008  Pekka Riikonen <priikone@silcnet.org>
 
        * Fixed printable fingerprint bufferoverlfow, RedHat bug 372021.
@@ -45,7 +52,7 @@ Sun Nov 11 16:02:12 EET 2007 Pekka Riikonen <priikone@silcnet.org>
 Sun Nov 11 14:15:48 EET 2007  Pekka Riikonen <priikone@silcnet.org>
 
        * SILC Toolkit 1.1.5.
-
+       
 Sun Nov 11 11:22:35 EET 2007  Pekka Riikonen <priikone@silcnet.org>
 
        * Fixed connection authentication with public keys to use
index 9c5a2f196ee5d93ed7e9c893ea912c8a5e4a7268..f41a61d66766ae4cfb547721a75acea0d82ad5dc 100644 (file)
@@ -190,13 +190,7 @@ SILC_CIPHER_API_CONTEXT_LEN(aes_ctr)
 SILC_CIPHER_API_ENCRYPT(aes_ctr)
 {
   AesContext *aes = context;
-  SilcUInt32 ctr[4];
-  int i;
-
-  SILC_GET32_MSB(ctr[0], iv);
-  SILC_GET32_MSB(ctr[1], iv + 4);
-  SILC_GET32_MSB(ctr[2], iv + 8);
-  SILC_GET32_MSB(ctr[3], iv + 12);
+  int i, k;
 
   i = aes->u.enc.inf.b[2];
   if (!i)
@@ -204,28 +198,17 @@ SILC_CIPHER_API_ENCRYPT(aes_ctr)
 
   while (len-- > 0) {
     if (i == 16) {
-      if (++ctr[3] == 0)
-       if (++ctr[2] == 0)
-         if (++ctr[1] == 0)
-           ++ctr[0];
-
-      SILC_PUT32_MSB(ctr[0], iv);
-      SILC_PUT32_MSB(ctr[1], iv + 4);
-      SILC_PUT32_MSB(ctr[2], iv + 8);
-      SILC_PUT32_MSB(ctr[3], iv + 12);
+      for (k = 15; k >= 0; k--)
+       if (++iv[k])
+         break;
 
-      aes_encrypt(iv, iv, &aes->u.enc);
+      aes_encrypt(iv, aes->u.enc.pad, &aes->u.enc);
       i = 0;
     }
-    *dst++ = *src++ ^ iv[i++];
+    *dst++ = *src++ ^ aes->u.enc.pad[i++];
   }
   aes->u.enc.inf.b[2] = i;
 
-  SILC_PUT32_MSB(ctr[0], iv);
-  SILC_PUT32_MSB(ctr[1], iv + 4);
-  SILC_PUT32_MSB(ctr[2], iv + 8);
-  SILC_PUT32_MSB(ctr[3], iv + 12);
-
   return TRUE;
 }
 
index e6dcb1c3a4a5fa9dca85a4d7bcbec681625581e6..83a01f3c5d3596594531dda4b617d2b33f568017 100644 (file)
@@ -44,6 +44,7 @@ typedef union {
 typedef struct {
   uint_32t ks[KS_LENGTH];
   aes_inf inf;
+  unsigned char pad[16];
 } aes_encrypt_ctx;
 
 typedef struct {