|
|
|
@ -53,11 +53,17 @@ def SHA1(message):
|
|
|
|
|
def encode(data, map):
|
|
|
|
|
result = b''
|
|
|
|
|
for char in data:
|
|
|
|
|
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,6 +90,9 @@ def decode(data,map):
|
|
|
|
|
def getTwoBitsFromBitField(bitField,offset):
|
|
|
|
|
byteNumber = offset // 4
|
|
|
|
|
bitPosition = 6 - 2*(offset % 4)
|
|
|
|
|
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
|
|
|
|
@ -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,6 +171,9 @@ def pidFromSerial(s, l):
|
|
|
|
|
crc = crc32(s)
|
|
|
|
|
arr1 = [0]*l
|
|
|
|
|
for i in range(len(s)):
|
|
|
|
|
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):
|
|
|
|
@ -168,7 +181,7 @@ def pidFromSerial(s, l):
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|