CMakeLists.txt 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. cmake_minimum_required(VERSION 3.5)
  2. if(NOT SDKCONFIG)
  3. message(FATAL_ERROR "Bootloader subproject expects the SDKCONFIG variable to be passed "
  4. "in by the parent build process.")
  5. endif()
  6. if(NOT IDF_PATH)
  7. message(FATAL_ERROR "Bootloader subproject expects the IDF_PATH variable to be passed "
  8. "in by the parent build process.")
  9. endif()
  10. if(NOT IDF_TARGET)
  11. message(FATAL_ERROR "Bootloader subproject expects the IDF_TARGET variable to be passed "
  12. "in by the parent build process.")
  13. endif()
  14. set(COMPONENTS
  15. bootloader
  16. esptool_py
  17. esp_hw_support
  18. hal
  19. partition_table
  20. soc
  21. bootloader_support
  22. log
  23. spi_flash
  24. micro-ecc
  25. main
  26. efuse)
  27. set(BOOTLOADER_BUILD 1)
  28. include("${IDF_PATH}/tools/cmake/project.cmake")
  29. set(common_req log esp_rom esp_common esp_hw_support hal)
  30. if(LEGACY_INCLUDE_COMMON_HEADERS)
  31. list(APPEND common_req soc hal)
  32. endif()
  33. idf_build_set_property(__COMPONENT_REQUIRES_COMMON "${common_req}")
  34. idf_build_set_property(__OUTPUT_SDKCONFIG 0)
  35. project(bootloader)
  36. idf_build_set_property(COMPILE_DEFINITIONS "-DBOOTLOADER_BUILD=1" APPEND)
  37. idf_build_set_property(COMPILE_OPTIONS "-fno-stack-protector" APPEND)
  38. idf_component_get_property(main_args esptool_py FLASH_ARGS)
  39. idf_component_get_property(sub_args esptool_py FLASH_SUB_ARGS)
  40. # String for printing flash command
  41. string(REPLACE ";" " " esptoolpy_write_flash
  42. "${ESPTOOLPY} --port=(PORT) --baud=(BAUD) ${main_args} "
  43. "write_flash ${sub_args}")
  44. string(REPLACE ";" " " espsecurepy "${ESPSECUREPY}")
  45. string(REPLACE ";" " " espefusepy "${ESPEFUSEPY}")
  46. if(CONFIG_SECURE_BOOTLOADER_REFLASHABLE)
  47. if(CONFIG_SECURE_BOOTLOADER_KEY_ENCODING_192BIT)
  48. set(key_digest_len 192)
  49. else()
  50. set(key_digest_len 256)
  51. endif()
  52. get_filename_component(bootloader_digest_bin
  53. "bootloader-reflash-digest.bin"
  54. ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}")
  55. get_filename_component(secure_bootloader_key
  56. "secure-bootloader-key-${key_digest_len}.bin"
  57. ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}")
  58. add_custom_command(OUTPUT "${secure_bootloader_key}"
  59. COMMAND ${ESPSECUREPY} digest_private_key
  60. --keylen "${key_digest_len}"
  61. --keyfile "${SECURE_BOOT_SIGNING_KEY}"
  62. "${secure_bootloader_key}"
  63. VERBATIM)
  64. if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES)
  65. add_custom_target(gen_secure_bootloader_key ALL DEPENDS "${secure_bootloader_key}")
  66. else()
  67. if(NOT EXISTS "${secure_bootloader_key}")
  68. message(FATAL_ERROR
  69. "No pre-generated key for a reflashable secure bootloader is available, "
  70. "due to signing configuration."
  71. "\nTo generate one, you can use this command:"
  72. "\n\t${espsecurepy} generate_flash_encryption_key ${secure_bootloader_key}"
  73. "\nIf a signing key is present, then instead use:"
  74. "\n\t${espsecurepy} digest_private_key "
  75. "--keylen (192/256) --keyfile KEYFILE "
  76. "${secure_bootloader_key}")
  77. endif()
  78. add_custom_target(gen_secure_bootloader_key)
  79. endif()
  80. add_custom_command(OUTPUT "${bootloader_digest_bin}"
  81. COMMAND ${CMAKE_COMMAND} -E echo "DIGEST ${bootloader_digest_bin}"
  82. COMMAND ${ESPSECUREPY} digest_secure_bootloader --keyfile "${secure_bootloader_key}"
  83. -o "${bootloader_digest_bin}" "${CMAKE_BINARY_DIR}/bootloader.bin"
  84. MAIN_DEPENDENCY "${CMAKE_BINARY_DIR}/.bin_timestamp"
  85. DEPENDS gen_secure_bootloader_key gen_project_binary
  86. VERBATIM)
  87. add_custom_target(gen_bootloader_digest_bin ALL DEPENDS "${bootloader_digest_bin}")
  88. endif()
  89. if(CONFIG_SECURE_BOOT_V2_ENABLED)
  90. if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES)
  91. get_filename_component(secure_boot_signing_key
  92. "${SECURE_BOOT_SIGNING_KEY}" ABSOLUTE BASE_DIR "${project_dir}")
  93. if(NOT EXISTS "${secure_boot_signing_key}")
  94. message(FATAL_ERROR
  95. "Secure Boot Signing Key Not found."
  96. "\nGenerate the Secure Boot V2 RSA-PSS 3072 Key."
  97. "\nTo generate one, you can use this command:"
  98. "\n\t${espsecurepy} generate_signing_key --version 2 ${SECURE_BOOT_SIGNING_KEY}")
  99. endif()
  100. set(bootloader_unsigned_bin "bootloader-unsigned.bin")
  101. add_custom_command(OUTPUT ".signed_bin_timestamp"
  102. COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/${PROJECT_BIN}"
  103. "${CMAKE_BINARY_DIR}/${bootloader_unsigned_bin}"
  104. COMMAND ${ESPSECUREPY} sign_data --version 2 --keyfile "${secure_boot_signing_key}"
  105. -o "${CMAKE_BINARY_DIR}/${PROJECT_BIN}" "${CMAKE_BINARY_DIR}/${bootloader_unsigned_bin}"
  106. COMMAND ${CMAKE_COMMAND} -E echo "Generated signed binary image ${build_dir}/${PROJECT_BIN}"
  107. "from ${CMAKE_BINARY_DIR}/${bootloader_unsigned_bin}"
  108. COMMAND ${CMAKE_COMMAND} -E md5sum "${CMAKE_BINARY_DIR}/${PROJECT_BIN}"
  109. > "${CMAKE_BINARY_DIR}/.signed_bin_timestamp"
  110. DEPENDS "${build_dir}/.bin_timestamp"
  111. VERBATIM
  112. COMMENT "Generated the signed Bootloader")
  113. else()
  114. add_custom_command(OUTPUT ".signed_bin_timestamp"
  115. VERBATIM
  116. COMMENT "Bootloader generated but not signed")
  117. endif()
  118. add_custom_target(gen_signed_bootloader ALL DEPENDS "${build_dir}/.signed_bin_timestamp")
  119. endif()
  120. if(CONFIG_SECURE_BOOTLOADER_ONE_TIME_FLASH)
  121. add_custom_command(TARGET bootloader.elf POST_BUILD
  122. COMMAND ${CMAKE_COMMAND} -E echo
  123. "=============================================================================="
  124. COMMAND ${CMAKE_COMMAND} -E echo
  125. "Bootloader built. Secure boot enabled, so bootloader not flashed automatically."
  126. COMMAND ${CMAKE_COMMAND} -E echo
  127. "One-time flash command is:"
  128. COMMAND ${CMAKE_COMMAND} -E echo
  129. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  130. COMMAND ${CMAKE_COMMAND} -E echo
  131. "* IMPORTANT: After first boot, BOOTLOADER CANNOT BE RE-FLASHED on same device"
  132. VERBATIM)
  133. elseif(CONFIG_SECURE_BOOTLOADER_REFLASHABLE)
  134. add_custom_command(TARGET bootloader.elf POST_BUILD
  135. COMMAND ${CMAKE_COMMAND} -E echo
  136. "=============================================================================="
  137. COMMAND ${CMAKE_COMMAND} -E echo
  138. "Bootloader built and secure digest generated."
  139. COMMAND ${CMAKE_COMMAND} -E echo
  140. "Secure boot enabled, so bootloader not flashed automatically."
  141. COMMAND ${CMAKE_COMMAND} -E echo
  142. "Burn secure boot key to efuse using:"
  143. COMMAND ${CMAKE_COMMAND} -E echo
  144. "\t${espefusepy} burn_key secure_boot_v1 ${secure_bootloader_key}"
  145. COMMAND ${CMAKE_COMMAND} -E echo
  146. "First time flash command is:"
  147. COMMAND ${CMAKE_COMMAND} -E echo
  148. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  149. COMMAND ${CMAKE_COMMAND} -E echo
  150. "=============================================================================="
  151. COMMAND ${CMAKE_COMMAND} -E echo
  152. "To reflash the bootloader after initial flash:"
  153. COMMAND ${CMAKE_COMMAND} -E echo
  154. "\t${esptoolpy_write_flash} 0x0 ${bootloader_digest_bin}"
  155. COMMAND ${CMAKE_COMMAND} -E echo
  156. "=============================================================================="
  157. COMMAND ${CMAKE_COMMAND} -E echo
  158. "* After first boot, only re-flashes of this kind (with same key) will be accepted."
  159. COMMAND ${CMAKE_COMMAND} -E echo
  160. "* Not recommended to re-use the same secure boot keyfile on multiple production devices."
  161. DEPENDS gen_secure_bootloader_key gen_bootloader_digest_bin
  162. VERBATIM)
  163. elseif(CONFIG_SECURE_BOOT_V2_ENABLED AND CONFIG_IDF_TARGET_ESP32S2)
  164. add_custom_command(TARGET bootloader.elf POST_BUILD
  165. COMMAND ${CMAKE_COMMAND} -E echo
  166. "=============================================================================="
  167. COMMAND ${CMAKE_COMMAND} -E echo
  168. "Bootloader built. Secure boot enabled, so bootloader not flashed automatically."
  169. COMMAND ${CMAKE_COMMAND} -E echo
  170. "To sign the bootloader with additional private keys."
  171. COMMAND ${CMAKE_COMMAND} -E echo
  172. "\t${espsecurepy} sign_data -k secure_boot_signing_key2.pem -v 2 \
  173. --append_signatures -o signed_bootloader.bin build/bootloader/bootloader.bin"
  174. COMMAND ${CMAKE_COMMAND} -E echo
  175. "Secure boot enabled, so bootloader not flashed automatically."
  176. COMMAND ${CMAKE_COMMAND} -E echo
  177. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  178. COMMAND ${CMAKE_COMMAND} -E echo
  179. "=============================================================================="
  180. DEPENDS gen_signed_bootloader
  181. VERBATIM)
  182. elseif(CONFIG_SECURE_BOOT_V2_ENABLED)
  183. add_custom_command(TARGET bootloader.elf POST_BUILD
  184. COMMAND ${CMAKE_COMMAND} -E echo
  185. "=============================================================================="
  186. COMMAND ${CMAKE_COMMAND} -E echo
  187. "Bootloader built. Secure boot enabled, so bootloader not flashed automatically."
  188. COMMAND ${CMAKE_COMMAND} -E echo
  189. "Secure boot enabled, so bootloader not flashed automatically."
  190. COMMAND ${CMAKE_COMMAND} -E echo
  191. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  192. COMMAND ${CMAKE_COMMAND} -E echo
  193. "=============================================================================="
  194. DEPENDS gen_signed_bootloader
  195. VERBATIM)
  196. endif()