34
34
#include "esp_secure_boot.h"
35
35
#include "esp_flash_encrypt.h"
36
36
#include "esp_efuse.h"
37
+ #include "esp_efuse_table.h"
37
38
38
39
/* The following API implementations are used only when called
39
40
* from the bootloader code.
@@ -290,16 +291,19 @@ static esp_err_t secure_boot_v2_digest_generate(uint32_t flash_offset, uint32_t
290
291
291
292
esp_err_t esp_secure_boot_v2_permanently_enable (const esp_image_metadata_t * image_data )
292
293
{
293
- uint32_t new_wdata0 = 0 ;
294
- uint32_t new_wdata6 = 0 ;
295
-
296
294
ESP_LOGI (TAG , "enabling secure boot v2..." );
297
295
esp_err_t ret ;
298
296
if (esp_secure_boot_enabled ()) {
299
297
ESP_LOGI (TAG , "secure boot v2 is already enabled. Continuing.." );
300
298
return ESP_OK ;
301
299
}
302
300
301
+ ret = esp_efuse_batch_write_begin ();
302
+ if (ret != ESP_OK ) {
303
+ ESP_LOGE (TAG , "Error batch programming security eFuses." );
304
+ return ret ;
305
+ }
306
+
303
307
uint32_t coding_scheme = REG_GET_FIELD (EFUSE_BLK0_RDATA6_REG , EFUSE_CODING_SCHEME );
304
308
if (coding_scheme != EFUSE_CODING_SCHEME_VAL_NONE ) {
305
309
ESP_LOGE (TAG , "No coding schemes are supported in secure boot v2.(Detected scheme: 0x%x)" , coding_scheme );
@@ -336,14 +340,19 @@ esp_err_t esp_secure_boot_v2_permanently_enable(const esp_image_metadata_t *imag
336
340
}
337
341
338
342
ESP_LOGI (TAG , "Burning public key hash to efuse." );
339
- uint32_t * boot_public_key_digest_ptr = ( uint32_t * ) boot_pub_key_digest ;
340
- for ( int i = 0 ; i < 8 ; i ++ ) {
341
- REG_WRITE ( EFUSE_BLK2_WDATA0_REG + 4 * i , boot_public_key_digest_ptr [ i ] );
342
- ESP_LOGD ( TAG , "EFUSE_BLKx_WDATA%d_REG = 0x%08x" , i , boot_public_key_digest_ptr [ i ]) ;
343
+ ret = esp_efuse_write_block ( EFUSE_BLK2 , boot_pub_key_digest , 0 , ( DIGEST_LEN * 8 )) ;
344
+ if ( ret != ESP_OK ) {
345
+ ESP_LOGE ( TAG , "Writing public key hash to efuse failed." );
346
+ return ret ;
343
347
}
344
348
345
349
ESP_LOGI (TAG , "Write protecting public key digest..." );
346
- new_wdata0 |= EFUSE_WR_DIS_BLK2 ;
350
+ ret = esp_efuse_set_write_protect (EFUSE_BLK2 );
351
+ if (ret != ESP_OK ) {
352
+ ESP_LOGE (TAG , "Write protecting public key digest...failed." );
353
+ return ret ;
354
+ }
355
+
347
356
efuse_key_write_protected = true;
348
357
efuse_key_read_protected = false;
349
358
} else {
@@ -375,26 +384,38 @@ esp_err_t esp_secure_boot_v2_permanently_enable(const esp_image_metadata_t *imag
375
384
ESP_LOGI (TAG , "blowing secure boot efuse..." );
376
385
ESP_LOGD (TAG , "before updating, EFUSE_BLK0_RDATA6 %x" , REG_READ (EFUSE_BLK0_RDATA6_REG ));
377
386
378
- new_wdata6 |= EFUSE_RD_ABS_DONE_1 ;
387
+ ret = esp_efuse_write_field_bit (ESP_EFUSE_ABS_DONE_1 );
388
+ if (ret != ESP_OK ) {
389
+ ESP_LOGE (TAG , "Blowing secure boot efuse...failed." );
390
+ return ret ;
391
+ }
379
392
380
393
#ifndef CONFIG_SECURE_BOOT_ALLOW_JTAG
381
394
ESP_LOGI (TAG , "Disable JTAG..." );
382
- new_wdata6 |= EFUSE_RD_DISABLE_JTAG ;
395
+ ret = esp_efuse_write_field_bit (ESP_EFUSE_DISABLE_JTAG );
396
+ if (ret != ESP_OK ) {
397
+ ESP_LOGE (TAG , "Disable JTAG...failed." );
398
+ return ret ;
399
+ }
383
400
#else
384
401
ESP_LOGW (TAG , "Not disabling JTAG - SECURITY COMPROMISED" );
385
402
#endif
386
403
387
404
#ifndef CONFIG_SECURE_BOOT_ALLOW_ROM_BASIC
388
405
ESP_LOGI (TAG , "Disable ROM BASIC interpreter fallback..." );
389
- new_wdata6 |= EFUSE_RD_CONSOLE_DEBUG_DISABLE ;
406
+ ret = esp_efuse_write_field_bit (ESP_EFUSE_CONSOLE_DEBUG_DISABLE );
407
+ if (ret != ESP_OK ) {
408
+ ESP_LOGE (TAG , "Disable ROM BASIC interpreter fallback...failed." );
409
+ return ret ;
410
+ }
390
411
#else
391
412
ESP_LOGW (TAG , "Not disabling ROM BASIC fallback - SECURITY COMPROMISED" );
392
413
#endif
393
414
394
415
#ifdef CONFIG_SECURE_DISABLE_ROM_DL_MODE
395
416
ESP_LOGI (TAG , "Disable ROM Download mode..." );
396
- esp_err_t err = esp_efuse_disable_rom_download_mode ();
397
- if (err != ESP_OK ) {
417
+ ret = esp_efuse_disable_rom_download_mode ();
418
+ if (ret != ESP_OK ) {
398
419
ESP_LOGE (TAG , "Could not disable ROM Download mode..." );
399
420
return ESP_FAIL ;
400
421
}
@@ -411,15 +432,21 @@ esp_err_t esp_secure_boot_v2_permanently_enable(const esp_image_metadata_t *imag
411
432
#endif
412
433
if (rd_dis_now ) {
413
434
ESP_LOGI (TAG , "Prevent read disabling of additional efuses..." );
414
- new_wdata0 |= EFUSE_WR_DIS_RD_DIS ;
435
+ ret = esp_efuse_write_field_bit (ESP_EFUSE_WR_DIS_EFUSE_RD_DISABLE );
436
+ if (ret != ESP_OK ) {
437
+ ESP_LOGE (TAG , "Prevent read disabling of additional efuses...failed." );
438
+ return ret ;
439
+ }
415
440
}
416
441
#else
417
442
ESP_LOGW (TAG , "Allowing read disabling of additional efuses - SECURITY COMPROMISED" );
418
443
#endif
419
444
420
- REG_WRITE (EFUSE_BLK0_WDATA0_REG , new_wdata0 );
421
- REG_WRITE (EFUSE_BLK0_WDATA6_REG , new_wdata6 );
422
- esp_efuse_burn_new_values ();
445
+ ret = esp_efuse_batch_write_commit ();
446
+ if (ret != ESP_OK ) {
447
+ ESP_LOGE (TAG , "Error programming security eFuses." );
448
+ return ret ;
449
+ }
423
450
uint32_t after = REG_READ (EFUSE_BLK0_RDATA6_REG );
424
451
ESP_LOGD (TAG , "after updating, EFUSE_BLK0_RDATA0 0x%08x EFUSE_BLK0_RDATA6 0x%08x" ,
425
452
REG_READ (EFUSE_BLK0_RDATA0_REG ), after );
0 commit comments