Skip to content

Commit 4e2d799

Browse files
committed
upgrade pdddbg to use basis decryption routines from the common libs
1 parent 54e929e commit 4e2d799

File tree

2 files changed

+50
-27
lines changed

2 files changed

+50
-27
lines changed

tools/pddbcommon.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ def get_key(index, keyrom, length):
765765
# - basis_credentials is a list of the secret Bases
766766
# Returns:
767767
# - A dictionary of keys, by Basis name
768-
def extract_keys(keyrom, pddb, boot_pw, basis_credentials=None):
768+
def extract_keys(keyrom, pddb, boot_pw, basis_credentials={}):
769769
user_key_enc = get_key(40, keyrom, 32)
770770
pepper = get_key(248, keyrom, 16)
771771
pepper[0] = pepper[0] ^ 1 # encodes the "boot" password type into the pepper

tools/pddbdbg.py

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,62 @@ def main():
1919
parser.add_argument(
2020
"--renode", required=False, help="Override flex-size settings and read a Renode bin file", action="store_true"
2121
)
22+
parser.add_argument(
23+
"--basis", type=str, help="Extra Bases to unlock, as `name:pass`. Each additional basis requires another --basis separator. Note that : is not legal to use in a Basis name.", action="append", nargs="+"
24+
)
2225
args = parser.parse_args()
2326

24-
if args.name == None:
25-
keyfile = './tools/pddb-images/pddb.key'
26-
imagefile = './tools/pddb-images/pddb.bin'
27-
else:
28-
keyfile = './tools/pddb-images/{}.key'.format(args.name)
29-
imagefile = './tools/pddb-images/{}.bin'.format(args.name)
30-
31-
if args.dump:
32-
DO_CI_TESTS = False
33-
3427
numeric_level = getattr(logging, args.loglevel.upper(), None)
3528
if not isinstance(numeric_level, int):
3629
raise ValueError('Invalid log level: %s' % args.loglevel)
3730
logging.basicConfig(level=numeric_level)
3831

39-
keys = {}
40-
with open(keyfile, 'rb') as key_f:
41-
raw_key = key_f.read()
42-
num_keys = int.from_bytes(raw_key[:4], 'little')
43-
for i in range(num_keys):
44-
name_all = raw_key[4 + i*128 : 4 + i*128 + 64]
45-
name_bytes = bytearray(b'')
46-
for b in name_all:
47-
if b != 0:
48-
name_bytes.append(b)
49-
else:
50-
break
51-
name = name_bytes.decode('utf8', errors='ignore')
52-
key_data = raw_key[4 + i*128 + 64 : 4 + i*128 + 96]
53-
key_pt = raw_key[4 + i*128 + 96 : 4 + i*128 + 128]
54-
keys[name] = [key_pt, key_data]
32+
33+
if args.renode is True:
34+
keyfile = "./emulation/renode-keybox.bin"
35+
imagefile = "./tools/pddb-images/renode.bin"
36+
basis_credentials = {}
37+
if args.basis:
38+
for pair in args.basis:
39+
credpair = pair[0].split(':', 1)
40+
if len(credpair) != 2:
41+
logging.error("Basis credential pair with name {} has a formatting problem, aborting!".format(credpair[0]))
42+
exit(1)
43+
basis_credentials[credpair[0]] = credpair[1]
44+
45+
with open(keyfile, 'rb') as key_f:
46+
keyrom = key_f.read()
47+
with open(imagefile, 'rb') as img_f:
48+
raw_img = img_f.read()
49+
raw_img = raw_img[0x01D80000:0x07F80000]
50+
keys = extract_keys(keyrom, raw_img, 'a', basis_credentials)
51+
else:
52+
if args.name == None:
53+
keyfile = './tools/pddb-images/pddb.key'
54+
imagefile = './tools/pddb-images/pddb.bin'
55+
else:
56+
keyfile = './tools/pddb-images/{}.key'.format(args.name)
57+
imagefile = './tools/pddb-images/{}.bin'.format(args.name)
58+
59+
if args.dump:
60+
DO_CI_TESTS = False
61+
62+
keys = {}
63+
with open(keyfile, 'rb') as key_f:
64+
raw_key = key_f.read()
65+
num_keys = int.from_bytes(raw_key[:4], 'little')
66+
for i in range(num_keys):
67+
name_all = raw_key[4 + i*128 : 4 + i*128 + 64]
68+
name_bytes = bytearray(b'')
69+
for b in name_all:
70+
if b != 0:
71+
name_bytes.append(b)
72+
else:
73+
break
74+
name = name_bytes.decode('utf8', errors='ignore')
75+
key_data = raw_key[4 + i*128 + 64 : 4 + i*128 + 96]
76+
key_pt = raw_key[4 + i*128 + 96 : 4 + i*128 + 128]
77+
keys[name] = [key_pt.hex(), key_data.hex()]
5578

5679
logging.info("Found basis keys (pt, data):")
5780
logging.info(str(keys))

0 commit comments

Comments
 (0)