]> xmof Git - DeDRM.git/commitdiff
Python 3 fix for old ereader PDB DRM removal
authorApprentice Harper <apprenticeharper@gmail.com>
Fri, 27 Nov 2020 15:51:33 +0000 (15:51 +0000)
committerApprentice Harper <apprenticeharper@gmail.com>
Fri, 27 Nov 2020 15:51:33 +0000 (15:51 +0000)
DeDRM_plugin/erdr2pml.py
DeDRM_plugin/openssl_des.py

index 5cc395fed23719ffa5bf7ee1abaaf2c72ad40895..a7ad95e5e2d60d2f10c96f746ccf94fb95b2f46d 100755 (executable)
@@ -200,7 +200,7 @@ class Sectionizer(object):
         self.num_sections, = struct.unpack('>H', self.contents[76:78])
         # Dictionary or normal content (TODO: Not hard-coded)
         if self.header[0x3C:0x3C+8] != ident:
-            if self.header[0x3C:0x3C+8] == "PDctPPrs":
+            if self.header[0x3C:0x3C+8] == b"PDctPPrs":
                 self.bkType = "Dict"
             else:
                 raise ValueError('Invalid file format')
@@ -240,7 +240,7 @@ def sanitizeFileName(name):
 def fixKey(key):
     def fixByte(b):
         return b ^ ((b ^ (b<<1) ^ (b<<2) ^ (b<<3) ^ (b<<4) ^ (b<<5) ^ (b<<6) ^ (b<<7) ^ 0x80) & 0x80)
-    return     "".join([chr(fixByte(ord(a))) for a in key])
+    return bytes([fixByte(a) for a in key])
 
 def deXOR(text, sp, table):
     r=''
@@ -269,13 +269,13 @@ class EreaderProcessor(object):
             raise ValueError('incorrect eReader version (error 2)')
         input = des.decrypt(data[-cookie_size:])
         def unshuff(data, shuf):
-            r = [''] * len(data)
+            r = [0] * len(data)
             j = 0
             for i in range(len(data)):
                 j = (j + shuf) % len(data)
                 r[j] = data[i]
-            assert    len("".join(r)) == len(data)
-            return "".join(r)
+            assert len(bytes(r)) == len(data)
+            return bytes(r)
         r = unshuff(input[0:-8], cookie_shuf)
 
         drm_sub_version = struct.unpack('>H', r[0:2])[0]
@@ -354,7 +354,7 @@ class EreaderProcessor(object):
 
     def getImage(self, i):
         sect = self.section_reader(self.first_image_page + i)
-        name = sect[4:4+32].strip('\0')
+        name = sect[4:4+32].strip(b'\0')
         data = sect[62:]
         return sanitizeFileName(name.decode('windows-1252')), data
 
@@ -404,7 +404,7 @@ class EreaderProcessor(object):
 
     def getText(self):
         des = Des(fixKey(self.content_key))
-        r = ''
+        r = b''
         for i in range(self.num_text_pages):
             logging.debug('get page %d', i)
             r += zlib.decompress(des.decrypt(self.section_reader(1 + i)))
@@ -456,8 +456,7 @@ def cleanPML(pml):
     # Convert special characters to proper PML code.  High ASCII start at (\x80, \a128) and go up to (\xff, \a255)
     pml2 = pml
     for k in range(128,256):
-        badChar = chr(k)
-        pml2 = pml2.replace(badChar, '\\a%03d' % k)
+        pml2 = pml2.replace(bytes([k]), b'\\a%03d' % k)
     return pml2
 
 def decryptBook(infile, outpath, make_pmlz, user_key):
@@ -476,7 +475,7 @@ def decryptBook(infile, outpath, make_pmlz, user_key):
         if not os.path.exists(outdir):
             os.makedirs(outdir)
         print("Decoding File")
-        sect  =Sectionizer(infile, 'PNRdPPrs')
+        sect  =Sectionizer(infile, b'PNRdPPrs')
         er = EreaderProcessor(sect, user_key)
 
         if er.getNumImages() > 0:
index 9a84e58ef56c151bdd118a9cc2e39292735b1b83..9e455b4ce322e603016fcf8c1f65a67dcc2ab782 100644 (file)
@@ -76,7 +76,7 @@ def load_libcrypto():
             return ob.raw
         def decrypt(self, data):
             if not data:
-                return ''
+                return b''
             i = 0
             result = []
             while i < len(data):
@@ -84,6 +84,6 @@ def load_libcrypto():
                 processed_block = self.desdecrypt(block)
                 result.append(processed_block)
                 i += 8
-            return ''.join(result)
+            return b''.join(result)
 
     return DES