From 0a512a7e922552255eddbab3a301e7a3126679ab Mon Sep 17 00:00:00 2001 From: steph-morton <143441730+steph-morton@users.noreply.github.com> Date: Tue, 21 Nov 2023 15:31:17 -0800 Subject: [PATCH] initial markdown conversion of hardware spec --- docs/CaliptraHardwareSpecification.md | 1536 ++++++++++++++++++++ docs/images/Caliptra_eq_CLKDIV.png | Bin 0 -> 12508 bytes docs/images/Caliptra_eq_NCO.png | Bin 0 -> 11540 bytes docs/images/Caliptra_eq_SPI_clk_period.png | Bin 0 -> 11100 bytes docs/images/Caliptra_eq_UART.png | Bin 0 -> 16363 bytes docs/images/Caliptra_eq_UART2.png | Bin 0 -> 12410 bytes 6 files changed, 1536 insertions(+) create mode 100644 docs/CaliptraHardwareSpecification.md create mode 100644 docs/images/Caliptra_eq_CLKDIV.png create mode 100644 docs/images/Caliptra_eq_NCO.png create mode 100644 docs/images/Caliptra_eq_SPI_clk_period.png create mode 100644 docs/images/Caliptra_eq_UART.png create mode 100644 docs/images/Caliptra_eq_UART2.png diff --git a/docs/CaliptraHardwareSpecification.md b/docs/CaliptraHardwareSpecification.md new file mode 100644 index 000000000..55f9068bc --- /dev/null +++ b/docs/CaliptraHardwareSpecification.md @@ -0,0 +1,1536 @@ +![OCP Logo](./images/OCP_logo.png) + +

Caliptra Hardware Specification

+ +

Version 0.5

