Fix python2 issues in kgenpids and kindlekey

This commit is contained in:
NoDRM 2023-08-03 10:50:06 +02:00
parent e82d2b5c9c
commit e509b7d520
3 changed files with 33 additions and 13 deletions

View File

@ -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 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 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).

View File

@ -53,11 +53,17 @@ def SHA1(message):
def encode(data, map): def encode(data, map):
result = b'' result = b''
for char in data: for char in data:
value = char if sys.version_info[0] == 2:
value = ord(char)
else:
value = char
Q = (value ^ 0x80) // len(map) Q = (value ^ 0x80) // len(map)
R = value % 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 return result
# Hash the bytes in data and then encode the digest with the characters in map # Hash the bytes in data and then encode the digest with the characters in map
@ -84,7 +90,10 @@ def decode(data,map):
def getTwoBitsFromBitField(bitField,offset): def getTwoBitsFromBitField(bitField,offset):
byteNumber = offset // 4 byteNumber = offset // 4
bitPosition = 6 - 2*(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 # Returns the six bits at offset from a bit field
def getSixBitsFromBitField(bitField,offset): def getSixBitsFromBitField(bitField,offset):
@ -97,7 +106,8 @@ def encodePID(hash):
global charMap3 global charMap3
PID = b'' PID = b''
for position in range (0,8): for position in range (0,8):
PID += bytes([charMap3[getSixBitsFromBitField(hash,position)]]) PID += bytes(bytearray([charMap3[getSixBitsFromBitField(hash,position)]]))
return PID return PID
# Encryption table used to generate the device PID # Encryption table used to generate the device PID
@ -134,7 +144,7 @@ def generateDevicePID(table,dsn,nbRoll):
index = (index+1) %8 index = (index+1) %8
for counter in range (0,8): for counter in range (0,8):
index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7) index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7)
pidAscii += bytes([charMap4[index]]) pidAscii += bytes(bytearray([charMap4[index]]))
return pidAscii return pidAscii
def crc32(s): def crc32(s):
@ -150,7 +160,7 @@ def checksumPid(s):
for i in (0,1): for i in (0,1):
b = crc & 0xff b = crc & 0xff
pos = (b // l) ^ (b % l) pos = (b // l) ^ (b % l)
res += bytes([charMap4[pos%l]]) res += bytes(bytearray([charMap4[pos%l]]))
crc >>= 8 crc >>= 8
return res return res
@ -161,14 +171,17 @@ def pidFromSerial(s, l):
crc = crc32(s) crc = crc32(s)
arr1 = [0]*l arr1 = [0]*l
for i in range(len(s)): 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] crc_bytes = [crc >> 24 & 0xff, crc >> 16 & 0xff, crc >> 8 & 0xff, crc & 0xff]
for i in range(l): for i in range(l):
arr1[i] ^= crc_bytes[i&3] arr1[i] ^= crc_bytes[i&3]
pid = b"" pid = b""
for i in range(l): for i in range(l):
b = arr1[i] & 0xff 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 return pid

View File

@ -115,11 +115,17 @@ def primes(n):
def encode(data, map): def encode(data, map):
result = b'' result = b''
for char in data: for char in data:
value = char if sys.version_info[0] == 2:
value = ord(char)
else:
value = char
Q = (value ^ 0x80) // len(map) Q = (value ^ 0x80) // len(map)
R = value % 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 return result
# Hash the bytes in data and then encode the digest with the characters in map # Hash the bytes in data and then encode the digest with the characters in map