Exemplo n.º 1
0
    def setUp(self):
        # reset and zero efuses
        serialport.dtr = False
        serialport.rts = True
        time.sleep(0.05)
        serialport.rts = False
        time.sleep(0.05)
        serialport.dtr = True

        # connect & verify efuses are really zero
        self.esp = espefuse.get_esp(serialport, 115200, "default_reset")
        # dict mapping register name to its efuse object
        self.efuses, self.operations = espefuse.get_efuses(esp=self.esp, do_not_confirm=True)
        if type(self.esp) is esptool.ESP32ROM:
            self.BLK1 = "BLOCK1"
            self.BLK2 = "BLOCK2"
            self.BLK3 = "BLOCK3"
            self.chip = "ESP32"
        else:
            self.BLK1 = "BLOCK_KEY1"
            self.BLK2 = "BLOCK_KEY2"
            self.BLK3 = "BLOCK_KEY3"
            self.chip = "ESP32-S2"

        for efuse in self.efuses:
            if efuse.name == "CLK8M_FREQ":
                continue
            val = efuse.get_raw()
            BAD_EFUSE_MSG = "Efuse %s not all zeroes - either this is a real ESP32 chip (VERY BAD, read top of file), or the reset is not erasing all efuses correctly." % efuse.name
            try:
                self.assertEqual(b'\x00'*len(val), val, BAD_EFUSE_MSG)
            except TypeError:
                self.assertEqual(0, val, BAD_EFUSE_MSG)
Exemplo n.º 2
0
    def enable_efuses(self):
        # We use an extra COM port to reset the efuses on FPGA.
        # Connect DTR pin of the COM port to the efuse reset pin on daughter board
        # Set EFUSEPORT env variable to the extra COM port
        if not self.efuse_reset_port:
            raise RuntimeError('EFUSEPORT not specified')

        # Stop any previous serial port operation
        self.stop_receive()
        if self.secure_boot_en:
            self.esp.connect()
        self.efuses, self.efuse_operations = espefuse.get_efuses(
            self.esp, False, False, True)
Exemplo n.º 3
0
def efuse_summary(esp, args):
    efuses, _efuse_operations = espefuse.get_efuses(esp, esp.CHIP_NAME, False,
                                                    False, False)

    summary_args = DefineArgs({
        'baud': 115200,
        'before': 'default_reset',
        'chip': esp.CHIP_NAME,
        'debug': False,
        'do_not_confirm': False,
        'file': sys.stdout,
        'mode': 'w',
        'encding': 'utf-8',
        'format': 'summary',
        'operation': 'summary',
        'port': args.port,
    })

    print("\n\n\n\t---SUMMARY START---\n")
    espefuse.summary(esp, efuses, summary_args)
    print("\n\t---SUMMARY END---\n\n")
Exemplo n.º 4
0
def efuse_burn_key(esp, args):

    efuses, efuse_operations = espefuse.get_efuses(esp, esp.CHIP_NAME, False,
                                                   False, False)

    if args.efuse_key_id is None:
        print("efuse Key id cannot be None")
        sys.exit(-1)

    key_file = open(hmac_key_file, 'rb')
    # First element of _KEYBLOCKS is config data so add offset of 1
    key_block = efuses._KEYBLOCKS[args.efuse_key_id + 1][0]
    burn_key_args = DefineArgs({
        'baud': 115200,
        'before': 'default_reset',
        'chip': esp.CHIP_NAME,
        'debug': False,
        'do_not_confirm': False,
        'block': [key_block],
        'keyfile': [key_file],
        'keypurpose': ['HMAC_DOWN_DIGITAL_SIGNATURE'],
        'operation': 'burn_key',
        'force_write_always': False,
        'no_read_protect': True,
        'no_write_protect': False,
        'port': args.port,
    })

    try:
        efuse_operations.burn_key(esp, efuses, burn_key_args, None)
        key_file.close()
    except esptool.FatalError:
        print(
            "\nERROR: The provided key block already contains previously burned key, please use a different key block ID"
        )
        sys.exit(-1)
Exemplo n.º 5
0
 def valid_key_present(self):
     esp = esptool.ESP32ROM(serialport)
     esp.connect()
     efuses, _ = espefuse.get_efuses(esp=esp)
     blk1_rd_en = efuses["BLOCK1"].is_readable()
     return not blk1_rd_en
Exemplo n.º 6
0
 def _set_34_coding_scheme(self):
     self.efuses["CODING_SCHEME"].burn(1)
     # EspEfuses constructor needs to re-load CODING_SCHEME
     self.efuses, self.operations = espefuse.get_efuses(esp=self.esp, do_not_confirm=True)