1a8e1175bSopenharmony_ciConditional inclusion of cryptographic mechanism through the PSA API in Mbed TLS
2a8e1175bSopenharmony_ci================================================================================
3a8e1175bSopenharmony_ci
4a8e1175bSopenharmony_ciThis document is a proposed interface for deciding at build time which cryptographic mechanisms to include in the PSA Cryptography interface.
5a8e1175bSopenharmony_ci
6a8e1175bSopenharmony_ciThis is currently a proposal for Mbed TLS. It is not currently on track for standardization in PSA.
7a8e1175bSopenharmony_ci
8a8e1175bSopenharmony_ci## Introduction
9a8e1175bSopenharmony_ci
10a8e1175bSopenharmony_ci### Purpose of this specification
11a8e1175bSopenharmony_ci
12a8e1175bSopenharmony_ciThe [PSA Cryptography API specification](https://armmbed.github.io/mbed-crypto/psa/#application-programming-interface) specifies the interface between a PSA Cryptography implementation and an application. The interface defines a number of categories of cryptographic algorithms (hashes, MAC, signatures, etc.). In each category, a typical implementation offers many algorithms (e.g. for signatures: RSA-PKCS#1v1.5, RSA-PSS, ECDSA). When building the implementation for a specific use case, it is often desirable to include only a subset of the available cryptographic mechanisms, primarily in order to reduce the code footprint of the compiled system.
13a8e1175bSopenharmony_ci
14a8e1175bSopenharmony_ciThe present document proposes a way for an application using the PSA cryptography interface to declare which mechanisms it requires.
15a8e1175bSopenharmony_ci
16a8e1175bSopenharmony_ci### Conditional inclusion of legacy cryptography modules
17a8e1175bSopenharmony_ci
18a8e1175bSopenharmony_ciMbed TLS offers a way to select which cryptographic mechanisms are included in a build through its configuration file (`mbedtls_config.h`). This mechanism is based on two main sets of symbols: `MBEDTLS_xxx_C` controls the availability of the mechanism to the application, and `MBEDTLS_xxx_ALT` controls the availability of an alternative implementation, so the software implementation is only included if `MBEDTLS_xxx_C` is defined but not `MBEDTLS_xxx_ALT`.
19a8e1175bSopenharmony_ci
20a8e1175bSopenharmony_ci### PSA evolution
21a8e1175bSopenharmony_ci
22a8e1175bSopenharmony_ciIn the PSA cryptography interface, the **core** (built-in implementations of cryptographic mechanisms) can be augmented with drivers. **Transparent drivers** replace the built-in implementation of a cryptographic mechanism (or, with **fallback**, the built-in implementation is tried if the driver only has partial support for the mechanism). **Opaque drivers** implement cryptographic mechanisms on keys which are stored in a separate domain such as a secure element, for which the core only does key management and dispatch using wrapped key blobs or key identifiers.
23a8e1175bSopenharmony_ci
24a8e1175bSopenharmony_ciThe current model is difficult to adapt to the PSA interface for several reasons. The `MBEDTLS_xxx_ALT` symbols are somewhat inconsistent, and in particular do not work well for asymmetric cryptography. For example, many parts of the ECC code have no `MBEDTLS_xxx_ALT` symbol, so a platform with ECC acceleration that can perform all ECDSA and ECDH operations in the accelerator would still embark the `bignum` module and large parts of the `ecp_curves`, `ecp` and `ecdsa` modules. Also the availability of a transparent driver for a mechanism does not translate directly to `MBEDTLS_xxx` symbols.
25a8e1175bSopenharmony_ci
26a8e1175bSopenharmony_ci### Requirements
27a8e1175bSopenharmony_ci
28a8e1175bSopenharmony_ci[Req.interface] The application can declare which cryptographic mechanisms it needs.
29a8e1175bSopenharmony_ci
30a8e1175bSopenharmony_ci[Req.inclusion] If the application does not require a mechanism, a suitably configured Mbed TLS build must not include it. The granularity of mechanisms must work for typical use cases and has [acceptable limitations](#acceptable-limitations).
31a8e1175bSopenharmony_ci
32a8e1175bSopenharmony_ci[Req.drivers] If a PSA driver is available in the build, a suitably configured Mbed TLS build must not include the corresponding software code (unless a software fallback is needed).
33a8e1175bSopenharmony_ci
34a8e1175bSopenharmony_ci[Req.c] The configuration mechanism consists of C preprocessor definitions, and the build does not require tools other than a C compiler. This is necessary to allow building an application and Mbed TLS in development environments that do not allow third-party tools.
35a8e1175bSopenharmony_ci
36a8e1175bSopenharmony_ci[Req.adaptability] The implementation of the mechanism must be adaptable with future evolution of the PSA cryptography specifications and Mbed TLS. Therefore the interface must remain sufficiently simple and abstract.
37a8e1175bSopenharmony_ci
38a8e1175bSopenharmony_ci### Acceptable limitations
39a8e1175bSopenharmony_ci
40a8e1175bSopenharmony_ci[Limitation.matrix] If a mechanism is defined by a combination of algorithms and key types, for example a block cipher mode (CBC, CTR, CFB, …) and a block permutation (AES, CAMELLIA, ARIA, …), there is no requirement to include only specific combinations.
41a8e1175bSopenharmony_ci
42a8e1175bSopenharmony_ci[Limitation.direction] For mechanisms that have multiple directions (for example encrypt/decrypt, sign/verify), there is no requirement to include only one direction.
43a8e1175bSopenharmony_ci
44a8e1175bSopenharmony_ci[Limitation.size] There is no requirement to include only support for certain key sizes.
45a8e1175bSopenharmony_ci
46a8e1175bSopenharmony_ci[Limitation.multipart] Where there are multiple ways to perform an operation, for example single-part and multi-part, there is no mechanism to select only one or a subset of the possible ways.
47a8e1175bSopenharmony_ci
48a8e1175bSopenharmony_ci## Interface
49a8e1175bSopenharmony_ci
50a8e1175bSopenharmony_ci### PSA Crypto configuration file
51a8e1175bSopenharmony_ci
52a8e1175bSopenharmony_ciThe PSA Crypto configuration file `psa/crypto_config.h` defines a series of symbols of the form `PSA_WANT_xxx` where `xxx` describes the feature that the symbol enables. The symbols are documented in the section [“PSA Crypto configuration symbols”](#psa-crypto-configuration-symbols) below.
53a8e1175bSopenharmony_ci
54a8e1175bSopenharmony_ciThe symbol `MBEDTLS_PSA_CRYPTO_CONFIG` in `mbedtls/mbedtls_config.h` determines whether `psa/crypto_config.h` is used.
55a8e1175bSopenharmony_ci
56a8e1175bSopenharmony_ci* If `MBEDTLS_PSA_CRYPTO_CONFIG` is unset, which is the default at least in Mbed TLS 2.x versions, things are as they are today: the PSA subsystem includes generic code unconditionally, and includes support for specific mechanisms conditionally based on the existing `MBEDTLS_xxx_` symbols.
57a8e1175bSopenharmony_ci* If `MBEDTLS_PSA_CRYPTO_CONFIG` is set, the necessary software implementations of cryptographic algorithms are included based on both the content of the PSA Crypto configuration file and the Mbed TLS configuration file. For example, the code in `aes.c` is enabled if either `mbedtls/mbedtls_config.h` contains `MBEDTLS_AES_C` or `psa/crypto_config.h` contains `PSA_WANT_KEY_TYPE_AES`.
58a8e1175bSopenharmony_ci
59a8e1175bSopenharmony_ci### PSA Crypto configuration symbols
60a8e1175bSopenharmony_ci
61a8e1175bSopenharmony_ci#### Configuration symbol syntax
62a8e1175bSopenharmony_ci
63a8e1175bSopenharmony_ciA PSA Crypto configuration symbol is a C preprocessor symbol whose name starts with `PSA_WANT_`.
64a8e1175bSopenharmony_ci
65a8e1175bSopenharmony_ci* If the symbol is not defined, the corresponding feature is not included.
66a8e1175bSopenharmony_ci* If the symbol is defined to a preprocessor expression with the value `1`, the corresponding feature is included.
67a8e1175bSopenharmony_ci* If the symbol is defined with a different value, the behavior is currently undefined and reserved for future use.
68a8e1175bSopenharmony_ci
69a8e1175bSopenharmony_ci#### Configuration symbol usage
70a8e1175bSopenharmony_ci
71a8e1175bSopenharmony_ciThe presence of a symbol `PSA_WANT_xxx` in the Mbed TLS configuration determines whether a feature is available through the PSA API. These symbols should be used in any place that requires conditional compilation based on the availability of a cryptographic mechanism through the PSA API, including:
72a8e1175bSopenharmony_ci
73a8e1175bSopenharmony_ci* In Mbed TLS test code.
74a8e1175bSopenharmony_ci* In Mbed TLS library code using `MBEDTLS_USE_PSA_CRYPTO`, for example in TLS to determine which cipher suites to enable.
75a8e1175bSopenharmony_ci* In application code that provides additional features based on cryptographic capabilities, for example additional key parsing and formatting functions, or cipher suite availability for network protocols.
76a8e1175bSopenharmony_ci
77a8e1175bSopenharmony_ci#### Configuration symbol semantics
78a8e1175bSopenharmony_ci
79a8e1175bSopenharmony_ciIf a feature is not requested for inclusion in the PSA Crypto configuration file, it may still be included in the build, either because the feature has been requested in some other way, or because the library does not support the exclusion of this feature. Mbed TLS should make a best effort to support the exclusion of all features, but in some cases this may be judged too much effort for too little benefit.
80a8e1175bSopenharmony_ci
81a8e1175bSopenharmony_ci#### Configuration symbols for key types
82a8e1175bSopenharmony_ci
83a8e1175bSopenharmony_ciFor most constant or constructor macros of the form `PSA_KEY_TYPE_xxx`, the symbol **`PSA_WANT_KEY_TYPE_xxx`** indicates that support for this key type is desired.
84a8e1175bSopenharmony_ci
85a8e1175bSopenharmony_ciAs an exception, starting in Mbed TLS 3.5.0, for `KEY_PAIR` types (that is, private keys for asymmetric cryptography), the feature selection is more fine-grained, with an additional suffix:
86a8e1175bSopenharmony_ci* `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_BASIC` enables basic support for the key type, and in particular support for operations with a key of that type for enabled algorithms. This is automatically enabled if any of the other `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_yyy` options is enabled.
87a8e1175bSopenharmony_ci* `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_IMPORT` enables support for `psa_import_key` to import a key of that type.
88a8e1175bSopenharmony_ci* `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_GENERATE` enables support for `psa_generate_key` to randomly generate a key of that type.
89a8e1175bSopenharmony_ci* `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_DERIVE` enables support for `psa_key_derivation_output_key` to deterministically derive a key of that type.
90a8e1175bSopenharmony_ci* `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_EXPORT` enables support for `psa_export_key` to export a key of that type.
91a8e1175bSopenharmony_ci
92a8e1175bSopenharmony_ciFor asymmetric cryptography, `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_BASIC` determines whether private-key operations are desired, and `PSA_WANT_KEY_TYPE_xxx_PUBLIC_KEY` determines whether public-key operations are desired. `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_BASIC` implicitly enables `PSA_WANT_KEY_TYPE_xxx_PUBLIC_KEY`, as well as support for `psa_export_public_key` on the private key: there is no way to only include private-key operations (which typically saves little code).
93a8e1175bSopenharmony_ci
94a8e1175bSopenharmony_ciNote: the implementation is always free to include support for more than what was explicitly requested. (For example, as of Mbed TLS 3.5.0, `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_BASIC` implicitly enables import and export support for that key type, but this may not be the case in future versions.) Applications should always request support for all operations they need, rather than rely on them being implicitly enabled by the implementation. The only thing that is documented and guaranteed in the future is as follows: `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_yyy` -> `PSA_WANT_KEY_TYPE_xxx_KEY_PAIR_BASIC` -> `PSA_WANT_KEY_TYPE_xxx_PUBLIC_KEY`.
95a8e1175bSopenharmony_ci
96a8e1175bSopenharmony_ci#### Configuration symbols for elliptic curves
97a8e1175bSopenharmony_ci
98a8e1175bSopenharmony_ciFor elliptic curve key types, only the specified curves are included. To include a curve, include a symbol of the form **`PSA_WANT_ECC_family_size`**. For example: `PSA_WANT_ECC_SECP_R1_256` for secp256r1, `PSA_WANT_ECC_MONTGOMERY_255` for Curve25519. It is an error to require an ECC key type but no curve, and Mbed TLS will reject this at compile time.
99a8e1175bSopenharmony_ci
100a8e1175bSopenharmony_ciRationale: this is a deviation of the general principle that `PSA_ECC_FAMILY_xxx` would have a corresponding symbol `PSA_WANT_ECC_FAMILY_xxx`. This deviation is justified by the fact that it is very common to wish to include only certain curves in a family, and that can lead to a significant gain in code size.
101a8e1175bSopenharmony_ci
102a8e1175bSopenharmony_ci#### Configuration symbols for Diffie-Hellman groups
103a8e1175bSopenharmony_ci
104a8e1175bSopenharmony_ciThere are no configuration symbols for Diffie-Hellman groups (`PSA_DH_GROUP_xxx`).
105a8e1175bSopenharmony_ci
106a8e1175bSopenharmony_ciRationale: Finite-field Diffie-Hellman code is usually not specialized for any particular group, so reducing the number of available groups at compile time only saves a little code space. Constrained implementations tend to omit FFDH anyway, so the small code size gain is not important.
107a8e1175bSopenharmony_ci
108a8e1175bSopenharmony_ci#### Configuration symbols for algorithms
109a8e1175bSopenharmony_ci
110a8e1175bSopenharmony_ciFor each constant or constructor macro of the form `PSA_ALG_xxx`, the symbol **`PSA_WANT_ALG_xxx`** indicates that support for this algorithm is desired.
111a8e1175bSopenharmony_ci
112a8e1175bSopenharmony_ciFor parametrized algorithms, the `PSA_WANT_ALG_xxx` symbol indicates whether the base mechanism is supported. Parameters must themselves be included through their own `PSA_WANT_ALG_xxx` symbols. It is an error to include a base mechanism without at least one possible parameter, and Mbed TLS will reject this at compile time. For example, `PSA_WANT_ALG_ECDSA` requires the inclusion of randomized ECDSA for all hash algorithms whose corresponding symbol `PSA_WANT_ALG_xxx` is enabled.
113a8e1175bSopenharmony_ci
114a8e1175bSopenharmony_ci## Implementation
115a8e1175bSopenharmony_ci
116a8e1175bSopenharmony_ci### Additional non-public symbols
117a8e1175bSopenharmony_ci
118a8e1175bSopenharmony_ci#### Accounting for transparent drivers
119a8e1175bSopenharmony_ci
120a8e1175bSopenharmony_ciIn addition to the [configuration symbols](#psa-crypto-configuration-symbols), we need two parallel or mostly parallel sets of symbols:
121a8e1175bSopenharmony_ci
122a8e1175bSopenharmony_ci* **`MBEDTLS_PSA_ACCEL_xxx`** indicates whether a fully-featured, fallback-free transparent driver is available.
123a8e1175bSopenharmony_ci* **`MBEDTLS_PSA_BUILTIN_xxx`** indicates whether the software implementation is needed.
124a8e1175bSopenharmony_ci
125a8e1175bSopenharmony_ci`MBEDTLS_PSA_ACCEL_xxx` is one of the outputs of the transpilation of a driver description, alongside the glue code for calling the drivers.
126a8e1175bSopenharmony_ci
127a8e1175bSopenharmony_ci`MBEDTLS_PSA_BUILTIN_xxx` is enabled when `PSA_WANT_xxx` is enabled and `MBEDTLS_PSA_ACCEL_xxx` is disabled.
128a8e1175bSopenharmony_ci
129a8e1175bSopenharmony_ciThese symbols are not part of the public interface of Mbed TLS towards applications or to drivers, regardless of whether the symbols are actually visible.
130a8e1175bSopenharmony_ci
131a8e1175bSopenharmony_ci### Architecture of symbol definitions
132a8e1175bSopenharmony_ci
133a8e1175bSopenharmony_ci#### New-style definition of configuration symbols
134a8e1175bSopenharmony_ci
135a8e1175bSopenharmony_ciWhen `MBEDTLS_PSA_CRYPTO_CONFIG` is set, the header file `mbedtls/mbedtls_config.h` needs to define all the `MBEDTLS_xxx_C` configuration symbols, including the ones deduced from the PSA Crypto configuration. It does this by including the new header file **`mbedtls/config_psa.h`**, which defines the `MBEDTLS_PSA_BUILTIN_xxx` symbols and deduces the corresponding `MBEDTLS_xxx_C` (and other) symbols.
136a8e1175bSopenharmony_ci
137a8e1175bSopenharmony_ci`mbedtls/config_psa.h` includes `psa/crypto_config.h`, the user-editable file that defines application requirements.
138a8e1175bSopenharmony_ci
139a8e1175bSopenharmony_ci#### Old-style definition of configuration symbols
140a8e1175bSopenharmony_ci
141a8e1175bSopenharmony_ciWhen `MBEDTLS_PSA_CRYPTO_CONFIG` is not set, the configuration of Mbed TLS works as before, and the inclusion of non-PSA code only depends on `MBEDTLS_xxx` symbols defined (or not) in `mbedtls/mbedtls_config.h`. Furthermore, the new header file **`mbedtls/config_psa.h`** deduces PSA configuration symbols (`PSA_WANT_xxx`, `MBEDTLS_PSA_BUILTIN_xxx`) from classic configuration symbols (`MBEDTLS_xxx`).
142a8e1175bSopenharmony_ci
143a8e1175bSopenharmony_ciThe `PSA_WANT_xxx` definitions in `mbedtls/config_psa.h` are needed not only to build the PSA parts of the library, but also to build code that uses these parts. This includes structure definitions in `psa/crypto_struct.h`, size calculations in `psa/crypto_sizes.h`, and application code that's specific to a given cryptographic mechanism. In Mbed TLS itself, code under `MBEDTLS_USE_PSA_CRYPTO` and conditional compilation guards in tests and sample programs need `PSA_WANT_xxx`.
144a8e1175bSopenharmony_ci
145a8e1175bSopenharmony_ciSince some existing applications use a handwritten `mbedtls/mbedtls_config.h` or an edited copy of `mbedtls/mbedtls_config.h` from an earlier version of Mbed TLS, `mbedtls/config_psa.h` must be included via an already existing header that is not `mbedtls/mbedtls_config.h`, so it is included via `psa/crypto.h` (for example from `psa/crypto_platform.h`).
146a8e1175bSopenharmony_ci
147a8e1175bSopenharmony_ci#### Summary of definitions of configuration symbols
148a8e1175bSopenharmony_ci
149a8e1175bSopenharmony_ciWhether `MBEDTLS_PSA_CRYPTO_CONFIG` is set or not, `mbedtls/config_psa.h` includes `mbedtls/crypto_drivers.h`, a header file generated by the transpilation of the driver descriptions. It defines `MBEDTLS_PSA_ACCEL_xxx` symbols according to the availability of transparent drivers without fallback.
150a8e1175bSopenharmony_ci
151a8e1175bSopenharmony_ciThe following table summarizes where symbols are defined depending on the configuration mode.
152a8e1175bSopenharmony_ci
153a8e1175bSopenharmony_ci* (U) indicates a symbol that is defined by the user (application).
154a8e1175bSopenharmony_ci* (D) indicates a symbol that is deduced from other symbols by code that ships with Mbed TLS.
155a8e1175bSopenharmony_ci* (G) indicates a symbol that is generated from driver descriptions.
156a8e1175bSopenharmony_ci
157a8e1175bSopenharmony_ci| Symbols                   | With `MBEDTLS_PSA_CRYPTO_CONFIG`  | Without `MBEDTLS_PSA_CRYPTO_CONFIG` |
158a8e1175bSopenharmony_ci| ------------------------- | --------------------------------- | ----------------------------------- |
159a8e1175bSopenharmony_ci| `MBEDTLS_xxx_C`           | `mbedtls/mbedtls_config.h` (U) or | `mbedtls/mbedtls_config.h` (U)      |
160a8e1175bSopenharmony_ci|                           | `mbedtls/config_psa.h` (D)        |                                     |
161a8e1175bSopenharmony_ci| `PSA_WANT_xxx`            | `psa/crypto_config.h` (U)         | `mbedtls/config_psa.h` (D)          |
162a8e1175bSopenharmony_ci| `MBEDTLS_PSA_BUILTIN_xxx` | `mbedtls/config_psa.h` (D)        | `mbedtls/config_psa.h` (D)          |
163a8e1175bSopenharmony_ci| `MBEDTLS_PSA_ACCEL_xxx`   | `mbedtls/crypto_drivers.h` (G)    | N/A                                 |
164a8e1175bSopenharmony_ci
165a8e1175bSopenharmony_ci#### Visibility of internal symbols
166a8e1175bSopenharmony_ci
167a8e1175bSopenharmony_ciIdeally, the `MBEDTLS_PSA_ACCEL_xxx` and `MBEDTLS_PSA_BUILTIN_xxx` symbols should not be visible to application code or driver code, since they are not part of the public interface of the library. However these symbols are needed to deduce whether to include library modules (for example `MBEDTLS_AES_C` has to be enabled if `MBEDTLS_PSA_BUILTIN_KEY_TYPE_AES` is enabled), which makes it difficult to keep them private.
168a8e1175bSopenharmony_ci
169a8e1175bSopenharmony_ci#### Compile-time checks
170a8e1175bSopenharmony_ci
171a8e1175bSopenharmony_ciThe header file **`library/psa_check_config.h`** applies sanity checks to the configuration, throwing `#error` if something is wrong.
172a8e1175bSopenharmony_ci
173a8e1175bSopenharmony_ciA mechanism similar to `mbedtls/check_config.h` detects errors such as enabling ECDSA but no curve.
174a8e1175bSopenharmony_ci
175a8e1175bSopenharmony_ciSince configuration symbols must be undefined or 1, any other value should trigger an `#error`.
176a8e1175bSopenharmony_ci
177a8e1175bSopenharmony_ci#### Automatic generation of preprocessor symbol manipulations
178a8e1175bSopenharmony_ci
179a8e1175bSopenharmony_ciA lot of the preprocessor symbol manipulation is systematic calculations that analyze the configuration. `mbedtls/config_psa.h` and `library/psa_check_config.h` should be generated automatically, in the same manner as `version_features.c`.
180a8e1175bSopenharmony_ci
181a8e1175bSopenharmony_ci### Structure of PSA Crypto library code
182a8e1175bSopenharmony_ci
183a8e1175bSopenharmony_ci#### Conditional inclusion of library entry points
184a8e1175bSopenharmony_ci
185a8e1175bSopenharmony_ciAn entry point can be eliminated entirely if no algorithm requires it.
186a8e1175bSopenharmony_ci
187a8e1175bSopenharmony_ci#### Conditional inclusion of mechanism-specific code
188a8e1175bSopenharmony_ci
189a8e1175bSopenharmony_ciCode that is specific to certain key types or to certain algorithms must be guarded by the applicable symbols: `PSA_WANT_xxx` for code that is independent of the application, and `MBEDTLS_PSA_BUILTIN_xxx` for code that calls an Mbed TLS software implementation.
190a8e1175bSopenharmony_ci
191a8e1175bSopenharmony_ci## PSA standardization
192a8e1175bSopenharmony_ci
193a8e1175bSopenharmony_ci### JSON configuration mechanism
194a8e1175bSopenharmony_ci
195a8e1175bSopenharmony_ciAt the time of writing, the preferred configuration mechanism for a PSA service is in JSON syntax. The translation from JSON to build instructions is not specified by PSA.
196a8e1175bSopenharmony_ci
197a8e1175bSopenharmony_ciFor PSA Crypto, the preferred configuration mechanism would be similar to capability specifications of transparent drivers. The same JSON properties that are used to mean “this driver can perform that mechanism” in a driver description would be used to mean “the application wants to perform that mechanism” in the application configuration.
198a8e1175bSopenharmony_ci
199a8e1175bSopenharmony_ci### From JSON to C
200a8e1175bSopenharmony_ci
201a8e1175bSopenharmony_ciThe JSON capability language allows a more fine-grained selection than the C mechanism proposed here. For example, it allows requesting only single-part mechanisms, only certain key sizes, or only certain combinations of algorithms and key types.
202a8e1175bSopenharmony_ci
203a8e1175bSopenharmony_ciThe JSON capability language can be translated approximately to the boolean symbol mechanism proposed here. The approximation considers a feature to be enabled if any part of it is enabled. For example, if there is a capability for AES-CTR and one for CAMELLIA-GCM, the translation to boolean symbols will also include AES-GCM and CAMELLIA-CTR. If there is a capability for AES-128, the translation will also include AES-192 and AES-256.
204a8e1175bSopenharmony_ci
205a8e1175bSopenharmony_ciThe boolean symbol mechanism proposed here can be translated to a list of JSON capabilities: for each included algorithm, include a capability with that algorithm, the key types that apply to that algorithm, no size restriction, and all the entry points that apply to that algorithm.
206a8e1175bSopenharmony_ci
207a8e1175bSopenharmony_ci## Open questions
208a8e1175bSopenharmony_ci
209a8e1175bSopenharmony_ci### Open questions about the interface
210a8e1175bSopenharmony_ci
211a8e1175bSopenharmony_ci#### Naming of symbols
212a8e1175bSopenharmony_ci
213a8e1175bSopenharmony_ciThe names of [elliptic curve symbols](#configuration-symbols-for-elliptic-curves) are a bit weird: `SECP_R1_256` instead of `SECP256R1`, `MONTGOMERY_255` instead of `CURVE25519`. Should we make them more classical, but less systematic?
214a8e1175bSopenharmony_ci
215a8e1175bSopenharmony_ci#### Impossible combinations
216a8e1175bSopenharmony_ci
217a8e1175bSopenharmony_ciWhat does it mean to have `PSA_WANT_ALG_ECDSA` enabled but with only Curve25519? Is it a mandatory error?
218a8e1175bSopenharmony_ci
219a8e1175bSopenharmony_ci#### Diffie-Hellman
220a8e1175bSopenharmony_ci
221a8e1175bSopenharmony_ciWay to request only specific groups? Not a priority: constrained devices don't do FFDH. Specify it as may change in future versions.
222a8e1175bSopenharmony_ci
223a8e1175bSopenharmony_ci#### Coexistence with the current Mbed TLS configuration
224a8e1175bSopenharmony_ci
225a8e1175bSopenharmony_ciThe two mechanisms have very different designs. Is there serious potential for confusion? Do we understand how the combinations work?
226a8e1175bSopenharmony_ci
227a8e1175bSopenharmony_ci### Open questions about the design
228a8e1175bSopenharmony_ci
229a8e1175bSopenharmony_ci#### Algorithms without a key type or vice versa
230a8e1175bSopenharmony_ci
231a8e1175bSopenharmony_ciIs it realistic to mandate a compile-time error if a key type is required, but no matching algorithm, or vice versa? Is it always the right thing, for example if there is an opaque driver that manipulates this key type?
232a8e1175bSopenharmony_ci
233a8e1175bSopenharmony_ci#### Opaque-only mechanisms
234a8e1175bSopenharmony_ci
235a8e1175bSopenharmony_ciIf a mechanism should only be supported in an opaque driver, what does the core need to know about it? Do we have all the information we need?
236a8e1175bSopenharmony_ci
237a8e1175bSopenharmony_ciThis is especially relevant to suppress a mechanism completely if there is no matching algorithm. For example, if there is no transparent implementation of RSA or ECDSA, `psa_sign_hash` and `psa_verify_hash` may still be needed if there is an opaque signature driver.
238a8e1175bSopenharmony_ci
239a8e1175bSopenharmony_ci### Open questions about the implementation
240a8e1175bSopenharmony_ci
241a8e1175bSopenharmony_ci#### Testability
242a8e1175bSopenharmony_ci
243a8e1175bSopenharmony_ciIs this proposal decently testable? There are a lot of combinations. What combinations should we test?
244a8e1175bSopenharmony_ci
245a8e1175bSopenharmony_ci<!--
246a8e1175bSopenharmony_ciLocal Variables:
247a8e1175bSopenharmony_citime-stamp-line-limit: 40
248a8e1175bSopenharmony_citime-stamp-start: "Time-stamp: *\""
249a8e1175bSopenharmony_citime-stamp-end: "\""
250a8e1175bSopenharmony_citime-stamp-format: "%04Y/%02m/%02d %02H:%02M:%02S %Z"
251a8e1175bSopenharmony_citime-stamp-time-zone: "GMT"
252a8e1175bSopenharmony_ciEnd:
253a8e1175bSopenharmony_ci-->
254