Skip to content

Commit 77dff7d

Browse files
committed
RKUSBMaskromDriver: add support for using vendor idblock v1 images
Add support for using vendor idblock v1 image files, typically created using the U-Boot mkimage tool. Signed-off-by: Jonas Karlman <[email protected]>
1 parent 13e2cf7 commit 77dff7d

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

labgrid/util/agents/rkusbmaskrom.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
164182
def 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

Comments
 (0)