+ +
+ +# Scope + +This document defines technical specifications for a Caliptra RoT for Measurement (RTM)[1] cryptographic subsystem used in the Open Compute Project (OCP). This document, along with [Caliptra: A Datacenter System on a Chip (SoC) Root of Trust (RoT)](https://chipsalliance.github.io/Caliptra/doc/Caliptra.html), shall comprise the Caliptra technical specification. + +# Overview + +This document provides definitions and requirements for a Caliptra cryptographic subsystem. The document then relates these definitions to existing technologies, enabling device and platform vendors to better understand those technologies in trusted computing terms. + +# Caliptra Core + +The following figure shows the Caliptra Core. + +*Figure 1: Caliptra Block Diagram* + +TODO: add figures + +## Boot FSM + +The Boot FSM detects that the SoC is bringing Caliptra out of reset. Part of this flow involves signaling to the SoC that Caliptra is awake and ready for fuses. After fuses are populated and the SoC indicates that it is done downloading fuses, Caliptra can wake up the rest of the IP by de-asserting the internal reset. + +The following figure shows the initial power-on arc of the Mailbox Boot FSM. + +*Figure 2: Mailbox Boot FSM state diagram* + +The Boot FSM first waits for the SoC to assert cptra\_pwrgood and de-assert cptra\_rst\_b. In the BOOT\_FUSE state, Caliptra signals to the SoC that it is ready for fuses. After the SoC is done writing fuses, it sets the fuse done register and the FSM advances to BOOT\_DONE. + +BOOT\_DONE enables Caliptra reset de-assertion through a two flip-flop synchronizer. + +## FW update reset (Impactless FW update) + +Runtime FW updates write to fw\_update\_reset register to trigger the FW update reset. When this register is written, only the RISC-V core is reset using cptra\_uc\_fw\_rst\_b pin and all AHB slaves are still active. All registers within the slaves and ICCM/DCCM memories are intact after the reset. Since ICCM is locked during runtime, it must be unlocked after the RISC-V reset is asserted. Reset is deasserted synchronously after a programmable number of cycles (currently set to 5 clocks) and normal boot flow updates the ICCM with the new FW from the mailbox SRAM. Reset de-assertion is done through a two flip-flop synchronizer. The boot flow is modified as shown in the following figure. + +*Figure 3: Mailbox Boot FSM state diagram for FW update reset* + +After Caliptra comes out of global reset and enters the BOOT\_DONE state, a write to the fw\_update\_reset register triggers the FW update reset flow. In the BOOT\_FWRST state, only the reset to the VeeR core is asserted, ICCM is unlocked and the timer is initialized. After the timer expires, the FSM advances from the BOOT\_WAIT to BOOT\_DONE state where the reset is deasserted. + +| Control register | Start address | Description | +| :------- | :---------- | :--------- | +| FW_UPDATE_RESET | 0x30030418 | Register to trigger the FW update reset flow. Setting it to 1 starts the Boot FSM. The field auto-clears to 0. | +| FW_UPDATE_RESET_WAIT_CYCLES | 0x3003041C | Programmable wait time to keep the microcontroller reset asserted. | + +## RISC-V core + +The RISC-V core is VeeR EL2 from CHIPS Alliance. It is a 32-bit CPU core that contains a 4-stage, scalar, in-order pipeline. The core supports RISC-V’s integer(I), compressed instruction(C), multiplication and division (M), instruction-fetch fence, CSR, and subset of bit manipulation instructions (Z) extensions. A link to the RISC-V VeeR EL2 Programmer’s Reference Manual is provided in the [References](#references) section. + +### Configuration + +The RISC-V core is highly configurable and has the following settings. + +| Parameter | Configuration | +| :---------------------- | :------------ | +| Interface | AHB-Lite | +| DCCM | 128 KiB | +| ICCM | 128 KiB | +| I-Cache | Disabled | +| Reset Vector | 0x00000000 | +| Fast Interrupt Redirect | Enabled | +| External Interrupts | 31 | + +### Embedded memory export + +Internal RISC-V SRAM memory components are exported from the Caliptra subsystem to support adaptation to various fabrication processes. For more information, see the [Caliptra Integration Specification](https://github.com/chipsalliance/caliptra-rtl/blob/main/docs/CaliptraIntegrationSpecification.md). + +#### Memory map address regions + +The 32-bit address region is subdivided into 16 fixed-sized, contiguous 256 MB regions. The following table describes the address mapping for each of the AHB devices that the RISC-V core interfaces with. + +| Subsystem | Address size | Start address | End address | +| :------------------ | :----------- | :------------ | :---------- | +| ROM | 48 KiB | 0x0000_0000 | 0x0000_BFFF | +| Cryptographic | 512 KiB | 0x1000_0000 | 0x1007_FFFF | +| Peripherals | 32 KiB | 0x2000_0000 | 0x2000_7FFF | +| SoC IFC | 256 KiB | 0x3000_0000 | 0x3003_FFFF | +| RISC-V Core ICCM | 128 KiB | 0x4000_0000 | 0x4001_FFFF | +| RISC-V Core DCCM | 128 KiB | 0x5000_0000 | 0x5001_FFFF | +| RISC-V MM CSR (PIC) | 256 MiB | 0x6000_0000 | 0x6FFF_FFFF | + +##### Cryptographic subsystem + +The following table shows the memory map address ranges for each of the IP blocks in the cryptographic subsystem. + +| IP/Peripheral | Slave \# | Address size | Start address | End address | +| :---------------------------------- | :------- | :----------- | :------------ | :---------- | +| Cryptographic Initialization Engine | 0 | 32 KiB | 0x1000_0000 | 0x1000_7FFF | +| ECC Secp384 | 1 | 32 KiB | 0x1000_8000 | 0x1000_FFFF | +| HMAC384 | 2 | 4 KiB | 0x1001_0000 | 0x1001_0FFF | +| Key Vault | 3 | 8 KiB | 0x1001_8000 | 0x1001_9FFF | +| PCR Vault | 4 | 8 KiB | 0x1001_A000 | 0x1001_BFFF | +| Data Vault | 5 | 8 KiB | 0x1001_C000 | 0x1001_DFFF | +| SHA512 | 6 | 32 KiB | 0x1002_0000 | 0x1002_7FFF | +| SHA256 | 13 | 32 KiB | 0x1002_8000 | 0x1002_FFFF | + +##### Peripherals subsystem + +The following table shows the memory map address ranges for each of the IP blocks in the peripherals’ subsystem. + +| IP/Peripheral | Slave \# | Address size | Start address | End address | +| :------------ | :------- | :----------- | :------------ | :---------- | +| QSPI | 7 | 4 KiB | 0x2000_0000 | 0x2000_0FFF | +| UART | 8 | 4 KiB | 0x2000_1000 | 0x2000_1FFF | +| CSRNG | 15 | 4 KiB | 0x2000_2000 | 0x2000_2FFF | +| ENTROPY SRC | 16 | 4 KiB | 0x2000_3000 | 0x2000_3FFF | + +##### SoC interface subsystem + +The following table shows the memory map address ranges for each of the IP blocks in the SoC interface subsystem. + +| IP/Peripheral | Slave \# | Address size | Start address | End address | +| :------------------------- | :------- | :----------- | :------------ | :---------- | +| Mailbox SRAM Direct Access | 10 | 128 KiB | 0x3000_0000 | 0x3001_FFFF | +| Mailbox CSR | 10 | 4 KiB | 0x3002_0000 | 0x3002_0FFF | +| SHA512 Accelerator CSR | 10 | 4 KiB | 0x3002_1000 | 0x3002_1FFF | +| Mailbox | 10 | 64 KiB | 0x3003_0000 | 0x3003_FFFF | + +##### RISC-V core local memory blocks + +The following table shows the memory map address ranges for each of the local memory blocks that interface with RISC-V core. + +| IP/Peripheral | Slave \# | Address size | Start address | End address | +| :-------------- | :------- | :----------- | :------------ | :---------- | +| ICCM0 (via DMA) | 12 | 128 KiB | 0x4000_0000 | 0x4001_FFFF | +| DCCM | 11 | 128 KiB | 0x5000_0000 | 0x5001_FFFF | + +#### Interrupts + +The VeeR-EL2 processor supports multiple types of interrupts, including non-maskable interrupts (NMI), software interrupts, timer interrupts, external interrupts, and local interrupts. Local interrupts are events not specified by the RISC-V standard, such as auxiliary timers and correctable errors. + +Caliptra uses NMI in conjunction with a watchdog timer to support fatal error recovery and system restart. For more information, see the [Watchdog timer](#watchdog-timer) section. + +Software and local interrupts are not implemented in the first generation of Caliptra. Standard RISC-V timer interrupts are implemented using the mtime and mtimecmp registers defined in the RISC-V Privileged Architecture Specification. Both mtime and mtimecmp are included in the soc\_ifc register bank, and are accessible by the internal microprocessor to facilitate precise timing tasks. Frequency for the timers is configured by the SoC using the dedicated timer configuration register, which satisfies the requirement prescribed in the RISC-V specification for such a mechanism. These timer registers drive the timer\_int pin into the internal microprocessor. + +##### Non-maskable interrupts + + 0p8 describe a register bank that may be used to dynamically configure the NMI reset vector. (i.e., where the PC resets to). + +##### External interrupts + +Caliptra uses the external interrupt feature to support event notification from all attached peripheral components in the subsystem. The RISC-V processor supports multiple priority levels (ranging from 1-15), which allows firmware to configure interrupt priority per component. + +Errors and notifications are allocated as interrupt events for each component, with error interrupts assigned a higher priority and expected to be infrequent. + +Notification interrupts are used to alert the processor of normal operation activity, such as completion of requested operations or arrival of SoC requests through the shared interface. + +Vector 0 is reserved by the RISC-V processor and may not be used, so vector assignment begins with Vector 1. Bit 0 of the interrupt port to the processor corresponds with Vector 1. + +| IP/Peripheral | Interrupt vector | Interrupt priority example
(Increasing, Max 15) | +| :-------------------------------------------------- | :--------------- | :---------------------------------------------- | +| Cryptographic Initialization Engine (Errors) | 1 | 8 | +| Cryptographic Initialization Engine (Notifications) | 2 | 7 | +| ECC (Errors) | 3 | 8 | +| ECC (Notifications) | 4 | 7 | +| HMAC (Errors) | 5 | 8 | +| HMAC (Notifications) | 6 | 7 | +| KeyVault (Errors) | 7 | 8 | +| KeyVault (Notifications) | 8 | 7 | +| SHA512 (Errors) | 9 | 8 | +| SHA512 (Notifications) | 10 | 7 | +| SHA256 (Errors) | 11 | 8 | +| SHA256 (Notifications) | 12 | 7 | +| QSPI (Errors) | 13 | 4 | +| QSPI (Notifications) | 14 | 3 | +| UART (Errors) | 15 | 4 | +| UART (Notifications) | 16 | 3 | +| RESERVED | 17 | 4 | +| RESERVED | 18 | 3 | +| Mailbox (Errors) | 19 | 8 | +| Mailbox (Notifications) | 20 | 7 | + +## Watchdog timer + +The primary function of Caliptra Watchdog Timer (WDT) is to reset the microcontroller (Caliptra), in the event of a software malfunction, by resetting the device if it has not been cleared in software. It is a two-stage timer, independent of the RISCV core. + +### Operation + +The WDT consists of two timers. When enabled in cascade mode (done by enabling Timer 1 alone), the WDT increments Timer 1 until the counter rolls over or times out. Typically, the timer is serviced at regular intervals to prevent it from overflowing or rolling over. If Timer 1 has not timed out, Timer 2 is disabled and held at its initial value. However, when Timer 1 does roll over, it triggers an error interrupt to the RISC-V core. In parallel, Timer 2 is enabled and begins counting. If the interrupt is serviced before Timer 2 times out, the timers are reset and continue to operate normally. If Timer 2 times out, it asserts an SoC fatal error and an NMI. The SoC fatal error is also captured in the CPTRA\_HW\_ERROR\_FATAL register, which can be cleared by the SoC by writing a 1. A warm reset is required by the SoC to reset the timers when Timer 2 times out. + +The WDT timers can be configured to operate independent of each other. When the enable register for Timer 2 is set, the default configuration of cascaded timers is disabled and both timers count independently of each other. In this case, a timeout on Timer 2 causes an error interrupt to the RISC-V core similar to Timer 1. Disabling Timer 2 configures the timers back into the default cascaded mode. + +Each timer has an enable bit, a restart bit, and a 64-bit timeout value register that can be programmed as needed. The restart bit is used to service the timers and restart counting. The timeout period registers can be configured to the desired upper bound of timers. + +If the WDT timers are disabled and then re-enabled with a new timeout period, they must be restarted by setting the appropriate control register (restart bit). If the timers are temporarily disabled and re-enabled with the same timeout period, they resume counting and do not restart from 0. + +For more details regarding the register interface to control the WDT, see the [register documentation](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs/?p=clp.soc_ifc_reg) published in the RTL GitHub repository. + +The following figure shows the two timers. + +*Figure 4: Caliptra Watchdog Timer* + +### Prescale settings + +Assuming a clock source of 500 MHz, a timeout value of 32’hFFFF\_FFFF results in a timeout period of ~8.5 seconds. Two 32-bit registers are provided for each timer, allowing a 64-bit timeout period to be programmed for each timer. This accommodates a maximum timeout value of over 1000 years for the same 500 Mhz clock source. + +### Microcontroller interface + +The Caliptra microcontroller communicates with the mailbox through its internal AHB-Lite fabric. + +#### AHB-lite interface + +AHB-lite is a subset of the full AHB specification. It is primarily used in single master systems. This interface connects VeeR EL2 Core (LSU master) to the slave devices as shown in Figure 1. + +The interface can be customized to support variable address and data widths, and a variable number of slave devices. Each slave device is assigned an address range within the 32-bit address memory map region. The interface includes address decoding logic to route data to the appropriate AHB slave device based on the address specified. + +The integration parameters for Caliptra’s AHB-lite interface are shown in the following table. + +| Parameter | Value | +| :------------ | :---- | +| ADDRESS_WIDTH | 32 | +| DATA_WIDTH | 64 | +| NUM_OF_SLAVES | 17 | + +Each IP component in the Caliptra system uses a native AHB data width of 32-bits (1 dword). The AHB responder logic in each IP component contains width conversion logic that transforms from the fabric data width of 64-bits to this native 32-bit width. The conversion involves calculating the dword offset (either 0 or 1) relative to the native 64-bit width by evaluating bit [2] of the address line. This information is used to extract the correct 32-bits from the native write data line. If there is a data offset, data is shifted down by 32-bits; otherwise, the upper 32-bits are simply truncated. This new dword-address is passed to the internal register interface along with the dword-sized data. A similar conversion works in reverse to correctly place read data in the response data line from the responder. + +As a result of this implementation, 64-bit data transfers are not supported on the Caliptra AHB fabric. Firmware running on the internal microprocessor may only access memory and registers using a 32-bit or smaller request size, as 64-bit transfer requests will be corrupted. + +### Cryptographic subsystem + +For details, see the [Cryptographic subsystem architecture](#cryptographic-subsystem-architecture) section. + +### Peripherals subsystem + +Caliptra includes QSPI and UART peripherals that are used to facilitate alternative operating modes and debug. In the first generation, Caliptra includes code to enable QSPI in the RTL, but does not support the BMI profile. Therefore, QSPI must not be enabled. Similarly, the UART interface exists to facilitate firmware debug in an FPGA prototype, but should be disabled in final silicon. SystemVerilog defines used to disable these peripherals are described in the [Caliptra Integration Specification](https://github.com/chipsalliance/caliptra-rtl/blob/main/docs/CaliptraIntegrationSpecification.md). Operation of these peripherals is described in the following sections. + +#### QSPI Flash Controller + +Caliptra implements a QSPI block that can communicate with 2 QSPI devices. This QSPI block is accessible to FW over the AHB-lite Interface. + +The QSPI block is composed of the spi\_host implementation. For information, see the [SPI\_HOST HWIP Technical Specification](https://opentitan.org/book/hw/ip/spi_host/index.html). The core code (see [spi\_host](https://github.com/lowRISC/opentitan/tree/master/hw/ip/spi_host)) is reused but the interface to the module is changed to AHB-lite and the number of chip select lines supported is increased to 2. The design provides support for Standard SPI, Dual SPI, or Quad SPI commands. The following figure shows the QSPI flash controller. + +*Figure 5: QSPI flash controller* + +#### Operation + +Transactions flow through the QSPI block starting with AHB-lite writes to the TXDATA FIFO. Commands are then written and processed by the control FSM, orchestrating transmissions from the TXDATA FIFO and receiving data into the RXDATA FIFO. + +The structure of a command depends on the device and the command itself. In the case of a standard SPI device, the host IP always transmits data on qspi\_d\_io[0] and always receives data from the target device on qspi\_d\_io[1]. In Dual or Quad modes, all data lines are bi-directional, thus allowing full bandwidth in transferring data across 4 data lines. + +A typical SPI command consists of different segments that are combined as shown in the following example. Each segment can configure the length, speed, and direction. As an example, the following SPI read transaction consists of 2 segments. + +*Figure 6: SPI read transaction segments* + +| Segment \# | Length (Bytes) | Speed | Direction | TXDATA FIFO | RXDATA FIFO | +| :--------- | :------------- | :------- | :---------------- | :----------- | :----------------- | +| 1 | 4 | standard | TX
qspi_d_io\[0\] | \[0\] 0x3 (ReadData)
\[1\] Addr\[23:16\]
\[2\] Addr\[15:8\]
\[3\] Addr\[7:0\] | | +| 2 | 1 | standard | RX
qspi_d_io\[1\] | | \[0\] Data \[7:0\] | + +In this example, the ReadData (0x3) command was written to the TXDATA FIFO, followed by the 3B address. This maps to a total of 4 bytes that are transmitted out across qspi\_d\_io[0] in the first segment. The second segment consists of a read command that receives 1 byte of data from the target device across qspi\_d\_io[1]. + +QSPI consists of up to four command segments in which the host: + +1. Transmits instructions or data at the standard rate +2. Transmits instructions address or data on 2 or 4 data lines +3. Holds the bus in a high-impedance state for some number of dummy cycles where neither side transmits +4. Receives information from the target device at the specified rate (derived from the original command) + +The following example shows the QSPI segments. + +*Figure 7: QSPI segments* + +| Segment \# | Length (Bytes) | Speed | Direction | TXDATA FIFO | RXDATA FIFO | +| :--------- | :------------- | :------- | :------------------ | :----------- | :---------------- | +| 1 | 1 | standard | TX
qspi_d_io\[3:0\] | \[0\] 0x6B (ReadDataQuad) | | +| 2 | 3\* | quad | TX
qspi_d_io\[3:0\] | \[1\] Addr\[23:16\]
\[2\] Addr\[15:8\]
\[3\] Addr\[7:0\] | | +| 3 | 2 | N/A | None (Dummy) | | | +| 4 | 1 | quad | RX
qspi_d_io\[3:0\] | | \[0\] Data\[7:0\] | + +Note: In the preceding figure, segment 2 doesn’t show bytes 2 and 3 for brevity. + +#### Configuration + +The CONFIGOPTS multi-register has one entry per CSB line and holds clock configuration and timing settings that are specific to each peripheral. After the CONFIGOPTS multi-register is programmed for each SPI peripheral device, the values can be left unchanged. + +The most common differences between target devices are the requirements for a specific SPI clock phase or polarity, CPOL and CPHA. These clock parameters can be set via the CONFIGOPTS.CPOL or CONFIGOPTS.CPHA register fields. + +The SPI clock rate depends on the peripheral clock and a 16b clock divider configured by CONFIGOPTS.CLKDIV. The following equation is used to configure the SPI clock period: + +![](./images/Caliptra_eq_SPI_clk_period.png) + +By default, CLKDIV is set to 0, which means that the maximum frequency that can be achieved is at most half the frequency of the peripheral clock (Fsck = Fclk/2). + +We can rearrange the equation to solve for the CLKDIV: + +![](./images/Caliptra_eq_CLKDIV.png) + +Assuming a 400MHz target peripheral, and a SPI clock target of 100MHz: + +CONFIGOPTS.CLKDIV = (400/(2\*100)) -1 = 1 + +The following figure shows CONFIGOPTS. + +*Figure 8: CONFIGOPTS* + +#### Signal descriptions + +The QSPI block architecture inputs and outputs are described in the following table. + +| Name | Input or output | Description | +| :------------------ | :-------------- | :-------------------------------------------------------- | +| clk_i | input | All signal timings are related to the rising edge of clk. | +| rst_ni | input | The reset signal is active LOW and resets the core. | +| cio_sck_o | output | SPI clock | +| cio_sck_en_o | output | SPI clock enable | +| cio_csb_o\[1:0\] | output | Chip select \# (one hot, active low) | +| cio_csb_en_o\[1:0\] | output | Chip select \# enable (one hot, active low) | +| cio_csb_sd_o\[3:0\] | output | SPI data output | +| cio_csb_sd_en_o | output | SPI data output enable | +| cio_csb_sd_i\[3:0\] | input | SPI data input | + +#### SPI\_HOST IP programming guide + +The operation of the SPI\_HOST IP proceeds in seven general steps. + +To initialize the IP: + +1. Program the CONFIGOPTS multi-register with the appropriate timing and polarity settings for each csb line. +2. Set the desired interrupt parameters. +3. Enable the IP. + +Then for each command: + +4. Load the data to be transmitted into the FIFO using the TXDATA memory window. +5. Specify the target device by programming the CSID. +6. Specify the structure of the command by writing each segment into the COMMAND register. + + For multi-segment transactions, assert COMMAND.CSAAT for all but the last command segment. + +7. For transactions that expect to receive a reply, the data can then be read back from the RXDATA window. + +Steps 4-7 are then repeated for each subsequent command. + +#### UART + +Caliptra implements a UART block that can communicate with a serial device that is accessible to FW over the AHB-lite Interface. This is a configuration that the SoC opts-in by defining CALIPTRA\_INTERNAL\_UART. + +The UART block is composed of the uart implementation. For information, see the [UART HWIP Technical Specification](https://opentitan.org/book/hw/ip/uart/). The design provides support for a programmable baud rate. The UART block is shown in the following figure. + +*Figure 9: UART block* + +#### Operation + +Transactions flow through the UART block starting with an AHB-lite write to WDATA, which triggers the transmit module to start a UART TX serial data transfer. The TX module dequeues the byte from the internal FIFO and shifts it out bit by bit at the baud rate. If TX is not enabled, the output is set high and WDATA in the FIFO is queued up. + +The following figure shows the transmit data on the serial lane, starting with the START bit, which is indicated by a high to low transition, followed by the 8 bits of data. + +*Figure 10: Serial transmission frame* + +On the receive side, after the START bit is detected, the data is sampled at the center of each data bit and stored into a FIFO. A user can monitor the FIFO status and read the data out of RDATA. + +#### Configuration + +The baud rate can be configured using the CTRL.NCO register field. This should be set using the following equation: + +![](./images/Caliptra_eq_NCO.png) + +If the desired baud rate is 115,200bps: + +![](./images/Caliptra_eq_UART.png) + +![](./images/Caliptra_eq_UART2.png) + +#### Signal descriptions + +The UART block architecture inputs and outputs are described in the following table. + +| Name | Input or output | Description | +| :------- | :-------------- | :-------------------------------------------------------- | +| clk_i | input | All signal timings are related to the rising edge of clk. | +| rst_ni | input | The reset signal is active LOW and resets the core. | +| cio_rx_i | input | Serial receive bit | +| cio_tx_o | output | Serial transmit bit | + +### SoC mailbox + +For more information on the mailbox protocol, see [Mailbox](https://github.com/chipsalliance/caliptra-rtl/blob/main/docs/Caliptra_rtl.md#mailbox) in the Caliptra Integration Specification. TODO: Fix this! + +The following table describes the mailbox control registers. + +| Control register | Start address | Description | +| :------------------------ | :---------------- | :----------------- | +| MBOX_LOCK | 0x30020000 | Mailbox lock register for mailbox access. Reading 0 sets the lock. | +| MBOX_USER | 0x30020004 | Stores the user that locked the mailbox.| +| MBOX_CMD | 0x30020008 | Command requested for data in mailbox. | +| MBOX_DLEN | 0x3002000c | Data length for mailbox access. | +| MBOX_DATAIN | 0x30020010 | Data in register. Writes the next data to mailbox. | +| MBOX_DATAOUT | 0x30020010 | Data out register. Reads the next data from mailbox.| +| MBOX_EXECUTE | 0x30020018 | Mailbox execute register indicates to the receiver that the sender is done. | +| MBOX_STATUS | 0x3002001c | Status of the mailbox command:
CMD_BUSY - 2’b00 – Indicates the requested command is still in progress
DATA_READY - 2’b01 – Indicates the return data is in the mailbox for the requested command
CMD_COMPLETE- 2’b10 – Indicates the successful completion of the requested command
CMD_FAILURE- 2’b11 – Indicates the requested command failed | +| HW_ERROR_FATAL | 0x30030000 | Indicates fatal hardware error. | +| HW_ERROR_NON_FATAL | 0x30030004 | Indicates non-fatal hardware error. | +| FW_ERROR_FATAL | 0x30030008 | Indicates fatal firmware error. | +| FW_ERROR_NON_FATAL | 0x3003000c | Indicates non-fatal firmware error. | +| HW_ERROR_ENC | 0x30030010 | Encoded error value for hardware errors. | +| FW_ERROR_ENC | 0x30030014 | Encoded error value for firmware errors. | +| BOOT_STATUS | 0x30030018 | Reports the boot status. | +| FLOW_STATUS | 0x3003001c | Reports the status of the firmware flows. | +| GENERIC_INPUT_WIRES | 0x30030024 | Generic input wires connected to the SoC interface. | +| GENERIC_OUTPUT_WIRES | 0x3003002c | Generic output wires connected to the SoC interface. | +| KEY_MANIFEST_PK_HASH | 0x300302b0 | | +| KEY_MANIFEST_PK_HASH_MASK | 0x30030370 | | +| KEY_MANIFEST_SVN | 0x30030374 | | +| BOOT_LOADER_SVN | 0x30030384 | | +| RUNTIME_SVN | 0x30030388 | | +| ANTI_ROLLBACK_DISABLE | 0x3003038c | | +| IEEE_IDEVID_CERT_CHAIN | 0x30030390 | | +| FUSE_DONE | 0x300303f0 | | + +### Security state + +Caliptra uses the MSB of the security state input to determine whether or not Caliptra is in debug mode. + +When Caliptra is in debug mode: + +* Security state MSB is set to 0. + +* Caliptra JTAG is opened for the microcontroller and HW debug. + +* Device secrets (UDS, FE, key vault, and obfuscation key) are programmed to debug values. + +If a transition to debug mode happens during ROM operation, any values computed from the use of device secrets may not match expected values. + +Transitions to debug mode trigger a hardware clear of all device secrets, and also trigger an interrupt to FW to inform of the transition. FW is responsible for initiating another hardware clear of device secrets utilizing the clear secrets register, in case any derivations were in progress and stored after the transition was detected. FW may open the JTAG after all secrets are cleared. + +Debug mode values may be set by integrators in the Caliptra configuration files. The default values are shown in the following table. + +| Name | Default value | +| :-------------------------- | :------------ | +| Obfuscation Key Debug Value | All 0x1 | +| UDS Debug Value | All 0x1 | +| Field Entropy Debug Value | All 0x1 | +| Key Vault Debug Value 0 | All 0xA | +| Key Vault Debug Value 1 | All 0x5 | + +### Clock gating + +Caliptra provides a clock gating feature that turns off clocks when the microcontroller is halted. Clock gating is disabled by default, but can be globally enabled via the following register. + +| Control register | Start address | Description | +| :------------------- | :---------------- | :------------------------ | +| CPTRA_CLK_GATING_EN | 0x300300bc | Register bit to enable or disable the clock gating feature. | + +When enabled, halting the microcontroller turns off clocks to all of the cryptographic subsystem, the vaults (keyvault, PCR vault, and data vault), mailbox SRAM, SoC interface, and peripherals subsystem. The Watchdog timer and SoC registers run on the gated RDC clock. The RV core implements its own clock gating mechanism. Halting the core automatically turns off its clock. + +There are a total of 4 clocks in Caliptra: ungated clock, gated clock, gated RDC clock, and gated SoC IFC clock. The following table shows the different modules and their designated clocks. + +| Module | Clock | +| :-------------------- | :-------------------------------------- | +| RV core | Clk | +| SOC IFC | Clk; clk_cg; rdc_clk_cg; soc_ifc_clk_cg | +| Crypto subsystem | Clk_cg | +| Vaults | Clk_cg | +| Peripherals subsystem | Clk_cg | +| AHB Lite IF, 2to1 Mux | Clk_cg | +| TRNG | Clk_cg | + +#### Wake up conditions + +For details on halting the core and waking up the core from the halt state, see section 5 of the [RISC-V VeeR EL2 Programmer's Reference Manual](https://github.com/chipsalliance/Cores-VeeR-EL2/blob/main/docs/RISC-V_VeeR_EL2_PRM.pdf). + +When the RV core wakes up, all clocks are enabled. However, when the core is halted, it is possible to wake up Caliptra clocks through: + +* A change in generic\_input\_wires + +* Cptra\_fatal\_error assertion + +* Entry to debug or scan modes + +* JTAG accesses + +* APB transactions + +Activity on the APB interface only wakes up the SoC IFC clock. All other clocks remain off until any other condition is met or the core exits the halt state. + +| Cpu_halt_status | PSEL | Generic input wires
\|\| fatal error
\|\| debug/scan mode
\|\|JTAG access | Expected behavior | +| :-------------- | :--- | :---------- | :-------------- | +| 0 | X | X | All gated clocks active | +| 1 | 0 | 0 | All gated clocks inactive | +| 1 | 0 | 1 | All gated clocks active (as long as condition is true) | +| 1 | 1 | 0 | Soc_ifc_clk_cg active (as long as PSEL = 1)
All other clks inactive | +| 1 | 1 | 1 | Soc_ifc_clk_cg active (as long as condition is true OR PSEL = 1)
All other clks active (as long as condition is true) | + +#### Usage + +The following applies to the clock gating feature: + +* The core should only be halted after all pending vault writes are done and cryptographic operations are complete. +* While the core is halted, any APB transaction wakes up the SoC interface clock and leaves all other clocks disabled. If the core is still halted when the APB transactions are done, the SoC interface clock is returned to a disabled state. . +* The RDC clock is similar to an ungated clock and is only disabled when a reset event occurs. This avoids metastability on flops. The RDC clock operates independently of core halt status. + + +#### Timing information + +The following figure shows the timing information for clock gating. + +*Figure 11: Clock gating timing* + +## Integrated TRNG + +Caliptra implements a true random number generator (TRNG) block for local use models. Firmware is able to read a random number from the TRNG core by accessing its register block over the AHB-lite interface. This is a configuration that SoC integrators enable by defining CALIPTRA\_INTERNAL\_TRNG. + +This TRNG block is a combination of entropy source and CSRNG implementations. For information, see the [ENTROPY\_SRC HWIP Technical Specification](https://opentitan.org/book/hw/ip/entropy_src/index.html) and the [CSRNG HWIP Technical Specification](https://opentitan.org/book/hw/ip/csrng/). The core code (see [entropy source](https://github.com/lowRISC/opentitan/tree/master/hw/ip/entropy_src) and [csrng](https://github.com/lowRISC/opentitan/tree/master/hw/ip/csrng)) is reused from here but the interface to the module is changed to AHB-lite. This design provides an interface to an external physical random noise generator. This is also referred to as a physical true random number generator (PTRNG). The PTRNG external source is a physical true random noise source. A noise source and its relation to an entropy source are defined by [SP 800-90B](https://csrc.nist.gov/publications/detail/sp/800-90b/final). + +The block is instantiated based on a design parameter chosen at integration time. This is to provide options for SoC to reuse an existing TRNG to build an optimized SoC design. For the optimized scenarios, SoC needs to follow the TODO: heading link in markdown. + +The following figure shows the integrated TRNG block. + +*Figure 12: Integrated TRNG block* + +The following figure shows the CSRNG block. + +*Figure 13: CSRNG block* + +The following figure shows the entropy source block. + +*Figure 14: Entropy source block* + +### Operation + +Requests for entropy bits start with [command requests](https://opentitan.org/book/hw/ip/csrng/doc/theory_of_operation.html#general-command-format) over the AHB-lite interface to the csrng [CMD\_REQ](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs/?p=clp.csrng_reg.CMD_REQ) register. + +The following describes the fields of the command request header: + +* Application Command: Selects one of five operations to perform. The commands supported are instantiate, reseed, generate, update, and uninstantiate. + +* Command Length: Number of 32-bit words that can optionally be appended to the command. A value of zero will only transfer the command header. A value of 4'hc transfers the header plus an additional twelve 32-bit words of data. + +* Command Flag0: flag0 is associated with the current command. Setting this field to True (4’h6) enables flag0 to be enabled. Note that flag0 is used for the instantiate and reseed commands only; for all other commands, the flag0 value is ignored. + +* Generate Length: Only defined for the generate command, this field is the total number of cryptographic entropy blocks requested. Each unit represents 128 bits of entropy returned. A value of 8 would return a total of 1024 bits. The maximum size supported is 4096. + +First an instantiate command is requested over the SW application interface to initialize an instance in the CSRNG module. Depending on the flag0 and clen fields in the command header, a request to the entropy\_src module over the entropy interface is sent to seed the csrng. This can take a few milliseconds if the seed entropy is not immediately available. + +Example instantiation: + +acmd = 0x1 (Instantiate) + +clen/flag0 = The seed behavior is described in the following table. + +glen = Not used + +| flag0 | clen | Description | +| :---- | :--- | :----------------------------------------------------------- | +| F | 0 | Only entropy source seed is used. | +| F | 1-12 | Entropy source seed is xor'ed with provided additional data. | +| T | 0 | Seed of zero is used (no entropy source seed used). | +| T | 1-12 | Only provided additional data is used as seed. | + +Next a generate command is used to request generation of cryptographic entropy bits. The glen field defines how many 128 bit words are to be returned to the application interface. After the generated bits are ready, they can be read out via the GENBITS register. This register must be read out glen \* 4 times for each request made. + +Example generate command: + +acmd = 0x3 (Generate) + +clen = 0 + +flag0 = false (4’h9) + +glen = 4 (4 \*128 = 512b) + +This requires 16 reads from GENBITS to read out all of the generated entropy. + +### Configuration + +The HW application interfaces are not supported. Only the SW application interface should be used for this design. + +### Physical true random noise source signal descriptions + +These are the top level signals defined in caliptra\_top. + +| Name | Input or output | Description | +| :---------- | :-------------- | :------------ | +| itrng_data | input | Physical true random noise source data | +| itrng_valid | input | Valid is asserted high for one cycle when data is valid. The expected valid output rate is about 50KHz. | + +The following figure shows the top level signals defined in caliptra\_top. + +*Figure 15: caliptra\_top signals* + +### Entropy source signal descriptions + +The following table provides descriptions of the entropy source signals. + +| Name | Input or output | Description | +| :------------------ | :-------------- | :--------------- | +| clk_i | input | All signal timings are related to the rising edge of clk. | +| rst_ni | input | The reset signal is active LOW and resets the core. | +| entropy_src_rng_req | output | Request from the entropy_src module to the physical true random noise source to start generating data. | +| entropy_src_rng_rsp | input | Contains the internal TRNG data and a flag indicating the data is valid. Valid is asserted high for one cycle when data is valid. | +| entropy_src_hw_if_i | input | Downstream block request for entropy bits. | +| entropy_src_hw_if_o | output | 384 bits of entropy data. Valid when es_ack is asserted high. | +| cs_aes_halt_i | input | Response from csrng that all requests to AES block are halted. | +| cs_aes_halt_o | output | Request to csrng to halt requests to the AES block for power leveling purposes. | + +The following figure shows the entropy source signals. + +*Figure 16: Entropy source signals* + +### CSRNG signal descriptions + +The following table provides descriptions for the CSRNG signals. + +| Name | Input or output | Description | +| :------------------------- | :-------------- | :---------------------------------------------------------------------------------------------------- | +| clk_i | input | All signal timings are related to the rising edge of clk. | +| rst_ni | input | The reset signal is active LOW and resets the core. | +| otp_en_csrng_sw_app_read_i | input | Enable firmware to access the ctr_drbg internal state and genbits through registers. | +| lc_hw_debug_en_i | input | Lifecycle that selects which diversification value is used for xoring with the seed from entropy_src. | +| entropy_src_hw_if_i | input | 384 bits of entropy data. Valid when es_ack is asserted high. | +| entropy_src_hw_if_o | output | Downstream block request for entropy bits. | +| cs_aes_halt_i | input | Request from entropy_src to halt requests to the AES block for power leveling purposes. | +| cs_aes_halt_o | output | Response to entropy_src that all requests to AES block are halted. | + +The CSRNG may only be enabled if entropy\_src is enabled. After it is disabled, CSRNG may only be re-enabled after entropy\_src has been disabled and re-enabled. + +## External-TRNG REQ HW API + +For SoCs that choose to not instantiate Caliptra’s integrated TRNG, Caliptra provides a TRNGREQ HW API. + +1. Caliptra asserts TRNG\_REQ wire (FW made the request for a TRNG). +2. SoC writes the TRNG architectural registers. +3. SoC writes a done bit in the TRNG architectural registers. +4. Caliptra desserts TRNG\_REQ. + +The reason to have a separate interface from the SoC mailbox is to ensure that this request is not intercepted by any SoC FW agents that communicate with the SoC mailbox. It is required for FIPS compliance that this TRNG HW API is always handled by a SoC HW gasket logic and not handled by SoC ROM/FW code. + +## SoC-SHA accelerator HW API + +Caliptra provides a SHA accelerator HW API for SoC and Caliptra internal FW to use. It is atomic in nature in that only one of them can use the SHA accelerator HW API at the same time. Details of the SHA accelerator register block may be found in the GitHub repository in [documentation](https://chipsalliance.github.io/caliptra-rtl/main/external-regs/?p=caliptra_top_reg.sha512_acc_csr) generated from the register definition file. + +Using the HW API: + +* A user of the HW API first locks the accelerator by reading the LOCK register. A read that returns the value 0 indicates that the resource was locked for exclusive use by the requesting user. A write of ‘1 clears the lock. +* The USER register captures the APB pauser value of the requestor that locked the SHA accelerator. This is the only user that is allowed to control the SHA accelerator by performing APB register writes. Writes by any other agent on the APB interface are dropped. +* MODE register is written to set the SHA execution mode. + * SHA accelerator supports both SHA384 and SHA512 modes of operation. + * SHA supports **streaming** mode: SHA is computed on a stream of incoming data to the DATAIN register. The EXECUTE register, when set, indicates to the accelerator that streaming is complete. The accelerator can then publish the result into the DIGEST register. When the VALID bit of the STATUS register is set, then the result in the DIGEST register is valid. + * SHA supports **Mailbox** mode: SHA is computed on LENGTH (DLEN) bytes of data stored in the mailbox beginning at START\_ADDRESS. This computation is performed when the EXECUTE register is set by the user. When the operation is completed and the result in the DIGEST register is valid, SHA accelerator sets the VALID bit of the STATUS register. + * The SHA computation engine in the SHA accelerator requires big endian data, but the SHA accelerator can accommodate mailbox input data in either the little endian or big endian format. By default, input data is assumed to be little endian and is swizzled to big endian at the byte level prior to computation. For the big endian format, data is loaded into the SHA engine as-is. Users may configure the SHA accelerator to treat data as big endian by setting the ENDIAN\_TOGGLE bit appropriately. + * See the register definition for the encodings. +* SHA engine also provides a ‘zeroize’ function through its CONTROL register to clear any of the SHA internal state. This can be used when the user wants to conceal previous state for debug or security reasons. + +## JTAG implementation + +For specific debug flows, see the [JTAG/TAP Debug](https://chipsalliance.github.io/Caliptra/doc/Caliptra.html#jtagtap-debug) section in Caliptra: A Datacenter System on a Chip (SoC) Root of Trust (RoT). + +The following figure shows the JTAG implementation within the Caliptra boundary. The output of the existing DMI wrapper is used to find the non-Core (Caliptra uncore) aperture to route the JTAG commands. + +Caliptra’s JTAG/TAP should be implemented as a TAP EP. JTAG is open if the debug mode is set at the time of Caliptra reset deassertion. + +Note: If the debug security state switches to debug mode anytime, the security assets and keys are still flushed even though JTAG is not open. + +*Figure 17: JTAG implementation* + +# Cryptographic subsystem architecture + +The architecture of Caliptra cryptographic subsystem includes the following components: + +* Symmetric cryptographic primitives + * De-obfuscation engine + * SHA512/384 (based on NIST FIPS 180-4 [2]) + * SHA256 (based on NIST FIPS 180-4 [2]) + * HMAC384 (based on [NIST FIPS 198-1](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.198-1.pdf) [5] and [RFC 4868](https://tools.ietf.org/html/rfc4868) [6]) +* Public-key cryptography + * NIST Secp384r1 Deterministic Digital Signature Algorithm (based on FIPS-186-4 [11] and RFC 6979 [7]) +* Key vault + * Key slots + * Key slot management + +The high-level architecture of Caliptra cryptographic subsystem is shown in the following figure. + +*Figure 18: Caliptra cryptographic subsystem TODO: fix this image* + +## SHA512/SHA384 + +SHA512 is a function of cryptographic hash algorithm SHA-2. The hardware implementation is based on [Secworks/SHA512](https://github.com/secworks/sha512) [1]. This implementation complies with the functionality in NIST FIPS 180-4 [2]. The implementation supports the SHA512 variants SHA-512/224, SHA-512/256, SHA384 and SHA512. + +The SHA512 algorithm is described as follows: + +* The message is padded by the host and broken into 1024-bit chunks +* For each chunk: + * The message is fed to the SHA512 core + * The core should be triggered by the host + * The SHA512 core status is changed to ready after hash processing +* The result digest can be read after feeding all message chunks + +### Operation + +#### Padding + +The message should be padded before feeding to the hash core. The input message is taken, and some padding bits are appended to it to get it to the desired length. The bits that are used for padding are simply ‘0’ bits with a leading ‘1’ (100000…000). The appended length of the message (before pre-processing), in bits, is a 128-bit big-endian integer. + +The total size should be equal to 128 bits short of a multiple of 1024 since the goal is to have the formatted message size as a multiple of 1024 bits (N x 1024). The following figure shows the SHA512 input formatting. + +*Figure 19: SHA512 input formatting* + +#### Hashing + +The SHA512 core performs 80 iterative operations to process the hash value of the given message. The algorithm processes each block of 1024 bits from the message using the result from the previous block. For the first block, the initial vectors (IV) are used for starting the chain processing of each 1024-bit block. + +### FSM + +The SHA512 architecture has the finite-state machine as shown in the following figure. + +*Figure 20: SHA512 FSM* + +### Signal descriptions + +The SHA512 architecture inputs and outputs are described in the following table. + +| Name | Inputs and outputs | Description | +|-----------------|--------------------|---------------------------------------------------------------------------------------------------| +| clk | input | All signal timings are related to the rising edge of clk. | +| reset_n | input | The reset signal is active LOW and resets the core. This is the only active LOW signal. | +| init | input | The core is initialized and processes the first block of message. | +| next | input | The core processes the rest of the message blocks using the result from the previous blocks. | +| mode\[1:0\] | input | Indicates the hash type of the function. This can be:
- SHA512/224
- SHA512/256
- SHA384
- SHA512 | +| zeroize | input | The core clears all internal registers to avoid any SCA information leakage. | +| block\[1023:0\] | input | The input padded block of message. | +| ready | output | When HIGH, the signal indicates the core is ready. | +| digest\[511:0\] | output | The hashed value of the given block. | +| digest_valid | output | When HIGH, the signal indicates that the result is ready. | + +### Address map + +The SHA512 address map is shown here: [sha512\_reg — clp Reference (chipsalliance.github.io)](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs/?p=clp.sha512_reg) + +### Pseudocode + +The following pseudocode demonstrates how the SHA512 interface can be implemented. + +*Figure 21: SHA512 pseudocode* + +### SCA countermeasure + +We do not propose any countermeasure to protect the hash functions. Inherently, hash functions do not work like other cryptographic engines. Hash functions target integrity without requiring a secret key. Hence, the attacker can target only messages. Also, the attacker cannot build a CPA or DPA platform on the hash function because the same message ideally gives the same side-channel behavior. + +If the attacker works on the multi-message mechanism, the attacker then needs to work with single trace attacks, which are very unlikely in ASIC/FPGA implementations. Also, our hash implementation is a noisy platform. As a result, we do not propose any SCA implementation countermeasure on the hash functions. + +### Performance + +The SHA512 core performance is reported considering two different architectures: pure hardware architecture, and hardware/software architecture. These are described next. + +#### Pure hardware architecture + +In this architecture, the SHA512 interface and controller are implemented in hardware. The performance specification of the SHA512 architecture is shown in the following table. + +| Operation | Cycle count \[CCs\] | Time \[us\] @ 400 MHz | Throughput \[op/s\] | +| :-------------------- | :------------------ | :-------------------- | :------------------ | +| Data_In transmission | | 0.08 | | +| Process | 87 | 0.22 | | +| Data_Out transmission | 16 | 0.04 | | +| Single block | 136 | 0.34 | 2,941,176 | +| Double block | 224 | 0.56 | 1,785,714 | +| 1 KiB message | 840 | 2.10 | 476,190 | +| 128 KiB message | 17,632 | 44.08 | 22,686 | + +#### Hardware/software architecture + +In this architecture, the SHA512 interface and controller are implemented in RISC-V core. The performance specification of the SHA512 architecture is shown in the following table. + +| Operation | Cycle count \[CCs\] | Time \[us\]\] @ 400 MHz | Throughput \[op/s\] | +| :-------------------- | :------------------ | :---------------------- | :------------------ | +| Data_In transmission | 990 | 2.48 | | +| Process | 139 | 0.35 | | +| Data_Out transmission | 387 | 0.97 | | +| Single block | 1,516 | 3.79 | 263,852 | +| Double block | 2,506 | 6.27 | 159,617 | +| 1 KiB message | 9,436 | 23.59 | 42,391 | +| 128 KiB message | 1,015,276 | 2,538.19 | 394 | + +#### Pure software architecture + +In this architecture, the SHA512 algorithm is implemented fully in software. The implementation is derived from the [OpenSSL](https://www.openssl.org/docs/man3.0/man3/SHA512.html) SHA512 implementation [3]. The performance numbers for this architecture are shown in the following table. + +| Data size | Cycle count | +| :------------ | :-------------- | +| 1 KiB | 147,002 | +| 4 KiB | 532,615 | +| 8 KiB | 1,046,727 | +| 12 KiB | 1,560,839 | +| 128 KiB | 16,470,055 | + +## SHA256 + +SHA256 is a function of the SHA-2 cryptographic hash algorithm. The hardware implementation is based on [Secworks/SHA256](https://github.com/secworks/sha256) [1]. The implementation supports the two variants: SHA256/224 and SHA256. + +The SHA256 algorithm is described as follows: + +* The message is padded by the host and broken into 512-bit chunks +* For each chunk: + * The message is fed to the sha256 core + * The core should be triggered by the host + * The sha256 core status is changed to ready after hash processing +* The result digest can be read after feeding all message chunks + + +### Operation + +#### Padding + +The message should be padded before feeding to the hash core. The input message is taken, and some padding bits are appended to the message to get it to the desired length. The bits that are used for padding are simply ‘0’ bits with a leading ‘1’ (100000…000). The appended length of the message (before pre-processing), in bits, is a 64-bit big-endian integer. + +The total size should be equal to 64 bits, short of a multiple of 512 because the goal is to have the formatted message size as a multiple of 512 bits (N x 512). + +The following figure shows SHA256 input formatting. + +*Figure 22: SHA256 input formatting* + +#### Hashing + +The SHA256 core performs 64 iterative operations to process the hash value of the given message. The algorithm processes each block of 512 bits from the message using the result from the previous block. For the first block, the initial vectors (IV) are used to start the chain processing of each 512-bit block. + +### FSM + +The SHA256 architecture has the finite-state machine as shown in the following figure. + +*Figure 23: SHA256 FSM* + +### Signal descriptions + +The SHA256 architecture inputs and outputs are described as follows. + +| Name | Input or output | Description | +| :-------------- | :-------------- | :------------------------------------------------------------------------------------------- | +| clk | input | All signal timings are related to the rising edge of clk. | +| reset_n | input | The reset signal is active LOW and resets the core. This is the only active LOW signal. | +| init | input | The core is initialized and processes the first block of message. | +| next | input | The core processes the rest of the message blocks using the result from the previous blocks. | +| mode | input | Indicates the hash type of the function. This can be:
- SHA256/224
- SHA256 | +| zeroize | input | The core clears all internal registers to avoid any SCA information leakage. | +| block\[511:0\] | input | The input padded block of message. | +| ready | output | When HIGH, the signal indicates the core is ready. | +| digest\[255:0\] | output | The hashed value of the given block. | +| digest_valid | output | When HIGH, the signal indicates the result is ready. | + +### Address map + +The SHA256 address map is shown here: [sha256\_reg — clp Reference (chipsalliance.github.io)](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs/?p=clp.sha256_reg). + +### Pseudocode + +The following pseudocode demonstrates how the SHA256 interface can be implemented. + +*Figure 24: SHA256 pseudocode* + +### SCA countermeasure + +We do not propose any countermeasure to protect the hash functions. For more information, see SCA countermeasure in the [SHA512/SHA384](#sha512sha384) section. + +### Performance + +The SHA256 core performance is reported considering two different architectures: pure hardware architecture, and hardware/software architecture. These are described next. + +#### Pure hardware architecture + +In this architecture, the SHA256 interface and controller are implemented in hardware. The performance specification of the SHA256 architecture is reported as shown in the following table. + +| Operation | Cycle count \[CCs\] | Time \[us\] @ 400 MHz | Throughput \[op/s\] | +| :-------------------- | :------------------ | :-------------------- | :------------------ | +| Data_In transmission | 17 | 0.04 | | +| Process | 66 | 0.17 | | +| Data_Out transmission | 8 | 0.02 | | +| Single block | 91 | 0.23 | 4,395,604 | +| Double block | 158 | 0.40 | 2,531,646 | +| 1 KiB message | 1163 | 2.91 | 343,938 | + +#### Hardware/software architecture + +In this architecture, the SHA256 interface and controller are implemented in RISC-V core. The performance specification of the SHA256 architecture is reported as shown in the following table. + +| Operation | Cycle count \[CCs\] | Time \[us\] @ 400 MHz | Throughput \[op/s\] | +| :-------------------- | :------------------ | :-------------------- | :------------------ | +| Data_In transmission | 500 | 1.25 | | +| Process | 66 | 0.17 | | +| Data_Out transmission | 195 | 0.49 | | +| Single block | 761 | 1.90 | 525,624 | +| Double block | 1355 | 3.39 | 295,203 | +| 1 KiB message | 8761 | 21.90 | 45,657 | + +## HMAC384 + +Hash-based message authentication code (HMAC) is a cryptographic authentication technique that uses a hash function and a secret key. HMAC involves a cryptographic hash function and a secret cryptographic key. This implementation supports HMAC-SHA-384-192 as specified in [NIST FIPS 198-1](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.198-1.pdf) [5]. The implementation is compatible with the HMAC-SHA-384-192 authentication and integrity functions defined in [RFC 4868](https://tools.ietf.org/html/rfc4868) [6]. + +Caliptra HMAC implementation uses SHA384 as the hash function, accepts a 384-bit key, and generates a 384-bit tag. + +The implementation also supports PRF-HMAC-SHA-384. The PRF-HMAC-SHA-384 algorithm is identical to HMAC-SHA-384-192, except that variable-length keys are permitted, and the truncation step is not performed. + +The HMAC algorithm is described as follows: +* The key is fed to the HMAC core to be padded +* The message is broken into 1024-bit chunks by the host +* For each chunk: + * The message is fed to the HMAC core + * The HMAC core should be triggered by the host + * The HMAC core status is changed to ready after hash processing +* The result digest can be read after feeding all message chunks + + +### Operation + +#### Padding + +The message should be padded before feeding to the HMAC core. Internally, the i\_padded key is concatenated with the message. The input message is taken, and some padding bits are appended to the message to get it to the desired length. The bits that are used for padding are simply ‘0’ bits with a leading ‘1’ (100000…000). + +The total size should be equal to 128 bits, short of a multiple of 1024 because the goal is to have the formatted message size as a multiple of 1024 bits (N x 1024). + +*Figure 25: HMAC input formatting* + +The following figures show examples of input formatting for different message lengths. + +*Figure 26: Message length of 1023 bits* + +When the message is 1023 bits long, padding is given in the next block along with message size. + +*Figure 27: 1 bit padding* + +When the message size is 895 bits, a padding of ‘1’ is also considered valid, followed by the message size. + +*Figure 28: Multi block message* + +Messages with a length greater than 1024 bits are broken down into N 1024-bit blocks. The last block contains padding and the size of the message. + + +#### Hashing + +The HMAC core performs the sha2-384 function to process the hash value of the given message. The algorithm processes each block of the 1024 bits from the message, using the result from the previous block. This data flow is shown in the following figure. + +*Figure 29: HMAC-SHA-384-192 data flow* + +### FSM + +The HMAC architecture has the finite-state machine as shown in the following figure. + +*Figure 30: HMAC FSM* + +### Signal descriptions + +The HMAC architecture inputs and outputs are described in the following table. + +| Name | Input or output | Description | +| :----------------- | :-------------- | :----------- | +| clk | input | All signal timings are related to the rising edge of clk. | +| reset_n | input | The reset signal is active LOW and resets the core. This is the only active LOW signal. | +| init | input | The core is initialized and processes the key and the first block of the message. | +| next | input | The core processes the rest of the message blocks using the result from the previous blocks. | +| zeroize | input | The core clears all internal registers to avoid any SCA information leakage. | +| key\[383:0\] | input | The input key. | +| block\[1023:0\] | input | The input padded block of message. | +| LFSR_seed\[159:0\] | Input | The input to seed PRNG to enable the masking countermeasure for SCA protection. | +| ready | output | When HIGH, the signal indicates the core is ready. | +| tag\[383:0\] | output | The HMAC value of the given key or block. For PRF-HMAC-SHA-384, a 384-bit tag is required. For HMAC-SHA-384-192, the host is responsible for reading 192 bits from the MSB. | +| tag_valid | output | When HIGH, the signal indicates the result is ready. | + +### Address map + +The HMAC address map is shown here: [hmac\_reg — clp Reference (chipsalliance.github.io)](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs/?p=clp.hmac_reg). + +### Pseudocode + +The following pseudocode demonstrates how the HMAC interface can be implemented. + +*Figure 31: HMAC pseudocode* + +### SCA countermeasure + +In an attack model, an attacker can form hypotheses about the secret key value and compute the corresponding output values by using the Hamming Distance model as an appropriate leakage model. An attacker who has knowledge of the implementation for open-source architecture has an advantage. The attacker can capture the power consumption traces to verify their hypotheses, by partitioning the acquisitions or using Pearson’s correlation coefficient. + +To protect the HMAC algorithm from side-channel attacks, a masking countermeasure is applied. This means that random values are added to the intermediate variables during the algorithm’s execution, so that the side-channel signals do not reveal any information about them. + +The embedded countermeasures are based on "Differential Power Analysis of HMAC Based on SHA-2, and Countermeasures" by McEvoy et. al. To provide the required random values for masking intermediate values, a lightweight 74-bit LFSR is implemented. Based on “Spin Me Right Round Rotational Symmetry for FPGA-specific AES” by Wegener et. al., LFSR is sufficient for masking statistical randomness. + +Each round of SHA512 execution needs 6,432 random bits, while one HMAC operation needs at least 4 rounds of SHA512 operations. However, the proposed architecture requires only 160-bit LFSR seed and provides first-order DPA attack protection at the cost of 10% latency overhead with negligible hardware resource overhead. + +### Performance + +The HMAC core performance is reported considering two different architectures: pure hardware architecture, and hardware/software architecture. These are described next. + +#### Pure hardware architecture + +In this architecture, the HMAC interface and controller are implemented in hardware. The performance specification of the HMAC architecture is reported as shown in the following table. + +| Operation | Cycle count \[CCs\] | Time \[us\] @ 400 MHz | Throughput \[op/s\] | +| :-------------------- | :------------------ | :-------------------- | :------------------ | +| Data_In transmission | 44 | 0.11 | - | +| Process | 254 | 0.635 | - | +| Data_Out transmission | 12 | 0.03 | - | +| Single block | 310 | 0.775 | 1,290,322 | +| Double block | 513 | 1.282 | 780,031 | +| 1 KiB message | 1,731 | 4.327 | 231,107 | +| 128 KiB message | 207,979 | 519.947 | 1,923 | + +#### Hardware/software architecture + +In this architecture, the HMAC interface and controller are implemented in RISC-V core. The performance specification of the HMAC architecture is reported as shown in the following table. + +| Operation | Cycle count \[CCs\] | Time \[us\] @ 400 MHz | Throughput \[op/s\] | +| :-------------------- | :------------------ | :-------------------- | :------------------ | +| Data_In transmission | 1389 | 3.473 | - | +| Process | 253 | 0.633 | - | +| Data_Out transmission | 290 | 0.725 | - | +| Single block | 1932 | 4.83 | 207,039 | +| Double block | 3166 | 7.915 | 136,342 | +| 1 KiB message | 10,570 | 26.425 | 37,842 | +| 128 KiB message | 1,264,314 | 3,160.785 | 316 | + +## HMAC_DRBG + +Hash-based message authentication code (HMAC) deterministic random bit generator (DRBG) is a cryptographic random bit generator that uses a HMAC function. HMAC_DRBG involves a cryptographic HMAC function and a seed. This architecture is designed as specified in section 10.1.2. of NIST SP 800-90A [12]. For ECC signing operation, the implementation is compatible with section 3.1. of RFC 6979 [7]. + +Caliptra HMAC_DRBG implementation uses HMAC384 as the HMAC function, accepts a 384-bit seed, and generates a 384-bit random value. + +The HMAC algorithm is described as follows: + +* The seed is fed to HMAC_DRBG core by the host +* For each 384-bit random value + * The core should be triggered by the host + * The HMAC_DRBG core status is changed to ready after HMAC processing + * The result digest can be read + + +### Operation + +HMAC_DRBG uses a loop of HMAC(K, V) to generate the random bits. In this algorithm, two constant values of K_init and V_init are used as follows: + + 1. Set V_init = 0x01 0x01 0x01 ... 0x01 (V has 384-bit) + 2. Set K_init = 0x00 0x00 0x00 ... 0x00 (K has 384-bit) + 3. K_tmp = HMAC(K_init, V_init || 0x00 || entropy || nonce) + 4. V_tmp = HMAC(K_tmp, V_init) + 5. K_new = HMAC(K_tmp, V_tmp || 0x01 || entropy || nonce) + 6. V_new = HMAC(K_new, V_tmp) + 7. Set T = [] + 8. T = T || HMAC(K_new, V_new) + 9. Return T if T is within the [1,q-1] range, otherwise: + 10. K_new = HMAC(K_new, V_new || 0x00) + 11. V_new = HMAC(K_new, V_new) + 12. Jump to 8 + +For ECC KeyGen operation, HMAC_DRBG is used to generate privkey as follows: + + Privkey = HMAC_DRBG(seed, nonce) + +For ECC SIGNING operation, HMAC_DRBG is used to generate k as follows: + + K = HMAC_DRBG(privkey, hashed_msg) + +### Signal descriptions + +The HMAC_DRBG architecture inputs and outputs are described in the following table. + +| Name | Input or output | Description | +| :------------------- | :-------------- | :-------------------------------------------------------------------------------------- | +| clk | input | All signal timings are related to the rising edge of clk. | +| reset_n | input | The reset signal is active LOW and resets the core. This is the only active LOW signal. | +| init | input | The core is initialized with the given seed and generates a 384-bit random value. | +| next | input | The core generates a new 384-bit random value using the result from the previous run. | +| zeroize | input | The core clears all internal registers to avoid any SCA information leakage. | +| entropy \[383:0\] | input | The input entropy. | +| nonce \[383:0\] | input | The input nonce. | +| LFSR_seed \[147 :0\] | input | The input to seed PRNG to enable masking countermeasure for SCA protection. | +| ready | output | When HIGH, the signal indicates the core is ready. | +| drbg \[383:0\] | output | The hmac_drbg value of the given inputs. | +| valid | output | When HIGH, the signal indicates the result is ready. | + +### Address map + +The HMAC_DRBG is embedded into ECC architecture, since there is no address map to access it from FW. + +### SCA countermeasure + +For information, see SCA countermeasure in the [HMAC384](#hmac384) section. + +## ECC + +The ECC unit includes the ECDSA (Elliptic Curve Digital Signature Algorithm) engine, offering a variant of the cryptographically secure Digital Signature Algorithm (DSA), which uses elliptic curve (ECC). A digital signature is an authentication method in which a public key pair and a digital certificate are used as a signature to verify the identity of a recipient or sender of information. + +The hardware implementation supports deterministic ECDSA, 384 Bits (Prime Field), also known as NIST-Secp384r1, described in RFC6979. + +Secp384r1 parameters are shown in the following figure. + +*Figure 32: Secp384r1 parameters* + +### Operation + +The ECDSA consists of three operations, shown in the following figure. + +*Figure 33: ECDSA operations* + +#### KeyGen + +In the deterministic key generation, the paired key of (privKey, pubKey) is generated by KeyGen(seed, nonce), taking a deterministic seed and nonce. The KeyGen algorithm is as follows: + +* Compute privKey = HMAC_DRBG(seed, nonce) to generate a random integer in the interval [1, n-1] where n is the group order of Secp384 curve. +* Generate pubKey(x,y) as a point on ECC calculated by pubKey=privKey × G, while G is the generator point over the curve. + + +#### Signing + +In the signing algorithm, a signature (r, s) is generated by Sign(privKey, h), taking a privKey and hash of message m, h = hash(m), using a cryptographic hash function, SHA384. The signing algorithm includes: + +* Generate a random number k in the range [1..n-1], while k = HMAC\_DRBG(privKey, h) +* Calculate the random point R = k × G +* Take r = Rx mod n, where Rx is x coordinate of R=(Rx, Ry) +* Calculate the signature proof: s = k-1 × (h + r × privKey) mod n +* Return the signature (r, s), each in the range [1..n-1] + +#### Verifying + +The signature (r, s) can be verified by Verify(pubKey ,h ,r, s) considering the public key pubKey and hash of message m, h=hash(m) using the same cryptographic hash function SHA384. The output is r’ value of verifying a signature. The ECDSA verify algorithm includes: + +* Calculate s1 = s−1 mod n +* Compute R' = (h × s1) × G + (r × s1) × pubKey +* Take r’ = R'x mod n, while R'x is x coordinate of R’=(R'x, R'y) +* Verify the signature by comparing whether r' == r + +### Architecture + +The ECC top-level architecture is shown in the following figure. + +*Figure 34: ECDSA architecture* + +### Signal descriptions + +The ECDSA architecture inputs and outputs are described in the following table. + + +| Name | Input or output | Description | +| :------------------------- | :-------------- | :----------- | +| clk | input | All signal timings are related to the rising edge of clk. | +| reset_n | input | The reset signal is active LOW and resets the core. This is the only active LOW signal. | +| ctrl\[1:0\] | input | Indicates the AES type of the function. This can be:
− 0b00: No Operation
− 0b01: KeyGen
− 0b10: Signing
− 0b11: Verifying | +| zeroize | input | The core clears all internal registers to avoid any SCA information leakage. | +| seed \[383:0\] | input | The deterministic seed for HMAC_DRBG in the KeyGen operation. | +| nonce \[383:0\] | input | The deterministic nonce for HMAC_DRBG in the KeyGen operation. | +| privKey_in\[383:0\] | input | The input private key used in the signing operation. | +| pubKey_in\[1:0\]\[383:0\] | input | The input public key(x,y) used in the verifying operation. | +| hashed_msg\[383:0\] | input | The hash of message using SHA384. | +| ready | output | When HIGH, the signal indicates the core is ready. | +| privKey_out\[383:0\] | output | The generated private key in the KeyGen operation. | +| pubKey_out\[1:0\]\[383:0\] | output | The generated public key(x,y) in the KeyGen operation. | +| r\[383:0\] | output | The signature value of the given priveKey/message. | +| s\[383:0\] | output | The signature value of the given priveKey/message. | +| r’\[383:0\] | Output | The signature verification result. | +| valid | output | When HIGH, the signal indicates the result is ready. | + +### Address map + +The ECDSA address map is shown here: [ecc\_reg — clp Reference (chipsalliance.github.io)](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs/?p=clp.ecc_reg). + +### Pseudocode + +The following pseudocode blocks demonstrate example implementations for KeyGen, Signing, and Verifying. + +#### KeyGen + +*Figure 35: KeyGen pseudocode* + +#### Signing + +*Figure 36: Signing pseudocode* + +#### Verifying + +*Figure 37: Verifying pseudocode* + +### SCA countermeasure + +The described ECDSA has three main routines: KeyGen, Signing, and Verifying. Since the Verifying routine requires operation with public values rather than a secret value, our side-channel analysis does not cover this routine. Our evaluation covers the KeyGen and Signing routines where the secret values are processed. + +KeyGen consists of HMAC DRBG and scalar multiplication, while Signing first requires a message hashing and then follows the same operations as KeyGen (HMAC DRBG and scalar multiplication). The last step of Signing is generating “S” as the proof of signature. Since HMAC DRBG and hash operations are evaluated separately in our document, this evaluation covers scalar multiplication and modular arithmetic operations. + +#### Scalar multiplication + +To perform the scalar multiplication, the Montgomery ladder is implemented, which is inherently resistant to timing and single power analysis (SPA) attacks. + +Implementation of complete unified addition formula for the scalar multiplication avoids information leakage and enhances architecture from security and mathematical perspectives. + +To protect the architecture against horizontal power/electromagnetic (EM) and differential power analysis (DPA) attacks, several countermeasures are embedded in the design [9]. Since these countermeasures require random inputs, HMAC-DRBG is fed by IV to generate these random values. + +Since HMAC-DRBG generates random value in a deterministic way, firmware MUST feed different IV to ECC engine for EACH keygen and signing operation. + +#### Base point randomization + +This countermeasure is achieved using the randomized base point in projective coordinates. Hence, the base point G=(Gx, Gy) in affine coordinates is transformed and randomized to projective coordinates as (X, Y, Z) using a random value as follows: + +This approach does not have the performance or area overhead because the architecture is variable-base-point implemented. + +#### Scalar blinding + +This countermeasure is achieved by randomizing the scalar as follows: + +Based on [10], half of the bit size of is required to prevent advanced DPA attacks. Therefore, has 192 bits, and the blinded scalar has 576 bits. Hence, this countermeasure extends the Montgomery ladder iterations due to extended scalar. + +This approach is achieved at the cost of 50% more latency on scalar multiplication and adding one lightweight block, including one 32\*32 multiplier and an accumulator. + +Note: the length of rand is configurable to have a trade-off between the required protection and performance. + +#### Making countermeasures embedded into HMAC\_DRBG + +In the first step of the KeyGen operation, the privkey is generated using HMAC\_DRBG by feeding the following two inputs: seed and nonce. To avoid SCA information leakage during this operation, we embed masking countermeasures into the HMAC\_DRBG architecture. + +Each round of SHA512 execution needs 6,432 random bits, and one HMAC operation needs at least 4 rounds of SHA512 operations. Furthermore, each HMAC\_DRBG round needs at least 5 rounds of HMAC operations. However, the proposed architecture uses a lightweight LFSR and provides first-order DPA attack protection with negligible latency and hardware resource overhead. + +#### ECDSA signing nonce leakage + +Generating “S” as the proof of signature at the steps of the signing operation leaks where the hashed message is signed with private key and ephemeral key as follows: + +Since the given message is known or the signature part r is known, the attacker can perform a known-plaintext attack. The attacker can sign multiple messages with the same key, or the attacker can observe part of the signature that is generated with multiple messages but the same key. + +The evaluation shows that the CPA attack can be performed with a small number of traces, respectively. Thus, an arithmetic masked design for these operations is implemented. + +##### Masking signature + +This countermeasure is achieved by randomizing the privkey as follows: + +Although computation of “S” seems the most vulnerable point in our scheme, the operation does not have a big contribution to overall latency. Hence, masking these operations has low overhead on the cost of the design. + +#### Random number generator for SCA countermeasure + +The ECC countermeasure requires several random vectors to randomize the intermediate values, as described in the preceding section. HMAC\_DRBG is used to take one random vector of 384-bit (i.e., ECC\_IV register) and to generate the required random vectors for different countermeasures. + +The state machine of HMAC\_DRBG utilization is shown in the following figure, including three main states: + +1. SCA random generator: Running HMAC\_DRBG with IV and an internal counter to generate the required random vectors. +2. KEYGEN PRIVKEY: Running HMAC\_DRBG with seed and nonce to generate the privkey in KEYGEN operation. +3. SIGNING NONCE: Running HMAC\_DRBG based on RFC6979 in SIGNING operation with privkey and hashed\_msg. + +*Figure 38: HMAC\_DRBG utilization* + +In SCA random generator state: + +* This state (in KeyGen operation mode) generates 3 384-bit random vectors for the following: LFSR, base point randomization, and scalar blinding randomization. +* This state (in signing operation) generates 4 384-bit random vectors for the following: LFSR, base point randomization, scalar blinding, and masking signature randomization. +* HMAC\_DRBG is initialized with IV and an internal counter. This 64-bit counter enables after reset and zeroization and contains different values depending on when ECC is called. +* HMAC\_DRBG is enabled by the INIT command. To generate all required vectors, HMAC-DRBG is continued by the NEXT command that increments the built-in counter inside the HMAC-DRBG unit. +* To initialize the required seed for LFSR, LFSR\_INIT\_SEED is set as a constant by RTL after reset and zeroization. However, this value is updated before enabling HMAC\_DRBG as follows: + * In the first execution of HMAC\_DRBG after reset and zeroization, hmac\_lfsr\_seed is equal to LFSR\_INIT\_SEED XORed by internal 64-bit counter. + * In the next executions of HMAC\_DRBG, hmac\_lfsr\_seed is equal to HMAC\_DRBG output of the first execution XORed by internal 64-bit counter. + +The data flow of the HMAC\_DRBG operation in keygen operation mode is shown in the following figure. + +*Figure 39: HMAC\_DRBG data flow* + +#### TVLA results + +Test vector leakage assessment (TVLA) provides a robust test using a 𝑡-test. This test evaluates the differences between sets of acquisitions to determine if one set of measurement can be distinguished from the other. This technique can detect different types of leakages, providing a clear indication of leakage or lack thereof. + +In practice, observing a t-value greater than a specific threshold (mainly 4.5) indicates the presence of leakage. However, in ECC, due to its latency, around 5 million samples are required to be captured. This latency leads to many false positives and the TVLA threshold can be considered a higher value than 4.5. Based on the following figure from “Side-Channel Analysis and Countermeasure Design for Implementation of Curve448 on Cortex-M4” by Bisheh-Niasar et. al., the threshold can be considered equal to 7 in our case. + +*Figure 40: TVLA threshold as a function of the number of samples per trace* + +##### Keygen TVLA + +TODO: provide content for this section + + +##### Signing TVLA + +The TVLA results for performing privkey-dependent leakage detection using 20,000 traces is shown in the following figure. Based on this figure, there is no leakage in ECC signing by changing the privkey after 20,000 operations. + +*Figure 41: privkey-dependent leakage detection using TVLA for ECC signing after 20,000 traces* + +The TVLA results for performing message-dependent leakage detection using 64,000 traces is shown in the following figure. Based on this figure, there is no leakage in ECC signing by changing the message after 64,000 operations. + +*Figure 42: Message-dependent leakage detection using TVLA for ECC signing after 64,000 traces* + +The point with t-value equal to -40 is mapped to the Montgomery conversion of the message that is a publicly known value (no secret is there). By ignoring those corresponding samples, there are some sparse samples with a t-value greater than 7, as shown in the following table. + +| Sample | Duration | Cycle | t-value | Operation | +| :-------- | :--------- | :-------- | :------ | :---------------------- | +| 4,746,127 | 214 | 911,381.4 | 11.2 | start of mont_conv(msg) | +| 4,746,341 | | 911,422.5 | -40 | end of mont_conv(msg) | +| 4,757,797 | 1 | 913,622.0 | 7.4 | inv_q | +| 4,768,302 | 1 | 915,639.0 | 7.8 | inv_q | +| 4,779,610 | 1 | 917,810.1 | -9.1 | inv_q | +| 4,788,120 | 1 | 919,444.0 | 7.6 | inv_q | +| 4,813,995 | 1 | 924,412.0 | 7.3 | inv_q | +| 4,822,693 | 1 | 926,082.1 | 7.5 | inv_q | +| 4,858,671 | to the end | 932,989.8 | -7.6 | Ended ECC signing | + +### Performance + +The ECC core performance is reported in the next section. + +### Pure hardware architecture + +In this architecture, the ECC interface and controller are implemented in hardware. The performance specification of the ECC architecture is reported as shown in the following table. + +| Operation | Cycle count \[CCs\] | Time \[ms\] @ 400 MHz | Throughput \[op/s\] | +| :-------- | :------------------ | :-------------------- | :------------------ | +| Keygen | 909,648 | 2.274 | 439 | +| Signing | 932,990 | 2.332 | 428 | +| Verifying | 1,223,938 | 3.060 | 326 | +## PCR vault + +* Platform Configuration Register (PCR) vault is a register file that stores measurements to be used by the microcontroller. +* PCR entries are read-only registers of 384 bits each. +* Control bits allow for entries to be cleared by FW, which sets their values back to 0. +* A lock bit can be set by FW to prevent the entry from being cleared. The lock bit is sticky and only resets on a powergood cycle. + +| PCRV register | Address Offset | Description | +| :---------------------------------| :------------- | :----------------------------- | +| PCR Control\[31:0\] | 0x1001a000 | 32 Control registers, 32 bits each | +| PCR Entry\[31:0\]\[11:0\]\[31:0\] | 0x1001a600 | 32 PCR entries, 384 bits each | + +### PCR vault functional block + +PCR entries are hash extended using a hash extension function. The hash extension function takes the data currently in the PCR entry specified, concatenates data provided by the FW, and performs a SHA384 function on that data, storing the result back into the same PCR entry. + +### PCR hash extend function + +FW provides the PCR entry to use as source and destination of the hash extend. HW copies the PCR into the start of the SHA block and locks those dwords from FW access. FW then provides the new data, and runs the SHA function as usual. After initialization, the locked dwords are unlocked. + +FW must set a last cycle flag before running the last iteration of the SHA engine. This could be the first “init” cycle, or the Nth “next” cycle. This flag allows HW to copy the final resulting hash output back to the source PCR. + +### PCR signing + +* PCR signing uses the key in key slot index 7 for PCR signing +* HW implements a HW function called GEN\_PCR\_HASH + * HW reads all the PCRs from all the PCR slots and hash extends them along with the NONCE that Caliptra FW provides + * PCR Hash = Hash(PCR[0], …, PCR[31], Nonce) +* HW also implements a HW function called SIGN\_PCR. This function takes the PCR digest that was generated by the previous routine and signs it using the key in key slot 7, following the same ECC sign flow defined in the [ECC](#ecc) section. + * The resulting PCR DIGEST is used only once for signing by the HW. If a new PCR signing is required, GEN\_PCR\_HASH needs to be redone. + +## Key vault + +Key Vault (KV) is a register file that stores the keys to be used by the microcontroller, but this register file is not observed by the microcontroller. Each cryptographic function has a control register and functional block designed to read from and write to the KV.  + +| KV register | Description | +| :------------------------------- | :------------------------------------------------------- | +| Key Control\[7:0\] | 8 Control registers, 32 bits each | +| Key Entry\[7:0\]\[15:0\]\[31:0\] | 8 Key entries, 512 bits each
No read or write access | + +### Key vault functional block + +Keys and measurements are stored in 512b register files. These have no read or write path from the microcontroller. The entries are read through a passive read mux driven by each cryptographic block. Locked entries return zeroes.  + +Entries in the KV must be cleared via control register, or by de-assertion of pwrgood.   + +Each entry has a control register that is writable by the microcontroller.  + +The destination valid field is programmed by FW in the cryptographic block generating the key, and it is passed here at generation time. This field cannot be modified after the key is generated and stored in the KV.  + +| KV Entry Ctrl Fields  | Reset  | Description  | +|---------------------------|-------------------|------------------------| +| Lock wr\[0\]  | core_only_rst_b   | Setting the lock wr field prevents the entry from being written by the microcontroller. Keys are always locked. After a lock is set, it cannot be reset until cptra_rst_b is de-asserted.  | +| Lock use\[1\]  | core_only_rst_b   | Setting the lock use field prevents the entry from being used in any cryptographic blocks. After the lock is set, it cannot be reset until cptra_rst_b is de-asserted. | +| Clear\[2\]  | cptra_rst_b  | If unlocked, setting the clear bit causes KV to clear the associated entry. The clear bit is reset after entry is cleared.  | +| Copy\[3\]  | cptra_rst_b  | ENHANCEMENT: Setting the copy bit causes KV to copy the key to the entry written to Copy Dest field.  | +| Copy Dest\[8:4\]  | cptra_rst_b  | ENHANCEMENT: Destination entry for the copy function.  | +| Dest_valid\[16:9\]  | hard_reset_b | KV entry can be used with the associated cryptographic block if the appropriate index is set.
\[0\] - HMAC KEY
\[1\] - HMAC BLOCK
\[2\] - SHA BLOCK
\[2\] - ECC PRIVKEY
\[3\] - ECC SEED
\[7:5\] - RSVD | +| last_dword\[20:19\] | hard_reset_b | Store the offset of the last valid dword, used to indicate the last cycle for read operations. | + +### Key vault cryptographic functional block  + +A generic block is instantiated in each cryptographic block to enable access to KV.  + +Each input to a cryptographic engine can have a key vault read block associated with it. The KV read block takes in a keyvault read control register that drives an FSM to copy an entry from the keyvault into the appropriate input register of the cryptographic engine. + +Each output generated by a cryptographic engine can have its result copied to a slot in the keyvault. The KV write block takes in a keyvault write control register. This register drives an FSM to copy the result from the cryptographic engine into the appropriate keyvault entry. It also programs a control field for that entry to indicate where that entry can be used. + +After programming the key vault read control, FW needs to query the associated key vault read status to confirm that the requested key was copied successfully. After valid is set and the error field reports success, the key is ready to be used. + +Similarly, after programming the key vault write control and initiating the cryptographic function that generates the key to be written, FW needs to query the associated key vault write status to confirm that the requested key was generated and written successfully. + +The following tables describe read, write, and status values for key vault blocks. + +| KV Read Ctrl Reg | Description | +| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | +| read_en\[0\] | Indicates that the read data is to come from the key vault. Setting this bit to 1 initiates copying of data from the key vault. | +| read_entry\[5:1\] | Key vault entry to retrieve the read data from the engine. | +| pcr_hash_extend\[6\] | Requested entry is a PCR. This is used only for the SHA engine to hash extend. It is not functional in any other cryptographic engine. | +| rsvd\[31:7\] | Reserved field | + +| KV Write Ctrl Reg | Description | +| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | +| write_en\[0\] | Indicates that the result is to be stored in the key vault. Setting this bit to 1 copies the result to the key vault when it is ready. | +| write_entry\[5:1\] | Key vault entry to store the result. | +| hmac_key_dest_valid\[6\] | HMAC KEY is a valid destination. | +| hmac_block_dest_valid\[7\] | HMAC BLOCK is a valid destination. | +| sha_block_dest_valid\[8\] | SHA BLOCK is a valid destination. | +| ecc_pkey_dest_valid\[9\] | ECC PKEY is a valid destination. | +| ecc_seed_dest_valid\[10\] | ECC SEED is a valid destination. | +| rsvd\[31:11\] | Reserved field | + +| KV Status Reg | Description | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------- | +| ready\[0\] | Key vault control is idle and ready for a command. | +| valid\[1\] | Requested flow is done. | +| error\[9:2\] | SUCCESS - 0x0 - Key Vault flow was successful
KV_READ_FAIL - 0x1 - Key Vault Read flow failed
KV_WRITE_FAIL - 0x2 - Key Vault Write flow failed | + +### De-obfuscation engine + +To protect software intellectual property from different attacks and, particularly, for thwarting an array of supply chain threats, code obfuscation is employed. Hence, the de-obfuscation engine is implemented to decrypt the code. + +Advanced Encryption Standard (AES) is used as a de-obfuscation function to encrypt and decrypt data [4]. The hardware implementation is based on[ Secworks/aes](https://github.com/secworks/aes) [1]. The implementation supports the two variants: 128- and 256-bit keys with a block/chunk size of 128 bits. + +The AES algorithm is described as follows: + +* The key is fed to an AES core to compute and initialize the round key +* The message is broken into 128-bit chunks by the host +* For each chunk: + * The message is fed to the AES core + * The AES core and its working mode (enc/dec) are triggered by the host + * The AES core status is changed to ready after encryption or decryption processing +* The result digest can be read before processing the next message chunks + + +### Key vault de-obfuscation block operation + +A de-obfuscation engine (DOE) is used in conjunction with AES cryptography to de-obfuscate the UDS and field entropy.   + +1. The obfuscation key is driven to the AES key. The data to be decrypted (either obfuscated UDS or obfuscated field entropy) is fed into the AES data.  +2. An FSM manually drives the AES engine and writes the decrypted data back to the key vault.  +3. FW programs the DOE with the requested function (UDS or field entropy de-obfuscation), and the destination for the result.  +4. After de-obfuscation is complete, FW can clear out the UDS and field entropy values from any flops until cptra\_pwrgood de-assertion.   + +The following tables describe DOE register and control fields. + +| DOE Register | Address | Description  | +| :----------- | :--------- | :----------------------------------------------------------------------------------------------------------------------------- | +| IV | 0x10000000 | 128 bit IV for DOE flow. Stored in big-endian representation. | +| CTRL | 0x10000010 | Controls for DOE flows. | +| STATUS | 0x10000014 | Valid indicates the command is done and results are stored in keyvault. Ready indicates the core is ready for another command. | + +| DOE Ctrl Fields  | Reset  | Description  | +| :--------------- | :----------- | :------------------------------------------------------------------------------------------------------------------------------------------- | +| COMMAND\[1:0\]  | Cptra_rst_b  | 2’b00 Idle 
2’b01 Run UDS flow 
2’b10 Run FE flow 
2’b11 Clear Obf Secrets | +| DEST\[4:2\]  | Cptra_rst_b  | Destination register for the result of the de-obfuscation flow. Field entropy writes into DEST and DEST+1 
Key entry only, can’t go to PCR . | + +### Key vault de-obfuscation flow  + +1. ROM loads IV into DOE. ROM writes to the DOE control register the destination for the de-obfuscated result and sets the appropriate bit to run UDS and/or the field entropy flow.  +2. DOE state machine takes over and loads the Caliptra obfuscation key into the key register.  +3. Next, either the obfuscated UDS or field entropy are loaded into the block register 4 DWORDS at a time.  +4. Results are written to the KV entry specified in the DEST field of the DOE control register.  +5. State machine resets the appropriate RUN bit when the de-obfuscated key is written to KV. FW can poll this register to know when the flow is complete. +6. The clear obf secrets command flushes the obfuscation key, the obfuscated UDS, and the field entropy from the internal flops. This should be done by ROM after both de-obfuscation flows are complete. + +## Data vault + +Data vault is a set of generic scratch pad registers with specific lock functionality and clearable on cold and warm resets. + +* 48B scratchpad registers that are lockable but cleared on cold reset (10 registers) +* 48B scratchpad registers that are lockable but cleared on warm reset (10 registers) +* 4B scratchpad registers that are lockable but cleared on cold reset (8 registers) +* 4B scratchpad registers that are lockable but cleared on warm reset (10 registers) +* 4B scratchpad registers that are cleared on warm reset (8 registers) + +## Cryptographic blocks fatal and non-fatal errors + +The following table describes cryptographic errors. + +| Errors | Error type | Description | +| :--------- | :----------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ECC_R_ZERO | HW_ERROR_NON_FATAL | Indicates a non-fatal error in ECC signing if the computed signature R is equal to 0. FW should change the message or privkey to perform a valid signing. | + +# Terminology + +The following terminology is used in this document. + +| Abbreviation | Description | +| :----------- | :--------------------------------------------- | +| AES | Advanced Encryption Standard | +| BMC | Baseboard Management Controller | +| CA | Certificate Authority | +| CDI | Composite Device Identifier | +| CPU | Central Processing Unit | +| CRL | Certificate Revocation List | +| CSR | Certificate Signing Request | +| CSP | Critical Security Parameter | +| DICE | Device Identifier Composition Engine | +| DME | Device Manufacturer Endorsement | +| DPA | Differential Power Analysis | +| DRBG | Deterministic Random Bit Generator | +| DWORD | 32-bit (4-byte) data element | +| ECDSA | Elliptic Curve Digital Signature Algorithm | +| FMC | FW First Mutable Code | +| FSM | Finite State Machine | +| GPU | Graphics Processing Unit | +| HMAC | Hash-based message authentication code | +| IDevId | Initial Device Identifier | +| iRoT | Internal RoT | +| IV | Initial Vector | +| KAT | Known Answer Test | +| KDF | Key Derivation Function | +| LDevId | Locally Significant Device Identifier | +| MCTP | Management Component Transport Protocol | +| NIC | Network Interface Card | +| NIST | National Institute of Standards and technology | +| OCP | Open Compute Project | +| OTP | One-time programmable | +| PCR | Platform Configuration Register | +| PKI | Public Key infrastructure | +| PUF | Physically unclonable function | +| RNG | Random Number Generator | +| RoT | Root of Trust | +| RTI | RoT for Identity | +| RTM | RoT for Measurement | +| RTR | RoT for Reporting | +| SCA | Side-Channel Analysis | +| SHA | Secure Hash Algorithm | +| SoC | System on Chip | +| SPA | Simple Power Analysis | +| SPDM | Security Protocol and Data Model | +| SSD | Solid State Drive | +| TCB | Trusted Computing Base | +| TCI | TCB Component Identifier | +| TCG | Trusted Computing Group | +| TEE | Trusted Execution Environment | +| TRNG | True Random Number Generator | +| UECC | Uncorrectable Error Correction Code | + +# References + +1. J. Strömbergson, "Secworks," \[Online\]. Available at https://github.com/secworks. +2. NIST, Federal Information Processing Standards Publication (FIPS PUB) 180-4 Secure Hash Standard (SHS). +3. OpenSSL \[Online\]. Available at https://www.openssl.org/docs/man3.0/man3/SHA512.html. +4. N. W. Group, RFC 3394, Advanced Encryption Standard (AES) Key Wrap Algorithm, 2002. +5. NIST, Federal Information Processing Standards Publication (FIPS) 198-1, The Keyed-Hash Message Authentication Code, 2008. +6. N. W. Group, RFC 4868, Using HMAC-SHA256, HMAC-SHA384, and HMAC-SHA512 with IPsec, 2007. +7. RFC 6979, Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA), 2013. +8. TCG, Hardware Requirements for a Device Identifier Composition Engine, 2018. +9. Coron, J.-S.: Resistance against differential power analysis for elliptic curve cryptosystems. In: Ko¸c, C¸ .K., Paar, C. (eds.) CHES 1999. LNCS, vol. 1717, pp. 292–302. +10. Schindler, W., Wiemers, A.: Efficient side-channel attacks on scalar blinding on elliptic curves with special structure. In: NISTWorkshop on ECC Standards (2015). +11. National Institute of Standards and Technology, "Digital Signature Standard (DSS)", Federal Information Processing Standards Publication (FIPS PUB) 186-4, July 2013. +12. NIST SP 800-90A, Rev 1: "Recommendation for Random Number Generation Using Deterministic Random Bit Generators", 2012. | +13. CHIPS Alliance, “RISC-V VeeR EL2 Programmer’s Reference Manual” \[Online\] Available at https://github.com/chipsalliance/Cores-VeeR-EL2/blob/main/docs/RISC-V_VeeR_EL2_PRM.pdf. +14. “The RISC-V Instruction Set Manual, Volume I: User-Level ISA, Document Version 20191213”, Editors Andrew Waterman and Krste Asanovi ́c, RISC-V Foundation, December 2019. Available at https://riscv.org/technical/specifications/. +15. “The RISC-V Instruction Set Manual, Volume II: Privileged Architecture, Document Version 20211203”, Editors Andrew Waterman, Krste Asanovi ́c, and John Hauser, RISC-V International, December 2021. Available at https://riscv.org/technical/specifications/. + +[1] _Caliptra.** **Spanish for “root cap” and describes the deepest part of the root_ diff --git a/docs/images/Caliptra_eq_CLKDIV.png b/docs/images/Caliptra_eq_CLKDIV.png new file mode 100644 index 0000000000000000000000000000000000000000..275ece4b5d03eac6363a7e51b70debbc6bac3472 GIT binary patch literal 12508 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 J*?qg0{|E8CGA;lB literal 0 HcmV?d00001 diff --git a/docs/images/Caliptra_eq_NCO.png b/docs/images/Caliptra_eq_NCO.png new file mode 100644 index 0000000000000000000000000000000000000000..601d4ad3d5f729a69942a3779c17a3428e1405dd GIT binary patch literal 11540 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 Nc*{t)>ZWtle*n6)K0E*b literal 0 HcmV?d00001 diff --git a/docs/images/Caliptra_eq_SPI_clk_period.png b/docs/images/Caliptra_eq_SPI_clk_period.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b5b0b229a3fd769360c2532eb7ce896db3632e GIT binary patch literal 11100 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 literal 0 HcmV?d00001 diff --git a/docs/images/Caliptra_eq_UART.png b/docs/images/Caliptra_eq_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..47277cc1645dc71218578b5188bc56cdb3b8fb09 GIT binary patch literal 16363 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 uu;zb0^q)iA2{@Oq0d`7*(+yh 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