bool esp32_fs_crypt_init(void) { uint8_t tmp[32]; uint32_t addr = 0; for (addr = 0; addr < spi_flash_get_chip_size(); addr += 32) { mgos_wdt_feed(); if (spi_flash_read(addr, tmp, sizeof(tmp)) != ESP_OK) { LOG(LL_ERROR, ("SPI read error at 0x%x", addr)); return false; } int j; for (j = 0; j < sizeof(tmp); j++) { if (tmp[j] != 0xff) break; } if (j < sizeof(tmp)) continue; /* Found a suitably empty location, now decrypt it. */ if (spi_flash_read_encrypted(addr, tmp, sizeof(tmp)) != ESP_OK) { LOG(LL_ERROR, ("SPI encrypted read error at 0x%x", addr)); return false; } /* Now in tmp we have 32 x 0xff processed with the flash encryption key. */ mbedtls_aes_init(&s_aes_ctx_enc); mbedtls_aes_setkey_enc(&s_aes_ctx_enc, tmp, 256); mbedtls_aes_init(&s_aes_ctx_dec); mbedtls_aes_setkey_dec(&s_aes_ctx_dec, tmp, 256); LOG(LL_INFO, ("FS encryption key set up, seed @ 0x%x", addr)); return true; } LOG(LL_ERROR, ("Could not a suitable seed area for FS encryption")); return false; }
esp_err_t IRAM_ATTR spi_flash_erase_range(uint32_t start_addr, uint32_t size) { CHECK_WRITE_ADDRESS(start_addr, size); if (start_addr % SPI_FLASH_SEC_SIZE != 0) { return ESP_ERR_INVALID_ARG; } if (size % SPI_FLASH_SEC_SIZE != 0) { return ESP_ERR_INVALID_SIZE; } if (size + start_addr > spi_flash_get_chip_size()) { return ESP_ERR_INVALID_SIZE; } size_t start = start_addr / SPI_FLASH_SEC_SIZE; size_t end = start + size / SPI_FLASH_SEC_SIZE; const size_t sectors_per_block = BLOCK_ERASE_SIZE / SPI_FLASH_SEC_SIZE; COUNTER_START(); esp_rom_spiflash_result_t rc; rc = spi_flash_unlock(); if (rc == ESP_ROM_SPIFLASH_RESULT_OK) { for (size_t sector = start; sector != end && rc == ESP_ROM_SPIFLASH_RESULT_OK; ) { spi_flash_guard_start(); if (sector % sectors_per_block == 0 && end - sector > sectors_per_block) { rc = esp_rom_spiflash_erase_block(sector / sectors_per_block); sector += sectors_per_block; COUNTER_ADD_BYTES(erase, sectors_per_block * SPI_FLASH_SEC_SIZE); } else { rc = esp_rom_spiflash_erase_sector(sector); ++sector; COUNTER_ADD_BYTES(erase, SPI_FLASH_SEC_SIZE); } spi_flash_guard_end(); } } COUNTER_STOP(erase); return spi_flash_translate_rc(rc); }