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