@@ -161,6 +161,16 @@ 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+     yield  0x471 , data [offset :offset  +  size ], delay 
167+     if  header .init_boot_size  >  header .init_size :
168+         offset  =  (header .init_offset  +  header .init_size ) *  512 
169+         size  =  (header .init_boot_size  -  header .init_size ) *  512 
170+         if  size  !=  524288 :
171+             yield  0x472 , data [offset :offset  +  size ], 0 
172+ 
173+ 
164174def  parse_image_header (data ):
165175    tag  =  int .from_bytes (data [:4 ], 'little' )
166176    RKBootHeader  =  namedtuple ('RKBootHeader' , [
@@ -189,6 +199,15 @@ def parse_image_header(data):
189199               digest  !=  data [1536 :1536  +  len (digest )]:
190200                raise  ValueError ("Digest mismatch for header" )
191201            return  header , get_newidblock_entries 
202+     RKIDBlockHeader0  =  namedtuple ('RKIDBlockHeader0' , [
203+         'tag' , 'disable_rc4' , 'init_offset' , 'init_size' , 'init_boot_size' ,
204+     ])
205+     if  tag  ==  0xfcdc8c3b :
206+         keystream  =  rc4_prga (rc4_ksa (RK_RC4_KEY ))
207+         data  =  bytes (byte  ^  next (keystream ) for  byte  in  data [:512 ])
208+         header  =  RKIDBlockHeader0 ._make (unpack ('<L4xLH492xHH2x' , data [:512 ]))
209+         if  header .tag  ==  0x0ff0aa55  and  header .init_size  >  0 :
210+             return  header , get_idblock_entries 
192211    return  None , None 
193212
194213
0 commit comments