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.
Files changed (200) hide show
  1. {esptool-4.9.dev8/esptool.egg-info → esptool-4.10.0}/PKG-INFO +1 -1
  2. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/base_fields.py +7 -1
  3. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/base_operations.py +161 -0
  4. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/emulate_efuse_controller_base.py +4 -0
  5. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/fields.py +1 -0
  6. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/operations.py +7 -9
  7. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/fields.py +14 -12
  8. esptool-4.10.0/espefuse/efuse/esp32c5/operations.py +390 -0
  9. {esptool-4.9.dev8/espefuse/efuse/esp32c61 → esptool-4.10.0/espefuse/efuse/esp32c6}/fields.py +18 -10
  10. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/operations.py +7 -9
  11. {esptool-4.9.dev8/espefuse/efuse/esp32c6 → esptool-4.10.0/espefuse/efuse/esp32c61}/fields.py +5 -8
  12. esptool-4.10.0/espefuse/efuse/esp32c61/operations.py +391 -0
  13. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/fields.py +1 -0
  14. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/operations.py +8 -17
  15. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/operations.py +8 -17
  16. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/fields.py +4 -2
  17. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/operations.py +8 -17
  18. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/fields.py +16 -3
  19. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/mem_definition.py +3 -1
  20. esptool-4.10.0/espefuse/efuse/esp32p4/operations.py +391 -0
  21. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/operations.py +7 -75
  22. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/fields.py +1 -0
  23. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/operations.py +7 -75
  24. esptool-4.10.0/espefuse/efuse_defs/esp32c61.yaml +105 -0
  25. esptool-4.10.0/espefuse/efuse_defs/esp32p4_v3.0.yaml +132 -0
  26. {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/__init__.py +2 -2
  27. {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/esp_hsm_sign/exceptions.py +8 -1
  28. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/__init__.py +17 -7
  29. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/bin_image.py +106 -39
  30. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/cmds.py +88 -100
  31. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/loader.py +222 -86
  32. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32.py +1 -4
  33. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c2.py +0 -1
  34. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c3.py +0 -1
  35. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c5.py +4 -3
  36. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c5beta3.py +0 -1
  37. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c6.py +0 -1
  38. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c61.py +0 -5
  39. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h2.py +0 -1
  40. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h21.py +0 -1
  41. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h2beta1.py +0 -1
  42. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h2beta2.py +0 -1
  43. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32h4.py +0 -1
  44. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32p4.py +20 -4
  45. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32s2.py +0 -1
  46. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32s3.py +0 -1
  47. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32s3beta2.py +0 -1
  48. esptool-4.10.0/esptool/targets/stub_flasher/1/.DS_Store +0 -0
  49. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/1/README.md +1 -1
  50. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32.json +8 -0
  51. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c2.json +8 -0
  52. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c3.json +8 -0
  53. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c5.json +8 -0
  54. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c5beta3.json +8 -0
  55. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c6.json +8 -0
  56. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c61.json +8 -0
  57. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32c6beta.json +8 -0
  58. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32h2.json +8 -0
  59. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32h2beta1.json +8 -0
  60. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32h2beta2.json +8 -0
  61. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32p4.json +8 -0
  62. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32p4rc1.json +8 -0
  63. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32s2.json +8 -0
  64. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32s3.json +8 -0
  65. esptool-4.10.0/esptool/targets/stub_flasher/1/esp32s3beta2.json +8 -0
  66. esptool-4.10.0/esptool/test.py +21 -0
  67. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/util.py +21 -17
  68. {esptool-4.9.dev8 → esptool-4.10.0/esptool.egg-info}/PKG-INFO +1 -1
  69. {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/SOURCES.txt +4 -0
  70. {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/top_level.txt +2 -0
  71. {esptool-4.9.dev8 → esptool-4.10.0}/pyproject.toml +1 -1
  72. esptool-4.9.dev8/espefuse/efuse/esp32c5/operations.py +0 -466
  73. esptool-4.9.dev8/espefuse/efuse/esp32c61/operations.py +0 -466
  74. esptool-4.9.dev8/espefuse/efuse/esp32p4/operations.py +0 -466
  75. esptool-4.9.dev8/espefuse/efuse_defs/esp32c61.yaml +0 -95
  76. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32.json +0 -8
  77. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c2.json +0 -8
  78. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c3.json +0 -8
  79. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c5.json +0 -8
  80. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c5beta3.json +0 -8
  81. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c6.json +0 -8
  82. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c61.json +0 -8
  83. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32c6beta.json +0 -8
  84. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32h2.json +0 -8
  85. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32h2beta1.json +0 -8
  86. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32h2beta2.json +0 -8
  87. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32p4.json +0 -8
  88. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32s2.json +0 -8
  89. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32s3.json +0 -8
  90. esptool-4.9.dev8/esptool/targets/stub_flasher/1/esp32s3beta2.json +0 -8
  91. {esptool-4.9.dev8 → esptool-4.10.0}/LICENSE +0 -0
  92. {esptool-4.9.dev8 → esptool-4.10.0}/MANIFEST.in +0 -0
  93. {esptool-4.9.dev8 → esptool-4.10.0}/README.md +0 -0
  94. {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/__init__.py +0 -0
  95. {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/__main__.py +0 -0
  96. {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/esp_port_manager.py +0 -0
  97. {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server/redirector.py +0 -0
  98. {esptool-4.9.dev8 → esptool-4.10.0}/esp_rfc2217_server.py +0 -0
  99. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/__init__.py +0 -0
  100. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/__main__.py +0 -0
  101. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/__init__.py +0 -0
  102. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/csv_table_parser.py +0 -0
  103. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/__init__.py +0 -0
  104. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/emulate_efuse_controller.py +0 -0
  105. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/fields.py +0 -0
  106. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/mem_definition.py +0 -0
  107. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32/operations.py +0 -0
  108. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/__init__.py +0 -0
  109. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -0
  110. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/fields.py +0 -0
  111. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/mem_definition.py +0 -0
  112. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c2/operations.py +0 -0
  113. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/__init__.py +0 -0
  114. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +0 -0
  115. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c3/mem_definition.py +0 -0
  116. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/__init__.py +0 -0
  117. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +0 -0
  118. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5/mem_definition.py +0 -0
  119. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/__init__.py +0 -0
  120. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/emulate_efuse_controller.py +0 -0
  121. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/fields.py +0 -0
  122. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/mem_definition.py +0 -0
  123. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c5beta3/operations.py +0 -0
  124. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/__init__.py +0 -0
  125. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +0 -0
  126. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c6/mem_definition.py +0 -0
  127. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c61/__init__.py +0 -0
  128. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +0 -0
  129. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32c61/mem_definition.py +0 -0
  130. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/__init__.py +0 -0
  131. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +0 -0
  132. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2/mem_definition.py +0 -0
  133. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/__init__.py +0 -0
  134. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/emulate_efuse_controller.py +0 -0
  135. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/fields.py +0 -0
  136. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h21/mem_definition.py +0 -0
  137. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/__init__.py +0 -0
  138. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/emulate_efuse_controller.py +0 -0
  139. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/fields.py +0 -0
  140. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/mem_definition.py +0 -0
  141. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h2beta1/operations.py +0 -0
  142. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/__init__.py +0 -0
  143. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/emulate_efuse_controller.py +0 -0
  144. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32h4/mem_definition.py +0 -0
  145. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/__init__.py +0 -0
  146. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +0 -0
  147. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/__init__.py +0 -0
  148. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +0 -0
  149. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/fields.py +0 -0
  150. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s2/mem_definition.py +0 -0
  151. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/__init__.py +0 -0
  152. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +0 -0
  153. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3/mem_definition.py +0 -0
  154. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/__init__.py +0 -0
  155. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/emulate_efuse_controller.py +0 -0
  156. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/fields.py +0 -0
  157. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/mem_definition.py +0 -0
  158. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/esp32s3beta2/operations.py +0 -0
  159. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/mem_definition_base.py +0 -0
  160. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse/util.py +0 -0
  161. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32.yaml +0 -0
  162. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c2.yaml +0 -0
  163. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c3.yaml +0 -0
  164. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c5.yaml +0 -0
  165. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c5beta3.yaml +0 -0
  166. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32c6.yaml +0 -0
  167. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h2.yaml +0 -0
  168. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h21.yaml +0 -0
  169. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h2_v0.0_v1.1.yaml +0 -0
  170. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32h4.yaml +0 -0
  171. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32p4.yaml +0 -0
  172. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32s2.yaml +0 -0
  173. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse/efuse_defs/esp32s3.yaml +0 -0
  174. {esptool-4.9.dev8 → esptool-4.10.0}/espefuse.py +0 -0
  175. {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/__main__.py +0 -0
  176. {esptool-4.9.dev8 → esptool-4.10.0}/espsecure/esp_hsm_sign/__init__.py +0 -0
  177. {esptool-4.9.dev8 → esptool-4.10.0}/espsecure.py +0 -0
  178. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/__main__.py +0 -0
  179. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/config.py +0 -0
  180. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/reset.py +0 -0
  181. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/__init__.py +0 -0
  182. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp32c6beta.py +0 -0
  183. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/esp8266.py +0 -0
  184. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/1/esp8266.json +0 -0
  185. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
  186. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
  187. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/README.md +0 -0
  188. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32.json +0 -0
  189. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32c2.json +0 -0
  190. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32c3.json +0 -0
  191. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32c6.json +0 -0
  192. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32h2.json +0 -0
  193. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32s2.json +0 -0
  194. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/targets/stub_flasher/2/esp32s3.json +0 -0
  195. {esptool-4.9.dev8 → esptool-4.10.0}/esptool/uf2_writer.py +0 -0
  196. {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/dependency_links.txt +0 -0
  197. {esptool-4.9.dev8 → esptool-4.10.0}/esptool.egg-info/requires.txt +0 -0
  198. {esptool-4.9.dev8 → esptool-4.10.0}/esptool.py +0 -0
  199. {esptool-4.9.dev8 → esptool-4.10.0}/setup.cfg +0 -0
  200. {esptool-4.9.dev8 → esptool-4.10.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esptool
3
- Version: 4.9.dev8
3
+ Version: 4.10.0
4
4
  Summary: A serial utility to communicate & flash code to Espressif chips.
5
5
  Author: Fredrik Ahlberg (themadinventor), Angus Gratton (projectgus), Espressif Systems
6
6
  License: GPLv2+
@@ -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
- util.check_duplicate_name_in_list(block_name_list)
228
- if len(block_name_list) != len(datafile_list) or len(block_name_list) != len(
229
- keypurpose_list
230
- ):
231
- raise esptool.FatalError(
232
- "The number of blocks (%d), datafile (%d) and keypurpose (%d) "
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
- KEY_PURPOSES = [
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)