# Security

## Overview

OpenTitan's mission is to create a trustworthy, vendor-agnostic open source
silicon Root of Trust (RoT) widely adopted across the industry. We do this by
implementing strong logical security integrity guarantees in the hardware and
firmware components, and restricting licensing of the OpenTitan trademark to
those implementations conforming to OpenTitan standards.

## [OpenTitan Security Model Specification][security_model]

The [OpenTitan Security Model Specification][security_model] defines the logical
security properties of the discrete IC. It covers device and software
attestation, provisioning, secure boot, chip lifecycle, firmware update, chip
identity, and chip ownership transfer.

## [Logical Security Model][logical_security_model]

The [OpenTitan Security Model][logical_security_model] provides a high level
framework for device provisioning and run-time operations. It starts by
enumerating the range of logical entities supported by the architecture, and
their mapping into software stages. Runtime isolation properties and baseline
identity concepts are introduced in this document.

## [Secure Hardware Design Guidelines][implementation_guidelines]

Silicon designs for security devices require special guidelines to protect the designs against myriad attacks.
To that end, the team established [Secure Hardware Design Guidelines][implementation_guidelines] which are followed when developing OpenTitan security IP.

## Functional Guarantees

At the functional level OpenTitan aims to provide the following guarantees:

*   Silicon Owners shall be able to deploy their own Root of Trust (RoT) Public
    Key Infrastructure (PKI) after taking ownership of the device.
*   Silicon Creators shall endorse the authenticity of the hardware. Endorsement
    is contingent on the silicon adhering to the physical implementation
    guidelines and standard requirements stipulated by the project. The
    endorsement shall be measurable via a Transport Certificate.
*   OpenTitan shall provide full boot attestation measurements to allow Silicon
    Owners to verify the boot chain configuration. The attestation chain shall
    be anchored in the Silicon Owner's RoT PKI.
*   OpenTitan shall provide a key manager implementation strongly bound to the
    boot chain. Only a boot chain signed with the expected set of keys shall be
    able to unlock stored keys/secrets.
*   OpenTitan shall provide a key versioning scheme with support for key
    migration bound to the firmware versioning and update implementation.

## Use Cases

The security goals of the project are derived from a list of target
[use cases][use_cases]. The security goals are used to define OpenTitan's
[threat model][threat_model], as well as functional and assurance security
requirements. Such requirements influence the system architecture, as well as
the certification strategy for silicon implementations.

## Security Primitives

All hardware security primitives adhere to the OpenTitan
[comportable][comportable_ip] peripheral interface specification.
Implementations for some of these components are available for reference and
may not meet production or certification criteria yet.

### [Entropy source][entropy_source]

Digital wrapper for a NIST SP 800-90B compliant entropy source. An additional
emulated entropy source implementation will be available for FPGA functional
testing.

### [CSRNG][csrng]

Cryptographically Secure Random Number Generator (CSRNG) providing support for
both deterministic (DRBG) and true random number generation (TRNG).

The DRBG is implemented using the `CTR_DRBG` construction specified in
NIST SP 800-90A.

### [AES][aes]

Advanced Encryption Standard (AES) supporting Encryption/Decryption using
128/192/256 bit key sizes in the following cipher block modes:

*   Electronic Codebook (ECB) mode,
*   Cipher Block Chaining (CBC) mode,
*   Cipher Feedback (CFB) mode with fixed data segment size of 128 bits,
*   Output Feedback (OFB) mode, and
*   Counter (CTR) mode.

### [HMAC][hmac]

HMAC with SHA-2 FIPS 180-4 compliant hash function, supporting both
HMAC-SHA256 and SHA256 modes of operation.

### [Key Manager][keymgr]

Hardware backed symmetric key generation and storage providing key isolation
from software.

### [OTBN][otbn]

Public key algorithm accelerator with support for bignum operations in hardware.

### [Alert Handler][alert_handler]

Aggregates alert signals from other system components designated as potential
security threats, converting them to processor interrupts. It also supports
alert policy assignments to handle alerts completely in hardware depending on
the assigned severity.

[aes]: ../../hw/ip/aes/README.md
[alert_handler]: ../../hw/top_earlgrey/ip_autogen/alert_handler/README.md
[comportable_ip]: ../contributing/hw/comportability/README.md
[csrng]: ../../hw/ip/csrng/README.md
[entropy_source]: ../../hw/ip/entropy_src/README.md
[hmac]: ../../hw/ip/hmac/README.md
[keymgr]: ../../hw/ip/keymgr/README.md
[logical_security_model]: ./logical_security_model/README.md
[implementation_guidelines]: ./implementation_guidelines/hardware/README.md
[otbn]: ../../hw/ip/otbn/README.md
[security_model]: ./specs/README.md
[use_cases]: ../use_cases/README.md
[threat_model]: ./threat_model/README.md
