blob: 0f4edf77184dd944706232a323c19b98f6930749 [file] [log] [blame] [view]
Gilles Peskine278e5eb2020-07-13 11:28:20 +02001PSA Cryptoprocessor driver developer's guide
2============================================
3
4**This is a specification of work in progress. The implementation is not yet merged into Mbed TLS.**
5
6This document describes how to write drivers of cryptoprocessors such as accelerators and secure elements for the PSA cryptography subsystem of Mbed TLS.
7
Gilles Peskine5298f682020-08-19 21:53:59 +02008This document focuses on behavior that is specific to Mbed TLS. For a reference of the interface between Mbed TLS and drivers, refer to the [PSA Cryptoprocessor Driver Interface specification](psa-driver-interface.html).
Gilles Peskine278e5eb2020-07-13 11:28:20 +02009
10The interface is not fully implemented in Mbed TLS yet and is disabled by default. You can enable the experimental work in progress by setting `MBEDTLS_PSA_CRYPTO_DRIVERS` in the compile-time configuration. Please note that the interface may still change: until further notice, we do not guarantee backward compatibility with existing driver code when `MBEDTLS_PSA_CRYPTO_DRIVERS` is enabled.
11
12## Introduction
13
14### Purpose
15
16The PSA cryptography driver interface provides a way to build Mbed TLS with additional code that implements certain cryptographic primitives. This is primarily intended to support platform-specific hardware.
17
18There are two types of drivers:
19
20* **Transparent** drivers implement cryptographic operations on keys that are provided in cleartext at the beginning of each operation. They are typically used for hardware **accelerators**. When a transparent driver is available for a particular combination of parameters (cryptographic algorithm, key type and size, etc.), it is used instead of the default software implementation. Transparent drivers can also be pure software implementations that are distributed as plug-ins to a PSA Crypto implementation.
21* **Opaque** drivers implement cryptographic operations on keys that can only be used inside a protected environment such as a **secure element**, a hardware security module, a smartcard, a secure enclave, etc. An opaque driver is invoked for the specific key location that the driver is registered for: the dispatch is based on the key's lifetime.
22
23### Deliverables for a driver
24
25To write a driver, you need to implement some functions with C linkage, and to declare these functions in a **driver description file**. The driver description file declares which functions the driver implements and what cryptographic mechanisms they support. Depending on the driver type, you may also need to define some C types and macros in a header file.
26
Gilles Peskine5298f682020-08-19 21:53:59 +020027The concrete syntax for a driver description file is JSON. The structure of this JSON file is specified in the section [“Driver description syntax”](psa-driver-interface.html#driver-description-syntax) of the PSA cryptography driver interface specification.
Gilles Peskine278e5eb2020-07-13 11:28:20 +020028
29A driver therefore consists of:
30
31* A driver description file (in JSON format).
32* C header files defining the types required by the driver description. The names of these header files is declared in the driver description file.
33* An object file compiled for the target platform defining the functions required by the driver description. Implementations may allow drivers to be provided as source files and compiled with the core instead of being pre-compiled.
34
35## Driver C interfaces
36
Gilles Peskine5298f682020-08-19 21:53:59 +020037Mbed TLS calls [driver functions as specified in the PSA Cryptography Driver Interface specification](psa-driver-interface.html#driver-entry-points) except as otherwise indicated in this section.
Gilles Peskine278e5eb2020-07-13 11:28:20 +020038
39### Key handles
40
41Mbed TLS currently implements the interface for opening and closing persistent keys from version 1.0 beta 3 of the PSA Crypto specification. As a consequence, functions that operate on an existing key take an argument of type `psa_key_handle_t` instead of `psa_key_id_t`. Functions that create a new key take an argument of type `psa_key_handle_t *` instead of `psa_key_id_t *`.
42
43## Building and testing your driver
44
45<!-- TODO -->
46
47## Dependencies on the Mbed TLS configuration
48
49<!-- TODO -->