sceutils 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sceutils/__init__.py +57 -0
- sceutils/__main__.py +57 -0
- sceutils/axfs.py +308 -0
- sceutils/decrypt_cpupdate.py +136 -0
- sceutils/emmc_extract.py +231 -0
- sceutils/extract_idstorage.py +27 -0
- sceutils/find_imported_by.py +35 -0
- sceutils/keys.py +57 -0
- sceutils/keys_external.py +333 -0
- sceutils/keys_internal.py +121 -0
- sceutils/keys_proto.py +137 -0
- sceutils/module_info.py +138 -0
- sceutils/pup_fiction.py +379 -0
- sceutils/pup_info.py +100 -0
- sceutils/scedecrypt.py +52 -0
- sceutils/scetypes.py +692 -0
- sceutils/sceutils.py +94 -0
- sceutils/self2elf.py +242 -0
- sceutils/selfinfo.py +249 -0
- sceutils/ud0_extract_pup.py +42 -0
- sceutils/unpack_bootimage_new.py +19 -0
- sceutils/util.py +72 -0
- sceutils-0.1.0.dist-info/METADATA +106 -0
- sceutils-0.1.0.dist-info/RECORD +31 -0
- sceutils-0.1.0.dist-info/WHEEL +5 -0
- sceutils-0.1.0.dist-info/entry_points.txt +3 -0
- sceutils-0.1.0.dist-info/licenses/LICENSE +21 -0
- sceutils-0.1.0.dist-info/top_level.txt +2 -0
- unarzl/__init__.py +25 -0
- unarzl/__main__.py +29 -0
- unarzl/arzl.py +497 -0
sceutils/emmc_extract.py
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
import itertools
|
|
5
|
+
import os
|
|
6
|
+
import struct
|
|
7
|
+
import subprocess
|
|
8
|
+
import sys
|
|
9
|
+
import zipfile
|
|
10
|
+
from enum import Enum
|
|
11
|
+
from glob import glob
|
|
12
|
+
from typing import IO
|
|
13
|
+
|
|
14
|
+
from sceutils import keys, pup_fiction
|
|
15
|
+
|
|
16
|
+
DO_EXTRACT = True
|
|
17
|
+
EMMC_BLOCK_SIZE = 512
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class EmmcPartitionCode(Enum):
|
|
21
|
+
EMPTY = 0
|
|
22
|
+
IDSTORAGE = 1
|
|
23
|
+
SLB2 = 2
|
|
24
|
+
OS0 = 3
|
|
25
|
+
VS0 = 4
|
|
26
|
+
VD0 = 5
|
|
27
|
+
TM0 = 6
|
|
28
|
+
UR0 = 7
|
|
29
|
+
UX0 = 8
|
|
30
|
+
GRO0 = 9
|
|
31
|
+
GRW0 = 0xA
|
|
32
|
+
UD0 = 0xB
|
|
33
|
+
SA0 = 0xC
|
|
34
|
+
UNKOWN_MC = 0xD
|
|
35
|
+
PD0 = 0xE
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class EmmcPartitionType(Enum):
|
|
39
|
+
UNKNOWN_0 = 0
|
|
40
|
+
FAT16 = 0x6
|
|
41
|
+
EXFAT = 0x7
|
|
42
|
+
UNKNOWN = 0xB
|
|
43
|
+
RAW = 0xDA
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def sizeof_fmt(num, suffix='B'):
|
|
47
|
+
for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
|
|
48
|
+
if abs(num) < 1024.0:
|
|
49
|
+
return "%3.1f%s%s" % (num, unit, suffix)
|
|
50
|
+
num /= 1024.0
|
|
51
|
+
return "%.1f%s%s" % (num, 'Yi', suffix)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class EmmcPartition:
|
|
55
|
+
Size = 0x11
|
|
56
|
+
|
|
57
|
+
def __init__(self, data):
|
|
58
|
+
(
|
|
59
|
+
offset,
|
|
60
|
+
size,
|
|
61
|
+
code,
|
|
62
|
+
type,
|
|
63
|
+
self.active,
|
|
64
|
+
self.flags,
|
|
65
|
+
) = struct.unpack('<IIBB?I2x', data)
|
|
66
|
+
|
|
67
|
+
self.offset = offset*EMMC_BLOCK_SIZE
|
|
68
|
+
self.size = size*EMMC_BLOCK_SIZE
|
|
69
|
+
self.code = EmmcPartitionCode(code)
|
|
70
|
+
self.type = EmmcPartitionType(type)
|
|
71
|
+
|
|
72
|
+
def __str__(self):
|
|
73
|
+
ret = 'EmmcPartition:\n'
|
|
74
|
+
ret += f'Offset (bytes): 0x{self.offset:X}\n'
|
|
75
|
+
ret += f'Size (bytes): 0x{self.size:X} ({sizeof_fmt(self.size)})\n'
|
|
76
|
+
ret += f'Code: {self.code}\n'
|
|
77
|
+
ret += f'Type: {self.type}\n'
|
|
78
|
+
ret += f'Active: {self.active}\n'
|
|
79
|
+
ret += f'Flags: 0x{self.flags:08X}\n'
|
|
80
|
+
return ret
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class EmmcMasterBlock:
|
|
84
|
+
Size = 0x200
|
|
85
|
+
|
|
86
|
+
def __init__(self, data):
|
|
87
|
+
(
|
|
88
|
+
self.magic,
|
|
89
|
+
self.version,
|
|
90
|
+
size,
|
|
91
|
+
signature
|
|
92
|
+
) = struct.unpack('<32sII40x272x94x16x16x16x16xH', data)
|
|
93
|
+
|
|
94
|
+
if signature != 0xAA55:
|
|
95
|
+
raise TypeError('Invalid boot signature')
|
|
96
|
+
|
|
97
|
+
if self.version != 3:
|
|
98
|
+
raise TypeError('Unknown version')
|
|
99
|
+
|
|
100
|
+
self.size = size*EMMC_BLOCK_SIZE
|
|
101
|
+
|
|
102
|
+
partitions = data[0x50:0x160]
|
|
103
|
+
partitions = [
|
|
104
|
+
EmmcPartition(partitions[x:x+EmmcPartition.Size])
|
|
105
|
+
for x in range(0, len(partitions), EmmcPartition.Size)
|
|
106
|
+
]
|
|
107
|
+
self.partitions = [p for p in itertools.takewhile(lambda x: x.offset != 0, partitions)]
|
|
108
|
+
|
|
109
|
+
def __str__(self):
|
|
110
|
+
ret = 'EmmcMasterBlock:\n'
|
|
111
|
+
ret += f'Magic: {self.magic}\n'
|
|
112
|
+
ret += f'Version: {self.version}\n'.format()
|
|
113
|
+
ret += f'Size (bytes): 0x{self.size:X} ({sizeof_fmt(self.size)})\n'
|
|
114
|
+
ret += 'Partitions:\n'
|
|
115
|
+
|
|
116
|
+
for p in self.partitions:
|
|
117
|
+
ret += f'{p}\n'
|
|
118
|
+
|
|
119
|
+
return ret
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def extract_partition(emmc: IO, p: EmmcPartition, partition_image_name: str):
|
|
123
|
+
if not os.path.exists(partition_image_name):
|
|
124
|
+
with open(partition_image_name, "wb") as f:
|
|
125
|
+
emmc.seek(p.offset)
|
|
126
|
+
length = 0
|
|
127
|
+
|
|
128
|
+
while length != p.size:
|
|
129
|
+
data = emmc.read(min(p.size - length, int(100e6)))
|
|
130
|
+
if len(data) == 0 or data is None:
|
|
131
|
+
break
|
|
132
|
+
|
|
133
|
+
f.write(data)
|
|
134
|
+
length += len(data)
|
|
135
|
+
print(f'{100*length/p.size:.2f}%... ')
|
|
136
|
+
|
|
137
|
+
if length != p.size:
|
|
138
|
+
print(f'output {p.code.name} is truncated ({100*length/p.size:.2f}% dumped)')
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def extract_fs(basedir: str, partition_name: str, p: EmmcPartition, partition_image_name: str):
|
|
142
|
+
print(f"Extracting {partition_name}")
|
|
143
|
+
partition_out = os.path.join(basedir, "fs", partition_name)
|
|
144
|
+
if not os.path.exists(partition_out):
|
|
145
|
+
subprocess.call(["7z", "x", partition_image_name, f"-o{partition_out}"])
|
|
146
|
+
|
|
147
|
+
partition_dec_out = os.path.join(basedir, "fs_dec", partition_name)
|
|
148
|
+
if not os.path.exists(partition_dec_out):
|
|
149
|
+
print("Decryping selfs")
|
|
150
|
+
pup_fiction.decrypt_selfs(partition_out, partition_dec_out)
|
|
151
|
+
|
|
152
|
+
if p.code == EmmcPartitionCode.OS0:
|
|
153
|
+
if not os.path.exists(partition_dec_out):
|
|
154
|
+
print("decrypting os0")
|
|
155
|
+
pup_fiction.decrypt_os0(basedir)
|
|
156
|
+
|
|
157
|
+
try:
|
|
158
|
+
bootimage_out = partition_dec_out+"/kd/bootimage"
|
|
159
|
+
if not os.path.exists(bootimage_out):
|
|
160
|
+
print("decrypting bootimage")
|
|
161
|
+
os.makedirs(bootimage_out, exist_ok=True)
|
|
162
|
+
pup_fiction.extract_bootimage(partition_dec_out+"/kd/bootimage.elf", bootimage_out)
|
|
163
|
+
except Exception as e:
|
|
164
|
+
print("error extracting bootimage")
|
|
165
|
+
print(e)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def extract_slb2(basedir: str, partition_name: str, partition_image_name: str):
|
|
169
|
+
slb2_out = os.path.join(basedir, partition_name)
|
|
170
|
+
if not os.path.exists(slb2_out):
|
|
171
|
+
print("extracting slb2")
|
|
172
|
+
os.makedirs(slb2_out, exist_ok=True)
|
|
173
|
+
pup_fiction.slb2_extract(partition_image_name, slb2_out)
|
|
174
|
+
|
|
175
|
+
slb2_dec_out = os.path.join(basedir, partition_name+"_dec")
|
|
176
|
+
if not os.path.exists(slb2_dec_out):
|
|
177
|
+
print("decrypting slb2")
|
|
178
|
+
os.makedirs(slb2_dec_out, exist_ok=True)
|
|
179
|
+
try:
|
|
180
|
+
pup_fiction.slb2_decrypt(slb2_out, slb2_dec_out)
|
|
181
|
+
except KeyError as e:
|
|
182
|
+
with open(slb2_dec_out+"/error.txt", "w", encoding="utf8") as f:
|
|
183
|
+
f.write(str(e))
|
|
184
|
+
print(e)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def extract_emmc(emmc: IO, basedir: str):
|
|
188
|
+
master = EmmcMasterBlock(emmc.read(EmmcMasterBlock.Size))
|
|
189
|
+
print(master)
|
|
190
|
+
|
|
191
|
+
for p in master.partitions:
|
|
192
|
+
partition_name = p.code.name.lower()
|
|
193
|
+
have_inactive = len([x for x in master.partitions if x.code == p.code]) > 1
|
|
194
|
+
if have_inactive:
|
|
195
|
+
partition_name = f"{partition_name}_{'active' if p.active else 'inactive'}"
|
|
196
|
+
name = f'{partition_name}.bin'
|
|
197
|
+
|
|
198
|
+
partition_image_name = f"{basedir}/{name}"
|
|
199
|
+
print(f'extracting {partition_image_name}... ')
|
|
200
|
+
extract_partition(emmc, p, partition_image_name)
|
|
201
|
+
|
|
202
|
+
if p.code in (EmmcPartitionCode.OS0, EmmcPartitionCode.VS0) and DO_EXTRACT:
|
|
203
|
+
extract_fs(basedir, partition_name, p, partition_image_name)
|
|
204
|
+
|
|
205
|
+
if p.code == EmmcPartitionCode.SLB2 and DO_EXTRACT:
|
|
206
|
+
extract_slb2(basedir, partition_name, partition_image_name)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def main(argv = sys.argv):
|
|
210
|
+
if len(argv) < 4:
|
|
211
|
+
print(f"usage: {argv[0]} (filename) (output_folder) [keyset]")
|
|
212
|
+
sys.exit(1)
|
|
213
|
+
fname = argv[1]
|
|
214
|
+
output = argv[2]
|
|
215
|
+
keyset = argv[3] if len(argv) > 3 else "keys_external.py"
|
|
216
|
+
keys.use_keys(keyset)
|
|
217
|
+
|
|
218
|
+
if fname.endswith(".zip"):
|
|
219
|
+
z = zipfile.PyZipFile(fname)
|
|
220
|
+
emmc = z.open(z.namelist()[0], "r")
|
|
221
|
+
else:
|
|
222
|
+
emmc = open(fname, "rb")
|
|
223
|
+
|
|
224
|
+
os.makedirs(output, exist_ok=True)
|
|
225
|
+
try:
|
|
226
|
+
extract_emmc(emmc, output)
|
|
227
|
+
finally:
|
|
228
|
+
emmc.close()
|
|
229
|
+
|
|
230
|
+
if __name__ == "__main__":
|
|
231
|
+
main()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
from .util import u16
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def main(argv = sys.argv):
|
|
10
|
+
if len(argv) != 3:
|
|
11
|
+
print(f"Usage: {argv[0]} idstorage-partition.bin output-directory/")
|
|
12
|
+
sys.exit(1)
|
|
13
|
+
|
|
14
|
+
with open(argv[1], "rb") as fin:
|
|
15
|
+
data = fin.read()
|
|
16
|
+
|
|
17
|
+
index_table = data[0:512]
|
|
18
|
+
for index in range(256):
|
|
19
|
+
leaf = u16(index_table, index * 2)
|
|
20
|
+
if leaf not in [0xFFFF, 0xFFF5]:
|
|
21
|
+
with open(os.path.join(argv[2], f"leaf_{leaf:04X}.bin"), "wb") as fout:
|
|
22
|
+
fout.write(data[512 * index:512 * (index + 1)])
|
|
23
|
+
print(f"Leaf 0x{leaf:04X}")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
if __name__ == "__main__":
|
|
27
|
+
main()
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# --folder = path to /fs_dec/
|
|
2
|
+
# --nid = the function nid you are search for
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import os
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
from sceutils import module_info
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def main(argv = sys.argv):
|
|
12
|
+
parser = argparse.ArgumentParser()
|
|
13
|
+
parser.add_argument("-f", "--folder", type=str, required=True)
|
|
14
|
+
parser.add_argument("-n", "--nid", type=str, required=True)
|
|
15
|
+
args = parser.parse_args(argv[1:])
|
|
16
|
+
nid = int(args.nid, 0)
|
|
17
|
+
|
|
18
|
+
for (root, folders, files) in os.walk(args.folder):
|
|
19
|
+
for file in files:
|
|
20
|
+
if not file.split(".")[-1] == "elf":
|
|
21
|
+
continue
|
|
22
|
+
path = os.path.join(root, file)
|
|
23
|
+
relpath = os.path.relpath(path, args.folder)
|
|
24
|
+
with open(path, "rb") as f:
|
|
25
|
+
info = module_info.read_module_info(f)
|
|
26
|
+
if info is None:
|
|
27
|
+
continue
|
|
28
|
+
module, imports, exports = info
|
|
29
|
+
for imp in imports:
|
|
30
|
+
if nid in imp.functions:
|
|
31
|
+
print(relpath)
|
|
32
|
+
break
|
|
33
|
+
|
|
34
|
+
if __name__ == "__main__":
|
|
35
|
+
main()
|
sceutils/keys.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import binascii
|
|
2
|
+
import importlib
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from collections import defaultdict
|
|
6
|
+
from typing import Literal, NamedTuple
|
|
7
|
+
|
|
8
|
+
from .scetypes import SelfType
|
|
9
|
+
|
|
10
|
+
ENC_KEY: bytes
|
|
11
|
+
ENC_IV: bytes
|
|
12
|
+
|
|
13
|
+
XXX_KEY: bytes
|
|
14
|
+
XXX_IV: bytes
|
|
15
|
+
|
|
16
|
+
SCEWM_KEY: bytes
|
|
17
|
+
SCEWM_IV: bytes
|
|
18
|
+
|
|
19
|
+
SCEAS_KEY: bytes
|
|
20
|
+
SCEAS_IV: bytes
|
|
21
|
+
|
|
22
|
+
SCE_KEYS: "KeyStore"
|
|
23
|
+
|
|
24
|
+
class KeyEntry(NamedTuple):
|
|
25
|
+
minver: int
|
|
26
|
+
maxver: int
|
|
27
|
+
keyrev: int
|
|
28
|
+
key: bytes
|
|
29
|
+
iv: bytes
|
|
30
|
+
|
|
31
|
+
class KeyStore:
|
|
32
|
+
def __init__(self):
|
|
33
|
+
self._store = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
|
|
34
|
+
|
|
35
|
+
def register(self, keytype, scetype, keyrev, key, iv, minver=0, maxver=0xffffffffffffffff, selftype=SelfType.NONE):
|
|
36
|
+
self._store[keytype][scetype][selftype].append(KeyEntry(minver, maxver, keyrev, binascii.a2b_hex(key), binascii.a2b_hex(iv)))
|
|
37
|
+
|
|
38
|
+
def get(self, keytype, scetype, sysver=-1, keyrev=-1, selftype=SelfType.NONE):
|
|
39
|
+
if keytype not in self._store:
|
|
40
|
+
raise KeyError("Cannot find any keys for this key type")
|
|
41
|
+
if scetype not in self._store[keytype]:
|
|
42
|
+
raise KeyError("Cannot find any keys for this SCE type")
|
|
43
|
+
if selftype not in self._store[keytype][scetype]:
|
|
44
|
+
raise KeyError("Cannot find any keys for this SELF type")
|
|
45
|
+
for item in self._store[keytype][scetype][selftype]:
|
|
46
|
+
if (sysver < 0 or (sysver >= item.minver and sysver <= item.maxver)) and (keyrev < 0 or keyrev == item.keyrev):
|
|
47
|
+
return (item.key, item.iv)
|
|
48
|
+
print(f"{keytype=} {scetype=} {sysver=:x} {keyrev=} {selftype}")
|
|
49
|
+
raise KeyError("Cannot find key/iv for this SCE file")
|
|
50
|
+
|
|
51
|
+
def use_keys(name: Literal["keys_external.py", "keys_internal.py", "keys_proto.py"] | str):
|
|
52
|
+
mod_name = os.path.basename(name).split(".")[0]
|
|
53
|
+
dir_ = os.path.dirname(name)
|
|
54
|
+
if dir_ not in sys.path:
|
|
55
|
+
sys.path.append(dir_)
|
|
56
|
+
mod = importlib.import_module("sceutils."+mod_name)
|
|
57
|
+
globals().update(vars(mod))
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import binascii
|
|
2
|
+
|
|
3
|
+
from .keys import KeyStore
|
|
4
|
+
from .scetypes import KeyType, SceType, SelfType
|
|
5
|
+
|
|
6
|
+
ENC_KEY = binascii.a2b_hex('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')
|
|
7
|
+
ENC_IV = binascii.a2b_hex('AF5F2CB04AC1751ABF51CEF1C8096210')
|
|
8
|
+
|
|
9
|
+
SCEWM_KEY = binascii.a2b_hex("BFD5EA9F91AE9AF23565E534C4823B72")
|
|
10
|
+
SCEWM_IV = binascii.a2b_hex("CE16937E97A3349F143C8FB6AA219528")
|
|
11
|
+
|
|
12
|
+
SCEAS_KEY = binascii.a2b_hex("AC5AB4907867FE8017072C98280DC311")
|
|
13
|
+
SCEAS_IV = binascii.a2b_hex("ACDFA94246D31970B7925FF7A26B0036")
|
|
14
|
+
|
|
15
|
+
SCE_KEYS = KeyStore()
|
|
16
|
+
SCE_KEYS.register(
|
|
17
|
+
KeyType.METADATA,
|
|
18
|
+
SceType.SPKG,
|
|
19
|
+
0,
|
|
20
|
+
'2E6F4751D15B06C51F572A9306E52DD7007EA56A31D459EC6D3681AB08625501',
|
|
21
|
+
'B3D541A568751DF8F4833BAB4EFE0537',
|
|
22
|
+
0x00000000000,
|
|
23
|
+
0xFFF00000000,
|
|
24
|
+
SelfType.NONE
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
SCE_KEYS.register(
|
|
28
|
+
KeyType.METADATA,
|
|
29
|
+
(SceType.SPKG, 2),
|
|
30
|
+
0,
|
|
31
|
+
'77E388FB9AC78A00BA7A746610A0DF76350919F541974E1439AD76AA96327CE2',
|
|
32
|
+
'41F2D4F7E5B106757ABCF48192B93944',
|
|
33
|
+
0x00000000000,
|
|
34
|
+
0xFFF00000000,
|
|
35
|
+
SelfType.NONE
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
SCE_KEYS.register(
|
|
39
|
+
KeyType.METADATA,
|
|
40
|
+
SceType.SRVK,
|
|
41
|
+
0,
|
|
42
|
+
'4648164DB9E67009456C7CA6F2378835FD678539B36B3DE6F1C604B7D4258141',
|
|
43
|
+
'6EC8AD67993DAE75675F0AFFDE5C41F3',
|
|
44
|
+
0x10300000000,
|
|
45
|
+
0x16920000000,
|
|
46
|
+
SelfType.NONE
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
SCE_KEYS.register(
|
|
50
|
+
KeyType.METADATA,
|
|
51
|
+
SceType.SRVK,
|
|
52
|
+
0,
|
|
53
|
+
'DAE4B0F901E338DEFF3CCDBDEA1E2FDEA9926BB98CB182443CC0C0F7FAE428EE',
|
|
54
|
+
'18D925FA885C7E28A9CFF458C24D8BED',
|
|
55
|
+
0x18000000000,
|
|
56
|
+
0xFFF00000000,
|
|
57
|
+
SelfType.NONE
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
SCE_KEYS.register(
|
|
61
|
+
KeyType.METADATA,
|
|
62
|
+
SceType.SELF,
|
|
63
|
+
1,
|
|
64
|
+
'9D4E4CE92EA1C4576EB9601EC43EC03AAE8EC324ECF6DE01E918E61D2223EE55',
|
|
65
|
+
'CFEA3CCBA454D3279AD7CB0510431434',
|
|
66
|
+
0x10300000000,
|
|
67
|
+
0x16920000000,
|
|
68
|
+
SelfType.SECURE
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
SCE_KEYS.register(
|
|
72
|
+
KeyType.METADATA,
|
|
73
|
+
SceType.SELF,
|
|
74
|
+
1,
|
|
75
|
+
'B1B6FEB39A8BD7A2AC584D435E150C624F560D3EFB03E745C575E0844569E2D0',
|
|
76
|
+
'89B4E6BAB03B03D49BF0FC927FEA8659',
|
|
77
|
+
0x18000000000,
|
|
78
|
+
0x36100000000,
|
|
79
|
+
SelfType.SECURE
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
SCE_KEYS.register(
|
|
83
|
+
KeyType.METADATA,
|
|
84
|
+
SceType.SELF,
|
|
85
|
+
1,
|
|
86
|
+
'59AC7F05E115D758201A3F3461BCA0D42BD186F00CFC24263973F622AD9ED30C',
|
|
87
|
+
'A053B00BA4BF880799B4265C6BC064B5',
|
|
88
|
+
0x36300000000,
|
|
89
|
+
0xFFF00000000,
|
|
90
|
+
SelfType.SECURE
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
SCE_KEYS.register(
|
|
94
|
+
KeyType.METADATA,
|
|
95
|
+
SceType.SELF,
|
|
96
|
+
1,
|
|
97
|
+
'7A7FB1560DCD121CEA5E11B90124B13282752F2D5B95D75036AB3A29BB3BD2AB',
|
|
98
|
+
'6C71642A042A041F1EE3094070B009BE',
|
|
99
|
+
0x10300000000,
|
|
100
|
+
0x16920000000,
|
|
101
|
+
SelfType.BOOT
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
SCE_KEYS.register(
|
|
105
|
+
KeyType.METADATA,
|
|
106
|
+
SceType.SELF,
|
|
107
|
+
1,
|
|
108
|
+
'B1B936B512F9A16E51B948622B26F15C53680C77AC332EC25846B839520393EC',
|
|
109
|
+
'90D527BAF7296B5B6A576CFA6B54D266',
|
|
110
|
+
0x18000000000,
|
|
111
|
+
0x36100000000,
|
|
112
|
+
SelfType.BOOT
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
SCE_KEYS.register(
|
|
116
|
+
KeyType.METADATA,
|
|
117
|
+
SceType.SELF,
|
|
118
|
+
1,
|
|
119
|
+
'426FD1D33FEBBFAC560B7957B94F445AE5F1DED2AA70F74DB944645DC439122F',
|
|
120
|
+
'995F1364BB9735FA448B18D886150C85',
|
|
121
|
+
0x36300000000,
|
|
122
|
+
0xFFF00000000,
|
|
123
|
+
SelfType.BOOT
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
SCE_KEYS.register(
|
|
127
|
+
KeyType.METADATA,
|
|
128
|
+
SceType.SELF,
|
|
129
|
+
1,
|
|
130
|
+
'B4AAF62D48FBD898C240308A9773AFE57B8A18D783F0B37932BB21B51386A9A0',
|
|
131
|
+
'8CD162C5C613376F3E4BEA0B8FD5A3D0',
|
|
132
|
+
0x10300000000,
|
|
133
|
+
0x16920000000,
|
|
134
|
+
SelfType.KERNEL
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
SCE_KEYS.register(
|
|
138
|
+
KeyType.METADATA,
|
|
139
|
+
SceType.SELF,
|
|
140
|
+
1,
|
|
141
|
+
'849AF7E8DE5B9C28C38CA74963FCF155E0F200FB08185E46CDA87790AAA10D72',
|
|
142
|
+
'88710E219454A3CBF6D382D4BBD22BFC',
|
|
143
|
+
0x18000000000,
|
|
144
|
+
0x36100000000,
|
|
145
|
+
SelfType.KERNEL
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
SCE_KEYS.register(
|
|
149
|
+
KeyType.METADATA,
|
|
150
|
+
SceType.SELF,
|
|
151
|
+
1,
|
|
152
|
+
'18E26DF712C362769D4F5E70460D28D88B7B991733DE692C2B9463B41FF4B925',
|
|
153
|
+
'5B13077EEA801FC77D492050801FA507',
|
|
154
|
+
0x36300000000,
|
|
155
|
+
0xFFF00000000,
|
|
156
|
+
SelfType.KERNEL
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
SCE_KEYS.register(
|
|
160
|
+
KeyType.METADATA,
|
|
161
|
+
SceType.SELF,
|
|
162
|
+
0,
|
|
163
|
+
'4769935C3B1CB248C3A88A406B1535D5DC2C0279D5901DE534DC4A11B8F60804',
|
|
164
|
+
'0CE906F746D40105660456D827CEBD25',
|
|
165
|
+
0x10300000000,
|
|
166
|
+
0x16920000000,
|
|
167
|
+
SelfType.USER
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
SCE_KEYS.register(
|
|
171
|
+
KeyType.METADATA,
|
|
172
|
+
SceType.SELF,
|
|
173
|
+
0,
|
|
174
|
+
'4769935C3B1CB248C3A88A406B1535D5DC2C0279D5901DE534DC4A11B8F60804',
|
|
175
|
+
'0CE906F746D40105660456D827CEBD25',
|
|
176
|
+
0x18000000000,
|
|
177
|
+
0xFFF00000000,
|
|
178
|
+
SelfType.USER
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
SCE_KEYS.register(
|
|
182
|
+
KeyType.METADATA,
|
|
183
|
+
SceType.SELF,
|
|
184
|
+
1,
|
|
185
|
+
'613AD6EAC63D4E14F51A8C6AF18C66621968323B6F205B5E515C16D77BB06671',
|
|
186
|
+
'ADBDAA5041B2094CF2B359301DE64171',
|
|
187
|
+
0x10300000000,
|
|
188
|
+
0xFFF00000000,
|
|
189
|
+
SelfType.USER
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
SCE_KEYS.register(
|
|
193
|
+
KeyType.METADATA,
|
|
194
|
+
SceType.SELF,
|
|
195
|
+
2,
|
|
196
|
+
'0F2041269B26D6B7EF143E35E83E914629A92F50F3A4CEE14CDFF63AEC641117',
|
|
197
|
+
'07EF64437F0CB6995E6D785E42796C83',
|
|
198
|
+
0x18000000000,
|
|
199
|
+
0xFFF00000000,
|
|
200
|
+
SelfType.USER
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
SCE_KEYS.register(
|
|
204
|
+
KeyType.METADATA,
|
|
205
|
+
SceType.SELF,
|
|
206
|
+
3,
|
|
207
|
+
'3AFADA34660C6515B539EBBBC79C9C0ADA4337C32652CA03C6DD21A1D612D8F4',
|
|
208
|
+
'7F98A137869B91B1EB9604F81FD74C50',
|
|
209
|
+
0x18000000000,
|
|
210
|
+
0xFFF00000000,
|
|
211
|
+
SelfType.USER
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
SCE_KEYS.register(
|
|
215
|
+
KeyType.METADATA,
|
|
216
|
+
SceType.SELF,
|
|
217
|
+
4,
|
|
218
|
+
'8FF491B36713E8AA38DE30B303689657F07AE70A8A8B1D7867441C52DB39C806',
|
|
219
|
+
'D9CC7E26CE99053E48F9BEF1CB93C184',
|
|
220
|
+
0x36300000000,
|
|
221
|
+
0xFFF00000000,
|
|
222
|
+
SelfType.USER
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
SCE_KEYS.register(
|
|
226
|
+
KeyType.METADATA,
|
|
227
|
+
SceType.SELF,
|
|
228
|
+
5,
|
|
229
|
+
'4D71B2FB3D4359FB34445305C88A5E82FA12D34A8308F312AA34B58F6112253A',
|
|
230
|
+
'04A27133FF0205C96B7F45A60D7D417B',
|
|
231
|
+
0x36300000000,
|
|
232
|
+
0xFFF00000000,
|
|
233
|
+
SelfType.USER
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
SCE_KEYS.register(
|
|
237
|
+
KeyType.NPDRM,
|
|
238
|
+
SceType.SELF,
|
|
239
|
+
0,
|
|
240
|
+
'C10368BF3D2943BC6E5BD05E46A9A7B6',
|
|
241
|
+
'00000000000000000000000000000000',
|
|
242
|
+
0x00000000000,
|
|
243
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
244
|
+
SelfType.APP
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
SCE_KEYS.register(
|
|
248
|
+
KeyType.NPDRM,
|
|
249
|
+
SceType.SELF,
|
|
250
|
+
1,
|
|
251
|
+
'16419DD3BFBE8BDC596929B72CE237CD',
|
|
252
|
+
'00000000000000000000000000000000',
|
|
253
|
+
0x00000000000,
|
|
254
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
255
|
+
SelfType.APP
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
SCE_KEYS.register(
|
|
259
|
+
KeyType.METADATA,
|
|
260
|
+
SceType.SELF,
|
|
261
|
+
0,
|
|
262
|
+
'AAA508FA5E85EAEE597ED2B27804D22287CFADF1DF32EDC7A7C58E8C9AA8BB36',
|
|
263
|
+
'CD1BD3A59200CC67A3B804808DC2AE73',
|
|
264
|
+
0x00000000000,
|
|
265
|
+
0x16920000000,
|
|
266
|
+
SelfType.APP
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
SCE_KEYS.register(
|
|
270
|
+
KeyType.METADATA,
|
|
271
|
+
SceType.SELF,
|
|
272
|
+
0,
|
|
273
|
+
'5661E5FB20CFD1D1DFF50C1E59A6EA977D0AA5C5770F53B9CDD4E9451FFF55CB',
|
|
274
|
+
'23D02FF79BF430E2D123869BF0CACAA0',
|
|
275
|
+
0x18000000000,
|
|
276
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
277
|
+
SelfType.APP
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
SCE_KEYS.register(
|
|
281
|
+
KeyType.METADATA,
|
|
282
|
+
SceType.SELF,
|
|
283
|
+
1,
|
|
284
|
+
'4181B2DF5F5D94D3C80B7D86EACF1928533A49BA58EDE2B43CDEE7E572568BD4',
|
|
285
|
+
'B1678C0543B6C1997B63A6F4F3C8FD33',
|
|
286
|
+
0x00000000000,
|
|
287
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
288
|
+
SelfType.APP
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
SCE_KEYS.register(
|
|
292
|
+
KeyType.METADATA,
|
|
293
|
+
SceType.SELF,
|
|
294
|
+
2,
|
|
295
|
+
'5282582F17F068F89A260AAFB71C58928F45A8D08C681376B07FF9EAB1114226',
|
|
296
|
+
'29672DF43E426F41AF46D42E8437D449',
|
|
297
|
+
0x18000000000,
|
|
298
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
299
|
+
SelfType.APP
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
SCE_KEYS.register(
|
|
303
|
+
KeyType.METADATA,
|
|
304
|
+
SceType.SELF,
|
|
305
|
+
3,
|
|
306
|
+
'270CBA370061B87077672ADB5142D18844AAED352A9CCEE63602B0D740594334',
|
|
307
|
+
'1CF2454FBF47D76221B91AFC3B608C28',
|
|
308
|
+
0x18000000000,
|
|
309
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
310
|
+
SelfType.APP
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
SCE_KEYS.register(
|
|
314
|
+
KeyType.METADATA,
|
|
315
|
+
SceType.SELF,
|
|
316
|
+
4,
|
|
317
|
+
'A782BC5A9EDDFC49A513FF3E592C4677A8C8920F23C9F11F2558FB9D99A43868',
|
|
318
|
+
'559B5E658559EB65EBF892C274E098A9',
|
|
319
|
+
0x35700000000,
|
|
320
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
321
|
+
SelfType.APP
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
SCE_KEYS.register(
|
|
325
|
+
KeyType.METADATA,
|
|
326
|
+
SceType.SELF,
|
|
327
|
+
5,
|
|
328
|
+
'12D64D0172495226010A687DE245A73DE028B3561E25E69BABC325636F3CAE0A',
|
|
329
|
+
'F149EED1757E5A915B24309795BFC380',
|
|
330
|
+
0x35700000000,
|
|
331
|
+
0xFFFFFFFFFFFFFFFFFFFFFF,
|
|
332
|
+
SelfType.APP
|
|
333
|
+
)
|