blob: 237eca785e1f4c6f41ad7482931a1c8e1a3ac8e4 [file] [log] [blame]
Almir Okato14763b12021-11-25 00:45:26 -03001/*
2 * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#include <strings.h>
8#include "bootloader_flash_priv.h"
9#include "bootloader_random.h"
10#include "esp_image_format.h"
11#include "esp_flash_encrypt.h"
12#include "esp_flash_partitions.h"
13#include "esp_secure_boot.h"
14#include "esp_efuse.h"
15#include "esp_efuse_table.h"
16#include "esp_log.h"
17#include "hal/wdt_hal.h"
Almir Okatob365e232022-03-08 01:35:54 -030018#include "soc/soc_caps.h"
Almir Okato14763b12021-11-25 00:45:26 -030019
20#include "esp_mcuboot_image.h"
21
22#if CONFIG_IDF_TARGET_ESP32
23#define CRYPT_CNT ESP_EFUSE_FLASH_CRYPT_CNT
24#define WR_DIS_CRYPT_CNT ESP_EFUSE_WR_DIS_FLASH_CRYPT_CNT
25#else
26#define CRYPT_CNT ESP_EFUSE_SPI_BOOT_CRYPT_CNT
27#define WR_DIS_CRYPT_CNT ESP_EFUSE_WR_DIS_SPI_BOOT_CRYPT_CNT
28#endif
29
30/* This file implements FLASH ENCRYPTION related APIs to perform
31 * various operations such as programming necessary flash encryption
32 * eFuses, detect whether flash encryption is enabled (by reading eFuse)
33 * and if required encrypt the partitions in flash memory
34 */
35
36static const char *TAG = "flash_encrypt";
37
38/* Static functions for stages of flash encryption */
39static esp_err_t initialise_flash_encryption(void);
40static esp_err_t encrypt_flash_contents(uint32_t flash_crypt_cnt, bool flash_crypt_wr_dis) __attribute__((unused));
41static esp_err_t encrypt_bootloader(void);
42static esp_err_t encrypt_primary_slot(void);
43
44esp_err_t esp_flash_encrypt_check_and_update(void)
45{
46 size_t flash_crypt_cnt = 0;
47 esp_efuse_read_field_cnt(CRYPT_CNT, &flash_crypt_cnt);
48 bool flash_crypt_wr_dis = esp_efuse_read_field_bit(WR_DIS_CRYPT_CNT);
49
50 ESP_LOGV(TAG, "CRYPT_CNT %d, write protection %d", flash_crypt_cnt, flash_crypt_wr_dis);
51
52 if (flash_crypt_cnt % 2 == 1) {
53 /* Flash is already encrypted */
54 int left = (CRYPT_CNT[0]->bit_count - flash_crypt_cnt) / 2;
55 if (flash_crypt_wr_dis) {
56 left = 0; /* can't update FLASH_CRYPT_CNT, no more flashes */
57 }
58 ESP_LOGI(TAG, "flash encryption is enabled (%d plaintext flashes left)", left);
59 return ESP_OK;
60 } else {
61#ifndef CONFIG_SECURE_FLASH_REQUIRE_ALREADY_ENABLED
62 /* Flash is not encrypted, so encrypt it! */
63 return encrypt_flash_contents(flash_crypt_cnt, flash_crypt_wr_dis);
64#else
65 ESP_LOGE(TAG, "flash encryption is not enabled, and SECURE_FLASH_REQUIRE_ALREADY_ENABLED "
66 "is set, refusing to boot.");
67 return ESP_ERR_INVALID_STATE;
68#endif // CONFIG_SECURE_FLASH_REQUIRE_ALREADY_ENABLED
69 }
70}
71
72static esp_err_t check_and_generate_encryption_keys(void)
73{
74 size_t key_size = 32;
75#ifdef CONFIG_IDF_TARGET_ESP32
76 enum { BLOCKS_NEEDED = 1 };
77 esp_efuse_purpose_t purposes[BLOCKS_NEEDED] = {
78 ESP_EFUSE_KEY_PURPOSE_FLASH_ENCRYPTION,
79 };
80 esp_efuse_coding_scheme_t coding_scheme = esp_efuse_get_coding_scheme(EFUSE_BLK_ENCRYPT_FLASH);
81 if (coding_scheme != EFUSE_CODING_SCHEME_NONE && coding_scheme != EFUSE_CODING_SCHEME_3_4) {
82 ESP_LOGE(TAG, "Unknown/unsupported CODING_SCHEME value 0x%x", coding_scheme);
83 return ESP_ERR_NOT_SUPPORTED;
84 }
85 if (coding_scheme == EFUSE_CODING_SCHEME_3_4) {
86 key_size = 24;
87 }
88#else
89#ifdef CONFIG_SECURE_FLASH_ENCRYPTION_AES256
90 enum { BLOCKS_NEEDED = 2 };
91 esp_efuse_purpose_t purposes[BLOCKS_NEEDED] = {
92 ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_1,
93 ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_2,
94 };
95 if (esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY, NULL)) {
96 ESP_LOGE(TAG, "XTS_AES_128_KEY is already in use, XTS_AES_256_KEY_1/2 can not be used");
97 return ESP_ERR_INVALID_STATE;
98 }
99#else
100 enum { BLOCKS_NEEDED = 1 };
101 esp_efuse_purpose_t purposes[BLOCKS_NEEDED] = {
102 ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY,
103 };
104#endif // CONFIG_SECURE_FLASH_ENCRYPTION_AES256
105#endif // CONFIG_IDF_TARGET_ESP32
106
107 /* Initialize all efuse block entries to invalid (max) value */
108 esp_efuse_block_t blocks[BLOCKS_NEEDED] = {[0 ... BLOCKS_NEEDED-1] = EFUSE_BLK_KEY_MAX};
109 bool has_key = true;
110 for (unsigned i = 0; i < BLOCKS_NEEDED; i++) {
111 bool tmp_has_key = esp_efuse_find_purpose(purposes[i], &blocks[i]);
112 if (tmp_has_key) { // For ESP32: esp_efuse_find_purpose() always returns True, need to check whether the key block is used or not.
113 tmp_has_key &= !esp_efuse_key_block_unused(blocks[i]);
114 }
115 if (i == 1 && tmp_has_key != has_key) {
116 ESP_LOGE(TAG, "Invalid efuse key blocks: Both AES-256 key blocks must be set.");
117 return ESP_ERR_INVALID_STATE;
118 }
119 has_key &= tmp_has_key;
120 }
121
122 if (!has_key) {
123 /* Generate key */
124 uint8_t keys[BLOCKS_NEEDED][32] = { 0 };
125 ESP_LOGI(TAG, "Generating new flash encryption key...");
126 for (unsigned i = 0; i < BLOCKS_NEEDED; ++i) {
127 bootloader_fill_random(keys[i], key_size);
128 }
129 ESP_LOGD(TAG, "Key generation complete");
130
131 esp_err_t err = esp_efuse_write_keys(purposes, keys, BLOCKS_NEEDED);
132 if (err != ESP_OK) {
133 if (err == ESP_ERR_NOT_ENOUGH_UNUSED_KEY_BLOCKS) {
134 ESP_LOGE(TAG, "Not enough free efuse key blocks (need %d) to continue", BLOCKS_NEEDED);
135 } else {
136 ESP_LOGE(TAG, "Failed to write efuse block with purpose (err=0x%x). Can't continue.", err);
137 }
138 return err;
139 }
140 } else {
141 for (unsigned i = 0; i < BLOCKS_NEEDED; i++) {
142 if (!esp_efuse_get_key_dis_write(blocks[i])
143 || !esp_efuse_get_key_dis_read(blocks[i])
144 || !esp_efuse_get_keypurpose_dis_write(blocks[i])) { // For ESP32: no keypurpose, it returns always True.
145 ESP_LOGE(TAG, "Invalid key state, check read&write protection for key and keypurpose(if exists)");
146 return ESP_ERR_INVALID_STATE;
147 }
148 }
149 ESP_LOGI(TAG, "Using pre-loaded flash encryption key in efuse");
150 }
151 return ESP_OK;
152}
153
154static esp_err_t initialise_flash_encryption(void)
155{
156 esp_efuse_batch_write_begin(); /* Batch all efuse writes at the end of this function */
157
158 /* Before first flash encryption pass, need to initialise key & crypto config */
159 esp_err_t err = check_and_generate_encryption_keys();
160 if (err != ESP_OK) {
161 esp_efuse_batch_write_cancel();
162 return err;
163 }
164
165 err = esp_flash_encryption_enable_secure_features();
166 if (err != ESP_OK) {
167 esp_efuse_batch_write_cancel();
168 return err;
169 }
170
Almir Okatob365e232022-03-08 01:35:54 -0300171#if defined(SOC_SUPPORTS_SECURE_DL_MODE) && defined(CONFIG_SECURE_ENABLE_SECURE_ROM_DL_MODE)
172 ESP_LOGI(TAG, "Enabling Secure Download mode...");
173 err = esp_efuse_enable_rom_secure_download_mode();
174 if (err != ESP_OK) {
175 ESP_LOGE(TAG, "Could not enable Secure Download mode...");
176 esp_efuse_batch_write_cancel();
177 return err;
178 }
179#elif CONFIG_SECURE_DISABLE_ROM_DL_MODE
180 ESP_LOGI(TAG, "Disable ROM Download mode...");
181 err = esp_efuse_disable_rom_download_mode();
182 if (err != ESP_OK) {
183 ESP_LOGE(TAG, "Could not disable ROM Download mode...");
184 esp_efuse_batch_write_cancel();
185 return err;
186 }
187#else
188 ESP_LOGW(TAG, "UART ROM Download mode kept enabled - SECURITY COMPROMISED");
189#endif
190
Almir Okato14763b12021-11-25 00:45:26 -0300191 err = esp_efuse_batch_write_commit();
192 if (err != ESP_OK) {
193 ESP_LOGE(TAG, "Error programming security eFuses (err=0x%x).", err);
194 return err;
195 }
196
197 return ESP_OK;
198}
199
200/* Encrypt all flash data that should be encrypted */
201static esp_err_t encrypt_flash_contents(uint32_t flash_crypt_cnt, bool flash_crypt_wr_dis)
202{
203 esp_err_t err;
204
205 /* If all flash_crypt_cnt bits are burned or write-disabled, the
206 device can't re-encrypt itself. */
207 if (flash_crypt_wr_dis || flash_crypt_cnt == CRYPT_CNT[0]->bit_count) {
208 ESP_LOGE(TAG, "Cannot re-encrypt data CRYPT_CNT %d write disabled %d", flash_crypt_cnt, flash_crypt_wr_dis);
209 return ESP_FAIL;
210 }
211
212 if (flash_crypt_cnt == 0) {
213 /* Very first flash of encrypted data: generate keys, etc. */
214 err = initialise_flash_encryption();
215 if (err != ESP_OK) {
216 return err;
217 }
218 }
219
220 err = encrypt_bootloader();
221 if (err != ESP_OK) {
222 return err;
223 }
224
225 /* If the primary slot executable application is not encrypted,
226 * then encrypt it
227 */
228 err = encrypt_primary_slot();
229 if (err != ESP_OK) {
230 return err;
231 }
232
233 /* Unconditionally encrypts remaining regions
234 * This will need changes when implementing multi-slot support
235 */
236 ESP_LOGI(TAG, "Encrypting remaining flash...");
237 uint32_t region_addr = CONFIG_ESP_APPLICATION_SECONDARY_START_ADDRESS;
238 size_t region_size = CONFIG_ESP_APPLICATION_SIZE;
239 err = esp_flash_encrypt_region(region_addr, region_size);
240 if (err != ESP_OK) {
241 return err;
242 }
243 region_addr = CONFIG_ESP_SCRATCH_OFFSET;
244 region_size = CONFIG_ESP_SCRATCH_SIZE;
245 err = esp_flash_encrypt_region(region_addr, region_size);
246 if (err != ESP_OK) {
247 return err;
248 }
249
250#ifdef CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE
251 // Go straight to max, permanently enabled
252 ESP_LOGI(TAG, "Setting CRYPT_CNT for permanent encryption");
253 size_t new_flash_crypt_cnt = CRYPT_CNT[0]->bit_count - flash_crypt_cnt;
254#else
255 /* Set least significant 0-bit in flash_crypt_cnt */
256 size_t new_flash_crypt_cnt = 1;
257#endif
258 ESP_LOGD(TAG, "CRYPT_CNT %d -> %d", flash_crypt_cnt, new_flash_crypt_cnt);
259 err = esp_efuse_write_field_cnt(CRYPT_CNT, new_flash_crypt_cnt);
260
261 ESP_LOGI(TAG, "Flash encryption completed");
262
263 return ESP_OK;
264}
265
266static esp_err_t encrypt_bootloader(void)
267{
268 esp_err_t err;
269 uint32_t image_length;
270 /* Check for plaintext bootloader (verification will fail if it's already encrypted) */
271 if (esp_image_verify_bootloader(&image_length) == ESP_OK) {
272 ESP_LOGI(TAG, "Encrypting bootloader...");
273
274 err = esp_flash_encrypt_region(ESP_BOOTLOADER_OFFSET, CONFIG_ESP_BOOTLOADER_SIZE);
275 if (err != ESP_OK) {
276 ESP_LOGE(TAG, "Failed to encrypt bootloader in place: 0x%x", err);
277 return err;
278 }
279 ESP_LOGI(TAG, "Bootloader encrypted successfully");
280 } else {
281 ESP_LOGW(TAG, "No valid bootloader was found");
282 return ESP_ERR_NOT_FOUND;
283 }
284
285 return ESP_OK;
286}
287
288static esp_err_t verify_img_header(uint32_t addr, const esp_image_load_header_t *image, bool silent)
289{
290 esp_err_t err = ESP_OK;
291
292 if (image->header_magic != ESP_LOAD_HEADER_MAGIC) {
293 if (!silent) {
294 ESP_LOGE(TAG, "image at 0x%x has invalid magic byte",
295 addr);
296 }
297 err = ESP_ERR_IMAGE_INVALID;
298 }
299
300 return err;
301}
302
303static esp_err_t encrypt_primary_slot(void)
304{
305 esp_err_t err;
306
307 esp_image_load_header_t img_header;
308
309 /* Check if the slot is plaintext or encrypted, 0x20 offset is for skipping
310 * MCUboot header
311 */
312 err = bootloader_flash_read(CONFIG_ESP_APPLICATION_PRIMARY_START_ADDRESS + 0x20,
313 &img_header, sizeof(esp_image_load_header_t), true);
314 if (err != ESP_OK) {
315 ESP_LOGE(TAG, "Failed to read slot img header");
316 return err;
317 } else {
318 err = verify_img_header(CONFIG_ESP_APPLICATION_PRIMARY_START_ADDRESS,
319 &img_header, true);
320 }
321
322 if (err == ESP_OK) {
323 ESP_LOGI(TAG, "Encrypting primary slot...");
324
325 err = esp_flash_encrypt_region(CONFIG_ESP_APPLICATION_PRIMARY_START_ADDRESS,
326 CONFIG_ESP_APPLICATION_SIZE);
327 if (err != ESP_OK) {
328 ESP_LOGE(TAG, "Failed to encrypt slot in place: 0x%x", err);
329 return err;
330 }
331 } else {
332 ESP_LOGW(TAG, "Slot already encrypted or no valid image was found");
333 }
334
335 return ESP_OK;
336}
337
338esp_err_t esp_flash_encrypt_region(uint32_t src_addr, size_t data_length)
339{
340 esp_err_t err;
341 uint32_t buf[FLASH_SECTOR_SIZE / sizeof(uint32_t)];
342
343 if (src_addr % FLASH_SECTOR_SIZE != 0) {
344 ESP_LOGE(TAG, "esp_flash_encrypt_region bad src_addr 0x%x", src_addr);
345 return ESP_FAIL;
346 }
347
348 wdt_hal_context_t rtc_wdt_ctx = {.inst = WDT_RWDT, .rwdt_dev = &RTCCNTL};
349 for (size_t i = 0; i < data_length; i += FLASH_SECTOR_SIZE) {
350 wdt_hal_write_protect_disable(&rtc_wdt_ctx);
351 wdt_hal_feed(&rtc_wdt_ctx);
352 wdt_hal_write_protect_enable(&rtc_wdt_ctx);
353 uint32_t sec_start = i + src_addr;
354 err = bootloader_flash_read(sec_start, buf, FLASH_SECTOR_SIZE, true);
355 if (err != ESP_OK) {
356 goto flash_failed;
357 }
358 err = bootloader_flash_erase_sector(sec_start / FLASH_SECTOR_SIZE);
359 if (err != ESP_OK) {
360 goto flash_failed;
361 }
362 err = bootloader_flash_write(sec_start, buf, FLASH_SECTOR_SIZE, true);
363 if (err != ESP_OK) {
364 goto flash_failed;
365 }
366 }
367 return ESP_OK;
368
369flash_failed:
370 ESP_LOGE(TAG, "flash operation failed: 0x%x", err);
371 return err;
372}