def main(): '''Main program''' # Determine program name, for error messages. pgmname = os.path.split(sys.argv[0])[-1] # Create a parser for parsing the command line and printing error messages. parser = create_argument_parser(pgmname) try: # Parse command line arguments. args = parse_arguments(parser) # Parse configuration file. config = BootloaderConfig.from_ini_files(args.configfile) # Check that config is valid # ValueError exception will be raised in case of invalid config config.check_config() except (ValueError, IOError, OSError, configparser.Error) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 flash = Flashable(config, args.bootloader) # Only create bootloader_with_config.hex. if len(args.infilespec) == 0: try: memory = flash.get_bootloader_hex() hextool.save_intel_hex(memory, filename=args.outfile) except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 return 0 else: # Read input files. try: for file_spec in args.infilespec: # Create an InFile object. in_file = InFile(file_spec=file_spec) flash.append(in_file) except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 try: # Combine bootloader, memory area specification, keys, stack and app. memory = flash.get_hex() hextool.save_intel_hex(memory, filename=args.outfile) except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 return 0
def main(): '''Main program''' # Determine program name, for error messages. pgmname = os.path.split(sys.argv[0])[-1] # Determine help text width. try: help_width = int(os.environ['COLUMNS']) except (KeyError, ValueError): help_width = 80 help_width -= 2 parser = argparse.ArgumentParser( prog = pgmname, formatter_class = argparse.RawDescriptionHelpFormatter, description = textwrap.fill( "A tool to prepare EFR32 stack hex file for v4.0 to v5.0 upgrade.")) parser.add_argument("infilespec", metavar = "INFILESPEC", help = "stack hex file") parser.add_argument("--output", "-o", metavar = "OUTFILESPEC", help = "output file") try: args = parser.parse_args() memory = hextool.Memory() hextool.load_intel_hex(memory, filename = args.infilespec) # Move first page off stack just before the v3 bootloader data. first_page = memory[memory.min_address:memory.min_address + PAGE_SIZE] memory.cursor = FIRST_PAGE_ADDRESS memory += first_page del memory[memory.min_address:memory.min_address + PAGE_SIZE] if args.output is not None: # Save output file. hextool.save_intel_hex(memory, filename=args.output) else: hextool.save_intel_hex(memory, filename=args.infilespec) except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 0
def main(): '''Main program''' # Determine program name, for error messages. pgmname = os.path.split(sys.argv[0])[-1] # Create a parser for parsing the command line and printing error messages. parser = create_argument_parser(pgmname) try: # Parse command line arguments. args = parse_arguments(parser) # Parse configuration file. config = BootloaderConfig.from_ini_files(args.configfile, args.symbols) # Check that config is valid # ValueError exception will be raised in case of invalid config config.check_config() # Check the key chosen is declared try: chosenkey = config.keys[args.keyname] except KeyError: raise ValueError("key not found: '%s'" % args.keyname) except (ValueError, IOError, OSError, configparser.Error) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 if False: # DEBUG: Show config. for key in config.keys.items(): print(key) # Create a Memory object for storing the bootloader. bootloader = hextool.Memory() if args.bootloader: # Read bootloader. hextool.load_intel_hex(bootloader, filename=args.bootloader) in_files = [] # List of InFile objects # (header, area_id, version, data) scratchpad_data = [] # List of scratchpad data blocks ver_major, ver_minor, ver_maint, ver_devel = (0, 0, 0, 0) if AES_TEST: # Run AES test. See aes_test1() in utils/aes.c for details. in_files.append(InFile(data=test_data)) scratchpad_data.append(test_icb) elif CMAC_TEST: # Run CMAC / OMAC1 test. See aes_omac1_test1() # in utils/aes.c for details. scratchpad_data.append(test_data) else: # Read input files. try: for file_spec in args.infilespec: # Create an InFile object. in_file = InFile(file_spec=file_spec, version=(0, 0, 0, args.otapseq)) # Compress data in-place. in_file.compress() in_files.append(in_file) except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 # Create secure header, which is also the initial counter block (ICB). secure_header = get_random_bytes(16) scratchpad_data.append(secure_header) if not CMAC_TEST: try: # Create an AES Counter (CTR) mode cipher using secure # header as the 16-byte initial counter block (ICB). cipher = create_cipher(secure_header, chosenkey.encryption) # Encrypt each input file. for in_file in in_files: # Encrypt data in-place. in_file.encrypt(cipher) # Add file header to scratchpad data. scratchpad_data.append(in_file.header) # Add compressed, encrypted file data to scratchpad data. scratchpad_data.append(in_file.data) except ValueError as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 # Calculate and add CMAC / OMAC1 tag. try: cmac = calculate_cmac(scratchpad_data, chosenkey.authentication) scratchpad_data.insert(0, cmac) except ValueError as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 if not AES_TEST and not CMAC_TEST: # Create a scratchpad header. try: scratchpad_header = make_scratchpad_header(args.otapseq, scratchpad_data) except ValueError as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 else: scratchpad_header = bytes() # Write output file and optionally the programming image file. try: with open(args.outfile, "wb") as f: # A combi scratchpad file starts with a 16-byte tag. f.write(SCRATCHPAD_V1_TAG) # Combi scratchpad files have the scratchpad header in front of # the scratchpad contents. The firmware rearranges the data in # Flash memory while storing the scratchpad. f.write(scratchpad_header) # Write scratchpad contents. for data in scratchpad_data: f.write(data) if args.genprog == None: return 0 # Combine bootloader, memory area specification, keys and scratchpad. file_without_scr = args.genprog.rsplit('.',1)[0] + \ "_without_scratchpad.hex" if config.is_scratchpad_internal(): # Generate a programming image (bootloader + scratchpad file) # and save it as Intel HEX. memory = gen_prog_image(config, bootloader, scratchpad_header, scratchpad_data) hextool.save_intel_hex(memory, filename=args.genprog) # Also generate a programming image without scratchpad # (bl+stack+app) for debug purposes and save it as Intel HEX. memory = gen_prog_image_without_scratchpad(config, bootloader, scratchpad_data, in_files) hextool.save_intel_hex(memory, filename=file_without_scr) else: # config.is_scratchpad_internal(): # Generate a programming image without scratchpad (bl+stack+app). # and save it as Intel HEX. memory = gen_prog_image_without_scratchpad(config, bootloader, scratchpad_data, in_files) hextool.save_intel_hex(memory, filename=file_without_scr) except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return 1 return 0
def main(): '''Main program''' # Determine program name, for error messages. pgmname = os.path.split(sys.argv[0])[-1] # Determine help text width. try: help_width = int(os.environ['COLUMNS']) except (KeyError, ValueError): help_width = 80 help_width -= 2 parser = argparse.ArgumentParser( prog=pgmname, formatter_class=argparse.RawTextHelpFormatter, description=textwrap.fill( "A tool to generate a hex file to customize node for \ provisioning.")) parser.add_argument("infilespec", metavar="INFILESPEC", help="yml personalization file") parser.add_argument("--output", "-o", metavar="OUTFILESPEC", help="The output file") parser.add_argument( "--address", "-a", type=parse_address, metavar="VALUE", required=True, help="Address of the storage area ([area:app_persistent]) " "defined in mcu/<mcu>/ini_files/<mcu>_app.ini file\n" "Default values per mcu are :\n" " - NRF52832 : 499712 (0x7A000)\n" " - NRF52833 : 499712 (0x7A000)\n" " - NRF52840 : 1024000 (0xFA000)\n" " - EFR32xg1x (512k) : 503808 (0x7B000)\n" " - EFR32xg1x (1024k): 1028096 (0xFB000)\n" " - EFR32xg22 (512k) : 491520 (0x78000)\n" " - EFR32xg21 (768k) : 753664 (0xB8000)\n" " - EFR32xg21 (1024k): 1015808 (0xF8000)") try: args = parser.parse_args() except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return -1 try: with open(args.infilespec, 'r') as ymlfile: cfg = yaml.load(ymlfile, Loader=yaml.FullLoader) except yaml.YAMLError as exc: sys.stdout.write("%s: Error opening %s (%s)\n" % (pgmname, args.infilespec, exc)) return -1 try: uid = to_bytes(cfg['provisioning']['uid']) method = to_bytes(cfg['provisioning']['method']) except KeyError: sys.stdout.write("%s: UID and Method are mandatory\n" % (pgmname)) return -1 try: key = to_bytes(cfg['provisioning']['factory_key']) except KeyError: key = b'' sys.stdout.write("%s - UID: %s (len: %d)\n" % (pgmname, uid, len(uid))) sys.stdout.write("%s - KEY: %s (len: %d)\n" % (pgmname, "".join("{:02X}".format(to_int(x)) for x in key), len(key))) sys.stdout.write("%s - Method: %d\n" % (pgmname, method)) data = struct.pack("<I", STORAGE_MAGIC) + \ struct.pack("B", method) + \ struct.pack("B", len(uid)) + \ uid + \ struct.pack("B", len(key)) + \ key memory = hextool.Memory() memory.cursor = args.address memory += data # Save output file. if args.output is not None: hextool.save_intel_hex(memory, filename=args.output) sys.stdout.write("%s - Output file: %s\n" % (pgmname, args.output)) else: hextool.save_intel_hex(memory, filename=os.path.splitext(args.infilespec)[0] + ".hex") sys.stdout.write( "%s - Output file: %s\n" % (pgmname, os.path.splitext(args.infilespec)[0] + ".hex"))
def main(): '''Main program''' # Determine program name, for error messages. pgmname = os.path.split(sys.argv[0])[-1] # Determine help text width. try: help_width = int(os.environ['COLUMNS']) except (KeyError, ValueError): help_width = 80 help_width -= 2 parser = argparse.ArgumentParser( prog=pgmname, formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.fill( "A tool to generate a hex file to customize node for \ provisioning.")) parser.add_argument("infilespec", metavar="INFILESPEC", help="yml personalization file") parser.add_argument("--output", "-o", metavar="OUTFILESPEC", help="output file") parser.add_argument("--address", "-a", type=parse_address, metavar="VALUE", required=True, help="Storage area address") try: args = parser.parse_args() except (ValueError, IOError, OSError) as exc: sys.stdout.write("%s: %s\n" % (pgmname, exc)) return -1 try: with open(args.infilespec, 'r') as ymlfile: cfg = yaml.load(ymlfile, Loader=yaml.FullLoader) except yaml.YAMLError as exc: sys.stdout.write("%s: Error opening %s (%s)\n" % (pgmname, args.infilespec, exc)) return -1 try: uid = to_bytes(cfg['provisioning']['uid']) method = to_bytes(cfg['provisioning']['method']) except KeyError: sys.stdout.write("%s: UID and Method are mandatory\n" % (pgmname)) return -1 try: key = to_bytes(cfg['provisioning']['factory_key']) except KeyError: key = b'' sys.stdout.write("%s - UID: %s (len: %d)\n" % (pgmname, uid, len(uid))) sys.stdout.write("%s - KEY: %s (len: %d)\n" % (pgmname, "".join("{:02X}".format(to_int(x)) for x in key), len(key))) sys.stdout.write("%s - Method: %d\n" % (pgmname, method)) data = struct.pack("<I", STORAGE_MAGIC) + \ struct.pack("B", method) + \ struct.pack("B", len(uid)) + \ uid + \ struct.pack("B", len(key)) + \ key memory = hextool.Memory() memory.cursor = args.address memory += data # Save output file. if args.output is not None: hextool.save_intel_hex(memory, filename=args.output) sys.stdout.write("%s - Output file: %s\n" % (pgmname, args.output)) else: hextool.save_intel_hex(memory, filename=os.path.splitext(args.infilespec)[0] + ".hex") sys.stdout.write( "%s - Output file: %s\n" % (pgmname, os.path.splitext(args.infilespec)[0] + ".hex"))
def main(): '''Main program''' # Determine program name, for error messages. pgmname = os.path.split(sys.argv[0])[-1] # Verify python version is 3.7 or newer. if sys.version_info.major < 3 or (sys.version_info.major == 3 and sys.version_info.minor < 7): print( f"{pgmname} ERROR: Python version {sys.version_info.major}.{sys.version_info.minor} not supported" ) return -1 # Determine help text width. try: help_width = int(os.environ['COLUMNS']) except (KeyError, ValueError): help_width = 80 help_width -= 2 parser = argparse.ArgumentParser( prog=pgmname, formatter_class=argparse.RawTextHelpFormatter, description=textwrap.fill( "A tool to generate a hex file to customize node for \ positioning application.")) parser.add_argument("infilespec", metavar="INFILESPEC", help="yml personalization file") parser.add_argument("--output", "-o", metavar="OUTFILESPEC", help="The output file") parser.add_argument("--layout", "-l", metavar="LAYOUTFILESPEC", help="The layout file") parser.add_argument( "--address", "-a", type=parse_address, metavar="VALUE", required=True, help="Address of the storage area ([area:app_persistent])\n" "defined in scratchpad_ini/scratchpad_<mcu>.ini file\n" "Default values per mcu are :\n" " - NRF52832 : 512000 (0x7D000)\n" " - NRF52833 : 512000 (0x7D000)\n" " - NRF52840 : 1036288 (0xFD000)\n" " - EFR32xg1x (512k) : 518144 (0x7E800)\n" " - EFR32xg1x (1024k): 1042432 (0xFE800)\n" " - EFR32xg22 (512k) : 499712 (0x7A000)\n" " - EFR32xg21 (1024k): 1024000 (0xFA000)") try: args = parser.parse_args() except (ValueError, IOError, OSError) as exc: sys.stdout.write(f"{pgmname}: {exc}\n") return -1 try: with open(args.layout, 'r') as ymllayoutfile: layout = yaml.load(ymllayoutfile, Loader=yaml.FullLoader) except yaml.YAMLError as exc: sys.stdout.write(f"{pgmname}: Error opening {args.layout} ({exc})\n") return -1 try: with open(args.infilespec, 'r') as ymlfile: cfg = yaml.load(ymlfile, Loader=yaml.FullLoader) except yaml.YAMLError as exc: sys.stdout.write( f"{pgmname}: Error opening {args.infilespec} ({exc})\n") return -1 if not check_config_against_layout(args, layout, cfg): return -1 status, data = process_layout_and_config(args, layout, cfg) if not status: return -1 memory = hextool.Memory() memory.cursor = args.address memory += data # Determine name for output file. if args.output is not None: outfilename = args.output else: outfilename = os.path.splitext(args.infilespec)[0] + ".hex" # Save output file. hextool.save_intel_hex(memory, filename=outfilename) sys.stdout.write(f"{pgmname} - Output file: {outfilename}\n")