blob: 89f3c9b8432d040c6f43b18e106519334e2a8bfb [file] [log] [blame] [view]
Fredrik Hessecc207bc2021-09-28 21:06:08 +02001# Mbed TLS driver interface test strategy
Gilles Peskineb26c8d82019-09-04 19:26:17 +02002
Fredrik Hessecc207bc2021-09-28 21:06:08 +02003This document describes the test strategy for the driver interfaces in Mbed TLS. Mbed TLS has interfaces for secure element drivers, accelerator drivers and entropy drivers. This document is about testing Mbed TLS itself; testing drivers is out of scope.
Gilles Peskineb26c8d82019-09-04 19:26:17 +02004
5The driver interfaces are standardized through PSA Cryptography functional specifications.
6
Gilles Peskinef0e28532020-11-30 17:51:14 +01007## Secure element driver interface testing
Gilles Peskineb26c8d82019-09-04 19:26:17 +02008
Gilles Peskinef0e28532020-11-30 17:51:14 +01009### Secure element driver interfaces
10
11#### Opaque driver interface
12
13The [unified driver interface](../../proposed/psa-driver-interface.md) supports both transparent drivers (for accelerators) and opaque drivers (for secure elements).
14
15Drivers exposing this interface need to be registered at compile time by declaring their JSON description file.
16
17#### Dynamic secure element driver interface
18
Fredrik Hessecc207bc2021-09-28 21:06:08 +020019The dynamic secure element driver interface (SE interface for short) is defined by [`psa/crypto_se_driver.h`](../../../include/psa/crypto_se_driver.h). This is an interface between Mbed TLS and one or more third-party drivers.
Gilles Peskineb26c8d82019-09-04 19:26:17 +020020
Fredrik Hessecc207bc2021-09-28 21:06:08 +020021The SE interface consists of one function provided by Mbed TLS (`psa_register_se_driver`) and many functions that drivers must implement. To make a driver usable by Mbed TLS, the initialization code must call `psa_register_se_driver` with a structure that describes the driver. The structure mostly contains function pointers, pointing to the driver's methods. All calls to a driver function are triggered by a call to a PSA crypto API function.
Gilles Peskineb26c8d82019-09-04 19:26:17 +020022
Gilles Peskine92bcfdb2019-09-04 19:26:50 +020023### SE driver interface unit tests
24
25This section describes unit tests that must be implemented to validate the secure element driver interface. Note that a test case may cover multiple requirements; for example a “good case” test can validate that the proper function is called, that it receives the expected inputs and that it produces the expected outputs.
26
27Many SE driver interface unit tests could be covered by running the existing API tests with a key in a secure element.
28
29#### SE driver registration
30
Gilles Peskinef0e28532020-11-30 17:51:14 +010031This applies to dynamic drivers only.
32
Gilles Peskine92bcfdb2019-09-04 19:26:50 +020033* Test `psa_register_se_driver` with valid and with invalid arguments.
34* Make at least one failing call to `psa_register_se_driver` followed by a successful call.
35* Make at least one test that successfully registers the maximum number of drivers and fails to register one more.
36
37#### Dispatch to SE driver
38
39For each API function that can lead to a driver call (more precisely, for each driver method call site, but this is practically equivalent):
40
41* Make at least one test with a key in a secure element that checks that the driver method is called. A few API functions involve multiple driver methods; these should validate that all the expected driver methods are called.
42* Make at least one test with a key that is not in a secure element that checks that the driver method is not called.
43* Make at least one test with a key in a secure element with a driver that does not have the requisite method (i.e. the method pointer is `NULL`) but has the substructure containing that method, and check that the return value is `PSA_ERROR_NOT_SUPPORTED`.
44* Make at least one test with a key in a secure element with a driver that does not have the substructure containing that method (i.e. the pointer to the substructure is `NULL`), and check that the return value is `PSA_ERROR_NOT_SUPPORTED`.
45* At least one test should register multiple drivers with a key in each driver and check that the expected driver is called. This does not need to be done for all operations (use a white-box approach to determine if operations may use different code paths to choose the driver).
46* At least one test should register the same driver structure with multiple lifetime values and check that the driver receives the expected lifetime value.
47
48Some methods only make sense as a group (for example a driver that provides the MAC methods must provide all or none). In those cases, test with all of them null and none of them null.
49
50#### SE driver inputs
51
52For each API function that can lead to a driver call (more precisely, for each driver method call site, but this is practically equivalent):
53
54* Wherever the specification guarantees parameters that satisfy certain preconditions, check these preconditions whenever practical.
55* If the API function can take parameters that are invalid and must not reach the driver, call the API function with such parameters and verify that the driver method is not called.
Gilles Peskine8b193c12019-09-05 17:58:13 +020056* Check that the expected inputs reach the driver. This may be implicit in a test that checks the outputs if the only realistic way to obtain the correct outputs is to start from the expected inputs (as is often the case for cryptographic material, but not for metadata).
Gilles Peskine92bcfdb2019-09-04 19:26:50 +020057
58#### SE driver outputs
59
Fredrik Hessecc207bc2021-09-28 21:06:08 +020060For each API function that leads to a driver call, call it with parameters that cause a driver to be invoked and check how Mbed TLS handles the outputs.
Gilles Peskine92bcfdb2019-09-04 19:26:50 +020061
62* Correct outputs.
63* Incorrect outputs such as an invalid output length.
64* Expected errors (e.g. `PSA_ERROR_INVALID_SIGNATURE` from a signature verification method).
65* Unexpected errors. At least test that if the driver returns `PSA_ERROR_GENERIC_ERROR`, this is propagated correctly.
66
67Key creation functions invoke multiple methods and need more complex error handling:
68
69* Check the consequence of errors detected at each stage (slot number allocation or validation, key creation method, storage accesses).
70* Check that the storage ends up in the expected state. At least make sure that no intermediate file remains after a failure.
71
72#### Persistence of SE keys
73
74The following tests must be performed at least one for each key creation method (import, generate, ...).
75
76* Test that keys in a secure element survive `psa_close_key(); psa_open_key()`.
77* Test that keys in a secure element survive `mbedtls_psa_crypto_free(); psa_crypto_init()`.
78* Test that the driver's persistent data survives `mbedtls_psa_crypto_free(); psa_crypto_init()`.
79* Test that `psa_destroy_key()` does not leave any trace of the key.
80
81#### Resilience for SE drivers
82
83Creating or removing a key in a secure element involves multiple storage modifications (M<sub>1</sub>, ..., M<sub>n</sub>). If the operation is interrupted by a reset at any point, it must be either rolled back or completed.
84
85* For each potential interruption point (before M<sub>1</sub>, between M<sub>1</sub> and M<sub>2</sub>, ..., after M<sub>n</sub>), call `mbedtls_psa_crypto_free(); psa_crypto_init()` at that point and check that this either rolls back or completes the operation that was started.
86* This must be done for each key creation method and for key destruction.
87* This must be done for each possible flow, including error cases (e.g. a key creation that fails midway due to `OUT_OF_MEMORY`).
88* The recovery during `psa_crypto_init` can itself be interrupted. Test those interruptions too.
89* Two things need to be tested: the key that is being created or destroyed, and the driver's persistent storage.
bootstrap-prime6dbbf442022-05-17 19:30:44 -040090* Check both that the storage has the expected content (this can be done by e.g. using a key that is supposed to be present) and does not have any unexpected content (for keys, this can be done by checking that `psa_open_key` fails with `PSA_ERROR_DOES_NOT_EXIST`).
Gilles Peskine92bcfdb2019-09-04 19:26:50 +020091
92This requires instrumenting the storage implementation, either to force it to fail at each point or to record successive storage states and replay each of them. Each `psa_its_xxx` function call is assumed to be atomic.
93
94### SE driver system tests
95
96#### Real-world use case
97
98We must have at least one driver that is close to real-world conditions:
99
100* With its own source tree.
101* Running on actual hardware.
102* Run the full driver validation test suite (which does not yet exist).
103* Run at least one test application (e.g. the Mbed OS TLS example).
104
Gilles Peskine545c28b2019-09-04 19:41:16 +0200105This requirement shall be fulfilled by the [Microchip ATECC508A driver](https://github.com/ARMmbed/mbed-os-atecc608a/).
Gilles Peskine92bcfdb2019-09-04 19:26:50 +0200106
107#### Complete driver
108
109We should have at least one driver that covers the whole interface:
110
111* With its own source tree.
112* Implementing all the methods.
113* Run the full driver validation test suite (which does not yet exist).
114
115A PKCS#11 driver would be a good candidate. It would be useful as part of our product offering.
Gilles Peskine24cebf62020-11-30 17:51:53 +0100116
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100117## Unified driver interface testing
Gilles Peskine24cebf62020-11-30 17:51:53 +0100118
119The [unified driver interface](../../proposed/psa-driver-interface.md) defines interfaces for accelerators.
120
121### Test requirements
122
123#### Requirements for transparent driver testing
124
125Every cryptographic mechanism for which a transparent driver interface exists (key creation, cryptographic operations, …) must be exercised in at least one build. The test must verify that the driver code is called.
126
127#### Requirements for fallback
128
129The driver interface includes a fallback mechanism so that a driver can reject a request at runtime and let another driver handle the request. For each entry point, there must be at least three test runs with two or more drivers available with driver A configured to fall back to driver B, with one run where A returns `PSA_SUCCESS`, one where A returns `PSA_ERROR_NOT_SUPPORTED` and B is invoked, and one where A returns a different error and B is not invoked.
130
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100131### Test drivers
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100132
133We have test drivers that are enabled by `PSA_CRYPTO_DRIVER_TEST` (not present
134in the usual config files, must be defined on the command line or in a custom
135config file). Those test drivers are implemented in `tests/src/drivers/*.c`
136and their API is declared in `tests/include/test/drivers/*.h`.
137
138We have two test driver registered: `mbedtls_test_opaque_driver` and
139`mbedtls_test_transparent_driver`. These are described in
140`scripts/data_files/driver_jsons/mbedtls_test_xxx_driver.json` (as much as our
141JSON support currently allows). Each of the drivers can potentially implement
142support for several mechanism; conversely, each of the file mentioned in the
143previous paragraph can potentially contribute to both the opaque and the
144transparent test driver.
145
146Each entry point is instrumented to record the number of hits for each part of
147the driver (same division as the files) and the status of the last call. It is
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100148also possible to force the next call to return a specified status, and
149sometimes more things can be forced: see the various
150`mbedtls_test_driver_XXX_hooks_t` structures declared by each driver.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100151
152The drivers can use one of two back-ends:
153- internal: this requires the built-in implementation to be present.
154- libtestdriver1: this allows the built-in implementation to be omitted from
155 the build.
156
157Historical note: internal was initially the only back-end; then support for
Manuel Pégourié-Gonnard0ca2fd02024-04-12 10:14:17 +0200158libtestdriver1 was added gradually. Support for libtestdriver1 is now complete
159(see following sub-sections), so we could remove internal now. Note it's
160useful to have builds with both a driver and the built-in, in order to test
161fallback to built-in, which is currently done only with internal, but this can
162be achieved with libtestdriver1 just as well.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100163
Manuel Pégourié-Gonnardb18bc802023-11-24 11:59:25 +0100164Note: our test drivers tend to provide all possible entry points (with a few
165exceptions that may not be intentional, see the next sections). However, in
166some cases, when an entry point is not available, the core is supposed to
167implement it using other entry points, for example:
168- `mac_verify` may use `mac_compute` if the driver does no provide verify;
169- for things that have both one-shot and multi-part API, the driver can
170 provide only the multi-part entry points, and the core is supposed to
171implement one-shot on top of it (but still call the one-shot entry points when
172they're available);
173- `sign/verify_message` can be implemented on top of `sign/verify_hash` for
174 some algorithms;
175- (not sure if the list is exhaustive).
176
177Ideally, we'd want build options for the test drivers so that we can test with
178different combinations of entry points present, and make sure the core behaves
179appropriately when some entry points are absent but other entry points allow
180implementing the operation. This is currently not supported by our test
181drivers.
182
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100183Our implementation of PSA Crypto is structured in a way that the built-in
184implementation of each operation follows the driver API, see
185[`../architecture/psa-crypto-implementation-structure.md`](../architecture/psa-crypto-implementation-structure.html).
186This makes implementing the test drivers very easy: each entry point has a
187corresponding `mbedtls_psa_xxx()` function that it can call as its
188implementation - with the `libtestdriver1` back-end the function is called
189`libtestdriver1_mbedtls_psa_xxx()` instead.
190
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100191A nice consequence of that strategy is that when an entry point has
192test-driver support, most of the time, it automatically works for all
193algorithms and key types supported by the library. (The exception being when
194the driver needs to call a different function for different key types, as is
195the case with some asymmetric key management operations.)
196
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100197The renaming process for `libtestdriver1` is implemented as a few Perl regexes
198applied to a copy of the library code, see the `libtestdriver1.a` target in
199`tests/Makefile`. Another modification that's done to this copy is appending
200`tests/include/test/drivers/crypto_config_test_driver_extension.h` to
201`psa/crypto_config.h`. This file reverses the `ACCEL`/`BUILTIN` macros so that
202`libtestdriver1` includes as built-in what the main `libmbedcrypto.a` will
203have accelerated; see that file's initial comment for details. See also
204`helper_libtestdriver1_` functions and the preceding comment in `all.sh` for
205how libtestdriver is used in practice.
206
207This general framework needs specific code for each family of operations. At a
208given point in time, not all operations have the same level of support. The
209following sub-sections describe the status of the test driver support, mostly
210following the structure and order of sections 9.6 and 10.2 to 10.10 of the
211[PSA Crypto standard](https://arm-software.github.io/psa-api/crypto/1.1/) as
212that is also a natural division for implementing test drivers (that's how the
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100213code is divided into files).
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100214
215#### Key management
216
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100217The following entry points are declared in `test/drivers/key_management.h`:
218
219- `"init"` (transparent and opaque)
220- `"generate_key"` (transparent and opaque)
221- `"export_public_key"` (transparent and opaque)
222- `"import_key"` (transparent and opaque)
223- `"export_key"` (opaque only)
224- `"get_builtin_key"` (opaque only)
225- `"copy_key"` (opaque only)
226
227The transparent driver fully implements the declared entry points, and can use
228any backend: internal or libtestdriver1.
229
230The opaque's driver implementation status is as follows:
231- `"generate_key"`: not implemented, always returns `NOT_SUPPORTED`.
232- `"export_public_key"`: implemented only for ECC and RSA keys, both backends.
233- `"import_key"`: implemented except for DH keys, both backends.
234- `"export_key"`: implemented for built-in keys (ECC and AES), and for
235 non-builtin keys except DH keys. (Backend not relevant.)
236- `"get_builtin_key"`: implemented - provisioned keys: AES-128 and ECC
237 secp2456r1. (Backend not relevant.)
238- `"copy_key"`: implemented - emulates a SE without storage. (Backend not
239 relevant.)
240
241Note: the `"init"` entry point is not part of the "key management" family, but
242listed here as it's declared and implemented in the same file. With the
243transparent driver and the libtestdriver1 backend, it calls
244`libtestdriver1_psa_crypto_init()`, which partially but not fully ensures
245that this entry point is called before other entry points in the test drivers.
246With the opaque driver, this entry point just does nothing an returns success.
247
248The following entry points are defined by the driver interface but missing
249from our test drivers:
250- `"allocate_key"`, `"destroy_key"`: this is for opaque drivers that store the
251 key material internally.
252
253Note: the instrumentation also allows forcing the output and its length.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100254
255#### Message digests (Hashes)
256
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100257The following entry points are declared (transparent only):
258- `"hash_compute"`
259- `"hash_setup"`
260- `"hash_clone"`
261- `"hash_update"`
262- `"hash_finish"`
263- `"hash_abort"`
264
265The transparent driver fully implements the declared entry points, and can use
266any backend: internal or libtestdriver1.
267
268This familly is not part of the opaque driver as it doesn't use keys.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100269
270#### Message authentication codes (MAC)
271
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100272The following entry points are declared (transparent and opaque):
273- `"mac_compute"`
274- `"mac_sign_setup"`
275- `"mac_verify_setup"`
276- `"mac_update"`
277- `"mac_sign_finish"`
278- `"mac_verify_finish"`
279- `"mac_abort"`
280
281The transparent driver fully implements the declared entry points, and can use
282any backend: internal or libtestdriver1.
283
284The opaque driver only implements the instrumentation but not the actual
285operations: entry points will always return `NOT_SUPPORTED`, unless another
286status is forced.
287
288The following entry points are not implemented:
Manuel Pégourié-Gonnardb18bc802023-11-24 11:59:25 +0100289- `mac_verify`: this mostly makes sense for opaque drivers; the core will fall
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100290 back to using `"mac_compute"` if this is not implemented. So, perhaps
291ideally we should test both with `"mac_verify"` implemented and with it not
292implemented? Anyway, we have a test gap here.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100293
294#### Unauthenticated ciphers
295
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100296The following entry points are declared (transparent and opaque):
297- `"cipher_encrypt"`
298- `"cipher_decrypt"`
299- `"cipher_encrypt_setup"`
300- `"cipher_decrypt_setup"`
301- `"cipher_set_iv"`
302- `"cipher_update"`
303- `"cipher_finish"`
304- `"cipher_abort"`
305
306The transparent driver fully implements the declared entry points, and can use
307any backend: internal or libtestdriver1.
308
309The opaque driver is not implemented at all, neither instumentation nor the
310operation: entry points always return `NOT_SUPPORTED`.
311
312Note: the instrumentation also allows forcing a specific output and output
313length.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100314
315#### Authenticated encryption with associated data (AEAD)
316
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100317The following entry points are declared (transparent only):
318- `"aead_encrypt"`
319- `"aead_decrypt"`
320- `"aead_encrypt_setup"`
321- `"aead_decrypt_setup"`
322- `"aead_set_nonce"`
323- `"aead_set_lengths"`
324- `"aead_update_ad"`
325- `"aead_update"`
326- `"aead_finish"`
327- `"aead_verify"`
328- `"aead_abort"`
329
330The transparent driver fully implements the declared entry points, and can use
331any backend: internal or libtestdriver1.
332
333The opaque driver does not implement or even declare entry points for this
334family.
335
336Note: the instrumentation records the number of hits per entry point, not just
337the total number of hits for this family.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100338
339#### Key derivation
340
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100341Not covered at all by the test drivers.
342
343That's a gap in our testing, as the driver interface does define a key
344derivation family of entry points. This gap is probably related to the fact
345that our internal code structure doesn't obey the guidelines and is not
346aligned with the driver interface, see #5488 and related issues.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100347
348#### Asymmetric signature
349
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100350The following entry points are declared (transparent and opaque):
351
352- `"sign_message"`
353- `"verify_message"`
354- `"sign_hash"`
355- `"verify_hash"`
356
357The transparent driver fully implements the declared entry points, and can use
358any backend: internal or libtestdriver1.
359
360The opaque driver is not implemented at all, neither instumentation nor the
361operation: entry points always return `NOT_SUPPORTED`.
362
363Note: the instrumentation also allows forcing a specific output and output
364length, and has two instance of the hooks structure: one for sign, the other
365for verify.
366
367Note: when a driver implements only the `"xxx_hash"` entry points, the core is
368supposed to implement the `psa_xxx_message()` functions by computing the hash
369itself before calling the `"xxx_hash"` entry point. Since the test driver does
370implement the `"xxx_message"` entry point, it's not exercising that part of
371the core's expected behaviour.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100372
373#### Asymmetric encryption
374
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100375The following entry points are declared (transparent and opaque):
376
377- `"asymmetric_encrypt"`
378- `"asymmetric_decrypt"`
379
380The transparent driver fully implements the declared entry points, and can use
381any backend: internal or libtestdriver1.
382
Manuel Pégourié-Gonnarddde1abd2024-04-09 12:12:48 +0200383The opaque driver implements the declared entry points, and can use any
384backend: internal or libtestdriver1. However it does not implement the
385instrumentation (hits, forced output/status), as this [was not an immediate
386priority](https://github.com/Mbed-TLS/mbedtls/pull/8700#issuecomment-1892466159).
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100387
388Note: the instrumentation also allows forcing a specific output and output
389length.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100390
391#### Key agreement
392
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100393The following entry points are declared (transparent and opaque):
394
395- `"key_agreement"`
396
397The transparent driver fully implements the declared entry points, and can use
398any backend: internal or libtestdriver1.
399
400The opaque driver is not implemented at all, neither instumentation nor the
401operation: entry points always return `NOT_SUPPORTED`.
402
403Note: the instrumentation also allows forcing a specific output and output
404length.
Manuel Pégourié-Gonnard1a827a32023-11-13 10:01:21 +0100405
406#### Other cryptographic services (Random number generation)
Gilles Peskine24cebf62020-11-30 17:51:53 +0100407
Manuel Pégourié-Gonnardb66f9db2023-11-13 11:32:37 +0100408Not covered at all by the test drivers.
409
410The driver interface defines a `"get_entropy"` entry point, as well as a
411"Random generation" family of entry points. None of those are currently
412implemented in the library. Part of it will be planned for 4.0, see #8150.
413
414#### PAKE extension
415
416The following entry points are declared (transparent only):
417- `"pake_setup"`
418- `"pake_output"`
419- `"pake_input"`
420- `"pake_get_implicit_key"`
421- `"pake_abort"`
422
423Note: the instrumentation records hits per entry point and allows forcing the
424output and its length, as well as forcing the status of setup independently
425from the others.
426
427The transparent driver fully implements the declared entry points, and can use
428any backend: internal or libtestdriver1.
429
430The opaque driver does not implement or even declare entry points for this
431family.
Manuel Pégourié-Gonnard6a96f422023-11-16 13:01:22 +0100432
433### Driver wrapper test suite
434
435We have a test suite dedicated to driver dispatch, which takes advantage of the
436instrumentation in the test drivers described in the previous section, in
437order to check that drivers are called when they're supposed to, and that the
438core behaves as expected when they return errors (in particular, that we fall
439back to the built-in implementation when the driver returns `NOT_SUPPORTED).
440
441This is `test_suite_psa_crypto_driver_wrappers`, which is maintained manually
442(that is, the test cases in the `.data` files are not auto-generated). The
443entire test suite depends on the test drivers being enabled
444(`PSA_CRYPTO_DRIVER_TEST`), which is not the case in the default or full
445config.
446
447#### Configurations coverage
448
449The driver wrappers test suite has cases that expect both the driver and the
450built-in to be present, and also cases that expect the driver to be present
451but not the built-in. As such, it's impossible for a single configuration to
452run all test cases, and we need at least two: driver+built-in, and
453driver-only.
454
455- The driver+built-in case is covered by `test_psa_crypto_drivers` in `all.sh`.
456This covers all areas (key types and algs) at once.
457- The driver-only case is split into multiple `all.sh` components whose names
458 start with `test_psa_crypto_config_accel`; we have one or more component per
459area, see below.
460
461Here's a summary of driver-only coverage, grouped by families of key types.
462
463Hash (key types: none)
464- `test_psa_crypto_config_accel_hash`: all algs, default config, no parity
465 testing.
466- `test_psa_crypto_config_accel_hash_use_psa`: all algs, full config, with
467 parity testing.
468
469HMAC (key type: HMAC)
Manuel Pégourié-Gonnard6c453612024-03-18 10:12:49 +0100470- `test_psa_crypto_config_accel_hmac`: all algs, full config except a few
471 exclusions (PKCS5, PKCS7, HMAC-DRBG, legacy HKDF, deterministic ECDSA), with
472parity testing.
Manuel Pégourié-Gonnard6a96f422023-11-16 13:01:22 +0100473
474Cipher, AEAD and CMAC (key types: DES, AES, ARIA, CHACHA20, CAMELLIA):
Manuel Pégourié-Gonnard98f8da12024-01-10 12:53:58 +0100475- `test_psa_crypto_config_accel_cipher_aead_cmac`: all key types and algs, full
476 config with a few exclusions (NIST-KW), with parity testing.
477- `test_psa_crypto_config_accel_des`: only DES (with all algs), full
Manuel Pégourié-Gonnard6a96f422023-11-16 13:01:22 +0100478 config, no parity testing.
479- `test_psa_crypto_config_accel_aead`: only AEAD algs (with all relevant key
480 types), full config, no parity testing.
481
482Key derivation (key types: `DERIVE`, `RAW_DATA`, `PASSWORD`, `PEPPER`,
483`PASSWORD_HASH`):
484- No testing as we don't have test driver support yet (see previous section).
485
486RSA (key types: `RSA_KEY_PAIR_xxx`, `RSA_PUBLIC_KEY`):
Manuel Pégourié-Gonnardf2089da2023-12-18 11:36:26 +0100487- `test_psa_crypto_config_accel_rsa_crypto`: all 4 algs (encryption &
488 signature, v1.5 & v2.1), config `crypto_full`, with parity testing excluding
489PK.
Manuel Pégourié-Gonnard6a96f422023-11-16 13:01:22 +0100490
491DH (key types: `DH_KEY_PAIR_xxx`, `DH_PUBLIC_KEY`):
492- `test_psa_crypto_config_accel_ffdh`: all key types and algs, full config,
493 with parity testing.
494- `test_psa_crypto_config_accel_ecc_ffdh_no_bignum`: with also bignum removed.
495
496ECC (key types: `ECC_KEY_PAIR_xxx`, `ECC_PUBLIC_KEY`):
497- Single algorithm accelerated (both key types, all curves):
498 - `test_psa_crypto_config_accel_ecdh`: default config, no parity testing.
499 - `test_psa_crypto_config_accel_ecdsa`: default config, no parity testing.
500 - `test_psa_crypto_config_accel_pake`: full config, no parity testing.
501- All key types, algs and curves accelerated (full config with exceptions,
502 with parity testing):
503 - `test_psa_crypto_config_accel_ecc_ecp_light_only`: `ECP_C` mostly disabled
504 - `test_psa_crypto_config_accel_ecc_no_ecp_at_all`: `ECP_C` fully disabled
505 - `test_psa_crypto_config_accel_ecc_no_bignum`: `BIGNUM_C` disabled (DH disabled)
506 - `test_psa_crypto_config_accel_ecc_ffdh_no_bignum`: `BIGNUM_C` disabled (DH accelerated)
507- Other - all algs accelerated but only some algs/curves (full config with
508 exceptions, no parity testing):
509 - `test_psa_crypto_config_accel_ecc_some_key_types`
510 - `test_psa_crypto_config_accel_ecc_non_weierstrass_curves`
511 - `test_psa_crypto_config_accel_ecc_weierstrass_curves`
512
513Note: `analyze_outcomes.py` provides a list of test cases that are not
Manuel Pégourié-Gonnardf2089da2023-12-18 11:36:26 +0100514executed in any configuration tested on the CI. We're missing driver-only HMAC
515testing, but no test is flagged as never executed there; this reveals we don't
516have "fallback not available" cases for MAC, see #8565.
Manuel Pégourié-Gonnard6a96f422023-11-16 13:01:22 +0100517
518#### Test case coverage
519
520Since `test_suite_psa_crypto_driver_wrappers.data` is maintained manually,
521we need to make sure it exercises all the cases that need to be tested.
522
523One way to evaluate this is to look at line coverage in test driver
524implementaitons - this doesn't reveal all gaps, but it does reveal cases where
525we thought about something when writing the test driver, but not when writing
526test functions/data.
527
528Key management:
Manuel Pégourié-Gonnard6a96f422023-11-16 13:01:22 +0100529- `mbedtls_test_transparent_generate_key()` is not tested with RSA keys.
530- `mbedtls_test_transparent_import_key()` is not tested with DH keys.
531- `mbedtls_test_opaque_import_key()` is not tested with unstructured keys nor
532 with RSA keys (nor DH keys since that's not implemented).
533- `mbedtls_test_opaque_export_key()` is not tested with non-built-in keys.
534- `mbedtls_test_transparent_export_public_key()` is not tested with RSA or DH keys.
535- `mbedtls_test_opaque_export_public_key()` is not tested with non-built-in keys.
536- `mbedtls_test_opaque_copy_key()` is not tested at all.
537
538Hash:
539- `mbedtls_test_transparent_hash_finish()` is not tested with a forced status.
540
541MAC:
542- The following are not tested with a forced status:
543 - `mbedtls_test_transparent_mac_sign_setup()`
544 - `mbedtls_test_transparent_mac_verify_setup()`
545 - `mbedtls_test_transparent_mac_update()`
546 - `mbedtls_test_transparent_mac_verify_finish()`
547 - `mbedtls_test_transparent_mac_abort()`
548- No opaque entry point is tested (they're not implemented either).
549
550Cipher:
551- The following are not tested with a forced status nor with a forced output:
552 - `mbedtls_test_transparent_cipher_encrypt()`
553 - `mbedtls_test_transparent_cipher_finish()`
554- No opaque entry point is tested (they're not implemented either).
555
556AEAD:
557- The following are not tested with a forced status:
558 - `mbedtls_test_transparent_aead_set_nonce()`
559 - `mbedtls_test_transparent_aead_set_lengths()`
560 - `mbedtls_test_transparent_aead_update_ad()`
561 - `mbedtls_test_transparent_aead_update()`
562 - `mbedtls_test_transparent_aead_finish()`
563 - `mbedtls_test_transparent_aead_verify()`
564- `mbedtls_test_transparent_aead_verify()` is not tested with an invalid tag
565 (though it might be in another test suite).
566
567Signature:
568- `sign_hash()` is not tested with RSA-PSS
569- No opaque entry point is tested (they're not implemented either).
570
Manuel Pégourié-Gonnard6a96f422023-11-16 13:01:22 +0100571Key agreement:
572- `mbedtls_test_transparent_key_agreement()` is not tested with FFDH.
573- No opaque entry point is tested (they're not implemented either).
574
575PAKE:
576- All lines are covered.