48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								import struct
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def align(num, alignment):
							 | 
						||
| 
								 | 
							
								    if num % alignment != 0:
							 | 
						||
| 
								 | 
							
								        num += (alignment - num % alignment)
							 | 
						||
| 
								 | 
							
								    return num
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def process_file(input, output):
							 | 
						||
| 
								 | 
							
								    with open(input, 'rb') as fin:
							 | 
						||
| 
								 | 
							
								        content = bytearray(fin.read())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    align_value = 512
							 | 
						||
| 
								 | 
							
								    padded_length = align(len(content), align_value)
							 | 
						||
| 
								 | 
							
								    # pad file to actual length
							 | 
						||
| 
								 | 
							
								    content += b'\x00' * (padded_length - len(content))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct_format = '<L8sLL'
							 | 
						||
| 
								 | 
							
								    (instruction, magic, checksum, length) = struct.unpack_from(struct_format, content)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if magic != b'eGON.BT0':
							 | 
						||
| 
								 | 
							
								        print("Magic is invalid:", magic)
							 | 
						||
| 
								 | 
							
								        return 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    checksum = 0x5F0A6C39
							 | 
						||
| 
								 | 
							
								    length = align(length, align_value)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    checksum = 0
							 | 
						||
| 
								 | 
							
								    for i in range(0, length, 4):
							 | 
						||
| 
								 | 
							
								        (n, ) = struct.unpack_from('<L', content, i)
							 | 
						||
| 
								 | 
							
								        checksum += n
							 | 
						||
| 
								 | 
							
								        checksum %= 4294967296
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    with open(output, 'wb') as fout:
							 | 
						||
| 
								 | 
							
								        fout.write(content)
							 | 
						||
| 
								 | 
							
								    return 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								    if len(sys.argv) != 3:
							 | 
						||
| 
								 | 
							
								        print("Usage: mksunxi.py input.bin output.bin")
							 | 
						||
| 
								 | 
							
								        exit(1)
							 | 
						||
| 
								 | 
							
								    exit(process_file(sys.argv[1], sys.argv[2]))
							 |