secure_boot_secure_features.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <strings.h>
  7. #include "esp_flash_encrypt.h"
  8. #include "esp_secure_boot.h"
  9. #include "esp_efuse.h"
  10. #include "esp_efuse_table.h"
  11. #include "esp_log.h"
  12. #include "sdkconfig.h"
  13. static __attribute__((unused)) const char *TAG = "secure_boot";
  14. esp_err_t esp_secure_boot_enable_secure_features(void)
  15. {
  16. esp_efuse_write_field_bit(ESP_EFUSE_DIS_DIRECT_BOOT);
  17. #ifdef CONFIG_SECURE_ENABLE_SECURE_ROM_DL_MODE
  18. ESP_LOGI(TAG, "Enabling Security download mode...");
  19. esp_err_t err = esp_efuse_enable_rom_secure_download_mode();
  20. if (err != ESP_OK) {
  21. ESP_LOGE(TAG, "Could not enable Security download mode...");
  22. return err;
  23. }
  24. #elif CONFIG_SECURE_DISABLE_ROM_DL_MODE
  25. ESP_LOGI(TAG, "Disable ROM Download mode...");
  26. esp_err_t err = esp_efuse_disable_rom_download_mode();
  27. if (err != ESP_OK) {
  28. ESP_LOGE(TAG, "Could not disable ROM Download mode...");
  29. return err;
  30. }
  31. #else
  32. ESP_LOGW(TAG, "UART ROM Download mode kept enabled - SECURITY COMPROMISED");
  33. #endif
  34. #ifndef CONFIG_SECURE_BOOT_ALLOW_JTAG
  35. ESP_LOGI(TAG, "Disable hardware & software JTAG...");
  36. esp_efuse_write_field_bit(ESP_EFUSE_DIS_PAD_JTAG);
  37. esp_efuse_write_field_bit(ESP_EFUSE_DIS_USB_JTAG);
  38. esp_efuse_write_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count);
  39. #else
  40. ESP_LOGW(TAG, "Not disabling JTAG - SECURITY COMPROMISED");
  41. #endif
  42. #ifdef CONFIG_SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE
  43. esp_efuse_write_field_bit(ESP_EFUSE_SECURE_BOOT_AGGRESSIVE_REVOKE);
  44. #endif
  45. esp_efuse_write_field_bit(ESP_EFUSE_SECURE_BOOT_EN);
  46. #ifndef CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS
  47. bool rd_dis_now = true;
  48. #ifdef CONFIG_SECURE_FLASH_ENC_ENABLED
  49. /* If flash encryption is not enabled yet then don't read-disable efuses yet, do it later in the boot
  50. when Flash Encryption is being enabled */
  51. rd_dis_now = esp_flash_encryption_enabled();
  52. #endif
  53. if (rd_dis_now) {
  54. ESP_LOGI(TAG, "Prevent read disabling of additional efuses...");
  55. esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_RD_DIS);
  56. }
  57. #else
  58. ESP_LOGW(TAG, "Allowing read disabling of additional efuses - SECURITY COMPROMISED");
  59. #endif
  60. return ESP_OK;
  61. }