CMakeLists.txt 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. idf_build_get_property(target IDF_TARGET)
  2. if(${target} STREQUAL "linux")
  3. return() # This component is not supported by the POSIX/Linux simulator
  4. endif()
  5. set(srcs
  6. "src/bootloader_common.c"
  7. "src/bootloader_common_loader.c"
  8. "src/bootloader_clock_init.c"
  9. "src/bootloader_mem.c"
  10. "src/bootloader_random.c"
  11. "src/bootloader_efuse.c"
  12. "src/flash_encrypt.c"
  13. "src/secure_boot.c"
  14. )
  15. if(NOT CONFIG_IDF_ENV_FPGA)
  16. # For FPGA ENV, bootloader_random implementation is implemented in `bootloader_random.c`
  17. list(APPEND srcs "src/bootloader_random_${IDF_TARGET}.c")
  18. endif()
  19. if(NOT CONFIG_APP_BUILD_TYPE_PURE_RAM_APP)
  20. list(APPEND srcs
  21. "bootloader_flash/src/bootloader_flash.c"
  22. "bootloader_flash/src/flash_qio_mode.c"
  23. "bootloader_flash/src/bootloader_flash_config_${IDF_TARGET}.c"
  24. )
  25. endif()
  26. if(CONFIG_APP_BUILD_TYPE_APP_2NDBOOT)
  27. list(APPEND srcs
  28. "src/bootloader_utility.c"
  29. "src/flash_partitions.c"
  30. "src/esp_image_format.c"
  31. )
  32. endif()
  33. if(BOOTLOADER_BUILD OR CONFIG_APP_BUILD_TYPE_RAM)
  34. set(include_dirs "include" "bootloader_flash/include"
  35. "private_include")
  36. set(priv_requires micro-ecc spi_flash efuse esp_bootloader_format esp_app_format)
  37. list(APPEND srcs
  38. "src/bootloader_init.c"
  39. "src/bootloader_clock_loader.c"
  40. "src/bootloader_console.c"
  41. "src/bootloader_console_loader.c"
  42. "src/${IDF_TARGET}/bootloader_sha.c"
  43. "src/${IDF_TARGET}/bootloader_soc.c"
  44. "src/${IDF_TARGET}/bootloader_${IDF_TARGET}.c"
  45. )
  46. list(APPEND priv_requires hal)
  47. if(CONFIG_ESP_ROM_REV0_HAS_NO_ECDSA_INTERFACE)
  48. list(APPEND srcs
  49. "src/${IDF_TARGET}/bootloader_ecdsa.c")
  50. endif()
  51. else()
  52. list(APPEND srcs
  53. "src/idf/bootloader_sha.c")
  54. set(include_dirs "include" "bootloader_flash/include")
  55. set(priv_include_dirs "private_include")
  56. # heap is required for `heap_memory_layout.h` header
  57. set(priv_requires spi_flash mbedtls efuse heap esp_bootloader_format esp_app_format)
  58. endif()
  59. if(BOOTLOADER_BUILD)
  60. list(APPEND srcs "src/bootloader_panic.c")
  61. if(CONFIG_SECURE_FLASH_ENC_ENABLED)
  62. list(APPEND srcs "src/flash_encryption/flash_encrypt.c"
  63. "src/${IDF_TARGET}/flash_encryption_secure_features.c")
  64. endif()
  65. if(CONFIG_SECURE_SIGNED_ON_BOOT)
  66. if(CONFIG_SECURE_SIGNED_APPS_ECDSA_SCHEME)
  67. list(APPEND srcs "src/secure_boot_v1/secure_boot_signatures_bootloader.c")
  68. endif()
  69. if(CONFIG_SECURE_BOOT_V1_ENABLED)
  70. list(APPEND srcs "src/secure_boot_v1/secure_boot.c"
  71. "src/${IDF_TARGET}/secure_boot_secure_features.c")
  72. endif()
  73. if(CONFIG_SECURE_BOOT_V2_ENABLED)
  74. list(APPEND srcs "src/secure_boot_v2/secure_boot_signatures_bootloader.c"
  75. "src/secure_boot_v2/secure_boot.c"
  76. "src/${IDF_TARGET}/secure_boot_secure_features.c")
  77. endif()
  78. endif()
  79. else()
  80. if(CONFIG_SECURE_SIGNED_ON_UPDATE)
  81. if(CONFIG_SECURE_SIGNED_APPS_ECDSA_SCHEME)
  82. list(APPEND srcs "src/secure_boot_v1/secure_boot_signatures_app.c")
  83. endif()
  84. if(CONFIG_SECURE_SIGNED_APPS_RSA_SCHEME)
  85. list(APPEND srcs "src/secure_boot_v2/secure_boot_signatures_app.c")
  86. list(APPEND srcs "src/secure_boot_v2/secure_boot_rsa_signature.c")
  87. endif()
  88. if(CONFIG_SECURE_SIGNED_APPS_ECDSA_V2_SCHEME)
  89. list(APPEND srcs "src/secure_boot_v2/secure_boot_signatures_app.c")
  90. list(APPEND srcs "src/secure_boot_v2/secure_boot_ecdsa_signature.c")
  91. endif()
  92. endif()
  93. endif()
  94. set(requires soc) #unfortunately the header directly uses SOC registers
  95. idf_component_register(SRCS "${srcs}"
  96. INCLUDE_DIRS "${include_dirs}"
  97. PRIV_INCLUDE_DIRS "${priv_include_dirs}"
  98. REQUIRES "${requires}"
  99. PRIV_REQUIRES "${priv_requires}")
  100. if(NOT BOOTLOADER_BUILD)
  101. if(CONFIG_SECURE_SIGNED_ON_UPDATE)
  102. if(CONFIG_SECURE_SIGNED_APPS_ECDSA_SCHEME OR CONFIG_SECURE_SIGNED_APPS_RSA_SCHEME OR
  103. CONFIG_SECURE_SIGNED_APPS_ECDSA_V2_SCHEME)
  104. target_link_libraries(${COMPONENT_LIB} PRIVATE idf::app_update)
  105. endif()
  106. endif()
  107. endif()
  108. if(CONFIG_SECURE_SIGNED_APPS AND (CONFIG_SECURE_BOOT_V1_ENABLED OR CONFIG_SECURE_SIGNED_APPS_ECDSA_SCHEME))
  109. if(BOOTLOADER_BUILD)
  110. # Whether CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES or not, we need verification key to embed
  111. # in the library.
  112. if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES)
  113. # We generate the key from the signing key. The signing key is passed from the main project.
  114. get_filename_component(secure_boot_signing_key
  115. "${SECURE_BOOT_SIGNING_KEY}"
  116. ABSOLUTE BASE_DIR "${project_dir}")
  117. get_filename_component(secure_boot_verification_key
  118. "signature_verification_key.bin"
  119. ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  120. add_custom_command(OUTPUT "${secure_boot_verification_key}"
  121. COMMAND ${ESPSECUREPY}
  122. extract_public_key --keyfile "${secure_boot_signing_key}"
  123. "${secure_boot_verification_key}"
  124. DEPENDS ${secure_boot_signing_key}
  125. VERBATIM)
  126. else()
  127. # We expect to 'inherit' the verification key passed from main project.
  128. get_filename_component(secure_boot_verification_key
  129. ${SECURE_BOOT_VERIFICATION_KEY}
  130. ABSOLUTE BASE_DIR "${project_dir}")
  131. endif()
  132. else() # normal app build
  133. idf_build_get_property(project_dir PROJECT_DIR)
  134. if(CONFIG_SECURE_BOOT_VERIFICATION_KEY)
  135. # verification-only build supplies verification key
  136. set(secure_boot_verification_key ${CONFIG_SECURE_BOOT_VERIFICATION_KEY})
  137. get_filename_component(secure_boot_verification_key
  138. ${secure_boot_verification_key}
  139. ABSOLUTE BASE_DIR "${project_dir}")
  140. else()
  141. # sign at build time, extracts key from signing key
  142. set(secure_boot_verification_key "${CMAKE_BINARY_DIR}/signature_verification_key.bin")
  143. get_filename_component(secure_boot_signing_key
  144. ${CONFIG_SECURE_BOOT_SIGNING_KEY}
  145. ABSOLUTE BASE_DIR "${project_dir}")
  146. add_custom_command(OUTPUT "${secure_boot_verification_key}"
  147. COMMAND ${ESPSECUREPY}
  148. extract_public_key --keyfile "${secure_boot_signing_key}"
  149. "${secure_boot_verification_key}"
  150. WORKING_DIRECTORY ${project_dir}
  151. DEPENDS ${secure_boot_signing_key}
  152. VERBATIM)
  153. endif()
  154. endif()
  155. # Embed the verification key in the binary (app & bootloader)
  156. #
  157. target_add_binary_data(${COMPONENT_LIB} "${secure_boot_verification_key}" "BINARY"
  158. RENAME_TO signature_verification_key_bin)
  159. set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  160. APPEND PROPERTY ADDITIONAL_CLEAN_FILES
  161. "${secure_boot_verification_key}")
  162. endif()
  163. if(BOOTLOADER_BUILD)
  164. target_link_libraries(${COMPONENT_LIB} INTERFACE "-u abort")
  165. # esp_bootloader_desc structure is added as an undefined symbol because otherwise the
  166. # linker will ignore this structure as it has no other files depending on it.
  167. target_link_libraries(${COMPONENT_LIB} INTERFACE "-u esp_bootloader_desc")
  168. endif()