blob: e7315ebc2aa0888f10746a381c0e9a91e809928a [file] [log] [blame] [view]
Gilles Peskine0b020022019-02-12 14:25:57 +01001Mbed Crypto storage specification
2=================================
3
4This document specifies how Mbed Crypto uses storage.
5
6Mbed Crypto may be upgraded on an existing device with the storage preserved. Therefore:
7
81. Any change may break existing installations and may require an upgrade path.
91. This document retains historical information about all past released versions. Do not remove information from this document unless it has always been incorrect or it is about a version that you are sure was never released.
10
11Mbed Crypto 0.1.0
12-----------------
13
14Tags: mbedcrypto-0.1.0b, mbedcrypto-0.1.0b2
15
16Released in November 2018. <br>
17Integrated in Mbed OS 5.11.
18
19Supported backends:
20
21* [PSA ITS](#file-namespace-on-its-for-0.1.0)
22* [C stdio](#file-namespace-on-stdio-for-0.1.0)
23
24Supported features:
25
26* [Persistent transparent keys](#key-file-format-for-0.1.0) designated by a [slot number](#key-names-for-0.1.0).
27* [Nonvolatile random seed](#nonvolatile-random-seed-file-format-for-0.1.0) on ITS only.
28
29This is a beta release, and we do not promise backward compatibility, with one exception:
30
31> On Mbed OS, if a device has a nonvolatile random seed file produced with Mbed OS 5.11.x and is upgraded to a later version of Mbed OS, the nonvolatile random seed file is preserved or upgraded.
32
33We do not make any promises regarding key storage, or regarding the nonvolatile random seed file on other platforms.
34
35### Key names for 0.1.0
36
37Information about each key is stored in a dedicated file whose name is constructed from the key identifier. The way in which the file name is constructed depends on the storage backend. The content of the file is described [below](#key-file-format-for-0.1.0).
38
Gilles Peskineb5a132f2019-02-12 16:47:20 +010039The valid values for a key identifier are the range from 1 to 0xfffeffff. This limitation on the range is not documented in user-facing documentation: according to the user-facing documentation, arbitrary 32-bit values are valid.
Gilles Peskine0b020022019-02-12 14:25:57 +010040
41The code uses the following constant in an internal header (note that despite the name, this value is actually one plus the maximum permitted value):
42
43 #define PSA_MAX_PERSISTENT_KEY_IDENTIFIER 0xffff0000
44
45There is a shared namespace for all callers.
46
47### Key file format for 0.1.0
48
49All integers are encoded in little-endian order in 8-bit bytes.
50
51The layout of a key file is:
52
53* magic (8 bytes): `"PSA\0KEY\0"`
54* version (4 bytes): 0
55* type (4 bytes): `psa_key_type_t` value
56* policy usage flags (4 bytes): `psa_key_usage_t` value
57* policy usage algorithm (4 bytes): `psa_algorithm_t` value
58* key material length (4 bytes)
59* key material: output of `psa_export_key`
60* Any trailing data is rejected on load.
61
62### Nonvolatile random seed file format for 0.1.0
63
64The nonvolatile random seed file contains a seed for the random generator. If present, it is rewritten at each boot as part of the random generator initialization.
65
66The file format is just the seed as a byte string with no metadata or encoding of any kind.
67
68### File namespace on ITS for 0.1.0
69
70Assumption: ITS provides a 32-bit file identifier namespace. The Crypto service can use arbitrary file identifiers and no other part of the system accesses the same file identifier namespace.
71
72* File 0: unused.
73* Files 1 through 0xfffeffff: [content](#key-file-format-for-0.1.0) of the [key whose identifier is the file identifier](#key-names-for-0.1.0).
74* File 0xffffff52 (`PSA_CRYPTO_ITS_RANDOM_SEED_UID`): [nonvolatile random seed](#nonvolatile-random-seed-file-format-for-0.1.0).
75* Files 0xffff0000 through 0xffffff51, 0xffffff53 through 0xffffffff: unused.
76
77### File namespace on stdio for 0.1.0
78
79Assumption: C stdio, allowing names containing lowercase letters, digits and underscores, of length up to 23.
80
81An undocumented build-time configuration value `CRYPTO_STORAGE_FILE_LOCATION` allows storing the key files in a directory other than the current directory. This value is simply prepended to the file name (so it must end with a directory separator to put the keys in a different directory).
82
83* `CRYPTO_STORAGE_FILE_LOCATION "psa_key_slot_0"`: used as a temporary file. Must be writable. May be overwritten or deleted if present.
84* `sprintf(CRYPTO_STORAGE_FILE_LOCATION "psa_key_slot_%lu", key_id)` [content](#key-file-format-for-0.1.0) of the [key whose identifier](#key-names-for-0.1.0) is `key_id`.
85* Other files: unused.
86
Gilles Peskine640273a2019-05-20 17:16:43 +020087Mbed Crypto 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +010088-----------------
89
Gilles Peskine640273a2019-05-20 17:16:43 +020090Tags: mbedcrypto-1.0.0d4, mbedcrypto-1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +010091
Gilles Peskine640273a2019-05-20 17:16:43 +020092Released in February 2019. <br>
93Integrated in Mbed OS 5.12.
Gilles Peskine0b020022019-02-12 14:25:57 +010094
Gilles Peskine11eca712019-02-20 15:44:22 +010095Supported integrations:
Gilles Peskine0b020022019-02-12 14:25:57 +010096
Gilles Peskine640273a2019-05-20 17:16:43 +020097* [PSA platform](#file-namespace-on-a-psa-platform-for-1.0.0)
98* [library using PSA ITS](#file-namespace-on-its-as-a-library-for-1.0.0)
99* [library using C stdio](#file-namespace-on-stdio-for-1.0.0)
Gilles Peskine0b020022019-02-12 14:25:57 +0100100
101Supported features:
102
Gilles Peskine640273a2019-05-20 17:16:43 +0200103* [Persistent transparent keys](#key-file-format-for-1.0.0) designated by a [key identifier and owner](#key-names-for-1.0.0).
104* [Nonvolatile random seed](#nonvolatile-random-seed-file-format-for-1.0.0) on ITS only.
Gilles Peskine0b020022019-02-12 14:25:57 +0100105
106Backward compatibility commitments: TBD
107
Gilles Peskine640273a2019-05-20 17:16:43 +0200108### Key names for 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +0100109
Gilles Peskine11eca712019-02-20 15:44:22 +0100110Information about each key is stored in a dedicated file designated by a _key file identifier_ (`psa_key_file_id_t`). The key file identifier is constructed from the 32-bit key identifier (`psa_key_id_t`) and, if applicable, an identifier of the owner of the key. In integrations where there is no concept of key owner (in particular, in library integrations), the key file identifier is exactly the key identifier. When the library is integrated into a service, the service determines the semantics of the owner identifier.
111
Gilles Peskine640273a2019-05-20 17:16:43 +0200112The way in which the file name is constructed from the key file identifier depends on the storage backend. The content of the file is described [below](#key-file-format-for-1.0.0).
Gilles Peskine0b020022019-02-12 14:25:57 +0100113
Gilles Peskineb5a132f2019-02-12 16:47:20 +0100114The valid values for a key identifier are the range from 1 to 0xfffeffff. This limitation on the range is not documented in user-facing documentation: according to the user-facing documentation, arbitrary 32-bit values are valid.
Gilles Peskine0b020022019-02-12 14:25:57 +0100115
116* Library integration: the key file name is just the key identifer. This is a 32-bit value.
Gilles Peskine11eca712019-02-20 15:44:22 +0100117* PSA service integration: the key file identifier is `(uint32_t)owner_uid << 32 | key_id` where `key_id` is the key identifier specified by the application and `owner_uid` (of type `int32_t`) is the calling partition identifier provided to the server by the partition manager. This is a 64-bit value.
Gilles Peskine0b020022019-02-12 14:25:57 +0100118
Gilles Peskine640273a2019-05-20 17:16:43 +0200119### Key file format for 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +0100120
Gilles Peskineb5a132f2019-02-12 16:47:20 +0100121The layout is identical to [0.1.0](#key-file-format-for-0.1.0) so far. However note that the encoding of key types, algorithms and key material has changed, therefore the storage format is not compatible (despite using the same value in the version field so far).
Gilles Peskine0b020022019-02-12 14:25:57 +0100122
Gilles Peskine640273a2019-05-20 17:16:43 +0200123### Nonvolatile random seed file format for 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +0100124
125[Identical to 0.1.0](#nonvolatile-random-seed-file-format-for-0.1.0).
126
Gilles Peskine640273a2019-05-20 17:16:43 +0200127### File namespace on a PSA platform for 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +0100128
129Assumption: ITS provides a 64-bit file identifier namespace. The Crypto service can use arbitrary file identifiers and no other part of the system accesses the same file identifier namespace.
130
Gilles Peskine11eca712019-02-20 15:44:22 +0100131Assumption: the owner identifier is a nonzero value of type `int32_t`.
132
133* Files 0 through 0xffffff51, 0xffffff53 through 0xffffffff: unused, reserved for internal use of the crypto library or crypto service.
Gilles Peskine0b020022019-02-12 14:25:57 +0100134* File 0xffffff52 (`PSA_CRYPTO_ITS_RANDOM_SEED_UID`): [nonvolatile random seed](#nonvolatile-random-seed-file-format-for-0.1.0).
Gilles Peskine640273a2019-05-20 17:16:43 +0200135* Files 0x100000000 through 0xffffffffffff: [content](#key-file-format-for-1.0.0) of the [key whose identifier is the file identifier](#key-names-for-1.0.0). The upper 32 bits determine the owner.
Gilles Peskine0b020022019-02-12 14:25:57 +0100136
Gilles Peskine640273a2019-05-20 17:16:43 +0200137### File namespace on ITS as a library for 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +0100138
Gilles Peskinef02fbf42019-02-13 15:43:35 +0100139Assumption: ITS provides a 64-bit file identifier namespace. The entity using the crypto library can use arbitrary file identifiers and no other part of the system accesses the same file identifier namespace.
Gilles Peskine0b020022019-02-12 14:25:57 +0100140
Gilles Peskine11eca712019-02-20 15:44:22 +0100141This is a library integration, so there is no owner. The key file identifier is identical to the key identifier.
142
Gilles Peskine0b020022019-02-12 14:25:57 +0100143* File 0: unused.
Gilles Peskine640273a2019-05-20 17:16:43 +0200144* Files 1 through 0xfffeffff: [content](#key-file-format-for-1.0.0) of the [key whose identifier is the file identifier](#key-names-for-1.0.0).
145* File 0xffffff52 (`PSA_CRYPTO_ITS_RANDOM_SEED_UID`): [nonvolatile random seed](#nonvolatile-random-seed-file-format-for-1.0.0).
Gilles Peskine0b020022019-02-12 14:25:57 +0100146* Files 0xffff0000 through 0xffffff51, 0xffffff53 through 0xffffffff, 0x100000000 through 0xffffffffffffffff: unused.
147
Gilles Peskine640273a2019-05-20 17:16:43 +0200148### File namespace on stdio for 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +0100149
Gilles Peskine11eca712019-02-20 15:44:22 +0100150This is a library integration, so there is no owner. The key file identifier is identical to the key identifier.
151
Gilles Peskine0b020022019-02-12 14:25:57 +0100152[Identical to 0.1.0](#file-namespace-on-stdio-for-0.1.0).
153
Gilles Peskine640273a2019-05-20 17:16:43 +0200154### Upgrade from 0.1.0 to 1.0.0.
Gilles Peskine0b020022019-02-12 14:25:57 +0100155
156* Delete files 1 through 0xfffeffff, which contain keys in a format that is no longer supported.
157
Gilles Peskine640273a2019-05-20 17:16:43 +0200158### Suggested changes to make before 1.0.0
Gilles Peskine0b020022019-02-12 14:25:57 +0100159
160The library integration and the PSA platform integration use different sets of file names. This is annoyingly non-uniform. For example, if we want to store non-key files, we have room in different ranges (0 through 0xffffffff on a PSA platform, 0xffff0000 through 0xffffffffffffffff in a library integration).
161
162It would simplify things to always have a 32-bit owner, with a nonzero value, and thus reserve the range 00xffffffff for internal library use.
Gilles Peskine131aa312019-05-20 17:17:17 +0200163
Gilles Peskine2c8f9092019-07-10 17:18:13 +0200164Mbed Crypto 1.1.0
Gilles Peskine131aa312019-05-20 17:17:17 +0200165-----------------
166
Gilles Peskine2c8f9092019-07-10 17:18:13 +0200167Tags: mbedcrypto-1.1.0
Gilles Peskine131aa312019-05-20 17:17:17 +0200168
Gilles Peskine2c8f9092019-07-10 17:18:13 +0200169Released in early June 2019. <br>
Gilles Peskine131aa312019-05-20 17:17:17 +0200170Integrated in Mbed OS 5.13.
171
172Identical to [1.0.0](#mbed-crypto-1.0.0) except for some changes in the key file format.
173
Gilles Peskine2c8f9092019-07-10 17:18:13 +0200174### Key file format for 1.1.0
Gilles Peskine131aa312019-05-20 17:17:17 +0200175
176The key file format is identical to [1.0.0](#key-file-format-for-1.0.0), except for the following changes:
177
Gilles Peskine2c8f9092019-07-10 17:18:13 +0200178* A new policy field, marked as [NEW:1.1.0] below.
Gilles Peskine131aa312019-05-20 17:17:17 +0200179* The encoding of key types, algorithms and key material has changed, therefore the storage format is not compatible (despite using the same value in the version field so far).
180
181A self-contained description of the file layout follows.
182
183All integers are encoded in little-endian order in 8-bit bytes.
184
185The layout of a key file is:
186
187* magic (8 bytes): `"PSA\0KEY\0"`
188* version (4 bytes): 0
189* type (4 bytes): `psa_key_type_t` value
190* policy usage flags (4 bytes): `psa_key_usage_t` value
191* policy usage algorithm (4 bytes): `psa_algorithm_t` value
Gilles Peskine2c8f9092019-07-10 17:18:13 +0200192* policy enrollment algorithm (4 bytes): `psa_algorithm_t` value [NEW:1.1.0]
Gilles Peskine131aa312019-05-20 17:17:17 +0200193* key material length (4 bytes)
194* key material: output of `psa_export_key`
195* Any trailing data is rejected on load.
Gilles Peskine831ac722019-07-23 19:29:35 +0200196
197Mbed Crypto TBD
198---------------
199
200Tags: TBD
201
202Released in TBD 2019. <br>
203Integrated in Mbed OS TBD.
204
205### Changes introduced in TBD
206
207* The layout of a key file now has a lifetime field before the type field.
208* Key files can store references to keys in a secure element. In such key files, the key material contains the slot number.
209
210### File namespace on a PSA platform on TBD
211
212Assumption: ITS provides a 64-bit file identifier namespace. The Crypto service can use arbitrary file identifiers and no other part of the system accesses the same file identifier namespace.
213
214Assumption: the owner identifier is a nonzero value of type `int32_t`.
215
216* Files 0 through 0xfffeffff: unused.
217* Files 0xffff0000 through 0xffffffff: reserved for internal use of the crypto library or crypto service. See [non-key files](#non-key-files-on-tbd).
218* Files 0x100000000 through 0xffffffffffff: [content](#key-file-format-for-1.0.0) of the [key whose identifier is the file identifier](#key-names-for-1.0.0). The upper 32 bits determine the owner.
219
220### File namespace on ITS as a library on TBD
221
222Assumption: ITS provides a 64-bit file identifier namespace. The entity using the crypto library can use arbitrary file identifiers and no other part of the system accesses the same file identifier namespace.
223
224This is a library integration, so there is no owner. The key file identifier is identical to the key identifier.
225
226* File 0: unused.
227* Files 1 through 0xfffeffff: [content](#key-file-format-for-1.0.0) of the [key whose identifier is the file identifier](#key-names-for-1.0.0).
228* Files 0xffff0000 through 0xffffffff: reserved for internal use of the crypto library or crypto service. See [non-key files](#non-key-files-on-tbd).
229* Files 0x100000000 through 0xffffffffffffffff: unused.
230
231### Non-key files on TBD
232
233File identifiers in the range 0xffff0000 through 0xffffffff are reserved for internal use in Mbed Crypto.
234
235* Files 0xfffffe02 through 0xfffffeff (`PSA_CRYPTO_SE_DRIVER_ITS_UID_BASE + lifetime`): secure element driver storage. The content of the file is the secure element driver's persistent data.
236* File 0xffffff52 (`PSA_CRYPTO_ITS_RANDOM_SEED_UID`): [nonvolatile random seed](#nonvolatile-random-seed-file-format-for-1.0.0).
237* File 0xffffff54 (`PSA_CRYPTO_ITS_TRANSACTION_UID`): [transaction file](#transaction-file-format-for-tbd).
238* Other files are unused and reserved for future use.
239
240### Key file format for TBD
241
242All integers are encoded in little-endian order in 8-bit bytes except where otherwise indicated.
243
244The layout of a key file is:
245
246* magic (8 bytes): `"PSA\0KEY\0"`.
247* version (4 bytes): 0.
248* lifetime (4 bytes): `psa_key_lifetime_t` value.
249* type (4 bytes): `psa_key_type_t` value.
250* policy usage flags (4 bytes): `psa_key_usage_t` value.
251* policy usage algorithm (4 bytes): `psa_algorithm_t` value.
252* policy enrollment algorithm (4 bytes): `psa_algorithm_t` value.
253* key material length (4 bytes).
254* key material:
255 * For a transparent key: output of `psa_export_key`.
256 * For an opaque key (key in a secure element): slot number (8 bytes), in platform endianness.
257* Any trailing data is rejected on load.
258
259### Transaction file format for TBD
260
261The transaction file contains data about an ongoing action that cannot be completed atomically. It exists only if there is an ongoing transaction.
262
263All integers are encoded in platform endianness.
264
265All currently existing transactions concern a key in a secure element.
266
267The layout of a transaction file is:
268
269* type (2 bytes): the [transaction type](#transaction-types-on-tbd).
270* unused (2 bytes)
271* lifetime (4 bytes): `psa_key_lifetime_t` value that corresponds to a key in a secure element.
272* slot number (8 bytes): `psa_key_slot_number_t` value. This is the unique designation of the key for the secure element driver.
273* key identifier (4 bytes in a library integration, 8 bytes on a PSA platform): the internal representation of the key identifier. On a PSA platform, this encodes the key owner in the same way as [in file identifiers for key files](#file-namespace-on-a-psa-platform-on-tbd)).
274
275#### Transaction types on TBD
276
277* 0x0001: key creation. The following locations may or may not contain data about the key that is being created:
278 * The slot in the secure element designated by the slot number.
279 * The file containing the key metadata designated by the key identifier.
280 * The driver persistent data.
281* 0x0002: key destruction. The following locations may or may not still contain data about the key that is being destroyed:
282 * The slot in the secure element designated by the slot number.
283 * The file containing the key metadata designated by the key identifier.
284 * The driver persistent data.