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)
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)
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")
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)
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
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)