1 /*
2 * SPDX-FileCopyrightText: 2015-2022 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"
18 #include "hal/efuse_hal.h"
19 #include "soc/soc_caps.h"
20 #ifdef CONFIG_SOC_EFUSE_CONSISTS_OF_ONE_KEY_BLOCK
21 #include "soc/sensitive_reg.h"
22 #endif
23
24 #include "esp_mcuboot_image.h"
25
26 #if CONFIG_IDF_TARGET_ESP32
27 #define CRYPT_CNT ESP_EFUSE_FLASH_CRYPT_CNT
28 #define WR_DIS_CRYPT_CNT ESP_EFUSE_WR_DIS_FLASH_CRYPT_CNT
29 #else
30 #define CRYPT_CNT ESP_EFUSE_SPI_BOOT_CRYPT_CNT
31 #define WR_DIS_CRYPT_CNT ESP_EFUSE_WR_DIS_SPI_BOOT_CRYPT_CNT
32 #endif
33
34 #define FLASH_ENC_CNT_MAX (CRYPT_CNT[0]->bit_count)
35
36 /* This file implements FLASH ENCRYPTION related APIs to perform
37 * various operations such as programming necessary flash encryption
38 * eFuses, detect whether flash encryption is enabled (by reading eFuse)
39 * and if required encrypt the partitions in flash memory
40 */
41
42 static const char *TAG = "flash_encrypt";
43
44 /* Static functions for stages of flash encryption */
45 static esp_err_t encrypt_bootloader(void);
46 static esp_err_t encrypt_primary_slot(void);
47 static size_t get_flash_encrypt_cnt_value(void);
48
49 /**
50 * This former inlined function must not be defined in the header file anymore.
51 * As it depends on efuse component, any use of it outside of `bootloader_support`,
52 * would require the caller component to include `efuse` as part of its `REQUIRES` or
53 * `PRIV_REQUIRES` entries.
54 * Attribute IRAM_ATTR must be specified for the app build.
55 */
esp_flash_encryption_enabled(void)56 bool IRAM_ATTR esp_flash_encryption_enabled(void)
57 {
58 #ifndef CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH
59 return efuse_hal_flash_encryption_enabled();
60 #else
61 uint32_t flash_crypt_cnt = 0;
62 #if CONFIG_IDF_TARGET_ESP32
63 esp_efuse_read_field_blob(ESP_EFUSE_FLASH_CRYPT_CNT, &flash_crypt_cnt, ESP_EFUSE_FLASH_CRYPT_CNT[0]->bit_count);
64 #else
65 esp_efuse_read_field_blob(ESP_EFUSE_SPI_BOOT_CRYPT_CNT, &flash_crypt_cnt, ESP_EFUSE_SPI_BOOT_CRYPT_CNT[0]->bit_count);
66 #endif
67 /* __builtin_parity is in flash, so we calculate parity inline */
68 bool enabled = false;
69 while (flash_crypt_cnt) {
70 if (flash_crypt_cnt & 1) {
71 enabled = !enabled;
72 }
73 flash_crypt_cnt >>= 1;
74 }
75 return enabled;
76 #endif // CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH
77 }
78
get_flash_encrypt_cnt_value(void)79 static size_t get_flash_encrypt_cnt_value(void)
80 {
81 size_t flash_crypt_cnt = 0;
82 esp_efuse_read_field_cnt(CRYPT_CNT, &flash_crypt_cnt);
83 return flash_crypt_cnt;
84 }
85
esp_flash_encrypt_initialized_once(void)86 bool esp_flash_encrypt_initialized_once(void)
87 {
88 return get_flash_encrypt_cnt_value() != 0;
89 }
90
esp_flash_encrypt_is_write_protected(bool print_error)91 bool esp_flash_encrypt_is_write_protected(bool print_error)
92 {
93 if (esp_efuse_read_field_bit(WR_DIS_CRYPT_CNT)) {
94 if (print_error) {
95 ESP_LOGE(TAG, "Flash Encryption cannot be enabled (CRYPT_CNT (%d) is write protected)", get_flash_encrypt_cnt_value());
96 }
97 return true;
98 }
99 return false;
100 }
101
esp_flash_encrypt_state(void)102 bool esp_flash_encrypt_state(void)
103 {
104 size_t flash_crypt_cnt = get_flash_encrypt_cnt_value();
105 bool flash_crypt_wr_dis = esp_flash_encrypt_is_write_protected(false);
106
107 ESP_LOGV(TAG, "CRYPT_CNT %d, write protection %d", flash_crypt_cnt, flash_crypt_wr_dis);
108
109 if (flash_crypt_cnt % 2 == 1) {
110 /* Flash is already encrypted */
111 int left = (FLASH_ENC_CNT_MAX - flash_crypt_cnt) / 2;
112 if (flash_crypt_wr_dis) {
113 left = 0; /* can't update FLASH_CRYPT_CNT, no more flashes */
114 }
115 ESP_LOGI(TAG, "flash encryption is enabled (%d plaintext flashes left)", left);
116 return true;
117 }
118 return false;
119 }
120
esp_flash_encrypt_check_and_update(void)121 esp_err_t esp_flash_encrypt_check_and_update(void)
122 {
123 bool flash_encryption_enabled = esp_flash_encrypt_state();
124 if (!flash_encryption_enabled) {
125 #ifndef CONFIG_SECURE_FLASH_REQUIRE_ALREADY_ENABLED
126 if (esp_flash_encrypt_is_write_protected(true)) {
127 return ESP_FAIL;
128 }
129
130 esp_err_t err = esp_flash_encrypt_init();
131 if (err != ESP_OK) {
132 ESP_LOGE(TAG, "Initialization of Flash encryption key failed (%d)", err);
133 return err;
134 }
135
136 err = esp_flash_encrypt_contents();
137 if (err != ESP_OK) {
138 ESP_LOGE(TAG, "Encryption flash contents failed (%d)", err);
139 return err;
140 }
141
142 err = esp_flash_encrypt_enable();
143 if (err != ESP_OK) {
144 ESP_LOGE(TAG, "Enabling of Flash encryption failed (%d)", err);
145 return err;
146 }
147 #else
148 ESP_LOGE(TAG, "flash encryption is not enabled, and SECURE_FLASH_REQUIRE_ALREADY_ENABLED "
149 "is set, refusing to boot.");
150 return ESP_ERR_INVALID_STATE;
151 #endif // CONFIG_SECURE_FLASH_REQUIRE_ALREADY_ENABLED
152 }
153 return ESP_OK;
154 }
155
check_and_generate_encryption_keys(void)156 static esp_err_t check_and_generate_encryption_keys(void)
157 {
158 size_t key_size = 32;
159 #ifdef CONFIG_IDF_TARGET_ESP32
160 enum { BLOCKS_NEEDED = 1 };
161 esp_efuse_purpose_t purposes[BLOCKS_NEEDED] = {
162 ESP_EFUSE_KEY_PURPOSE_FLASH_ENCRYPTION,
163 };
164 esp_efuse_coding_scheme_t coding_scheme = esp_efuse_get_coding_scheme(EFUSE_BLK_ENCRYPT_FLASH);
165 if (coding_scheme != EFUSE_CODING_SCHEME_NONE && coding_scheme != EFUSE_CODING_SCHEME_3_4) {
166 ESP_LOGE(TAG, "Unknown/unsupported CODING_SCHEME value 0x%x", coding_scheme);
167 return ESP_ERR_NOT_SUPPORTED;
168 }
169 if (coding_scheme == EFUSE_CODING_SCHEME_3_4) {
170 key_size = 24;
171 }
172 #else
173 #ifdef CONFIG_SECURE_FLASH_ENCRYPTION_AES256
174 enum { BLOCKS_NEEDED = 2 };
175 esp_efuse_purpose_t purposes[BLOCKS_NEEDED] = {
176 ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_1,
177 ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_2,
178 };
179 if (esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY, NULL)) {
180 ESP_LOGE(TAG, "XTS_AES_128_KEY is already in use, XTS_AES_256_KEY_1/2 can not be used");
181 return ESP_ERR_INVALID_STATE;
182 }
183 #else
184 #ifdef CONFIG_SECURE_FLASH_ENCRYPTION_AES128_DERIVED
185 enum { BLOCKS_NEEDED = 1 };
186 esp_efuse_purpose_t purposes[BLOCKS_NEEDED] = {
187 ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS,
188 };
189 key_size = 16;
190 #else
191 enum { BLOCKS_NEEDED = 1 };
192 esp_efuse_purpose_t purposes[BLOCKS_NEEDED] = {
193 ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY,
194 };
195 #endif // CONFIG_SECURE_FLASH_ENCRYPTION_AES128_DERIVED
196 #endif // CONFIG_SECURE_FLASH_ENCRYPTION_AES256
197 #endif // CONFIG_IDF_TARGET_ESP32
198
199 /* Initialize all efuse block entries to invalid (max) value */
200 esp_efuse_block_t blocks[BLOCKS_NEEDED] = {[0 ... BLOCKS_NEEDED-1] = EFUSE_BLK_KEY_MAX};
201 bool has_key = true;
202 for (unsigned i = 0; i < BLOCKS_NEEDED; i++) {
203 bool tmp_has_key = esp_efuse_find_purpose(purposes[i], &blocks[i]);
204 if (tmp_has_key) { // For ESP32: esp_efuse_find_purpose() always returns True, need to check whether the key block is used or not.
205 tmp_has_key &= !esp_efuse_key_block_unused(blocks[i]);
206 }
207 if (i == 1 && tmp_has_key != has_key) {
208 ESP_LOGE(TAG, "Invalid efuse key blocks: Both AES-256 key blocks must be set.");
209 return ESP_ERR_INVALID_STATE;
210 }
211 has_key &= tmp_has_key;
212 }
213
214 if (!has_key) {
215 /* Generate key */
216 uint8_t keys[BLOCKS_NEEDED][32] = { 0 };
217 ESP_LOGI(TAG, "Generating new flash encryption key...");
218 for (unsigned i = 0; i < BLOCKS_NEEDED; ++i) {
219 bootloader_fill_random(keys[i], key_size);
220 }
221 ESP_LOGD(TAG, "Key generation complete");
222
223 esp_err_t err = esp_efuse_write_keys(purposes, keys, BLOCKS_NEEDED);
224 if (err != ESP_OK) {
225 if (err == ESP_ERR_NOT_ENOUGH_UNUSED_KEY_BLOCKS) {
226 ESP_LOGE(TAG, "Not enough free efuse key blocks (need %d) to continue", BLOCKS_NEEDED);
227 } else {
228 ESP_LOGE(TAG, "Failed to write efuse block with purpose (err=0x%x). Can't continue.", err);
229 }
230 return err;
231 }
232 } else {
233 for (unsigned i = 0; i < BLOCKS_NEEDED; i++) {
234 if (!esp_efuse_get_key_dis_write(blocks[i])
235 || !esp_efuse_get_key_dis_read(blocks[i])
236 || !esp_efuse_get_keypurpose_dis_write(blocks[i])) { // For ESP32: no keypurpose, it returns always True.
237 ESP_LOGE(TAG, "Invalid key state, check read&write protection for key and keypurpose(if exists)");
238 return ESP_ERR_INVALID_STATE;
239 }
240 }
241 ESP_LOGI(TAG, "Using pre-loaded flash encryption key in efuse");
242 }
243 return ESP_OK;
244 }
245
esp_flash_encrypt_init(void)246 esp_err_t esp_flash_encrypt_init(void)
247 {
248 if (esp_flash_encryption_enabled() || esp_flash_encrypt_initialized_once()) {
249 return ESP_OK;
250 }
251
252 /* Very first flash encryption pass: generate keys, etc. */
253
254 esp_efuse_batch_write_begin(); /* Batch all efuse writes at the end of this function */
255
256 /* Before first flash encryption pass, need to initialise key & crypto config */
257 esp_err_t err = check_and_generate_encryption_keys();
258 if (err != ESP_OK) {
259 esp_efuse_batch_write_cancel();
260 return err;
261 }
262
263 err = esp_flash_encryption_enable_secure_features();
264 if (err != ESP_OK) {
265 esp_efuse_batch_write_cancel();
266 return err;
267 }
268
269 err = esp_efuse_batch_write_commit();
270 if (err != ESP_OK) {
271 ESP_LOGE(TAG, "Error programming security eFuses (err=0x%x).", err);
272 return err;
273 }
274
275 return ESP_OK;
276 }
277
278 /* Encrypt all flash data that should be encrypted */
esp_flash_encrypt_contents(void)279 esp_err_t esp_flash_encrypt_contents(void)
280 {
281 esp_err_t err;
282
283 #ifdef CONFIG_SOC_EFUSE_CONSISTS_OF_ONE_KEY_BLOCK
284 REG_WRITE(SENSITIVE_XTS_AES_KEY_UPDATE_REG, 1);
285 #endif
286
287 err = encrypt_bootloader();
288 if (err != ESP_OK) {
289 return err;
290 }
291
292 /* If the primary slot executable application is not encrypted,
293 * then encrypt it
294 */
295 err = encrypt_primary_slot();
296 if (err != ESP_OK) {
297 return err;
298 }
299
300 /* Unconditionally encrypts remaining regions
301 * This will need changes when implementing multi-slot support
302 */
303 ESP_LOGI(TAG, "Encrypting remaining flash...");
304 uint32_t region_addr = CONFIG_ESP_IMAGE0_SECONDARY_START_ADDRESS;
305 size_t region_size = CONFIG_ESP_APPLICATION_SIZE;
306 err = esp_flash_encrypt_region(region_addr, region_size);
307 if (err != ESP_OK) {
308 return err;
309 }
310 region_addr = CONFIG_ESP_SCRATCH_OFFSET;
311 region_size = CONFIG_ESP_SCRATCH_SIZE;
312 err = esp_flash_encrypt_region(region_addr, region_size);
313 if (err != ESP_OK) {
314 return err;
315 }
316
317 #if defined(CONFIG_ESP_IMAGE_NUMBER) && (CONFIG_ESP_IMAGE_NUMBER == 2)
318 region_addr = CONFIG_ESP_IMAGE1_PRIMARY_START_ADDRESS;
319 region_size = CONFIG_ESP_APPLICATION_SIZE;
320 err = esp_flash_encrypt_region(region_addr, region_size);
321 if (err != ESP_OK) {
322 return err;
323 }
324 region_addr = CONFIG_ESP_IMAGE1_SECONDARY_START_ADDRESS;
325 region_size = CONFIG_ESP_APPLICATION_SIZE;
326 err = esp_flash_encrypt_region(region_addr, region_size);
327 if (err != ESP_OK) {
328 return err;
329 }
330 #endif
331
332 ESP_LOGI(TAG, "Flash encryption completed");
333
334 return ESP_OK;
335 }
336
esp_flash_encrypt_enable(void)337 esp_err_t esp_flash_encrypt_enable(void)
338 {
339 esp_err_t err = ESP_OK;
340 if (!esp_flash_encryption_enabled()) {
341
342 if (esp_flash_encrypt_is_write_protected(true)) {
343 return ESP_FAIL;
344 }
345
346 size_t flash_crypt_cnt = get_flash_encrypt_cnt_value();
347
348 #ifdef CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE
349 // Go straight to max, permanently enabled
350 ESP_LOGI(TAG, "Setting CRYPT_CNT for permanent encryption");
351 size_t new_flash_crypt_cnt = FLASH_ENC_CNT_MAX - flash_crypt_cnt;
352 #else
353 /* Set least significant 0-bit in flash_crypt_cnt */
354 size_t new_flash_crypt_cnt = 1;
355 #endif
356 ESP_LOGD(TAG, "CRYPT_CNT %d -> %d", flash_crypt_cnt, new_flash_crypt_cnt);
357 err = esp_efuse_write_field_cnt(CRYPT_CNT, new_flash_crypt_cnt);
358
359 #if defined(CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE) && defined(CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128_DERIVED)
360 // For AES128_DERIVED, FE key is 16 bytes and XTS_KEY_LENGTH_256 is 0.
361 // It is important to protect XTS_KEY_LENGTH_256 from further changing it to 1. Set write protection for this bit.
362 // Burning WR_DIS_CRYPT_CNT, blocks further changing of eFuses: DOWNLOAD_DIS_MANUAL_ENCRYPT, SPI_BOOT_CRYPT_CNT, [XTS_KEY_LENGTH_256], SECURE_BOOT_EN.
363 esp_efuse_write_field_bit(WR_DIS_CRYPT_CNT);
364 #endif
365 }
366
367 ESP_LOGI(TAG, "Flash encryption completed");
368
369 #ifdef CONFIG_EFUSE_VIRTUAL
370 ESP_LOGW(TAG, "Flash encryption not really completed. Must disable virtual efuses");
371 #endif
372
373 return err;
374 }
375
encrypt_bootloader(void)376 static esp_err_t encrypt_bootloader(void)
377 {
378 esp_err_t err;
379 uint32_t image_length;
380 /* Check for plaintext bootloader (verification will fail if it's already encrypted) */
381 if (esp_image_verify_bootloader(&image_length) == ESP_OK) {
382 ESP_LOGI(TAG, "Encrypting bootloader...");
383
384 err = esp_flash_encrypt_region(ESP_BOOTLOADER_OFFSET, CONFIG_ESP_BOOTLOADER_SIZE);
385 if (err != ESP_OK) {
386 ESP_LOGE(TAG, "Failed to encrypt bootloader in place: 0x%x", err);
387 return err;
388 }
389 ESP_LOGI(TAG, "Bootloader encrypted successfully");
390 } else {
391 ESP_LOGW(TAG, "No valid bootloader was found");
392 return ESP_ERR_NOT_FOUND;
393 }
394
395 return ESP_OK;
396 }
397
verify_img_header(uint32_t addr,const esp_image_load_header_t * image,bool silent)398 static esp_err_t verify_img_header(uint32_t addr, const esp_image_load_header_t *image, bool silent)
399 {
400 esp_err_t err = ESP_OK;
401
402 if (image->header_magic != ESP_LOAD_HEADER_MAGIC) {
403 if (!silent) {
404 ESP_LOGE(TAG, "image at 0x%x has invalid magic byte",
405 addr);
406 }
407 err = ESP_ERR_IMAGE_INVALID;
408 }
409
410 return err;
411 }
412
encrypt_primary_slot(void)413 static esp_err_t encrypt_primary_slot(void)
414 {
415 esp_err_t err;
416
417 esp_image_load_header_t img_header;
418
419 /* Check if the slot is plaintext or encrypted, 0x20 offset is for skipping
420 * MCUboot header
421 */
422 err = bootloader_flash_read(CONFIG_ESP_IMAGE0_PRIMARY_START_ADDRESS + 0x20,
423 &img_header, sizeof(esp_image_load_header_t), true);
424 if (err != ESP_OK) {
425 ESP_LOGE(TAG, "Failed to read slot img header");
426 return err;
427 } else {
428 err = verify_img_header(CONFIG_ESP_IMAGE0_PRIMARY_START_ADDRESS,
429 &img_header, true);
430 }
431
432 if (err == ESP_OK) {
433 ESP_LOGI(TAG, "Encrypting primary slot...");
434
435 err = esp_flash_encrypt_region(CONFIG_ESP_IMAGE0_PRIMARY_START_ADDRESS,
436 CONFIG_ESP_APPLICATION_SIZE);
437 if (err != ESP_OK) {
438 ESP_LOGE(TAG, "Failed to encrypt slot in place: 0x%x", err);
439 return err;
440 }
441 } else {
442 ESP_LOGW(TAG, "Slot already encrypted or no valid image was found");
443 }
444
445 return ESP_OK;
446 }
447
esp_flash_encrypt_region(uint32_t src_addr,size_t data_length)448 esp_err_t esp_flash_encrypt_region(uint32_t src_addr, size_t data_length)
449 {
450 esp_err_t err;
451 uint32_t buf[FLASH_SECTOR_SIZE / sizeof(uint32_t)];
452
453 if (src_addr % FLASH_SECTOR_SIZE != 0) {
454 ESP_LOGE(TAG, "esp_flash_encrypt_region bad src_addr 0x%x", src_addr);
455 return ESP_FAIL;
456 }
457
458 wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
459 for (size_t i = 0; i < data_length; i += FLASH_SECTOR_SIZE) {
460 wdt_hal_write_protect_disable(&rtc_wdt_ctx);
461 wdt_hal_feed(&rtc_wdt_ctx);
462 wdt_hal_write_protect_enable(&rtc_wdt_ctx);
463 uint32_t sec_start = i + src_addr;
464 err = bootloader_flash_read(sec_start, buf, FLASH_SECTOR_SIZE, true);
465 if (err != ESP_OK) {
466 goto flash_failed;
467 }
468 err = bootloader_flash_erase_sector(sec_start / FLASH_SECTOR_SIZE);
469 if (err != ESP_OK) {
470 goto flash_failed;
471 }
472 err = bootloader_flash_write(sec_start, buf, FLASH_SECTOR_SIZE, true);
473 if (err != ESP_OK) {
474 goto flash_failed;
475 }
476 }
477 return ESP_OK;
478
479 flash_failed:
480 ESP_LOGE(TAG, "flash operation failed: 0x%x", err);
481 return err;
482 }
483