|  | --- | 
|  | title: "Ownership Transfer" | 
|  | --- | 
|  |  | 
|  | ## Overview | 
|  |  | 
|  | The Silicon Owner is defined as a logical entity or entities allowed to sign | 
|  | code for execution, as well as to sign ownership management commands[^1]. | 
|  | OpenTitan supports the following device life cycle states to manage the | 
|  | ownership state of the device: | 
|  |  | 
|  | *   _UNLOCKED_OWNERSHIP_: The device is ready to be assigned to a new owner. | 
|  | *   _LOCKED_OWNERSHIP_: The device is assigned to an owner and in operational mode. | 
|  |  | 
|  | This document defines the ownership management functions that control the | 
|  | transitions between ownership states: | 
|  |  | 
|  | ### Unlock Ownership {#unlock-ownership-top} | 
|  |  | 
|  | Implements transition from `LOCKED_OWNERSHIP` to `UNLOCKED_OWNERSHIP` state. The device must be in | 
|  | `UNLOCKED_OWNERSHIP` state before it can be assigned to a new owner. | 
|  |  | 
|  | ### Ownership Transfer (or Ownership Assignment) {#ownership-transfer-top} | 
|  |  | 
|  | Implements transition from `UNLOCKED_OWNERSHIP` to `LOCKED_OWNERSHIP` stage. The rest of this document | 
|  | refers to this functionality as Ownership Transfer. | 
|  |  | 
|  | ## Owner Keys {#owner-keys} | 
|  |  | 
|  | The following keys are provisioned as part of this flow. | 
|  |  | 
|  | ### CODE_SIGN | 
|  |  | 
|  | *   **Description**: Used to verify the Silicon Owner first bootloader stage. | 
|  | *   **Key Type**: RSA-3072 public key with exponent F4. | 
|  |  | 
|  | ### UNLOCK | 
|  |  | 
|  | *   **Description**: Used to authenticate the Unlock Ownership payload. | 
|  | *   **Key Type**: ECC NIST-P256 Curve. | 
|  |  | 
|  | ### NEXT_OWNER | 
|  |  | 
|  | *   **Description**: Used to authenticate the Ownership Transfer payload. | 
|  | *   **Key Type**: ECC NIST-P256 Curve. | 
|  |  | 
|  | The `UNLOCK` and `NEXT_OWNER` keys are required to ensure ownership state | 
|  | transitions are only triggered by authenticated and authorized commands. | 
|  | Authorization is implemented via key identification (`UNLOCK` versus | 
|  | `NEXT_OWNER`). | 
|  |  | 
|  | <!-- TODO: Add link to Identities and Root Keys doc --> | 
|  |  | 
|  | Transition into `LOCKED_OWNERSHIP` stage results in a new device [Owner Identity](#), used | 
|  | in attestation and post-ownership-transfer application provisioning flows. | 
|  |  | 
|  | There are three modes of ownership transfer supported: | 
|  |  | 
|  | *   **Silicon Creator endorses Next Owner**: The Silicon Creator signs the set | 
|  | of public keys associated with the next owner as part of the ownership | 
|  | transfer flow. | 
|  | *   **Current Owner endorses Next Owner**: The Current Owner signs the set of | 
|  | keys associated with the next owner as part of the ownership transfer flow. | 
|  | *   **Fixed Owner**: In this case a single owner is provisioned on the device | 
|  | and ownership transfer is disabled via manufacturing SKU configuration. | 
|  |  | 
|  | ## Terminology | 
|  |  | 
|  | Boot stages: | 
|  |  | 
|  | *   `ROM`: Metal ROM, sometimes known as Boot ROM. | 
|  | *   `ROM_EXT`: ROM Extension. Stored in flash and signed by the Silicon Creator. | 
|  | *   Owner boot stages. This document uses two stages as an example. The Silicon | 
|  | Owner is free to choose other boot configurations. | 
|  | *   `BL0`: Bootloader. Signed by the Silicon Owner. | 
|  | *   `KERNEL`: Signed by the Silicon Owner. | 
|  |  | 
|  | ## Key Provisioning {#key-provisioning} | 
|  |  | 
|  | As part of the Ownership Transfer flow, the Silicon Owner keys are endorsed | 
|  | either by the Silicon Creator or by the Current Owner of the device. This is | 
|  | done to ensure that only authenticated and authorized entities are able to take | 
|  | ownership of the device. | 
|  |  | 
|  | ### Key Endorsement Format | 
|  |  | 
|  | Key endorsement is implemented as a signed manifest. The rest of the document | 
|  | refers to this as the Key Endorsement Manifest, or manifest for simplicity. The | 
|  | following fields must be supported by the manifest implementation: | 
|  |  | 
|  | #### signature | 
|  |  | 
|  | Signature covering the manifest. | 
|  |  | 
|  | #### signature_algorithm | 
|  |  | 
|  | Signature algorithm. For this version of the specification it is always set | 
|  | to `ECDSA-sha256`. | 
|  |  | 
|  | #### public_key | 
|  |  | 
|  | Public key to verify the signature with. The number of bytes depends on the | 
|  | `signature_algorithm` field. Depending on the ownership transfer model, the | 
|  | public key must match one of the following requirements: | 
|  |  | 
|  | Endorsing Entity | Public Key Requirement | 
|  | ---------------- | -------------------------------------------------------- | 
|  | Silicon Creator  | The public key must be stored in the ROM_EXT and  integrity protected by the ROM_EXT signature. | 
|  | Previous Owner   | The public key must be stored in the previous owner slot and labeled as the `NEXT_OWNER` in the policy field. See `owner_keys` for more details. | 
|  |  | 
|  | #### owner_keys (array) | 
|  |  | 
|  | List of public keys endorsed by the manifest. See [Owner Keys](#owner-keys) for | 
|  | more details. | 
|  |  | 
|  | #### Optional Parameters | 
|  |  | 
|  | The following parameters are required in the secure boot manifest | 
|  | implementation, but are left as optional in the key endorsement manifest. The | 
|  | Silicon Creator or previous Silicon Owner may want to implement these parameters | 
|  | to restrict the deployment of the endorsed keys. | 
|  |  | 
|  | Note: If implemented, the restrictions imposed by these fields cannot be revoked | 
|  | by ownership transfer once provisioned. This is to simplify the implementation | 
|  | of an open samples policy. | 
|  |  | 
|  | ##### otp_settings | 
|  |  | 
|  | Minimum list of fuses that must match the device configuration before committing | 
|  | the endorsed keys to flash. The hash of the list of targeted fuse values is | 
|  | hashed with the endorsement manifest before signing. | 
|  |  | 
|  | Note: The device identifier fuses can be added to the `otp_settings` to restrict | 
|  | the keys to be used with a single device. This mode of operation is referred to | 
|  | as node-locked secure boot configuration. | 
|  |  | 
|  | ### Device Key Provisioning Flow | 
|  |  | 
|  | The following figure shows the sequence of operations to commit the new set of | 
|  | keys once the key endorsement manifest has been verified. | 
|  |  | 
|  | Definitions: | 
|  |  | 
|  | *   `slot`: Owner slot. This implementation assumes that there are only 2 owner | 
|  | slots, so the only valid values are 0 and 1. | 
|  | *   `id`: The owner assignment identifier. It is implemented as a monotonically | 
|  | increasing counter. The new owner id is equivalent to N + 1 for a previous | 
|  | owner id of N. | 
|  | *   `pub_keys`: List of keys associated with the owner slot. Includes key policy | 
|  | information. | 
|  | *   `digest`: Integrity of the owner slot record calculated as `MAC(Kn, | 
|  | slot|id|pub_keys)`. The key (`Kn`) requirements are described later in more | 
|  | detail. | 
|  |  | 
|  | <table> | 
|  | <tr> | 
|  | <td> | 
|  | <!-- | 
|  | svgs are made in google docs, and can be found here: | 
|  | https://docs.google.com/drawings/d/1hnC2EgkYpkxhVJ6I0prxdoQbglstqfwxvBYh_JIt8TA/edit?usp=sharing | 
|  | --> | 
|  | <img src="ownership_transfer_fig1.svg" width="900" alt="fig1"> | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Figure: Provisioning sequence versus owner slots.</td> | 
|  | </tr> | 
|  | </table> | 
|  |  | 
|  | Detailed description: | 
|  |  | 
|  | **Step 1 (S1) Initial State** | 
|  |  | 
|  | The current owner is stored in slot 0 and the device is in unlocked ownership | 
|  | state. A key stored in the current owner slot (0) is used to validate the key | 
|  | endorsement manifest for the next owner. | 
|  |  | 
|  | **Step 2 (S2) Intermediate State** | 
|  |  | 
|  | The new owner keys are written into the available owner slot - in this case slot | 
|  | one. The `pub_keys` and `digest` parameters are written before the `id`. Once the | 
|  | `id`is written into flash, the new owner slot entry is considered to be valid. | 
|  |  | 
|  | The `id` parameter must be strictly greater than the previous owner `id`. | 
|  |  | 
|  | **Step 3 (S3) Final State** | 
|  |  | 
|  | An additional integrity check over the new owner slot is performed before | 
|  | completing provisioning of the new owner keys. Upon successful verification, the | 
|  | new owner is marked as the current owner by deleting the `id` of the previous | 
|  | owner. The `pub_keys` of the previous owner may be deleted as well as part of | 
|  | this step. | 
|  |  | 
|  | #### Integrity Key (Kn, Kn+1) | 
|  |  | 
|  | Integrity keys are used to implement integrity checks for each owner slot. The | 
|  | integrity key has the following requirements: | 
|  |  | 
|  | *   IK_REQ1: The key shall be unique per owner slot and ownership configuration. | 
|  | *   IK_REQ2: The key can only be computed by a trusted `ROM_EXT` boot | 
|  | configuration. | 
|  | *   IK_REQ3: The key only available to the `ROM`/`ROM_EXT`. | 
|  |  | 
|  | These requirements can be achieved by a combination of physical security and | 
|  | cryptographic guarantees. The following example demonstrates how to derive the | 
|  | Integrity Key from a symmetric key stored in OTP and only available to | 
|  | `ROM`/`ROM_EXT` software. | 
|  |  | 
|  | ##### Key Step Function - MAC | 
|  |  | 
|  | This approach relies on a symmetric secret (`K`) managed by the `ROM`/`ROM_EXT` | 
|  | software. It is intended to mitigate boot time issues associated with consuming | 
|  | `K` directly from the key manager. | 
|  |  | 
|  | Parameters: | 
|  |  | 
|  | *   `K`: Device integrity secret provisioned at manufacturing time. Only visible | 
|  | to ROM and ROM_EXT software. Stored in OTP. | 
|  | *   `slot`: Owner slot. This implementation assumes that there are only 2 owner | 
|  | slots, so the only valid values are 0 and 1. This parameter is used to make | 
|  | sure the key cannot be reused to verify the other slot. | 
|  | *   `n`: The owner assignment identifier. It is implemented as a monotonically | 
|  | increasing counter. It is used here to bind the key to the owner identifier. | 
|  | *   `prev_owner_digest`: (Under consideration) Digest of the previous owner | 
|  | (e.g. `id = n - 1`). Used to bind the key to the custody chain (chain of | 
|  | owners). | 
|  |  | 
|  | Function: `MAC` is an OpenTitan approved MAC function. | 
|  |  | 
|  | ``` | 
|  | Kn = MAC(K, "OwnerSlot" | slot | n | prev_owner_digest) | 
|  | ``` | 
|  |  | 
|  | The slot and n values are used to fulfill the IK_REQ1 requirement. The | 
|  | availability of `K` is enforced by software to fulfill IK_REQ2 and IK_REQ3. | 
|  | `prev_owner_digest` is under consideration to bind the key to the custody chain | 
|  | (chain of ownership). | 
|  |  | 
|  | #### Additional Requirements | 
|  |  | 
|  | **Key Manager Availability** | 
|  |  | 
|  | The `ROM_EXT` is required to disable the key manager before handing over | 
|  | execution to the next boot stage when the device is in device | 
|  | `UNLOCKED_OWNERSHIP` | 
|  | ownership state. | 
|  |  | 
|  | **Manufacturing Requirements** | 
|  |  | 
|  | Determine if the `prev_owner_digest` field must be initialized with non-zero | 
|  | value at manufacturing time. | 
|  |  | 
|  | ## OpenTitan Device Mode | 
|  |  | 
|  | A host can send unlock ownership and ownership transfer commands to OpenTitan | 
|  | via any physical interface supported by the `ROM_EXT`. The details of the | 
|  | command transport layer protocol, as well as the list of supported physical | 
|  | devices are left to the reference software implementation. | 
|  |  | 
|  | However, there must be at least one mechanism available to perform ownership | 
|  | transfer at manufacturing time using an implementation compatible with ATE[^2] | 
|  | infrastructure. | 
|  |  | 
|  | ### Unlock Ownership {#unlock-ownership} | 
|  |  | 
|  | This flow implements transition from `LOCKED_OWNERSHIP` to `UNLOCKED_OWNERSHIP` states. It | 
|  | is used by the Silicon Owner to relinquish ownership of the device and enable | 
|  | ownership transfer functionality. The device must be in `UNLOCKED_OWNERSHIP` state before | 
|  | it can be assigned to a new owner. | 
|  |  | 
|  | The unlock operation is implemented as a signed command sent from the | 
|  | Kernel/Application layer to the `ROM_EXT`. The signature is required to allow | 
|  | the current owner to only allow authenticated and authorized users access to the | 
|  | unlock ownership flow. | 
|  |  | 
|  | The following fields must be supported by the command: | 
|  |  | 
|  | #### signature | 
|  |  | 
|  | Signature covering the command structure. The signature is verified using the | 
|  | `UNLOCK` key stored in the active owner slot. | 
|  |  | 
|  | #### unlock_nonce | 
|  |  | 
|  | Ownership-unlock nonce value, which is generated at the time the current owner | 
|  | first took ownership of the device. | 
|  |  | 
|  | *   The nonce is expected to be unique per device and ownership assignment. | 
|  | *   The nonce is stored to make the unlock command re-triable (and fault | 
|  | tolerant). | 
|  | *   The nonce may be readable from any boot stage to simplify the unlock | 
|  | operation. | 
|  |  | 
|  | #### flags | 
|  |  | 
|  | Additional flags passed to the `ROM_EXT` to configure unlock flow settings: | 
|  |  | 
|  | *   `WIPE_FLASH`: Erase owner flash contents on successful unlock operation. | 
|  |  | 
|  | <strong>Example</strong> | 
|  |  | 
|  | The following sequence diagram shows a reference implementation of the unlock | 
|  | flow. Error handling is omitted for simplicity. | 
|  |  | 
|  | <table> | 
|  | <tr> | 
|  | <td> | 
|  | <img src="ownership_transfer_fig2.svg" width="900" alt="fig2" > | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Figure: Device unlock</td> | 
|  | </tr> | 
|  | </table> | 
|  |  | 
|  | Detailed description: | 
|  |  | 
|  | **Step 1 (S1) Get unlock nonce and device id**: The Host queries the device | 
|  | identifier and unlock nonce from the device. | 
|  |  | 
|  | **Steps 2-4 (S2, S3, S4) Request unlock command signature**: The Host requests | 
|  | the Device Registry service to sign the unlock ownership command for the device | 
|  | id with provided nonce. The Device Registry requests a cloud key manager service | 
|  | to sign the command with a key associated with the device identifier. The | 
|  | signature must be verifiable with the `UNLOCK` key stored in the active owner | 
|  | slot. | 
|  |  | 
|  | **Step 5 (S5) Request device unlock**: The Host sends the unlock ownership | 
|  | command to the Device. The command is first handled by the Kernel/APP layer. | 
|  |  | 
|  | **Step 6 (S6) Pre-unlock steps**: The Kernel/APP layer may verify the unlock | 
|  | command and execute any pre-unlock steps, including erasing owner level secrets. | 
|  |  | 
|  | **Step 7 (S7) Request device unlock**: The Kernel copies the unlock command to a | 
|  | boot services memory region shared with the `ROM_EXT`, and performs a reset to | 
|  | trigger the unlock operation on the next boot. | 
|  |  | 
|  | **Step 8 (S8) Unlock steps**: The `ROM_EXT` verifies the unlock command and | 
|  | updates the device state to `UNLOCKED_OWNERSHIP` state. The Device proceeds with the boot | 
|  | flow and reports the unlock result to the kernel via shared memory. | 
|  |  | 
|  | **Step 9 (S9) Unlock result**: The unlock result is first propagated to the | 
|  | Device Kernel/APP layer. The Kernel may opt to execute any post-unlock steps | 
|  | before propagating the result to the Host. The Host propagates the unlock result | 
|  | to the Device Registry. The Device Registry may opt to remove the device from | 
|  | its allow-list. | 
|  |  | 
|  | ### Ownership Transfer {#ownership-transfer-device} | 
|  |  | 
|  | An ownership transfer command sent by a host to OpenTitan, is serviced by the | 
|  | ROM extension (`ROM_EXT`) allowing the Silicon Owner to take ownership of the | 
|  | device at silicon manufacture, Contract Manufacturing (CM) stage or in the | 
|  | field. | 
|  |  | 
|  | <table> | 
|  | <tr> | 
|  | <td> | 
|  | <img src="ownership_transfer_fig3.svg" width="300" alt="fig3" > | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Figure: Ownership Transfer supported by ROM_EXT</td> | 
|  | </tr> | 
|  | </table> | 
|  |  | 
|  | <table> | 
|  | <tr> | 
|  | <td><strong>Step</strong></td> | 
|  | <td><strong>Description</strong></td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>UNLOCKED_OWNERSHIP state</td> | 
|  | <td> | 
|  |  | 
|  | Entry into the ownership transfer flow is conditional to the device being in | 
|  | `UNLOCKED_OWNERSHIP` state. See [Unlock Flow](#unlock-ownership) for more details on how | 
|  | to transition from LOCKED_OWNERSHIP to UNLOCKED_OWNERSHIP states. | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Verify payload header</td> | 
|  | <td> | 
|  |  | 
|  | The ownership transfer payload header including the key endorsement manifest is | 
|  | verified by the ROM extension. The *header shall fit within available SRAM* and | 
|  | be signed by an approved key as described in the | 
|  | [Key Provisioning](#key-provisioning) section. | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Flash erase</td> | 
|  | <td> | 
|  |  | 
|  | Code, data and info pages available to the Silicon Owner are erased. Erase | 
|  | checks are performed. | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Reset secrets</td> | 
|  | <td> | 
|  | <!-- TODO: Link to Identities and Root Keys document --> | 
|  |  | 
|  | The [OwnerRootSecret](#) is reset with a value extracted from a DRBG configured | 
|  | with a security strength equivalent to one supported by the key manager. | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Rotate unlock nonce</td> | 
|  | <td> | 
|  |  | 
|  | A 64bit random value is extracted from the DRBG to be used as an unlock nonce. | 
|  | See [Unlock Flow](#unlock-flow) for more details. | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Provision owner keys</td> | 
|  | <td> | 
|  |  | 
|  | Owner keys are provisioned into the device as defined in the | 
|  | [Key Provisioning](#key-provisioning) section. | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Flash image</td> | 
|  | <td>Owner software is written into one of the flash partitions.</td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Activate owner</td> | 
|  | <td> | 
|  |  | 
|  | Owner software sends a command to the `ROM_EXT` to complete ownership transfer, | 
|  | which effectively sets the new owner as the current owner. | 
|  | </td> | 
|  | </tr> | 
|  | </table> | 
|  |  | 
|  | ## OpenTitan Host Mode | 
|  |  | 
|  | Some of the OpenTitan use cases require support for self updates in which | 
|  | OpenTitan is used in host mode to scan an external device interface for update | 
|  | payloads. This section describes Ownership Transfer layered on top of such self | 
|  | update mechanism. | 
|  |  | 
|  | An OpenTitan implementation may support this ownership transfer model at the SKU | 
|  | level. | 
|  |  | 
|  | ### Unlock Ownership | 
|  |  | 
|  | The Device is initially in `LOCKED_OWNERSHIP` state and configured with a stack signed by | 
|  | the current owner. The following steps must be implemented in a fault tolerant | 
|  | way: | 
|  |  | 
|  | 1.  The Device is updated to a stack able to support the ownership transfer | 
|  | implementation as described in the next section. The owner may opt for | 
|  | clearing any device secrets as part of this step. | 
|  | 2.  Ownership unlock is performed as described in the OpenTitan device mode | 
|  | [Unlock Flow](#unlock-flow) section. | 
|  |  | 
|  | ### Ownership Transfer | 
|  |  | 
|  | In this section, SPI EEPROM is used as the target device. However, the | 
|  | implementation may opt for supporting other targets. | 
|  |  | 
|  | The Device is initially in `UNLOCKED_OWNERSHIP` state and configured with a stack (Kernel + | 
|  | APPs) able to scan an external SPI EEPROM and trigger the ownership transfer | 
|  | flow. The following procedure also assumes that the Device storage follows the | 
|  | internal [flash layout](#flash-layout) guidelines. | 
|  |  | 
|  | The process must be implemented in a fault tolerant manner to be able to restart | 
|  | the process to recover from a failed attempt. | 
|  |  | 
|  | Detailed steps: | 
|  |  | 
|  | 1.  The current owner endorses the next owner keys as described in the | 
|  | [Key Endorsement](#key-endorsement) section. | 
|  | 2.  The next owner writes the key endorsement manifest to the external EEPROM | 
|  | followed by an update payload. The update payload includes all the silicon | 
|  | owner boot stages. | 
|  | 3.  The Device kernel module or application in charge of performing ownership | 
|  | transfer, referred to as _the application_, is activated upon detecting the | 
|  | `UNLOCKED_OWNERSHIP` state at Device boot time. | 
|  | 4.  The application scans the external EEPROM for a valid key endorsement | 
|  | manifest and update payload. The key endorsement manifest is validated with | 
|  | the current owner’s `NEXT_OWNER` key. The update payload is validated with | 
|  | one of the `CODE_SIGN` keys embedded in the key endorsement manifest. | 
|  | 5.  The application writes the inactive embedded flash code partitions with the | 
|  | ones included in the update payload. | 
|  | *   Note: In order to avoid a BL0 (bootloader) fixed flash size allocation | 
|  | across all owners, the implementation may opt to support the following: | 
|  | 1.  The boot flow will give preference to the next boot stage residing | 
|  | in the same flash bank if both A and B versions are the same. | 
|  | 2.  The A/B flash layout may contain two identical copies of the stack | 
|  | at the start of the process to make sure it is possible to boot from | 
|  | a single flash bank. | 
|  | 6.  The application loads the key endorsement manifest into the boot services | 
|  | shared memory region and triggers a reset to perform ownership transfer on | 
|  | the next boot cycle. | 
|  | 7.  The `ROM_EXT` executes the ownership transfer flow described in the | 
|  | [Ownership Transfer](#ownership-transfer-device) section with the following | 
|  | differences: | 
|  | 1.  Flash erase and flash image stages are not executed. | 
|  | 2.  The activate owner stage may be delayed and executed later depending on | 
|  | the implementation. | 
|  | 8.  The `ROM_EXT` attempts to boot the new owner image with the new owner | 
|  | configuration. | 
|  | 9.  On the first boot, the new owner image queues an activate owner command, | 
|  | which is then executed by the `ROM_EXT` on the next boot. The new owner | 
|  | becomes the current owner. | 
|  | 10. The previous owner code partitions can be erased at this point. | 
|  | 11. Device attestation can be performed after this point. | 
|  |  | 
|  | ## Ownership Transfer Disabled | 
|  |  | 
|  | Ownership Transfer can be disabled at the SKU level. In this case secure boot is | 
|  | implemented by storing the Silicon Owner BL0 verification keys in the `ROM_EXT`. | 
|  | The `ROM_EXT` is thus not required to implement ownership transfer in this | 
|  | configuration. | 
|  |  | 
|  | ## Flash Layout {#flash-layout} | 
|  |  | 
|  | To simplify the implementation, the flash layout implements fixed offset and | 
|  | size allocations for the `ROM_EXT` and the certificate storage regions. This | 
|  | allows the flash erase and write operations to be performed at deterministic | 
|  | address ranges. | 
|  |  | 
|  | The implementation may opt to store the certificates in info regions to save | 
|  | data partition space. | 
|  |  | 
|  | <table> | 
|  | <tr> | 
|  | <td> | 
|  | <img src="ownership_transfer_fig4.svg" width="900" alt="fig4" > | 
|  | </td> | 
|  | </tr> | 
|  | <tr> | 
|  | <td>Figure: Flash layout</td> | 
|  | </tr> | 
|  | </table> | 
|  |  | 
|  | `owner_slot_0` and `owner_slot_1` are used to store the Silicon Owner keys as | 
|  | described in the [Key Provisioning](#key-provisioning) section. | 
|  |  | 
|  | ## Attestation Update | 
|  |  | 
|  | <!-- TODO: Link to Attestation specification document --> | 
|  |  | 
|  | Regular attestation updates as described in the [Attestation](#) specification | 
|  | are available when the device has an active owner. Devices in | 
|  | `UNLOCKED_OWNERSHIP` state may have restricted attestation capabilities, for example, | 
|  | restricted to only end-to-end attestation. | 
|  |  | 
|  | ## Ownership Transfer During Manufacturing | 
|  |  | 
|  | Manufacturing shall not preclude the implementation of the following default | 
|  | stack configurations: | 
|  |  | 
|  | <!-- TODO: Update links to device life cycle specification doc.  --> | 
|  |  | 
|  | *   [`LOCKED_OWNERSHIP`](#) state with default factory image. | 
|  | *   [`UNLOCKED_OWNERSHIP`](#) state with default factory image. | 
|  | *   [`LOCKED_OWNERSHIP`](#) state with default factory image and Ownership Transfer | 
|  | disabled. | 
|  |  | 
|  | Factory software may be used to configure the ownership slots before injecting | 
|  | the factory image. | 
|  |  | 
|  | <!-- Footnotes themselves at the bottom. --> | 
|  |  | 
|  | ## Notes | 
|  |  | 
|  | [^1]: https://docs.opentitan.org/doc/security/logical_security_model/#silicon-owner | 
|  |  | 
|  | [^2]: Automatic Test Equipment used at package level testing. |