Hello,
security/py-crypto in ports is vulnerable to CVE-2013-7459, the attached
patches apply the changes from the following commit to v2.6.1.
https://github.com/dlitz/pycrypto/commit/8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4


Sevan
--- lib/Crypto/SelfTest/Cipher/common.py.orig	2017-03-07 16:48:08.000000000 +0000
+++ lib/Crypto/SelfTest/Cipher/common.py
@@ -239,19 +239,33 @@ class RoundtripTest(unittest.TestCase):
         return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,)
 
     def runTest(self):
-        for mode in (self.module.MODE_ECB, self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB, self.module.MODE_OPENPGP):
+        ## ECB mode
+	mode = self.module.MODE_ECB
+	encryption_cipher = self.module.new(a2b_hex(self.key), mode)
+	ciphertext = encryption_cipher.encrypt(self.plaintext)
+	decryption_cipher = self.module.new(a2b_hex(self.key), mode)
+	decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
+	self.assertEqual(self.plaintext, decrypted_plaintext)
+
+	## OPENPGP mode
+	mode = self.module.MODE_OPENPGP
+	encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
+	eiv_ciphertext = encryption_cipher.encrypt(self.plaintext)
+	eiv = eiv_ciphertext[:self.module.block_size+2]
+	ciphertext = eiv_ciphertext[self.module.block_size+2:]
+	decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv)
+	decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
+	self.assertEqual(self.plaintext, decrypted_plaintext)
+
+	## All other non-AEAD modes (but CTR)
+	for mode in (self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB):
             encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
             ciphertext = encryption_cipher.encrypt(self.plaintext)
-            
-            if mode != self.module.MODE_OPENPGP:
-                decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
-            else:
-                eiv = ciphertext[:self.module.block_size+2]
-                ciphertext = ciphertext[self.module.block_size+2:]
-                decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv)
+	    decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
             decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
             self.assertEqual(self.plaintext, decrypted_plaintext)
 
+
 class PGPTest(unittest.TestCase):
     def __init__(self, module, params):
         unittest.TestCase.__init__(self)
--- src/block_template.c.orig   2017-03-07 16:58:09.000000000 +0000
+++ src/block_template.c
@@ -170,6 +170,17 @@ ALGnew(PyObject *self, PyObject *args, P
                                "Key cannot be the null string");
                return NULL;
        }
+       if (IVlen != 0 && mode == MODE_ECB)
+       {
+               PyErr_Format(PyExc_ValueError, "ECB mode does not use IV");
+               return NULL;
+       }
+       if (IVlen != 0 && mode == MODE_CTR)
+       {
+               PyErr_Format(PyExc_ValueError,
+                       "CTR mode needs counter parameter, not IV");
+               return NULL;
+       }
        if (IVlen != BLOCK_SIZE && mode != MODE_ECB && mode != MODE_CTR)
        {
                PyErr_Format(PyExc_ValueError,

Reply via email to