@@ -161,6 +161,24 @@ def get_newidblock_entries(data, header, delay):
161
161
offset += size
162
162
163
163
164
+ def get_idblock_entries (data , header , delay ):
165
+ offset , size = header .init_offset * 512 , header .init_size * 512
166
+ entry_data = data [offset :offset + size ]
167
+ if header .disable_rc4 :
168
+ keystream = rc4_prga (rc4_ksa (RK_RC4_KEY ))
169
+ entry_data = bytes ([byte ^ next (keystream ) for byte in entry_data ])
170
+ yield 0x471 , entry_data , delay
171
+ if header .init_boot_size > header .init_size :
172
+ offset = (header .init_offset + header .init_size ) * 512
173
+ size = (header .init_boot_size - header .init_size ) * 512
174
+ if size != 524288 :
175
+ entry_data = data [offset :offset + size ]
176
+ if header .disable_rc4 :
177
+ keystream = rc4_prga (rc4_ksa (RK_RC4_KEY ))
178
+ entry_data = bytes ([byte ^ next (keystream ) for byte in entry_data ])
179
+ yield 0x472 , entry_data , 0
180
+
181
+
164
182
def parse_image_header (data ):
165
183
tag = int .from_bytes (data [:4 ], 'little' )
166
184
RKBootHeader = namedtuple ('RKBootHeader' , [
@@ -189,6 +207,15 @@ def parse_image_header(data):
189
207
digest != data [1536 :1536 + len (digest )]:
190
208
raise ValueError ("Digest mismatch for header" )
191
209
return header , get_newidblock_entries
210
+ RKIDBlockHeader0 = namedtuple ('RKIDBlockHeader0' , [
211
+ 'tag' , 'disable_rc4' , 'init_offset' , 'init_size' , 'init_boot_size' ,
212
+ ])
213
+ if tag == 0xfcdc8c3b :
214
+ keystream = rc4_prga (rc4_ksa (RK_RC4_KEY ))
215
+ data = bytes (byte ^ next (keystream ) for byte in data [:512 ])
216
+ header = RKIDBlockHeader0 ._make (unpack ('<L4xLH492xHH2x' , data [:512 ]))
217
+ if header .tag == 0x0ff0aa55 and header .init_size > 0 :
218
+ return header , get_idblock_entries
192
219
return None , None
193
220
194
221
0 commit comments