def main() -> None: parser = argparse.ArgumentParser() parser.add_argument('hjson') parser.add_argument('infile', type=argparse.FileType('rb')) parser.add_argument('outfile', type=argparse.FileType('w')) args = parser.parse_args() scrambler = Scrambler.from_hjson_path(args.hjson, ROM_SIZE_WORDS) # Load the input ELF file clr_mem = MemFile.load_elf32(args.infile, 4 * ROM_BASE_WORD) # Flatten the file, padding with pseudo-random data and ensuring it's # exactly scrambler.rom_size_words words long. clr_flat = scrambler.flatten(clr_mem) # Extend from 32 bits to 39 by adding Hsiao (39,32) ECC bits. clr_flat.add_ecc32() # Zero-extend the cleartext memory by one more bit (this is the size we # actually use in the physical ROM) assert clr_flat.width == 39 clr_flat.width = 40 # Scramble the memory scr_mem = scrambler.scramble40(clr_flat) # TODO: Calculate and insert the expected hash here. scr_mem.write_vmem(args.outfile)
def main() -> int: parser = argparse.ArgumentParser() parser.add_argument('hjson') parser.add_argument('infile', type=argparse.FileType('rb')) parser.add_argument('outfile', type=argparse.FileType('w')) args = parser.parse_args() scrambler = Scrambler.from_hjson_path(args.hjson, ROM_SIZE_WORDS) # Load the input ELF file clr_mem = MemFile.load_elf32(args.infile, 4 * ROM_BASE_WORD) # Flatten the file, padding with pseudo-random data and ensuring it's # exactly scrambler.rom_size_words words long. clr_flat = scrambler.flatten(clr_mem) # Extend from 32 bits to 39 by adding Hsiao (39,32) ECC bits. clr_flat.add_ecc32() # Zero-extend the cleartext memory by one more bit (this is the size we # actually use in the physical ROM) assert clr_flat.width == 39 clr_flat.width = 40 # Scramble the memory scr_mem = scrambler.scramble40(clr_flat) # Insert the expected hash here to the top 8 words scrambler.add_hash(scr_mem) # Check for collisions collisions = scr_mem.collisions() if collisions: print( 'ERROR: This combination of ROM contents and scrambling\n' ' key results in one or more collisions where\n' ' different addresses have the same data.\n' '\n' ' Looks like we\'ve been (very) unlucky with the\n' ' birthday problem. As a work-around, try again after\n' ' generating some different RndCnst* parameters.\n', file=sys.stderr) print('{} colliding addresses:'.format(len(collisions)), file=sys.stderr) for addr0, addr1 in collisions: print(' {:#010x}, {:#010x}'.format(addr0, addr1), file=sys.stderr) return 1 scr_mem.write_vmem(args.outfile) return 0