Exemplo n.º 1
0
    def test_generate_without_application_or_sd_file(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(nRFArch.NRF52, settings.arch)
        self.assertEqual('nRF52', settings.arch_str)
        self.assertEqual(0x0007F000, settings.bl_sett_addr)
        self.assertEqual(0x12ECF0A5, settings.crc)
        self.assertEqual(0x00000002, settings.bl_sett_ver)
        self.assertEqual(0x00000001, settings.app_ver)
        self.assertEqual(0x00000001, settings.bl_ver)
        self.assertEqual(0x00000000, settings.bank_layout)
        self.assertEqual(0x00000000, settings.bank_current)
        self.assertEqual(0x00000000, settings.app_sz)
        self.assertEqual(0x00000000, settings.app_crc)
        self.assertEqual(0x00000000, settings.bank0_bank_code)
        self.assertEqual(0x00000000, settings.sd_sz)
        self.assertEqual(0xACDA1BA2, settings.boot_validation_crc)
        self.assertEqual(0x00, settings.sd_boot_validation_type)
        # self.assertEqual(0x5B00BDCE, settings.sd_boot_validation_bytes)
        self.assertEqual(0x00, settings.app_boot_validation_type)
Exemplo n.º 2
0
def generate(hex_file,
        family,
        application,
        application_version,
        application_version_string,
        bootloader_version,
        bl_settings_version,
        start_address,
        no_backup,
        backup_address):

    # Initial consistency checks
    if family is None:
        click.echo("Error: IC Family required.")
        return

    # The user can specify the application version with two different
    # formats. As an integer, e.g. 102130, or as a string
    # "10.21.30". Internally we convert to integer.
    if application_version_string:
        application_version_internal = convert_version_string_to_int(application_version_string)
    else:
        application_version_internal = application_version

    if application is not None:
        if not os.path.isfile(application):
            click.echo("Error: Application file not found.")
            return
        if application_version_internal is None:
            click.echo("Error: Application version required.")
            return

    if bootloader_version is None:
        click.echo("Error: Bootloader version required.")
        return

    if bl_settings_version is None:
        click.echo("Error: Bootloader DFU settings version required.")
        return

    if (no_backup is not None) and (backup_address is not None):
        click.echo("Error: Bootloader DFU settings backup page cannot be specified if backup is disabled.")
        return

    if no_backup is None:
        no_backup = False

    if no_backup == False:
        display_settings_backup_warning()

    if (start_address is not None) and (backup_address is None):
        click.echo("WARNING: Using default offset in order to calculate bootloader settings backup page")

    sett = BLDFUSettings()
    sett.generate(arch=family, app_file=application, app_ver=application_version_internal, bl_ver=bootloader_version, bl_sett_ver=bl_settings_version, custom_bl_sett_addr=start_address, no_backup=no_backup, backup_address=backup_address)
    sett.tohexfile(hex_file)

    click.echo("\nGenerated Bootloader DFU settings .hex file and stored it in: {}".format(hex_file))

    click.echo("{0}".format(str(sett)))
Exemplo n.º 3
0
    def test_generate_with_application_file(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file='firmwares/s132_nrf52_mini.hex',
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=1,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(nRFArch.NRF52, settings.arch)
        self.assertEqual('nRF52', settings.arch_str)
        self.assertEqual(0x0007F000, settings.bl_sett_addr)
        self.assertEqual(0xEB5917FB, settings.crc)
        self.assertEqual(0x00000001, settings.bl_sett_ver)
        self.assertEqual(0x00000001, settings.app_ver)
        self.assertEqual(0x00000001, settings.bl_ver)
        self.assertEqual(0x00000000, settings.bank_layout)
        self.assertEqual(0x00000000, settings.bank_current)
        self.assertEqual(0x00003000, settings.app_sz)
        self.assertEqual(0x5F045729, settings.app_crc)
        self.assertEqual(0x00000001, settings.bank0_bank_code)
Exemplo n.º 4
0
    def test_generate_with_backup_page_check_size(self):
        settings_raw = BLDFUSettings()
        settings_raw.generate(arch='NRF52',
                              app_file=None,
                              app_ver=1,
                              bl_ver=1,
                              bl_sett_ver=2,
                              custom_bl_sett_addr=None,
                              no_backup=True,
                              backup_address=None,
                              app_boot_validation_type=None,
                              sd_boot_validation_type=None,
                              sd_file=None,
                              key_file=None)

        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(len(list(settings.ihex.todict().keys())),
                         len(list(settings_raw.ihex.todict().keys())) * 2)
Exemplo n.º 5
0
    def test_generate_without_application_file(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=1,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          signer=None)

        self.assertEqual(nRFArch.NRF52, settings.arch)
        self.assertEqual('nRF52', settings.arch_str)
        self.assertEqual(0x0007F000, settings.bl_sett_addr)
        self.assertEqual(0xEAA3288E, settings.crc)
        self.assertEqual(0x00000001, settings.bl_sett_ver)
        self.assertEqual(0x00000001, settings.app_ver)
        self.assertEqual(0x00000001, settings.bl_ver)
        self.assertEqual(0x00000000, settings.bank_layout)
        self.assertEqual(0x00000000, settings.bank_current)
        self.assertEqual(0x00000000, settings.app_sz)
        self.assertEqual(0x00000000, settings.app_crc)
        self.assertEqual(0x00000000, settings.bank0_bank_code)
    def test_generate_without_application_or_sd_file(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(nRFArch.NRF52, settings.arch)
        self.assertEqual('nRF52', settings.arch_str)
        self.assertEqual(0x0007F000, settings.bl_sett_addr)
        self.assertEqual(0x12ECF0A5, settings.crc)
        self.assertEqual(0x00000002, settings.bl_sett_ver)
        self.assertEqual(0x00000001, settings.app_ver)
        self.assertEqual(0x00000001, settings.bl_ver)
        self.assertEqual(0x00000000, settings.bank_layout)
        self.assertEqual(0x00000000, settings.bank_current)
        self.assertEqual(0x00000000, settings.app_sz)
        self.assertEqual(0x00000000, settings.app_crc)
        self.assertEqual(0x00000000, settings.bank0_bank_code)
        self.assertEqual(0x00000000, settings.sd_sz)
        self.assertEqual(0xACDA1BA2, settings.boot_validation_crc)
        self.assertEqual(0x00, settings.sd_boot_validation_type)
        # self.assertEqual(0x5B00BDCE, settings.sd_boot_validation_bytes)
        self.assertEqual(0x00, settings.app_boot_validation_type)
    def test_generate_with_backup_page_check_size(self):
        settings_raw = BLDFUSettings()
        settings_raw.generate(arch='NRF52',
                             app_file=None,
                             app_ver=1,
                             bl_ver=1,
                             bl_sett_ver=2,
                             custom_bl_sett_addr=None,
                             no_backup=True,
                             backup_address=None,
                             app_boot_validation_type=None,
                             sd_boot_validation_type=None,
                             sd_file=None,
                             key_file=None)

        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(len(settings.ihex.todict().keys()), len(settings_raw.ihex.todict().keys()) * 2)
    def test_generate_with_application_file(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file='firmwares/s132_nrf52_mini.hex',
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=1,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(nRFArch.NRF52, settings.arch)
        self.assertEqual('nRF52', settings.arch_str)
        self.assertEqual(0x0007F000, settings.bl_sett_addr)
        self.assertEqual(0xEB5917FB, settings.crc)
        self.assertEqual(0x00000001, settings.bl_sett_ver)
        self.assertEqual(0x00000001, settings.app_ver)
        self.assertEqual(0x00000001, settings.bl_ver)
        self.assertEqual(0x00000000, settings.bank_layout)
        self.assertEqual(0x00000000, settings.bank_current)
        self.assertEqual(0x00003000, settings.app_sz)
        self.assertEqual(0x5F045729, settings.app_crc)
        self.assertEqual(0x00000001, settings.bank0_bank_code)
Exemplo n.º 9
0
    def test_generate_with_custom_start_address(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=1,
                          custom_bl_sett_addr=0x0006F000)

        self.assertEqual(settings.bl_sett_addr, 0x0006F000)
Exemplo n.º 10
0
    def test_generate_with_backup_page_custom_address(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=1,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=0x0006F000)

        self.assertEqual(settings.backup_address, 0x0006F000)
        self.assertTrue(0x0006F000 in settings.ihex.todict().keys())
Exemplo n.º 11
0
def generate(hex_file, family, application, application_version,
             application_version_string, bootloader_version,
             bl_settings_version, start_address):

    # Initial consistency checks
    if family is None:
        click.echo("Error: IC Family required.")
        return

    # The user can specify the application version with two different
    # formats. As an integer, e.g. 102130, or as a string
    # "10.21.30". Internally we convert to integer.
    if application_version_string:
        application_version_internal = convert_version_string_to_int(
            application_version_string)
    else:
        application_version_internal = application_version

    if application is not None:
        if not os.path.isfile(application):
            click.echo("Error: Application file not found.")
            return
        if application_version_internal is None:
            click.echo("Error: Application version required.")
            return

    if bootloader_version is None:
        click.echo("Error: Bootloader version required.")
        return

    if bl_settings_version is None:
        click.echo("Error: Bootloader DFU settings version required.")
        return

    sett = BLDFUSettings()
    sett.generate(arch=family,
                  app_file=application,
                  app_ver=application_version_internal,
                  bl_ver=bootloader_version,
                  bl_sett_ver=bl_settings_version,
                  custom_bl_sett_addr=start_address)
    sett.tohexfile(hex_file)

    click.echo(
        "\nGenerated Bootloader DFU settings .hex file and stored it in: {}".
        format(hex_file))

    click.echo("{0}".format(str(sett)))
    def test_generate_with_custom_start_address(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=0x0006F000,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(settings.bl_sett_addr, 0x0006F000)
Exemplo n.º 13
0
    def test_generate_with_custom_start_address(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=0x0006F000,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(settings.bl_sett_addr, 0x0006F000)
    def test_generate_with_backup_page_default_address(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=0x0006F000,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(settings.backup_address, (0x0006F000 - settings.bl_sett_backup_offset))
        self.assertTrue((0x0006F000 - settings.bl_sett_backup_offset) in settings.ihex.todict().keys())
    def test_generate_with_backup_page_check_values(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        backup_dict = {(k + settings.bl_sett_backup_offset): v for k, v in settings.ihex.todict().items() if k < settings.bl_sett_addr}
        settings_dict = {k: v for k, v in settings.ihex.todict().items() if k >= settings.bl_sett_addr}
        self.assertEqual(backup_dict, settings_dict)
Exemplo n.º 16
0
def generate(hex_file,
        family,
        application,
        application_version,
        application_version_string,
        bootloader_version,
        bl_settings_version):

    # Initial consistency checks
    if family is None:
        click.echo("Error: IC Family required.")
        return

    # The user can specify the application version with two different
    # formats. As an integer, e.g. 102130, or as a string
    # "10.21.30". Internally we convert to integer.
    if application_version_string:
        application_version_internal = convert_version_string_to_int(application_version_string)
    else:
        application_version_internal = application_version

    if application is not None:
        if not os.path.isfile(application):
            click.echo("Error: Application file not found.")
            return
        if application_version_internal is None:
            click.echo("Error: Application version required.")
            return

    if bootloader_version is None:
        click.echo("Error: Bootloader version required.")
        return
 
    if bl_settings_version is None:
        click.echo("Error: Bootloader DFU settings version required.")
        return
       
    sett = BLDFUSettings()
    sett.generate(arch=family, app_file=application, app_ver=application_version_internal, bl_ver=bootloader_version, bl_sett_ver=bl_settings_version)
    sett.tohexfile(hex_file)

    click.echo("\nGenerated Bootloader DFU settings .hex file and stored it in: {}".format(hex_file))

    click.echo("{0}".format(str(sett)))
Exemplo n.º 17
0
    def test_generate_with_sd_boot_validation_ecdsa(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=True,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type='VALIDATE_ECDSA_P256_SHA256',
                          sd_file='firmwares/s132_nrf52_mini.hex',
                          key_file='key.pem')

        # Since ECDSA contains a random component the signature will be different every time
        # it is generated. Therefore only overall structure of the boot validation will be checked.
        self.assertEqual(0x03, settings.sd_boot_validation_type)
        self.assertEqual(64, len(settings.sd_boot_validation_bytes))
Exemplo n.º 18
0
    def test_generate_with_backup_page_default_address(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=0x0006F000,
                          no_backup=False,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(settings.backup_address,
                         (0x0006F000 - settings.bl_sett_backup_offset))
        self.assertTrue((0x0006F000 - settings.bl_sett_backup_offset
                         ) in list(settings.ihex.todict().keys()))
    def test_generate_with_sd_boot_validation_crc(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=True,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type='VALIDATE_GENERATED_CRC',
                          sd_file='firmwares/s132_nrf52_mini.hex',
                          key_file=None)

        self.assertEqual(0x4637019F, settings.crc)
        self.assertEqual(0xCB5F90FB, settings.boot_validation_crc)
        self.assertEqual(0x01,       settings.sd_boot_validation_type)
        self.assertEqual(0x5F045729, struct.unpack('<I', settings.sd_boot_validation_bytes)[0])
    def test_generate_with_sd_boot_validation_ecdsa(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=True,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type='VALIDATE_ECDSA_P256_SHA256',
                          sd_file='firmwares/s132_nrf52_mini.hex',
                          key_file='key.pem')

        # Since ECDSA contains a random component the signature will be different everytime
        # it is generated. Therefore only overall structure of the boot validation will be checked.
        self.assertEqual(0x03, settings.sd_boot_validation_type)
        self.assertEqual(64, len(settings.sd_boot_validation_bytes))
    def test_generate_with_sd_boot_validation_sha256(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=True,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type='VALIDATE_GENERATED_SHA256',
                          sd_file='firmwares/s132_nrf52_mini.hex',
                          key_file=None)

        self.assertEqual(0x4637019F, settings.crc)
        self.assertEqual(0x9C761426, settings.boot_validation_crc)
        self.assertEqual(0x02, settings.sd_boot_validation_type)
        self.assertEqual('036F52C9EBB53819D6E2B6FB57803823E864783B04D7331B46C0B5897CA9F1C7',
                         binascii.hexlify(settings.sd_boot_validation_bytes).upper())
Exemplo n.º 22
0
    def test_generate_with_backup_page_check_values(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=1,
                          custom_bl_sett_addr=None,
                          no_backup=False,
                          backup_address=None)

        backup_dict = {(k + settings.bl_sett_backup_offset): v
                       for k, v in settings.ihex.todict().items()
                       if k < settings.bl_sett_addr}
        settings_dict = {
            k: v
            for k, v in settings.ihex.todict().items()
            if k >= settings.bl_sett_addr
        }
        self.assertEqual(backup_dict, settings_dict)
Exemplo n.º 23
0
    def test_generate_with_sd_boot_validation_sha256(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=True,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type='VALIDATE_GENERATED_SHA256',
                          sd_file='firmwares/s132_nrf52_mini.hex',
                          key_file=None)

        self.assertEqual(0x4637019F, settings.crc)
        self.assertEqual(0x9C761426, settings.boot_validation_crc)
        self.assertEqual(0x02, settings.sd_boot_validation_type)
        self.assertEqual(
            '036F52C9EBB53819D6E2B6FB57803823E864783B04D7331B46C0B5897CA9F1C7',
            binascii.hexlify(settings.sd_boot_validation_bytes).upper())
Exemplo n.º 24
0
    def test_generate_without_application_file(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=1,
                          custom_bl_sett_addr=None)

        self.assertEqual(nRFArch.NRF52, settings.arch)
        self.assertEqual('nRF52', settings.arch_str)
        self.assertEqual(0x0007F000, settings.bl_sett_addr)
        self.assertEqual(0x2070A601, settings.crc)
        self.assertEqual(0x00000001, settings.bl_sett_ver)
        self.assertEqual(0x00000001, settings.app_ver)
        self.assertEqual(0x00000001, settings.bl_ver)
        self.assertEqual(0x00000000, settings.bank_layout)
        self.assertEqual(0x00000000, settings.bank_current)
        self.assertEqual(0x00000000, settings.app_sz)
        self.assertEqual(0x00000000, settings.app_crc)
        self.assertEqual(0x00000001, settings.bank0_bank_code)
Exemplo n.º 25
0
    def test_generate_with_sd_boot_validation_crc(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file=None,
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=True,
                          backup_address=None,
                          app_boot_validation_type=None,
                          sd_boot_validation_type='VALIDATE_GENERATED_CRC',
                          sd_file='firmwares/s132_nrf52_mini.hex',
                          key_file=None)

        self.assertEqual(0x4637019F, settings.crc)
        self.assertEqual(0xCB5F90FB, settings.boot_validation_crc)
        self.assertEqual(0x01, settings.sd_boot_validation_type)
        self.assertEqual(
            0x5F045729,
            struct.unpack('<I', settings.sd_boot_validation_bytes)[0])
Exemplo n.º 26
0
    def test_generate_with_app_boot_validation_sha256(self):
        settings = BLDFUSettings()
        settings.generate(arch='NRF52',
                          app_file='firmwares/s132_nrf52_mini.hex',
                          app_ver=1,
                          bl_ver=1,
                          bl_sett_ver=2,
                          custom_bl_sett_addr=None,
                          no_backup=True,
                          backup_address=None,
                          app_boot_validation_type='VALIDATE_GENERATED_SHA256',
                          sd_boot_validation_type=None,
                          sd_file=None,
                          key_file=None)

        self.assertEqual(0x1316CFD0, settings.crc)
        self.assertEqual(0xF78E451E, settings.boot_validation_crc)
        self.assertEqual(0x02, settings.app_boot_validation_type)
        self.assertEqual(
            bytes.fromhex(
                '036F52C9EBB53819D6E2B6FB57803823E864783B04D7331B46C0B5897CA9F1C7'
            ), settings.app_boot_validation_bytes)
Exemplo n.º 27
0
def generate(hex_file, family, application, application_version,
             bootloader_version, bl_settings_version):

    # Initial consistency checks
    if family is None:
        click.echo("Error: IC Family required.")
        return

    if application is not None:
        if not os.path.isfile(application):
            click.echo("Error: Application file not found.")
            return
        if application_version is None:
            click.echo("Error: Application version required.")
            return

    if bootloader_version is None:
        click.echo("Error: Bootloader version required.")
        return

    if bl_settings_version is None:
        click.echo("Error: Bootloader DFU settings version required.")
        return

    sett = BLDFUSettings()
    sett.generate(arch=family,
                  app_file=application,
                  app_ver=application_version,
                  bl_ver=bootloader_version,
                  bl_sett_ver=bl_settings_version)
    sett.tohexfile(hex_file)

    click.echo(
        "\nGenerated Bootloader DFU settings .hex file and stored it in: {}".
        format(hex_file))

    click.echo("{0}".format(str(sett)))
Exemplo n.º 28
0
def generate(hex_file, family, application, application_version,
             application_version_string, bootloader_version,
             bl_settings_version, start_address, no_backup, backup_address,
             app_boot_validation, sd_boot_validation, softdevice, key_file):

    # The user can specify the application version with two different
    # formats. As an integer, e.g. 102130, or as a string
    # "10.21.30". Internally we convert to integer.
    if application_version_string:
        application_version_internal = convert_version_string_to_int(
            application_version_string)
        if application_version:
            click.echo(
                'Warning: When both application-version-string and application-version are provided, only the string will be used.'
            )
    else:
        application_version_internal = application_version

    if application is not None:
        if not os.path.isfile(application):
            raise click.FileError(application,
                                  hint="Application file not found")
        if application_version_internal is None:
            raise click.UsageError(
                '--application-version or --application-version-string'
                ' required with application image.')

    if (no_backup is not None) and (backup_address is not None):
        raise click.BadParameter(
            "Bootloader DFU settings backup page cannot be specified if backup is disabled.",
            param_hint='backup_address')

    if no_backup is None:
        no_backup = False

    if no_backup is False:
        display_settings_backup_warning()

    if (start_address is not None) and (backup_address is None):
        click.echo(
            "WARNING: Using default offset in order to calculate bootloader settings backup page"
        )

    if bl_settings_version == 1 and (app_boot_validation
                                     or sd_boot_validation):
        raise click.BadParameter(
            "Bootloader settings version 1 does not support boot validation.",
            param_hint='bl_settings_version')

    # load signing key (if needed) only once
    if 'VALIDATE_ECDSA_P256_SHA256' in (app_boot_validation,
                                        sd_boot_validation):
        if not os.path.isfile(key_file):
            raise click.UsageError(
                "Key file must be given when 'VALIDATE_ECDSA_P256_SHA256' boot validation is used"
            )
        signer = Signing()
        default_key = signer.load_key(key_file)
        if default_key:
            display_sec_warning()
    else:
        signer = None

    if app_boot_validation and not application:
        raise click.UsageError(
            "--application hex file must be set when using --app_boot_validation"
        )

    if sd_boot_validation and not softdevice:
        raise click.UsageError(
            "--softdevice hex file must be set when using --sd_boot_validation"
        )

    # Default boot validation cases
    if app_boot_validation is None and application is not None and bl_settings_version == 2:
        app_boot_validation = DEFAULT_BOOT_VALIDATION
    if sd_boot_validation is None and softdevice is not None and bl_settings_version == 2:
        sd_boot_validation = DEFAULT_BOOT_VALIDATION

    sett = BLDFUSettings()
    sett.generate(arch=family,
                  app_file=application,
                  app_ver=application_version_internal,
                  bl_ver=bootloader_version,
                  bl_sett_ver=bl_settings_version,
                  custom_bl_sett_addr=start_address,
                  no_backup=no_backup,
                  backup_address=backup_address,
                  app_boot_validation_type=app_boot_validation,
                  sd_boot_validation_type=sd_boot_validation,
                  sd_file=softdevice,
                  signer=signer)
    sett.tohexfile(hex_file)

    click.echo(
        "\nGenerated Bootloader DFU settings .hex file and stored it in: {}".
        format(hex_file))

    click.echo("{0}".format(str(sett)))