blob: f205c16ace3adeb8a0074e03c86830045ba0d7b1 [file] [log] [blame] [view]
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +02001Testing strategy for `MBEDTLS_USE_PSA_CRYPTO`
2=============================================
3
4This document records the testing strategy used so far in implementing
5`MBEDTLS_USE_PSA_CRYPTO`.
6
7
8General considerations
9----------------------
10
11There needs to be at least one build in `all.sh` that enables
Manuel Pégourié-Gonnard2467aed2022-02-01 10:42:30 +010012`MBEDTLS_USE_PSA_CRYPTO` and runs the full battery of tests; currently that's
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020013ensured by the fact that `scripts/config.py full` enables
Manuel Pégourié-Gonnard2467aed2022-02-01 10:42:30 +010014`MBEDTLS_USE_PSA_CRYPTO`. There needs to be at least one build with
15`MBEDTLS_USE_PSA_CRYPTO` disabled (as long as it's optional); currently that's
16ensured by the fact that it's disabled in the default config.
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020017
18Generally, code review is enough to ensure that PSA APIs are indeed used where
19they should be when `MBEDTLS_USE_PSA_CRYPTO` is enabled.
20
21However, when it comes to TLS, we also have the option of using debug messages
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +010022to confirm which code path is taken. This is generally unnecessary, except when
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020023a decision is made at run-time about whether to use the PSA or legacy code
Manuel Pégourié-Gonnardb8a6c232022-04-20 12:50:59 +020024path. (For example, for record protection, previously (until 3.1), some ciphers were supported
25via PSA while some others weren't, with a run-time fallback. In this case, it's
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020026good to have a debug message checked by the test case to confirm that the
27right decision was made at run-time, i. e. that we didn't use the fallback for
Manuel Pégourié-Gonnardb8a6c232022-04-20 12:50:59 +020028ciphers that are supposed to be supported.)
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020029
30
31New APIs meant for application use
32----------------------------------
33
34For example, `mbedtls_pk_setup_opaque()` is meant to be used by applications
35in order to create PK contexts that can then be passed to existing TLS and
36X.509 APIs (which remain unchanged).
37
38In that case, we want:
39
40- unit testing of the new API and directly-related APIs - for example:
41 - in `test_suite_pk` we have a new test function `pk_psa_utils` that exercises
42 `mbedtls_pk_setup_opaque()` and checks that various utility functions
43 (`mbedtls_pk_get_type()` etc.) work and the functions that are expected to
44 fail (`mbedtls_pk_verify()` etc) return the expected error.
45 - in `test_suite_pk` we modified the existing `pk_psa_sign` test function to
46 check that signature generation works as expected
47 - in `test_suite_pkwrite` we should have a new test function checking that
48 exporting (writing out) the public part of the key works as expected and
49 that exporting the private key fails as expected.
50- integration testing of the new API with each existing API which should
51 accepts a context created this way - for example:
52 - in `programs/ssl/ssl_client2` a new option `key_opaque` that causes the
53 new API to be used, and one or more tests in `ssl-opt.sh` using that.
54 (We should have the same server-side.)
55 - in `test_suite_x509write` we have a new test function
56 `x509_csr_check_opaque()` checking integration of the new API with the
Manuel Pégourié-Gonnardb8a6c232022-04-20 12:50:59 +020057 existing `mbedtls_x509write_csr_set_key()`. (And also
58 `mbedtls_x509write_crt_set_issuer_key()` since #5710.)
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020059
Manuel Pégourié-Gonnard2467aed2022-02-01 10:42:30 +010060For some APIs, for example with `mbedtls_ssl_conf_psk_opaque()`, testing in
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +010061`test_suite_ssl` was historically not possible, so we only have testing in
Manuel Pégourié-Gonnard2467aed2022-02-01 10:42:30 +010062`ssl-opt.sh`.
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020063
64New APIs meant for internal use
65-------------------------------
66
Manuel Pégourié-Gonnardb8a6c232022-04-20 12:50:59 +020067For example, `mbedtls_cipher_setup_psa()` (no longer used, soon to be
68deprecated - #5261) was meant to be used by the TLS layer, but probably not
69directly by applications.
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020070
71In that case, we want:
72
73- unit testing of the new API and directly-related APIs - for example:
74 - in `test_suite_cipher`, the existing test functions `auth_crypt_tv` and
75 `test_vec_crypt` gained a new parameter `use_psa` and corresponding test
76 cases
77- integration testing:
78 - usually already covered by existing tests for higher-level modules:
79 - for example simple use of `mbedtls_cipher_setup_psa()` in TLS is already
80 covered by running the existing TLS tests in a build with
81 `MBEDTLS_USA_PSA_CRYPTO` enabled
82 - however if use of the new API in higher layers involves more logic that
83 use of the old API, specific integrations test may be required
84 - for example, the logic to fall back from `mbedtls_cipher_setup_psa()` to
85 `mbedtls_cipher_setup()` in TLS is tested by `run_test_psa` in
86 `ssl-opt.sh`.
87
88Internal changes
89----------------
90
91For example, use of PSA to compute the TLS 1.2 PRF.
92
93Changes in this category rarely require specific testing, as everything should
94be already be covered by running the existing tests in a build with
Manuel Pégourié-Gonnard2467aed2022-02-01 10:42:30 +010095`MBEDTLS_USE_PSA_CRYPTO` enabled; however we need to make sure the existing
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +010096test have sufficient coverage, and improve them if necessary.
Manuel Pégourié-Gonnard1b52d092021-09-29 12:28:57 +020097
98However, if additional logic is involved, or there are run-time decisions about
99whether to use the PSA or legacy code paths, specific tests might be in order.