From fb8b0034448fd191fa2f3abc12233391d931e4a2 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 6 Jan 2023 14:32:25 +0100 Subject: [PATCH] Support for Adobe's 'aes128-cbc-uncompressed' encryption (see #242) --- CHANGELOG.md | 2 ++ DeDRM_plugin/ineptepub.py | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e8f105..0e4301b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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). diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index d403dac..f118ce6 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -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