diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bb9848..b5537cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -101,3 +101,4 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix a bug where decrypting a 40-bit RC4 pdf with R=2 didn't work. - Fix a bug where decrypting a 256-bit AES pdf with V=5 didn't work. +- Fix bugs in kgenpids.py and kindlekey.py that caused it to fail on Python 2 (#380). diff --git a/DeDRM_plugin/kgenpids.py b/DeDRM_plugin/kgenpids.py index 31cb6a5..d11c3da 100644 --- a/DeDRM_plugin/kgenpids.py +++ b/DeDRM_plugin/kgenpids.py @@ -53,11 +53,17 @@ def SHA1(message): def encode(data, map): result = b'' for char in data: - value = char + if sys.version_info[0] == 2: + value = ord(char) + else: + value = char + Q = (value ^ 0x80) // len(map) R = value % len(map) - result += bytes([map[Q]]) - result += bytes([map[R]]) + + result += bytes(bytearray([map[Q]])) + result += bytes(bytearray([map[R]])) + return result # Hash the bytes in data and then encode the digest with the characters in map @@ -84,8 +90,11 @@ def decode(data,map): def getTwoBitsFromBitField(bitField,offset): byteNumber = offset // 4 bitPosition = 6 - 2*(offset % 4) - return bitField[byteNumber] >> bitPosition & 3 - + if sys.version_info[0] == 2: + return ord(bitField[byteNumber]) >> bitPosition & 3 + else: + return bitField[byteNumber] >> bitPosition & 3 + # Returns the six bits at offset from a bit field def getSixBitsFromBitField(bitField,offset): offset *= 3 @@ -97,7 +106,8 @@ def encodePID(hash): global charMap3 PID = b'' for position in range (0,8): - PID += bytes([charMap3[getSixBitsFromBitField(hash,position)]]) + PID += bytes(bytearray([charMap3[getSixBitsFromBitField(hash,position)]])) + return PID # Encryption table used to generate the device PID @@ -134,7 +144,7 @@ def generateDevicePID(table,dsn,nbRoll): index = (index+1) %8 for counter in range (0,8): index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7) - pidAscii += bytes([charMap4[index]]) + pidAscii += bytes(bytearray([charMap4[index]])) return pidAscii def crc32(s): @@ -150,7 +160,7 @@ def checksumPid(s): for i in (0,1): b = crc & 0xff pos = (b // l) ^ (b % l) - res += bytes([charMap4[pos%l]]) + res += bytes(bytearray([charMap4[pos%l]])) crc >>= 8 return res @@ -161,14 +171,17 @@ def pidFromSerial(s, l): crc = crc32(s) arr1 = [0]*l for i in range(len(s)): - arr1[i%l] ^= s[i] + if sys.version_info[0] == 2: + arr1[i%l] ^= ord(s[i]) + else: + arr1[i%l] ^= s[i] crc_bytes = [crc >> 24 & 0xff, crc >> 16 & 0xff, crc >> 8 & 0xff, crc & 0xff] for i in range(l): arr1[i] ^= crc_bytes[i&3] pid = b"" for i in range(l): b = arr1[i] & 0xff - pid += bytes([charMap4[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))]]) + pid += bytes(bytearray([charMap4[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))]])) return pid diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 14e4ed1..e8a0e65 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -115,11 +115,17 @@ def primes(n): def encode(data, map): result = b'' for char in data: - value = char + if sys.version_info[0] == 2: + value = ord(char) + else: + value = char + Q = (value ^ 0x80) // len(map) R = value % len(map) - result += bytes([map[Q]]) - result += bytes([map[R]]) + + result += bytes(bytearray([map[Q]])) + result += bytes(bytearray([map[R]])) + return result # Hash the bytes in data and then encode the digest with the characters in map