kopia lustrzana https://github.com/fagci/qs-uvk5-firmware-modder
refactor
rodzic
f0f1940ecd
commit
fdf002bc13
70
encdec.py
70
encdec.py
|
@ -1,51 +1,70 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from itertools import cycle
|
||||
import os
|
||||
from pathlib import Path
|
||||
from itertools import cycle
|
||||
|
||||
from sys import argv, stderr
|
||||
|
||||
# Structure of pre-encoded payload
|
||||
# 8196 | 16 | ... | 2 |
|
||||
# data D1 | version V | data D2 | crc |
|
||||
# 8196 | 16 | ... | 2 |
|
||||
# data | version | data | crc |
|
||||
|
||||
KEY = Path('./key.bin').read_bytes()
|
||||
|
||||
D1_LEN = 8192
|
||||
V_OFFSET = 8192
|
||||
V_LEN = 16
|
||||
CRC_LEN = 2
|
||||
|
||||
|
||||
def eprint(*args, **kwargs):
|
||||
print(*args, **kwargs, file=stderr)
|
||||
|
||||
|
||||
def xor(var, key):
|
||||
return bytes(a ^ b for a, b in zip(var, cycle(key)))
|
||||
|
||||
def decrypt(data):
|
||||
|
||||
def eprint_crc(crc):
|
||||
eprint('crc:', ['0x%02x' % x for x in crc], f'{crc[0]*crc[1]}')
|
||||
|
||||
|
||||
def make_16yte_version(version):
|
||||
return bytes([ord(c) for c in version] + [0] * (16 - len(version)))
|
||||
|
||||
|
||||
def decrypt(data):
|
||||
decr = xor(data, KEY)
|
||||
|
||||
d1 = decr[:D1_LEN]
|
||||
v = decr[D1_LEN:D1_LEN+V_LEN]
|
||||
d2 = decr[D1_LEN+V_LEN:-2]
|
||||
crc = decr[-2:]
|
||||
v = decr[V_OFFSET:V_OFFSET+V_LEN]
|
||||
decr_data = decr[:-CRC_LEN]
|
||||
crc = decr[-CRC_LEN:]
|
||||
|
||||
print('version:', v, file=stderr)
|
||||
print('crc:', ['0x%02x' % x for x in crc], f'{crc[0]*crc[1]}', file=stderr)
|
||||
eprint('version:', v)
|
||||
eprint_crc(crc)
|
||||
|
||||
return d1 + d2
|
||||
return decr_data
|
||||
|
||||
|
||||
def encrypt(data, version='2.01.19'):
|
||||
v = make_16yte_version(version)
|
||||
data = data[:V_OFFSET] + v + data[V_OFFSET+V_LEN:]
|
||||
crc = b'\xd9\xab' # here will be some crc
|
||||
|
||||
eprint('version:', v)
|
||||
eprint_crc(crc)
|
||||
|
||||
return xor(data + crc, KEY)
|
||||
|
||||
def encrypt(data, version='2.01.26'):
|
||||
D1_LEN = 8192
|
||||
v = bytes([ord(c) for c in version] + [0] * (16 - len(version)))
|
||||
print('version:', v, file=stderr)
|
||||
return xor(data[:D1_LEN] + v + data[D1_LEN:] + b'\xd8\x7f', KEY)
|
||||
|
||||
def usage(info = None):
|
||||
if info:
|
||||
print(info, file=stderr)
|
||||
print(f'Usage: {argv[0]} <e|d> filename.bin > raw.bin', file=stderr)
|
||||
print(f' Example decode: {argv[0]} d k5_26_encrypted.bin > k5_26_raw.bin', file=stderr)
|
||||
print(f' Example encode: {argv[0]} e k5_26_raw.bin > k5_26_encrypted.bin', file=stderr)
|
||||
eprint(info)
|
||||
eprint(f'Usage: {argv[0]} <e|d> filename.bin > raw.bin')
|
||||
eprint(f' Example decode: {argv[0]} d k5_26_encrypted.bin > k5_26_raw.bin')
|
||||
eprint(f' Example encode: {argv[0]} e k5_26_raw.bin > k5_26_encrypted.bin')
|
||||
exit(128)
|
||||
|
||||
|
||||
def main():
|
||||
if len(argv) != 3:
|
||||
usage()
|
||||
|
@ -57,14 +76,15 @@ def main():
|
|||
encrypted = Path(fname).read_bytes()
|
||||
decrypted = decrypt(encrypted)
|
||||
os.write(1, bytes(decrypted))
|
||||
print('Success!', file=stderr)
|
||||
eprint('Success!')
|
||||
return
|
||||
|
||||
if encdec == 'e':
|
||||
print('WARNING! encoding not working for now, as CRC not valid', file=stderr)
|
||||
eprint('WARNING! encoding not working for now, as CRC not valid')
|
||||
decrypted = Path(fname).read_bytes()
|
||||
encrypted = encrypt(decrypted)
|
||||
os.write(1, bytes(encrypted))
|
||||
print('Success!', file=stderr)
|
||||
eprint('Success!')
|
||||
return
|
||||
|
||||
usage()
|
||||
|
|
Ładowanie…
Reference in New Issue