]> xmof Git - DeDRM.git/commitdiff
Support for Adobe's 'aes128-cbc-uncompressed' encryption (see #242)
authorNoDRM <no_drm123@protonmail.com>
Fri, 6 Jan 2023 13:32:25 +0000 (14:32 +0100)
committerNoDRM <no_drm123@protonmail.com>
Fri, 6 Jan 2023 13:32:25 +0000 (14:32 +0100)
CHANGELOG.md
DeDRM_plugin/ineptepub.py

index 8e8f105d12e13ba2605aea327679c734e0611323..0e4301bf470070cee40e3c5f53989f29c3802e06 100644 (file)
@@ -87,3 +87,5 @@ List of changes since the fork of Apprentice Harper's repository:
 - Obok: Fix where changing the Calibre UI language to some languages would cause the "duplicate book" setting to reset.
 - Fix Python3 bug in stylexml2css.php script, fixes #232.
 - PDF: Ignore invalid PDF objids unless the script is running in strict mode. Fixes some PDFs, apparently. Fixes #233. 
+- Bugfix: EPUBs with remaining content in the encryption.xml after decryption weren't written correctly. 
+- Support for Adobe's 'aes128-cbc-uncompressed' encryption method (fixes #242).
index d403dacc1e41c32ef70587952913df66e0dd84cf..f118ce691bebfb0dc6b7a3042efa3b85b7e4afe1 100644 (file)
@@ -91,6 +91,7 @@ class Decryptor(object):
         self._aes = AES.new(bookkey, AES.MODE_CBC, b'\x00'*16)
         self._encryption = etree.fromstring(encryption)
         self._encrypted = encrypted = set()
+        self._encryptedForceNoDecomp = encryptedForceNoDecomp = set()
         self._otherData = otherData = set()
 
         self._json_elements_to_remove = json_elements_to_remove = set()
@@ -106,6 +107,11 @@ class Decryptor(object):
                     path = path.encode('utf-8')
                     encrypted.add(path)
                     json_elements_to_remove.add(elem.getparent().getparent())
+                elif (encryption_type_url == "http://ns.adobe.com/adept/xmlenc#aes128-cbc-uncompressed"):
+                    # Adobe uncompressed, for stuff like video files
+                    path = path.encode('utf-8')
+                    encryptedForceNoDecomp.add(path)
+                    json_elements_to_remove.add(elem.getparent().getparent())
                 else:
                     path = path.encode('utf-8')
                     otherData.add(path)
@@ -134,14 +140,15 @@ class Decryptor(object):
         return decompressed_bytes
 
     def decrypt(self, path, data):
-        if path.encode('utf-8') in self._encrypted:
+        if path.encode('utf-8') in self._encrypted or path.encode('utf-8') in self._encryptedForceNoDecomp:
             data = self._aes.decrypt(data)[16:]
             if type(data[-1]) != int:
                 place = ord(data[-1])
             else:
                 place = data[-1]
             data = data[:-place]
-            data = self.decompress(data)
+            if not path.encode('utf-8') in self._encryptedForceNoDecomp:
+                data = self.decompress(data)
         return data
 
 # check file to make check whether it's probably an Adobe Adept encrypted ePub