[ pycrypto-Bugs-1364920 ] bug in Zooko's fast-CTR-mode patch

"SourceForge.net" <[email protected]> Wed, 23 Nov 2005 11:07:08 -0800
Newsgroups gmane.comp.python.cryptography.cvs
Message-ID <[email protected]>
Bugs item #1364920, was opened at 2005-11-23 19:07
Message generated for change (Tracker Item Submitted) made by Item Submitter
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=120937&aid=1364920&group_id=20937

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Zooko O'Whielacronx (zooko)
Assigned to: Nobody/Anonymous (nobody)
Summary: bug in Zooko's fast-CTR-mode patch

Initial Comment:
My patch for fast CTR mode (all in C -- no Python) has
a bug in that it isn't "restartable" -- if you encrypt
or decrypt some data which is not itself a multiple of
the block length, then subsequent calls to
encrypt/decrypt will give incorrect results.

I'll make fixes for this soon.  In the meantime, here's
a unit test showing how it doesn't work.

https://yumyum.zooko.com:19144/cgi-bin/darcs.cgi/pycrypto-zookopatches/?c=patches

Wed Nov 23 15:00:57 AST 2005  [email protected]
  * add unit test that shows that CTR mode is not
restartable -- this is a bug
diff -rN -u
old-pycrypto-2.0.1-varlength-cctr/pycrypto-2.0.1/Util/test.py
new-pycrypto-2.0.1-varlength-cctr/pycrypto-2.0.1/Util/test.py
---
old-pycrypto-2.0.1-varlength-cctr/pycrypto-2.0.1/Util/test.py
2005-11-23 15:06:39.000000000 -0400
+++
new-pycrypto-2.0.1-varlength-cctr/pycrypto-2.0.1/Util/test.py
2005-11-23 15:06:39.000000000 -0400
@@ -146,6 +146,23 @@
     print_timing(256, end-start, verbose)
     del obj1, obj2
 
+    if verbose: print '  CTR mode, variable length,
restart:',
+    strv = str[:-1]
+    obj1=ciph.new(password, ciph.MODE_CTR,
counterstart=long_to_bytes(startctr, ciph.block_size))
+    obj2=ciph.new(password, ciph.MODE_CTR,
counterstart=long_to_bytes(startctr, ciph.block_size))
+    start=time.time()
+    tempstrv = strv
+    while tempstrv:
+        chunksiz = random.randrange(1, len(tempstrv)+1)
+        ciphertext = obj1.encrypt(tempstrv[:chunksiz])
+        tempstrv = tempstrv[chunksiz:]
+    plaintext=obj2.decrypt(ciphertext)
+    end=time.time()
+    if (plaintext!=strv):
+        die('Error in resulting plaintext from CTR
mode, variable length, restart')
+    print_timing(256, end-start, verbose)
+    del obj1, obj2
+
     # Test the IV handling
     if verbose: print '  Testing IV handling'
     obj1=ciph.new(password, ciph.MODE_CBC, IV)

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=120937&aid=1364920&group_id=20937


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click