CMakeLists.txt 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 bootloader esptool_py partition_table soc bootloader_support log spi_flash micro-ecc main efuse)
  15. set(BOOTLOADER_BUILD 1)
  16. include("${IDF_PATH}/tools/cmake/project.cmake")
  17. set(common_req log esp_rom esp_common xtensa)
  18. if(LEGACY_INCLUDE_COMMON_HEADERS)
  19. list(APPEND common_req soc)
  20. endif()
  21. idf_build_set_property(__COMPONENT_REQUIRES_COMMON "${common_req}")
  22. idf_build_set_property(__OUTPUT_SDKCONFIG 0)
  23. project(bootloader)
  24. idf_build_set_property(COMPILE_DEFINITIONS "-DBOOTLOADER_BUILD=1" APPEND)
  25. idf_build_set_property(COMPILE_OPTIONS "-fno-stack-protector" APPEND)
  26. string(REPLACE ";" " " espsecurepy "${ESPSECUREPY}")
  27. string(REPLACE ";" " " espefusepy "${ESPEFUSEPY}")
  28. set(esptoolpy_write_flash "${ESPTOOLPY_WRITE_FLASH_STR}")
  29. if(CONFIG_SECURE_BOOTLOADER_REFLASHABLE)
  30. if(CONFIG_SECURE_BOOTLOADER_KEY_ENCODING_192BIT)
  31. set(key_digest_len 192)
  32. else()
  33. set(key_digest_len 256)
  34. endif()
  35. get_filename_component(bootloader_digest_bin
  36. "bootloader-reflash-digest.bin"
  37. ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}")
  38. get_filename_component(secure_bootloader_key
  39. "secure-bootloader-key-${key_digest_len}.bin"
  40. ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}")
  41. add_custom_command(OUTPUT "${secure_bootloader_key}"
  42. COMMAND ${ESPSECUREPY} digest_private_key
  43. --keylen "${key_digest_len}"
  44. --keyfile "${SECURE_BOOT_SIGNING_KEY}"
  45. "${secure_bootloader_key}"
  46. VERBATIM)
  47. if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES)
  48. add_custom_target(gen_secure_bootloader_key ALL DEPENDS "${secure_bootloader_key}")
  49. else()
  50. if(NOT EXISTS "${secure_bootloader_key}")
  51. message(FATAL_ERROR
  52. "No pre-generated key for a reflashable secure bootloader is available, "
  53. "due to signing configuration."
  54. "\nTo generate one, you can use this command:"
  55. "\n\t${espsecurepy} generate_flash_encryption_key ${secure_bootloader_key}"
  56. "\nIf a signing key is present, then instead use:"
  57. "\n\t${espsecurepy} digest_private_key "
  58. "--keylen (192/256) --keyfile KEYFILE "
  59. "${secure_bootloader_key}")
  60. endif()
  61. add_custom_target(gen_secure_bootloader_key)
  62. endif()
  63. add_custom_command(OUTPUT "${bootloader_digest_bin}"
  64. COMMAND ${CMAKE_COMMAND} -E echo "DIGEST ${bootloader_digest_bin}"
  65. COMMAND ${ESPSECUREPY} digest_secure_bootloader --keyfile "${secure_bootloader_key}"
  66. -o "${bootloader_digest_bin}" "${CMAKE_BINARY_DIR}/bootloader.bin"
  67. MAIN_DEPENDENCY "${CMAKE_BINARY_DIR}/.bin_timestamp"
  68. DEPENDS gen_secure_bootloader_key gen_project_binary
  69. VERBATIM)
  70. add_custom_target (gen_bootloader_digest_bin ALL DEPENDS "${bootloader_digest_bin}")
  71. endif()
  72. if(CONFIG_SECURE_BOOT_V2_ENABLED)
  73. if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES)
  74. get_filename_component(secure_boot_signing_key
  75. "${SECURE_BOOT_SIGNING_KEY}" ABSOLUTE BASE_DIR "${project_dir}")
  76. if(NOT EXISTS "${secure_boot_signing_key}")
  77. message(FATAL_ERROR
  78. "Secure Boot Signing Key Not found."
  79. "\nGenerate the Secure Boot V2 RSA-PSS 3072 Key."
  80. "\nTo generate one, you can use this command:"
  81. "\n\t${espsecurepy} generate_signing_key --version 2 ${SECURE_BOOT_SIGNING_KEY}")
  82. endif()
  83. set(bootloader_unsigned_bin "bootloader-unsigned.bin")
  84. add_custom_command(OUTPUT ".signed_bin_timestamp"
  85. COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/${PROJECT_BIN}" "${CMAKE_BINARY_DIR}/${bootloader_unsigned_bin}"
  86. COMMAND ${ESPSECUREPY} sign_data --version 2 --keyfile "${secure_boot_signing_key}"
  87. -o "${CMAKE_BINARY_DIR}/${PROJECT_BIN}" "${CMAKE_BINARY_DIR}/${bootloader_unsigned_bin}"
  88. COMMAND ${CMAKE_COMMAND} -E echo "Generated signed binary image ${build_dir}/${PROJECT_BIN}"
  89. "from ${CMAKE_BINARY_DIR}/${bootloader_unsigned_bin}"
  90. COMMAND ${CMAKE_COMMAND} -E md5sum "${CMAKE_BINARY_DIR}/${PROJECT_BIN}" > "${CMAKE_BINARY_DIR}/.signed_bin_timestamp"
  91. DEPENDS "${build_dir}/.bin_timestamp"
  92. VERBATIM
  93. COMMENT "Generated the signed Bootloader")
  94. else()
  95. add_custom_command(OUTPUT ".signed_bin_timestamp"
  96. VERBATIM
  97. COMMENT "Bootloader generated but not signed")
  98. endif()
  99. add_custom_target (gen_signed_bootloader ALL DEPENDS "${build_dir}/.signed_bin_timestamp")
  100. endif()
  101. if(CONFIG_SECURE_BOOTLOADER_ONE_TIME_FLASH)
  102. add_custom_command(TARGET bootloader.elf POST_BUILD
  103. COMMAND ${CMAKE_COMMAND} -E echo
  104. "=============================================================================="
  105. COMMAND ${CMAKE_COMMAND} -E echo
  106. "Bootloader built. Secure boot enabled, so bootloader not flashed automatically."
  107. COMMAND ${CMAKE_COMMAND} -E echo
  108. "One-time flash command is:"
  109. COMMAND ${CMAKE_COMMAND} -E echo
  110. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  111. COMMAND ${CMAKE_COMMAND} -E echo
  112. "* IMPORTANT: After first boot, BOOTLOADER CANNOT BE RE-FLASHED on same device"
  113. VERBATIM)
  114. elseif(CONFIG_SECURE_BOOTLOADER_REFLASHABLE)
  115. add_custom_command(TARGET bootloader.elf POST_BUILD
  116. COMMAND ${CMAKE_COMMAND} -E echo
  117. "=============================================================================="
  118. COMMAND ${CMAKE_COMMAND} -E echo
  119. "Bootloader built and secure digest generated."
  120. COMMAND ${CMAKE_COMMAND} -E echo
  121. "Secure boot enabled, so bootloader not flashed automatically."
  122. COMMAND ${CMAKE_COMMAND} -E echo
  123. "Burn secure boot key to efuse using:"
  124. COMMAND ${CMAKE_COMMAND} -E echo
  125. "\t${espefusepy} burn_key secure_boot ${secure_bootloader_key}"
  126. COMMAND ${CMAKE_COMMAND} -E echo
  127. "First 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. "=============================================================================="
  132. COMMAND ${CMAKE_COMMAND} -E echo
  133. "To reflash the bootloader after initial flash:"
  134. COMMAND ${CMAKE_COMMAND} -E echo
  135. "\t${esptoolpy_write_flash} 0x0 ${bootloader_digest_bin}"
  136. COMMAND ${CMAKE_COMMAND} -E echo
  137. "=============================================================================="
  138. COMMAND ${CMAKE_COMMAND} -E echo
  139. "* After first boot, only re-flashes of this kind (with same key) will be accepted."
  140. COMMAND ${CMAKE_COMMAND} -E echo
  141. "* Not recommended to re-use the same secure boot keyfile on multiple production devices."
  142. DEPENDS gen_secure_bootloader_key gen_bootloader_digest_bin
  143. VERBATIM)
  144. elseif(CONFIG_SECURE_BOOT_V2_ENABLED)
  145. add_custom_command(TARGET bootloader.elf POST_BUILD
  146. COMMAND ${CMAKE_COMMAND} -E echo
  147. "=============================================================================="
  148. COMMAND ${CMAKE_COMMAND} -E echo
  149. "Bootloader built. Secure boot enabled, so bootloader not flashed automatically."
  150. COMMAND ${CMAKE_COMMAND} -E echo
  151. "Secure boot enabled, so bootloader not flashed automatically."
  152. COMMAND ${CMAKE_COMMAND} -E echo
  153. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  154. COMMAND ${CMAKE_COMMAND} -E echo
  155. "=============================================================================="
  156. DEPENDS gen_signed_bootloader
  157. VERBATIM)
  158. endif()