forked from espressif/esp-idf
Merge branch 'feature/add_documentation_for_externally_enabling_secure_boot' into 'master'
docs/security: Added host based worlflow to enable secure boot externally See merge request espressif/esp-idf!24409
This commit is contained in:
@@ -3,6 +3,7 @@ Host Based Security Workflows
|
||||
|
||||
{IDF_TARGET_CRYPT_CNT:default="SPI_BOOT_CRYPT_CNT",esp32="FLASH_CRYPT_CNT"}
|
||||
{IDF_TARGET_CRYPT_CNT_MAX_VAL:default="7",esp32="127"}
|
||||
{IDF_TARGET_SBV2_DEFAULT_SCHEME:default="RSA", esp32c2="ECDSA (V2)"}
|
||||
|
||||
Introduction
|
||||
------------
|
||||
@@ -22,7 +23,7 @@ Goals
|
||||
|
||||
Pre-requisite
|
||||
-------------
|
||||
* ``esptool``: Please make sure the ``esptool`` has been installed. It can be installed with help of the following command:
|
||||
* ``esptool``: Please make sure the ``esptool`` has been installed. It can be installed by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
@@ -30,11 +31,29 @@ Pre-requisite
|
||||
|
||||
Scope
|
||||
-----
|
||||
* :ref:`enable-flash-encryption-and-secure-boot-v2-externally`
|
||||
* :ref:`enable-flash-encryption-externally`
|
||||
* :ref:`enable-secure-boot-v2-externally`
|
||||
|
||||
Security Workflows
|
||||
------------------
|
||||
|
||||
.. _enable-flash-encryption-and-secure-boot-v2-externally:
|
||||
|
||||
Enable Flash Encryption and Secure Boot V2 Externally
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. important::
|
||||
|
||||
It is recommended to enable both Flash Encryption and Secure Boot V2 for a production use case.
|
||||
|
||||
When enabling the Flash Encryption and Secure Boot V2 externally we need to enable them in following order:
|
||||
|
||||
#. Enable Flash Encryption feature by following the steps listed in :ref:`enable-flash-encryption-externally`.
|
||||
#. Enable Secure Boot V2 feature by following the steps listed in :ref:`enable-secure-boot-v2-externally`.
|
||||
|
||||
The reason for this order is that when Secure Boot V2 is enabled, we write protect the eFuse ``WR_DIS``. Once that eFuse is write protected, we can no longer enable Flash Encryption.
|
||||
|
||||
.. _enable-flash-encryption-externally:
|
||||
|
||||
Enable Flash Encryption Externally
|
||||
@@ -47,13 +66,15 @@ In this case all the eFuses related to flash encryption are written with help of
|
||||
See how to check :ref:`flash-encryption-status`.
|
||||
|
||||
In this case the Flash on the chip must be erased and flash encryption must not be enabled.
|
||||
The chip can be erased using the following command:
|
||||
The chip can be erased by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
esptool.py --port PORT erase_flash
|
||||
|
||||
2. Generate a random flash encryption key by running:
|
||||
2. Generate a flash encryption key.
|
||||
|
||||
A random flash encryption key can be generated by running:
|
||||
|
||||
.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES
|
||||
|
||||
@@ -96,7 +117,9 @@ The chip can be erased using the following command:
|
||||
|
||||
espsecure.py generate_flash_encryption_key --keylen 128 my_flash_encryption_key.bin
|
||||
|
||||
3. Burn the key into your device's eFuse using the command below. This action can be done **only once**.
|
||||
3. Burn the flash encryption key into eFuse.
|
||||
|
||||
This action **cannot be reverted**. It can be done by running:
|
||||
|
||||
.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES
|
||||
|
||||
@@ -165,8 +188,9 @@ The chip can be erased using the following command:
|
||||
|
||||
.. only:: SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK
|
||||
|
||||
.. note::
|
||||
**WARNING**: For the {IDF_TARGET_NAME} BLOCK9 (BLOCK_KEY5) can not be used by XTS_AES keys.
|
||||
.. warning::
|
||||
|
||||
For the {IDF_TARGET_NAME} BLOCK9 (BLOCK_KEY5) can not be used by XTS_AES keys.
|
||||
|
||||
|
||||
4. Burn the ``{IDF_TARGET_CRYPT_CNT}`` eFuse.
|
||||
@@ -179,7 +203,7 @@ If you only want to enable flash encryption in **Development** mode and want to
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
In case of {IDF_TARGET_NAME}, you also need to burn the ``FLASH_CRYPT_CONFIG``. It can be done with help of the following command:
|
||||
In case of {IDF_TARGET_NAME}, you also need to burn the ``FLASH_CRYPT_CONFIG``. It can be done by running:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@@ -189,7 +213,7 @@ If you only want to enable flash encryption in **Development** mode and want to
|
||||
|
||||
At this point the flash encryption on the device has been enabled. You may test the flash encryption process as given in step 5. Please note that the security related eFuses have not been burned at this point. It is recommended that they should be burned in production use-cases as explained in step 6.
|
||||
|
||||
5. Encrypt and flash the binaries
|
||||
5. Encrypt and flash the binaries.
|
||||
|
||||
The bootloader and the application binaries for the project must be built with Flash Encryption Release mode with default configurations.
|
||||
|
||||
@@ -206,7 +230,7 @@ Flash encryption Release mode can be set in the menuconfig as follows:
|
||||
- Save the configuration and exit.
|
||||
|
||||
|
||||
The binaries can be encrypted on the host machine using the following command
|
||||
The binaries can be encrypted on the host machine by running:
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
@@ -242,7 +266,11 @@ The command ``espsecure.py decrypt_flash_data`` can be used with the same option
|
||||
|
||||
6. Burn flash encryption related security eFuses as listed below:
|
||||
|
||||
**A) Burn security eFuses:**
|
||||
A) Burn security eFuses:
|
||||
|
||||
.. important::
|
||||
|
||||
For production use cases, it is highly recommended to burn all the eFuses listed below.
|
||||
|
||||
.. list::
|
||||
|
||||
@@ -260,8 +288,7 @@ The command ``espsecure.py decrypt_flash_data`` can be used with the same option
|
||||
:SOC_EFUSE_DIS_PAD_JTAG: - ``DIS_PAD_JTAG``: Disable JTAG permanently
|
||||
:not esp32: - ``DIS_DOWNLOAD_MANUAL_ENCRYPT``: Disable UART bootloader encryption access
|
||||
|
||||
**Burning all of the eFuses listed above is recommended for production use-case.**
|
||||
The respective eFuses can be burned with help of the following command:
|
||||
The respective eFuses can be burned by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
@@ -269,7 +296,7 @@ The respective eFuses can be burned with help of the following command:
|
||||
|
||||
.. note:: Please update the EFUSE_NAME with the eFuse that you need to burn. Multiple eFuses can be burned at the same time by appending them to the above command (e.g., EFUSE_NAME VAL EFUSE_NAME2 VAL2). More documentation about `espefuse.py` can be found `here <https://docs.espressif.com/projects/esptool/en/latest/esp32/espefuse/index.html>`_
|
||||
|
||||
**B) Write protect security eFuses:**
|
||||
B) Write protect security eFuses:
|
||||
|
||||
After burning the respective eFuses we need to write_protect the security configurations
|
||||
|
||||
@@ -283,7 +310,7 @@ After burning the respective eFuses we need to write_protect the security config
|
||||
|
||||
The write disable bit for MAC also write disables DIS_CACHE which is required to prevent accidental burning of this bit.
|
||||
|
||||
**C) Disable UART ROM DL mode**
|
||||
C) Disable UART ROM DL mode:
|
||||
|
||||
.. only:: not esp32
|
||||
|
||||
@@ -295,9 +322,11 @@ After burning the respective eFuses we need to write_protect the security config
|
||||
|
||||
The write protection of above eFuse also write protects multiple other eFuses, Please refer to the {IDF_TARGET_NAME} eFuse table for more details.
|
||||
|
||||
**C) Enable Security Download mode:**
|
||||
C) Enable Security Download mode:
|
||||
|
||||
**WARNING:** Please burn the following bit at the very end. After this bit is burned, the espefuse tool can no longer be used to burn additional eFuses.
|
||||
.. warning::
|
||||
|
||||
Please burn the following bit at the very end. After this bit is burned, the espefuse tool can no longer be used to burn additional eFuses.
|
||||
|
||||
.. list::
|
||||
|
||||
@@ -306,7 +335,7 @@ After burning the respective eFuses we need to write_protect the security config
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
The eFuse can be burned with following command:
|
||||
The eFuse can be burned by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
@@ -314,15 +343,260 @@ After burning the respective eFuses we need to write_protect the security config
|
||||
|
||||
.. only:: not esp32
|
||||
|
||||
The eFuse can be burned with following command:
|
||||
The eFuse can be burned by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT burn_efuse ENABLE_SECURITY_DOWNLOAD
|
||||
|
||||
.. important::
|
||||
|
||||
7. Delete flash encryption key on host:
|
||||
|
||||
* Once the flash encryption has been enabled for the device, the key **must be deleted immediately**. This ensures that the host cannot produce encrypted binaries for the same device going forward. This step is important to reduce the vulnerability of the flash encryption key.
|
||||
* It is recommended to generate a unique flash encryption key for each device for production use-cases.
|
||||
Once the flash encryption has been enabled for the device, the key **must be deleted immediately**. This ensures that the host cannot produce encrypted binaries for the same device going forward. This step is important to reduce the vulnerability of the flash encryption key.
|
||||
|
||||
Flash Encryption Guidelines
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* It is recommended to generate a unique flash encryption key for each device for production use-cases.
|
||||
* It is recommended to ensure that the RNG used by host machine to generate the flash encryption key has good entropy.
|
||||
* See :ref:`flash-encryption-limitations` for more details.
|
||||
|
||||
.. _enable-secure-boot-v2-externally:
|
||||
|
||||
Enable Secure Boot V2 Externally
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
In this workflow we shall use ``espsecure`` tool to generate signing keys and use the ``espefuse`` tool to burn the relevant eFuses. The details about the Secure Boot V2 process can be found at :doc:`Secure Boot V2 Guide </security/secure-boot-v2>`
|
||||
|
||||
1. Generate Secure Boot V2 Signing Private Key.
|
||||
|
||||
.. only:: esp32 or SOC_SECURE_BOOT_V2_RSA
|
||||
|
||||
The Secure Boot V2 signing key for RSA3072 scheme can be generated by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espsecure.py generate_signing_key --version 2 --scheme rsa3072 secure_boot_signinig_key.pem
|
||||
|
||||
.. only:: SOC_SECURE_BOOT_V2_ECC
|
||||
|
||||
The Secure Boot V2 signing key for ECDSA scheme can be generated by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espsecure.py generate_signing_key --version 2 --scheme ecdsa256 secure_boot_signing_key.pem
|
||||
|
||||
The scheme in the above command can be changed to ``ecdsa192`` to generate ecdsa192 private key.
|
||||
|
||||
.. only:: SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS
|
||||
|
||||
A total of 3 keys can be used for Secure Boot V2 at once. These should be computed independently and stored separately. The same command with different keyfile names can be used to generated multiple Secure Boot V2 signing keys. It is recommended to use multiple keys in order to reduce dependency on a single key.
|
||||
|
||||
2. Generate Public Key Digest.
|
||||
|
||||
The public key digest for the private key generated in the previous step can be generated by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espsecure.py digest_sbv2_public_key --keyfile secure_boot_signing_key.pem --output digest.bin
|
||||
|
||||
.. only:: SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS
|
||||
|
||||
In case of multiple digests, each digest should be kept in a separate file.
|
||||
|
||||
3. Burn the key digest in eFuse.
|
||||
|
||||
The public key digest can be burned in the eFuse by running:
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT --chip esp32 burn_key secure_boot_v2 digest.bin
|
||||
|
||||
.. only:: esp32c2
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT --chip esp32c2 burn_key KEY_BLOCK0 SECURE_BOOT_DIGEST digest.bin
|
||||
|
||||
.. only:: SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT --chip {IDF_TARGET_PATH_NAME} burn_key BLOCK SECURE_BOOT_DIGEST0 digest.bin
|
||||
|
||||
where ``BLOCK`` is a free keyblock between ``BLOCK_KEY0`` and ``BLOCK_KEY5``.
|
||||
|
||||
In case of multiple digests, the other digests can be burned sequentially by changing the key purpose to ``SECURE_BOOT_DIGEST1`` and ``SECURE_BOOT_DIGEST2`` respectively.
|
||||
|
||||
4. Enable Secure Boot V2.
|
||||
|
||||
Secure Boot V2 eFuse can be enabled by running:
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT --chip esp32 burn_efuse ABS_DONE_1
|
||||
|
||||
.. only:: not esp32
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT --chip {IDF_TARGET_PATH_NAME} burn_efuse SECURE_BOOT_EN
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
At this stage the secure boot V2 has been enabled for the {IDF_TARGET_NAME}. The ROM bootloader shall now verify the authenticity of the :ref:`second-stage-bootloader` on every bootup. You may test the secure boot process by executing Step 5 & 6. Please note that security related eFuses have not been burned at this point. For production use cases, all security related eFuses must be burned as given in step 7.
|
||||
|
||||
5. Build the binaries.
|
||||
|
||||
By default the ROM bootloader would only verify the :ref:`second-stage-bootloader` (firmware bootloader). The firmware bootloader would verify the app partition only when the :ref:`CONFIG_SECURE_BOOT` option is enabled (and :ref:`CONFIG_SECURE_BOOT_VERSION` is set to ``SECURE_BOOT_V2_ENABLED``) while building the bootloader.
|
||||
|
||||
a) Open the :ref:`project-configuration-menu`, in "Security features" set "Enable hardware Secure Boot in bootloader" to enable Secure Boot.
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
For ESP32, Secure Boot V2 is available only ESP32 ECO3 onwards. To view the "Secure Boot V2" option the chip revision should be changed to revision v3.0 (ECO3). To change the chip revision, set "Minimum Supported ESP32 Revision" to "Rev 3.0 (ECO3)" in "Component Config" -> "Hardware Settings" -> "Chip Revision".
|
||||
|
||||
.. only:: SOC_SECURE_BOOT_V2_RSA or SOC_SECURE_BOOT_V2_ECC
|
||||
|
||||
The "Secure Boot V2" option will be selected and the "App Signing Scheme" would be set to {IDF_TARGET_SBV2_DEFAULT_SCHEME} by default.
|
||||
|
||||
b) Disable the option :ref:`CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES` for the project in the :ref:`project-configuration-menu`. This shall make sure that all the generated binaries are secure padded and unsigned. This step is done to avoid generating signed binaries as we are going to manually sign the binaries using ``espsecure`` tool.
|
||||
|
||||
After the above configurations, the bootloader and application binaries can be built with ``idf.py build`` command.
|
||||
|
||||
6. Sign and Flash the binaries.
|
||||
|
||||
The Secure Boot V2 workflow only verifies the ``bootloader`` and ``application`` binaries, hence only those binaries need to be signed. The other binaries (e.g. ``partition-table.bin``) can be flashed as they are generated in the build stage.
|
||||
|
||||
The ``bootloader.bin`` and ``app.bin`` binaries can be signed by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espsecure.py sign_data --version 2 --keyfile secure_boot_signing_key.pem --output bootloader-signed.bin build/bootloader/bootloader.bin
|
||||
|
||||
espsecure.py sign_data --version 2 --keyfile secure_boot_signing_key.pem --output my-app-signed.bin build/my-app.bin
|
||||
|
||||
.. only:: SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS
|
||||
|
||||
If multiple keys secure boot keys are to be used then the same signed binary can be appended with signature block signed with the new key as follows:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espsecure.py sign_data --keyfile secure_boot_signing_key2.pem --version 2 --amend_signatures -o bootloader-signed.bin bootloader-signed.bin
|
||||
|
||||
espsecure.py sign_data --keyfile secure_boot_signing_key2.pem --version 2 --apend_signatures -o my-app-signed.bin my-app-signed.bin
|
||||
|
||||
The same process can be repeated for the third key.
|
||||
|
||||
The signatures attached to a binary can be checked by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espsecure.py signature_info_v2 bootloader-signed.bin
|
||||
|
||||
The above files along with other binaries (e.g. partition table) can then be flashed to their respective offset using ``esptool.py``. To see all of the command line options recommended for ``esptool.py``, see the output printed when ``idf.py build`` succeeds. The flash offset for your firmware can be obtained by checking the partition table entry or by running ``idf.py partition-table``.
|
||||
|
||||
7. Burn relevant eFuses.
|
||||
|
||||
A) Burn security eFuses:
|
||||
|
||||
.. important::
|
||||
|
||||
For production use cases, it is highly recommended to burn all the eFuses listed below.
|
||||
|
||||
.. list::
|
||||
|
||||
:esp32: - ``JTAG_DISABLE``: Disable the JTAG
|
||||
:SOC_EFUSE_DIS_BOOT_REMAP: - ``DIS_BOOT_REMAP``: Disable capability to Remap ROM to RAM address space
|
||||
:SOC_EFUSE_HARD_DIS_JTAG: - ``HARD_DIS_JTAG``: Hard disable JTAG peripheral
|
||||
:SOC_EFUSE_SOFT_DIS_JTAG: - ``SOFT_DIS_JTAG``: Disable software access to JTAG peripheral
|
||||
:SOC_EFUSE_DIS_DIRECT_BOOT:- ``DIS_DIRECT_BOOT``: Disable direct boot (legacy SPI boot mode)
|
||||
:SOC_EFUSE_DIS_LEGACY_SPI_BOOT: - ``DIS_LEGACY_SPI_BOOT``: Disable legacy SPI boot mode
|
||||
:SOC_EFUSE_DIS_USB_JTAG: - ``DIS_USB_JTAG``: Disable USB switch to JTAG
|
||||
:SOC_EFUSE_DIS_PAD_JTAG: - ``DIS_PAD_JTAG``: Disable JTAG permanently
|
||||
:SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS: - ``SECURE_BOOT_AGGRESSIVE_REVOKE``: Aggressive revocation of key digests, see :ref:`secure-boot-v2-aggressive-key-revocation` for more details.
|
||||
|
||||
The respective eFuses can be burned by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py burn_efuse --port PORT EFUSE_NAME 0x1
|
||||
|
||||
.. note:: Please update the EFUSE_NAME with the eFuse that you need to burn. Multiple eFuses can be burned at the same time by appending them to the above command (e.g., EFUSE_NAME VAL EFUSE_NAME2 VAL2). More documentation about `espefuse.py` can be found `here <https://docs.espressif.com/projects/esptool/en/latest/esp32/espefuse/index.html>`_
|
||||
|
||||
B) Secure Boot V2 related eFuses:
|
||||
|
||||
i) Disable ability for read protection:
|
||||
|
||||
The secure boot digest burned in the eFuse must be kept readable otherwise secure boot operation would result in a failure. To prevent the accidental enabling of read protection for this key block we need to burn following eFuse:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py -p $ESPPORT write_protect_efuse RD_DIS
|
||||
|
||||
.. important::
|
||||
|
||||
After this eFuse has been burned, read protection cannot be enabled for any key. E.g., if Flash Encryption which requires read protection for its key is not enabled at this point then it cannot be enabled afterwards. Please ensure that no efuse keys are going to need read protection after this.
|
||||
|
||||
|
||||
.. only:: SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS
|
||||
|
||||
ii) Revoke key digests:
|
||||
|
||||
The unused digest slots need to be revoked when we are burning the secure boot key. The respective slots can be revoked by running
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT --chip {IDF_TARGET_PATH_NAME} burn_efuse EFUSE_REVOKE_BIT
|
||||
|
||||
The ``EFUSE_REVOKE_BIT`` in the above command can be ``SECURE_BOOT_KEY_REVOKE0`` or ``SECURE_BOOT_KEY_REVOKE1`` or ``SECURE_BOOT_KEY_REVOKE2``. Please note that only the unused key digests must be revoked. Once reovked, the respective digest cannot be used again.
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
C) Disable UART ROM DL mode:
|
||||
|
||||
.. only:: not esp32
|
||||
|
||||
C) Enable Security Download mode:
|
||||
|
||||
|
||||
.. warning::
|
||||
|
||||
Please burn the following bit at the very end. After this bit is burned, the espefuse tool can no longer be used to burn additional eFuses.
|
||||
|
||||
.. list::
|
||||
|
||||
:esp32: - ``UART_DOWNLOAD_DIS`` : Disable the UART ROM Download mode.
|
||||
:not esp32: - ``ENABLE_SECURITY_DOWNLOAD``: Enable Secure ROM download mode
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
The eFuse can be burned by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT burn_efuse UART_DOWNLOAD_DIS
|
||||
|
||||
.. only:: not esp32
|
||||
|
||||
The eFuse can be burned by running:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
espefuse.py --port PORT burn_efuse ENABLE_SECURITY_DOWNLOAD
|
||||
|
||||
Secure Boot V2 Guidelines
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* It is recommended to store the Secure boot key at a highly secure place. A physical or a cloud HSM may be used for secure storage of the Secure Boot Private key. Please take a look at :ref:`remote-sign-v2-image` for more details.
|
||||
|
||||
.. only:: SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS
|
||||
|
||||
* It is recommended to use all the available digest slots to reduce dependency on a single private key.
|
||||
|
||||
|
||||
|
@@ -554,6 +554,8 @@ Secure Boot Best Practices
|
||||
|
||||
* A similar approach can also be used to physically re-flash with a new key. For physical re-flashing, the bootloader content can also be changed at the same time.
|
||||
|
||||
.. _secure-boot-v2-aggressive-key-revocation:
|
||||
|
||||
Aggressive approach:
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
Reference in New Issue
Block a user