2005-03-19 Moritz Schulte <moritz@g10code.com>
authorMoritz Schulte <mo@g10code.com>
Sat, 19 Mar 2005 17:35:27 +0000 (17:35 +0000)
committerMoritz Schulte <mo@g10code.com>
Sat, 19 Mar 2005 17:35:27 +0000 (17:35 +0000)
* cipher.c (do_cbc_encrypt): Be careful to not overwrite data,
which is to be used later on.  This happend, in case CTS is
enabled and OUTBUF is equal to INBUF.

cipher/ChangeLog
cipher/cipher.c

index bc2a2ec..5306340 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-19  Moritz Schulte  <moritz@g10code.com>
+
+       * cipher.c (do_cbc_encrypt): Be careful to not overwrite data,
+       which is to be used later on.  This happend, in case CTS is
+       enabled and OUTBUF is equal to INBUF.
+
 2005-02-25  Werner Koch  <wk@g10code.com>
 
        * pubkey.c (gcry_pk_get_keygrip): Allow for shadowed-private-key.
index c1af943..24e94e1 100644 (file)
@@ -784,30 +784,36 @@ do_cbc_encrypt( gcry_cipher_hd_t c, byte *outbuf, const byte *inbuf,
            outbuf[i] = inbuf[i] ^ *ivp++;
        c->cipher->encrypt ( &c->context.c, outbuf, outbuf );
        memcpy(c->iv, outbuf, blocksize );
-       inbuf  += c->cipher->blocksize;
+       inbuf  += blocksize;
        if (!(c->flags & GCRY_CIPHER_CBC_MAC))
-         outbuf += c->cipher->blocksize;
+         outbuf += blocksize;
     }
 
     if ((c->flags & GCRY_CIPHER_CBC_CTS) && nbytes > blocksize)
       {
+       /* We have to be careful here, since outbuf might be equal to
+          inbuf.  */
+
        int restbytes;
+       byte b;
 
        if ((nbytes % blocksize) == 0)
          restbytes = blocksize;
        else
          restbytes = nbytes % blocksize;
 
-       memcpy(outbuf, outbuf - c->cipher->blocksize, restbytes);
-       outbuf -= c->cipher->blocksize;
-
-       for(ivp=c->iv,i=0; i < restbytes; i++ )
-           outbuf[i] = inbuf[i] ^ *ivp++;
-       for(; i < blocksize; i++ )
-           outbuf[i] = 0 ^ *ivp++;
+       outbuf -= blocksize;
+       for (ivp = c->iv, i = 0; i < restbytes; i++)
+         {
+           b = inbuf[i];
+           outbuf[blocksize + i] = outbuf[i];
+           outbuf[i] = b ^ *ivp++;
+         }
+       for (; i < blocksize; i++)
+         outbuf[i] = 0 ^ *ivp++;
 
-       c->cipher->encrypt ( &c->context.c, outbuf, outbuf );
-       memcpy(c->iv, outbuf, blocksize );
+       c->cipher->encrypt (&c->context.c, outbuf, outbuf);
+       memcpy (c->iv, outbuf, blocksize);
       }
 }