@@ -161,6 +161,24 @@ def get_newidblock_entries(data, header, delay):
161161 offset += size
162162
163163
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+
164182def parse_image_header (data ):
165183 tag = int .from_bytes (data [:4 ], 'little' )
166184 RKBootHeader = namedtuple ('RKBootHeader' , [
@@ -189,6 +207,15 @@ def parse_image_header(data):
189207 digest != data [1536 :1536 + len (digest )]:
190208 raise ValueError ("Digest mismatch for header" )
191209 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
192219 return None , None
193220
194221
0 commit comments