esptool 4.9.dev8__tar.gz → 4.10.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {esptool-4.9.dev8/esptool.egg-info → esptool-4.10.0}/PKG-INFO +1 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/base_fields.py +7 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/base_operations.py +161 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/emulate_efuse_controller_base.py +4 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/fields.py +1 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/operations.py +7 -9
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/fields.py +14 -12
- esptool-4.10.0/espefuse/efuse/esp32c5/operations.py +390 -0
- {esptool-4.9.dev8/espefuse/efuse/esp32c61 → esptool-4.10.0/espefuse/efuse/esp32c6}/fields.py +18 -10
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/operations.py +7 -9
- {esptool-4.9.dev8/espefuse/efuse/esp32c6 → esptool-4.10.0/espefuse/efuse/esp32c61}/fields.py +5 -8
- esptool-4.10.0/espefuse/efuse/esp32c61/operations.py +391 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/fields.py +1 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/operations.py +8 -17
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/operations.py +8 -17
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/fields.py +4 -2
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/operations.py +8 -17
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/fields.py +16 -3
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/mem_definition.py +3 -1
- esptool-4.10.0/espefuse/efuse/esp32p4/operations.py +391 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/operations.py +7 -75
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/fields.py +1 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/operations.py +7 -75
- esptool-4.10.0/espefuse/efuse_defs/esp32c61.yaml +105 -0
- esptool-4.10.0/espefuse/efuse_defs/esp32p4_v3.0.yaml +132 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/__init__.py +2 -2
- {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/esp_hsm_sign/exceptions.py +8 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/__init__.py +17 -7
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/bin_image.py +106 -39
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/cmds.py +88 -100
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/loader.py +222 -86
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32.py +1 -4
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c2.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c3.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c5.py +4 -3
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c5beta3.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c6.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c61.py +0 -5
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h2.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h21.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h2beta1.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h2beta2.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h4.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32p4.py +20 -4
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32s2.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32s3.py +0 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32s3beta2.py +0 -1
- esptool-4.10.0/esptool/targets/stub_flasher/1/.DS_Store +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/1/README.md +1 -1
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c2.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c3.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c5.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c5beta3.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c6.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c61.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c6beta.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32h2.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32h2beta1.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32h2beta2.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32p4.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32p4rc1.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32s2.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32s3.json +8 -0
- esptool-4.10.0/esptool/targets/stub_flasher/1/esp32s3beta2.json +8 -0
- esptool-4.10.0/esptool/test.py +21 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/util.py +21 -17
- {esptool-4.9.dev8 → esptool-4.10.0/esptool.egg-info}/PKG-INFO +1 -1
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/SOURCES.txt +4 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/top_level.txt +2 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/pyproject.toml +1 -1
- esptool-4.9.dev8/espefuse/efuse/esp32c5/operations.py +0 -466
- esptool-4.9.dev8/espefuse/efuse/esp32c61/operations.py +0 -466
- esptool-4.9.dev8/espefuse/efuse/esp32p4/operations.py +0 -466
- esptool-4.9.dev8/espefuse/efuse_defs/esp32c61.yaml +0 -95
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c2.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c3.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c5.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c5beta3.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c6.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c61.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c6beta.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32h2.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32h2beta1.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32h2beta2.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32p4.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32s2.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32s3.json +0 -8
- esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32s3beta2.json +0 -8
- {esptool-4.9.dev8 → esptool-4.10.0}/LICENSE +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/MANIFEST.in +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/README.md +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/__main__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/esp_port_manager.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/redirector.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/__main__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/csv_table_parser.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/fields.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/operations.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/fields.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/operations.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/fields.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/operations.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c61/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c61/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/fields.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/fields.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/operations.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/fields.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/emulate_efuse_controller.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/fields.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/mem_definition.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/operations.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/mem_definition_base.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/util.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c2.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c3.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c5.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c5beta3.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c6.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h2.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h21.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h2_v0.0_v1.1.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h4.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32p4.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32s2.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32s3.yaml +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espefuse.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/__main__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/esp_hsm_sign/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/espsecure.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/__main__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/config.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/reset.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/__init__.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c6beta.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp8266.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/1/esp8266.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/README.md +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32c2.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32c3.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32c6.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32h2.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32s2.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32s3.json +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool/uf2_writer.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/dependency_links.txt +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/requires.txt +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/esptool.py +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/setup.cfg +0 -0
- {esptool-4.9.dev8 → esptool-4.10.0}/setup.py +0 -0
|
@@ -488,8 +488,14 @@ class EspEfusesBase(object):
|
|
|
488
488
|
print("Re-connecting...")
|
|
489
489
|
baudrate = esp._port.baudrate
|
|
490
490
|
port = esp._port.port
|
|
491
|
+
connect_mode = (
|
|
492
|
+
"usb-reset"
|
|
493
|
+
if esp._get_pid() == esp.USB_JTAG_SERIAL_PID
|
|
494
|
+
else "default-reset"
|
|
495
|
+
)
|
|
496
|
+
print(f"Port: {port}, Baudrate: {baudrate}, Connect mode: {connect_mode}")
|
|
491
497
|
esp._port.close()
|
|
492
|
-
return esptool.cmds.detect_chip(port, baudrate)
|
|
498
|
+
return esptool.cmds.detect_chip(port, baudrate, connect_mode)
|
|
493
499
|
|
|
494
500
|
def get_index_block_by_name(self, name):
|
|
495
501
|
for block in self.blocks:
|
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
6
|
|
|
7
7
|
import argparse
|
|
8
|
+
import io
|
|
8
9
|
import os
|
|
9
10
|
import json
|
|
10
11
|
import sys
|
|
11
12
|
|
|
12
13
|
from bitstring import BitStream
|
|
13
14
|
|
|
15
|
+
import espsecure
|
|
14
16
|
import esptool
|
|
15
17
|
|
|
16
18
|
from . import base_fields
|
|
@@ -802,3 +804,162 @@ def check_error(esp, efuses, args):
|
|
|
802
804
|
if error_in_blocks:
|
|
803
805
|
raise esptool.FatalError("Error(s) were detected in eFuses")
|
|
804
806
|
print("No errors detected")
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
def _key_block_is_unused(block, key_purpose_block):
|
|
810
|
+
"""Helper method to check if a key block is available for use"""
|
|
811
|
+
if not block.is_readable() or not block.is_writeable():
|
|
812
|
+
return False
|
|
813
|
+
|
|
814
|
+
if key_purpose_block.get() != "USER" or not key_purpose_block.is_writeable():
|
|
815
|
+
return False
|
|
816
|
+
|
|
817
|
+
if not block.get_bitstring().all(False):
|
|
818
|
+
return False
|
|
819
|
+
|
|
820
|
+
return True
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
def _get_next_key_block(efuses, current_key_block, block_name_list):
|
|
824
|
+
"""Helper method to get the next available key block"""
|
|
825
|
+
key_blocks = [b for b in efuses.blocks if b.key_purpose_name]
|
|
826
|
+
start = key_blocks.index(current_key_block)
|
|
827
|
+
|
|
828
|
+
# Sort key blocks so that we pick the next free block
|
|
829
|
+
# (and loop around if necessary)
|
|
830
|
+
key_blocks = key_blocks[start:] + key_blocks[0:start]
|
|
831
|
+
|
|
832
|
+
# Exclude any other blocks that will be be burned
|
|
833
|
+
key_blocks = [b for b in key_blocks if b.name not in block_name_list]
|
|
834
|
+
|
|
835
|
+
for block in key_blocks:
|
|
836
|
+
key_purpose_block = efuses[block.key_purpose_name]
|
|
837
|
+
if _key_block_is_unused(block, key_purpose_block):
|
|
838
|
+
return block
|
|
839
|
+
|
|
840
|
+
return None
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
def adjust_key_data_for_blocks(efuses, block_names, datafiles, keypurposes):
|
|
844
|
+
"""Split a key that takes more than one efuse block into two blocks.
|
|
845
|
+
It handles all key purposes that require splitting into two blocks.
|
|
846
|
+
|
|
847
|
+
This method checks if key purposes require splitting into two blocks,
|
|
848
|
+
such as "XTS_AES_256_KEY", "XTS_AES_256_PSRAM_KEY", and "ECDSA_KEY_P384".
|
|
849
|
+
|
|
850
|
+
Args:
|
|
851
|
+
block_names: List of block names.
|
|
852
|
+
datafiles: List of BinaryIO objects containing key data.
|
|
853
|
+
keypurposes: List of key purposes.
|
|
854
|
+
|
|
855
|
+
Returns:
|
|
856
|
+
A tuple containing updated block names, datafiles, and keypurposes.
|
|
857
|
+
"""
|
|
858
|
+
keypurposes = list(keypurposes)
|
|
859
|
+
datafiles = list(datafiles)
|
|
860
|
+
block_names = list(block_names)
|
|
861
|
+
|
|
862
|
+
if "XTS_AES_256_KEY" in keypurposes:
|
|
863
|
+
# XTS_AES_256_KEY is not an actual HW key purpose, needs to be split into
|
|
864
|
+
# XTS_AES_256_KEY_1 and XTS_AES_256_KEY_2
|
|
865
|
+
block_names, datafiles, keypurposes = _split_multiblock_key(
|
|
866
|
+
efuses,
|
|
867
|
+
block_names,
|
|
868
|
+
datafiles, # type: ignore
|
|
869
|
+
keypurposes,
|
|
870
|
+
"XTS_AES_256_KEY",
|
|
871
|
+
)
|
|
872
|
+
|
|
873
|
+
if "XTS_AES_256_PSRAM_KEY" in keypurposes:
|
|
874
|
+
# XTS_AES_256_PSRAM_KEY -> XTS_AES_256_PSRAM_KEY_1 and ..._KEY_2
|
|
875
|
+
block_names, datafiles, keypurposes = _split_multiblock_key(
|
|
876
|
+
efuses,
|
|
877
|
+
block_names,
|
|
878
|
+
datafiles, # type: ignore
|
|
879
|
+
keypurposes,
|
|
880
|
+
"XTS_AES_256_PSRAM_KEY",
|
|
881
|
+
)
|
|
882
|
+
|
|
883
|
+
# ECDSA keys can be present in a command multiple times
|
|
884
|
+
i = 0
|
|
885
|
+
while i < len(keypurposes):
|
|
886
|
+
if "ECDSA_KEY" in keypurposes[i]:
|
|
887
|
+
if keypurposes[i] not in ["ECDSA_KEY_P384_L", "ECDSA_KEY_P384_H"]:
|
|
888
|
+
sk = espsecure.load_ecdsa_signing_key(datafiles[i]) # type: ignore
|
|
889
|
+
data = sk.to_string()
|
|
890
|
+
if "ECDSA_KEY_P384" == keypurposes[i]:
|
|
891
|
+
assert (
|
|
892
|
+
len(data) == 48
|
|
893
|
+
), "NIST384p private key should be 48 bytes long"
|
|
894
|
+
datafiles[i] = io.BytesIO(b"\x00" * 16 + data)
|
|
895
|
+
# ECDSA_KEY_P384 -> ECDSA_KEY_P384_L and ECDSA_KEY_P384_H
|
|
896
|
+
block_names, datafiles, keypurposes = _split_multiblock_key(
|
|
897
|
+
efuses,
|
|
898
|
+
block_names,
|
|
899
|
+
datafiles, # type: ignore
|
|
900
|
+
keypurposes,
|
|
901
|
+
"ECDSA_KEY_P384",
|
|
902
|
+
)
|
|
903
|
+
else:
|
|
904
|
+
# the private key is 24 bytes long for NIST192p,
|
|
905
|
+
# and 8 bytes of padding
|
|
906
|
+
datafiles[i] = (
|
|
907
|
+
io.BytesIO(b"\x00" * 8 + data)
|
|
908
|
+
if len(data) == 24
|
|
909
|
+
else io.BytesIO(data)
|
|
910
|
+
)
|
|
911
|
+
|
|
912
|
+
i += 1
|
|
913
|
+
|
|
914
|
+
# Check that all block names are unique
|
|
915
|
+
util.check_duplicate_name_in_list(block_names)
|
|
916
|
+
|
|
917
|
+
# Check that the number of blocks, datafiles, and keypurposes is equal
|
|
918
|
+
if len(block_names) != len(datafiles) or len(block_names) != len(keypurposes):
|
|
919
|
+
raise esptool.FatalError(
|
|
920
|
+
f"The number of blocks ({len(block_names)}), "
|
|
921
|
+
f"datafile ({len(datafiles)}) and keypurpose ({len(keypurposes)}) "
|
|
922
|
+
"should be the same."
|
|
923
|
+
)
|
|
924
|
+
|
|
925
|
+
return block_names, datafiles, keypurposes
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
def _split_multiblock_key(
|
|
929
|
+
efuses, block_names, datafiles, keypurposes, base_keypurpose="XTS_AES_256_KEY"
|
|
930
|
+
):
|
|
931
|
+
"""Helper method to split 512-bit key into two 256-bit keys"""
|
|
932
|
+
|
|
933
|
+
keypurpose_list = list(keypurposes)
|
|
934
|
+
datafile_list = list(datafiles)
|
|
935
|
+
block_name_list = list(block_names)
|
|
936
|
+
|
|
937
|
+
i = keypurpose_list.index(base_keypurpose)
|
|
938
|
+
block_name = block_name_list[i]
|
|
939
|
+
|
|
940
|
+
block_num = efuses.get_index_block_by_name(block_name)
|
|
941
|
+
block = efuses.blocks[block_num]
|
|
942
|
+
|
|
943
|
+
data = datafile_list[i].read()
|
|
944
|
+
if len(data) != 64:
|
|
945
|
+
raise esptool.FatalError(
|
|
946
|
+
f"Incorrect key file size {len(data)}, {base_keypurpose} "
|
|
947
|
+
"should be 64 bytes"
|
|
948
|
+
)
|
|
949
|
+
|
|
950
|
+
key_block_2 = _get_next_key_block(efuses, block, block_name_list)
|
|
951
|
+
if not key_block_2:
|
|
952
|
+
raise esptool.FatalError(f"{base_keypurpose} requires two free keyblocks")
|
|
953
|
+
|
|
954
|
+
postfix = (
|
|
955
|
+
["_1", "_2"] if base_keypurpose.startswith("XTS_AES_256") else ["_H", "_L"]
|
|
956
|
+
)
|
|
957
|
+
keypurpose_list[i] = f"{base_keypurpose}{postfix[0]}"
|
|
958
|
+
datafile_list[i] = io.BytesIO(data[:32])
|
|
959
|
+
block_name_list[i] = block_name
|
|
960
|
+
|
|
961
|
+
keypurpose_list.insert(i + 1, f"{base_keypurpose}{postfix[1]}")
|
|
962
|
+
datafile_list.insert(i + 1, io.BytesIO(data[32:]))
|
|
963
|
+
block_name_list.insert(i + 1, key_block_2.name)
|
|
964
|
+
|
|
965
|
+
return block_name_list, datafile_list, keypurpose_list
|
|
@@ -18,6 +18,7 @@ class EmulateEfuseControllerBase(object):
|
|
|
18
18
|
Blocks = None
|
|
19
19
|
Fields = None
|
|
20
20
|
REGS = None
|
|
21
|
+
USB_JTAG_SERIAL_PID = 0x1001
|
|
21
22
|
|
|
22
23
|
def __init__(self, efuse_file=None, debug=False):
|
|
23
24
|
self.debug = debug
|
|
@@ -75,6 +76,9 @@ class EmulateEfuseControllerBase(object):
|
|
|
75
76
|
blk = self.Blocks.get(self.Blocks.BLOCKS[block])
|
|
76
77
|
self.write_reg(blk.wr_addr + (4 * n), value)
|
|
77
78
|
|
|
79
|
+
def _get_pid(self):
|
|
80
|
+
return -1
|
|
81
|
+
|
|
78
82
|
""" << esptool method end """
|
|
79
83
|
|
|
80
84
|
def handle_writing_event(self, addr, value):
|
|
@@ -450,5 +450,6 @@ class EfuseKeyPurposeField(EfuseField):
|
|
|
450
450
|
raw_val = int(self.check_format(str(new_value)))
|
|
451
451
|
str_new_value = self.get_name(raw_val)
|
|
452
452
|
if self.name == "KEY_PURPOSE_5" and str_new_value.startswith("XTS_AES"):
|
|
453
|
+
# see SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK in esp-idf
|
|
453
454
|
raise esptool.FatalError(f"{self.name} can not have {str_new_value} key due to a hardware bug (please see TRM for more details)")
|
|
454
455
|
return super(EfuseKeyPurposeField, self).save(raw_val)
|
|
@@ -26,6 +26,7 @@ from ..base_operations import (
|
|
|
26
26
|
read_protect_efuse,
|
|
27
27
|
summary,
|
|
28
28
|
write_protect_efuse,
|
|
29
|
+
adjust_key_data_for_blocks,
|
|
29
30
|
)
|
|
30
31
|
|
|
31
32
|
|
|
@@ -224,15 +225,12 @@ def burn_key(esp, efuses, args, digest=None):
|
|
|
224
225
|
0 : len([name for name in args.keypurpose if name is not None]) :
|
|
225
226
|
]
|
|
226
227
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
"should be the same."
|
|
234
|
-
% (len(block_name_list), len(datafile_list), len(keypurpose_list))
|
|
235
|
-
)
|
|
228
|
+
block_name_list, datafile_list, keypurpose_list = adjust_key_data_for_blocks(
|
|
229
|
+
efuses,
|
|
230
|
+
block_name_list,
|
|
231
|
+
datafile_list,
|
|
232
|
+
keypurpose_list,
|
|
233
|
+
)
|
|
236
234
|
|
|
237
235
|
print("Burn keys to blocks:")
|
|
238
236
|
for block_name, datafile, keypurpose in zip(
|
|
@@ -8,7 +8,7 @@ import binascii
|
|
|
8
8
|
import struct
|
|
9
9
|
import sys
|
|
10
10
|
import time
|
|
11
|
-
|
|
11
|
+
from typing import List, Tuple, Optional
|
|
12
12
|
from bitstring import BitArray
|
|
13
13
|
|
|
14
14
|
import esptool
|
|
@@ -403,14 +403,13 @@ class EfuseMacField(EfuseField):
|
|
|
403
403
|
|
|
404
404
|
# fmt: off
|
|
405
405
|
class EfuseKeyPurposeField(EfuseField):
|
|
406
|
-
|
|
406
|
+
key_purpose_len = 5 # bits for key purpose
|
|
407
|
+
KeyPurposeType = Tuple[str, int, Optional[str], Optional[str], str]
|
|
408
|
+
KEY_PURPOSES: List[KeyPurposeType] = [
|
|
407
409
|
("USER", 0, None, None, "no_need_rd_protect"), # User purposes (software-only use)
|
|
408
|
-
("ECDSA_KEY", 1, None, "Reverse", "need_rd_protect"), # ECDSA key P256
|
|
409
410
|
("ECDSA_KEY_P256", 1, None, "Reverse", "need_rd_protect"), # ECDSA key P256
|
|
411
|
+
("ECDSA_KEY", 1, None, "Reverse", "need_rd_protect"), # ECDSA key P256
|
|
410
412
|
("RESERVED", 1, None, None, "no_need_rd_protect"), # Reserved
|
|
411
|
-
("XTS_AES_256_KEY_1", 2, None, "Reverse", "need_rd_protect"), # XTS_AES_256_KEY_1 (flash/PSRAM encryption)
|
|
412
|
-
("XTS_AES_256_KEY_2", 3, None, "Reverse", "need_rd_protect"), # XTS_AES_256_KEY_2 (flash/PSRAM encryption)
|
|
413
|
-
("XTS_AES_256_KEY", -1, "VIRTUAL", None, "no_need_rd_protect"), # Virtual purpose splits to XTS_AES_256_KEY_1 and XTS_AES_256_KEY_2
|
|
414
413
|
("XTS_AES_128_KEY", 4, None, "Reverse", "need_rd_protect"), # XTS_AES_128_KEY (flash/PSRAM encryption)
|
|
415
414
|
("HMAC_DOWN_ALL", 5, None, None, "need_rd_protect"), # HMAC Downstream mode
|
|
416
415
|
("HMAC_DOWN_JTAG", 6, None, None, "need_rd_protect"), # JTAG soft enable key (uses HMAC Downstream mode)
|
|
@@ -420,14 +419,20 @@ class EfuseKeyPurposeField(EfuseField):
|
|
|
420
419
|
("SECURE_BOOT_DIGEST1", 10, "DIGEST", None, "no_need_rd_protect"), # SECURE_BOOT_DIGEST1 (Secure Boot key digest)
|
|
421
420
|
("SECURE_BOOT_DIGEST2", 11, "DIGEST", None, "no_need_rd_protect"), # SECURE_BOOT_DIGEST2 (Secure Boot key digest)
|
|
422
421
|
("KM_INIT_KEY", 12, None, None, "need_rd_protect"), # init key that is used for the generation of AES/ECDSA key
|
|
423
|
-
("XTS_AES_256_PSRAM_KEY_1", 13, None, "Reverse", "need_rd_protect"), # XTS_AES_256_PSRAM_KEY_1 (PSRAM encryption)
|
|
424
|
-
("XTS_AES_256_PSRAM_KEY_2", 14, None, "Reverse", "need_rd_protect"), # XTS_AES_256_PSRAM_KEY_1 (PSRAM encryption)
|
|
425
|
-
# ("XTS_AES_256_PSRAM_KEY", -2, "VIRTUAL", None, "no_need_rd_protect"), # Virtual purpose splits to XTS_AES_256_PSRAM_KEY_1 and XTS_AES_256_PSRAM_KEY_1
|
|
426
422
|
("XTS_AES_128_PSRAM_KEY", 15, None, "Reverse", "need_rd_protect"), # XTS_AES_128_PSRAM_KEY (PSRAM encryption)
|
|
427
423
|
("ECDSA_KEY_P192", 16, None, "Reverse", "need_rd_protect"), # ECDSA key P192
|
|
428
424
|
("ECDSA_KEY_P384_L", 17, None, "Reverse", "need_rd_protect"), # ECDSA key P384 low
|
|
429
425
|
("ECDSA_KEY_P384_H", 18, None, "Reverse", "need_rd_protect"), # ECDSA key P384 high
|
|
426
|
+
("ECDSA_KEY_P384", -3, "VIRTUAL", None, "need_rd_protect"), # Virtual purpose splits to ECDSA_KEY_P384_L and ECDSA_KEY_P384_H
|
|
430
427
|
]
|
|
428
|
+
CUSTOM_KEY_PURPOSES: List[KeyPurposeType] = []
|
|
429
|
+
for id in range(0, 1 << key_purpose_len):
|
|
430
|
+
if id not in [p[1] for p in KEY_PURPOSES]:
|
|
431
|
+
CUSTOM_KEY_PURPOSES.append((f"CUSTOM_{id}", id, None, None, "no_need_rd_protect"))
|
|
432
|
+
CUSTOM_KEY_PURPOSES.append((f"CUSTOM_DIGEST_{id}", id, "DIGEST", None, "no_need_rd_protect"))
|
|
433
|
+
CUSTOM_KEY_PURPOSES.append(("CUSTOM_MAX", (1 << key_purpose_len) - 1, None, None, "no_need_rd_protect"))
|
|
434
|
+
CUSTOM_KEY_PURPOSES.append(("CUSTOM_DIGEST_MAX", (1 << key_purpose_len) - 1, "DIGEST", None, "no_need_rd_protect"))
|
|
435
|
+
KEY_PURPOSES += CUSTOM_KEY_PURPOSES
|
|
431
436
|
# fmt: on
|
|
432
437
|
KEY_PURPOSES_NAME = [name[0] for name in KEY_PURPOSES]
|
|
433
438
|
DIGEST_KEY_PURPOSES = [name[0] for name in KEY_PURPOSES if name[2] == "DIGEST"]
|
|
@@ -470,7 +475,4 @@ class EfuseKeyPurposeField(EfuseField):
|
|
|
470
475
|
|
|
471
476
|
def save(self, new_value):
|
|
472
477
|
raw_val = int(self.check_format(str(new_value)))
|
|
473
|
-
str_new_value = self.get_name(raw_val)
|
|
474
|
-
if self.name == "KEY_PURPOSE_5" and str_new_value.startswith("XTS_AES"):
|
|
475
|
-
raise esptool.FatalError(f"{self.name} can not have {str_new_value} key due to a hardware bug (please see TRM for more details)")
|
|
476
478
|
return super(EfuseKeyPurposeField, self).save(raw_val)
|