xref: /aosp_15_r20/external/mbedtls/library/psa_crypto_driver_wrappers.h (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi  *  Functions to delegate cryptographic operations to an available
3*62c56f98SSadaf Ebrahimi  *  and appropriate accelerator.
4*62c56f98SSadaf Ebrahimi  *  Warning: This file is now auto-generated.
5*62c56f98SSadaf Ebrahimi  */
6*62c56f98SSadaf Ebrahimi /*  Copyright The Mbed TLS Contributors
7*62c56f98SSadaf Ebrahimi  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
8*62c56f98SSadaf Ebrahimi  */
9*62c56f98SSadaf Ebrahimi 
10*62c56f98SSadaf Ebrahimi 
11*62c56f98SSadaf Ebrahimi /* BEGIN-common headers */
12*62c56f98SSadaf Ebrahimi #include "common.h"
13*62c56f98SSadaf Ebrahimi #include "psa_crypto_aead.h"
14*62c56f98SSadaf Ebrahimi #include "psa_crypto_cipher.h"
15*62c56f98SSadaf Ebrahimi #include "psa_crypto_core.h"
16*62c56f98SSadaf Ebrahimi #include "psa_crypto_driver_wrappers_no_static.h"
17*62c56f98SSadaf Ebrahimi #include "psa_crypto_hash.h"
18*62c56f98SSadaf Ebrahimi #include "psa_crypto_mac.h"
19*62c56f98SSadaf Ebrahimi #include "psa_crypto_pake.h"
20*62c56f98SSadaf Ebrahimi #include "psa_crypto_rsa.h"
21*62c56f98SSadaf Ebrahimi 
22*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
23*62c56f98SSadaf Ebrahimi #include "mbedtls/constant_time.h"
24*62c56f98SSadaf Ebrahimi /* END-common headers */
25*62c56f98SSadaf Ebrahimi 
26*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_C)
27*62c56f98SSadaf Ebrahimi 
28*62c56f98SSadaf Ebrahimi /* BEGIN-driver headers */
29*62c56f98SSadaf Ebrahimi /* Headers for mbedtls_test opaque driver */
30*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
31*62c56f98SSadaf Ebrahimi #include "test/drivers/test_driver.h"
32*62c56f98SSadaf Ebrahimi 
33*62c56f98SSadaf Ebrahimi #endif
34*62c56f98SSadaf Ebrahimi /* Headers for mbedtls_test transparent driver */
35*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
36*62c56f98SSadaf Ebrahimi #include "test/drivers/test_driver.h"
37*62c56f98SSadaf Ebrahimi 
38*62c56f98SSadaf Ebrahimi #endif
39*62c56f98SSadaf Ebrahimi /* Headers for p256 transparent driver */
40*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_P256M_DRIVER_ENABLED)
41*62c56f98SSadaf Ebrahimi #include "../3rdparty/p256-m/p256-m_driver_entrypoints.h"
42*62c56f98SSadaf Ebrahimi 
43*62c56f98SSadaf Ebrahimi #endif
44*62c56f98SSadaf Ebrahimi 
45*62c56f98SSadaf Ebrahimi /* END-driver headers */
46*62c56f98SSadaf Ebrahimi 
47*62c56f98SSadaf Ebrahimi /* Auto-generated values depending on which drivers are registered.
48*62c56f98SSadaf Ebrahimi  * ID 0 is reserved for unallocated operations.
49*62c56f98SSadaf Ebrahimi  * ID 1 is reserved for the Mbed TLS software driver. */
50*62c56f98SSadaf Ebrahimi /* BEGIN-driver id definition */
51*62c56f98SSadaf Ebrahimi #define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
52*62c56f98SSadaf Ebrahimi #define MBEDTLS_TEST_OPAQUE_DRIVER_ID (2)
53*62c56f98SSadaf Ebrahimi #define MBEDTLS_TEST_TRANSPARENT_DRIVER_ID (3)
54*62c56f98SSadaf Ebrahimi #define P256_TRANSPARENT_DRIVER_ID (4)
55*62c56f98SSadaf Ebrahimi 
56*62c56f98SSadaf Ebrahimi /* END-driver id */
57*62c56f98SSadaf Ebrahimi 
58*62c56f98SSadaf Ebrahimi /* BEGIN-Common Macro definitions */
59*62c56f98SSadaf Ebrahimi 
60*62c56f98SSadaf Ebrahimi /* END-Common Macro definitions */
61*62c56f98SSadaf Ebrahimi 
62*62c56f98SSadaf Ebrahimi /* Support the 'old' SE interface when asked to */
63*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
64*62c56f98SSadaf Ebrahimi /* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
65*62c56f98SSadaf Ebrahimi  * SE driver is present, to avoid unused argument errors at compile time. */
66*62c56f98SSadaf Ebrahimi #ifndef PSA_CRYPTO_DRIVER_PRESENT
67*62c56f98SSadaf Ebrahimi #define PSA_CRYPTO_DRIVER_PRESENT
68*62c56f98SSadaf Ebrahimi #endif
69*62c56f98SSadaf Ebrahimi #include "psa_crypto_se.h"
70*62c56f98SSadaf Ebrahimi #endif
71*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_init(void)72*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_init( void )
73*62c56f98SSadaf Ebrahimi {
74*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
75*62c56f98SSadaf Ebrahimi 
76*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
77*62c56f98SSadaf Ebrahimi     status = psa_init_all_se_drivers( );
78*62c56f98SSadaf Ebrahimi     if( status != PSA_SUCCESS )
79*62c56f98SSadaf Ebrahimi         return( status );
80*62c56f98SSadaf Ebrahimi #endif
81*62c56f98SSadaf Ebrahimi 
82*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
83*62c56f98SSadaf Ebrahimi     status = mbedtls_test_transparent_init( );
84*62c56f98SSadaf Ebrahimi     if( status != PSA_SUCCESS )
85*62c56f98SSadaf Ebrahimi         return( status );
86*62c56f98SSadaf Ebrahimi 
87*62c56f98SSadaf Ebrahimi     status = mbedtls_test_opaque_init( );
88*62c56f98SSadaf Ebrahimi     if( status != PSA_SUCCESS )
89*62c56f98SSadaf Ebrahimi         return( status );
90*62c56f98SSadaf Ebrahimi #endif
91*62c56f98SSadaf Ebrahimi 
92*62c56f98SSadaf Ebrahimi     (void) status;
93*62c56f98SSadaf Ebrahimi     return( PSA_SUCCESS );
94*62c56f98SSadaf Ebrahimi }
95*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_free(void)96*62c56f98SSadaf Ebrahimi static inline void psa_driver_wrapper_free( void )
97*62c56f98SSadaf Ebrahimi {
98*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
99*62c56f98SSadaf Ebrahimi     /* Unregister all secure element drivers, so that we restart from
100*62c56f98SSadaf Ebrahimi      * a pristine state. */
101*62c56f98SSadaf Ebrahimi     psa_unregister_all_se_drivers( );
102*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
103*62c56f98SSadaf Ebrahimi 
104*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
105*62c56f98SSadaf Ebrahimi     mbedtls_test_transparent_free( );
106*62c56f98SSadaf Ebrahimi     mbedtls_test_opaque_free( );
107*62c56f98SSadaf Ebrahimi #endif
108*62c56f98SSadaf Ebrahimi }
109*62c56f98SSadaf Ebrahimi 
110*62c56f98SSadaf Ebrahimi /* Start delegation functions */
psa_driver_wrapper_sign_message(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * input,size_t input_length,uint8_t * signature,size_t signature_size,size_t * signature_length)111*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_sign_message(
112*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
113*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
114*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
115*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
116*62c56f98SSadaf Ebrahimi     const uint8_t *input,
117*62c56f98SSadaf Ebrahimi     size_t input_length,
118*62c56f98SSadaf Ebrahimi     uint8_t *signature,
119*62c56f98SSadaf Ebrahimi     size_t signature_size,
120*62c56f98SSadaf Ebrahimi     size_t *signature_length )
121*62c56f98SSadaf Ebrahimi {
122*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
123*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
124*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
125*62c56f98SSadaf Ebrahimi 
126*62c56f98SSadaf Ebrahimi     switch( location )
127*62c56f98SSadaf Ebrahimi     {
128*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
129*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
130*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
131*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
132*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
133*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_signature_sign_message(
134*62c56f98SSadaf Ebrahimi                         attributes,
135*62c56f98SSadaf Ebrahimi                         key_buffer,
136*62c56f98SSadaf Ebrahimi                         key_buffer_size,
137*62c56f98SSadaf Ebrahimi                         alg,
138*62c56f98SSadaf Ebrahimi                         input,
139*62c56f98SSadaf Ebrahimi                         input_length,
140*62c56f98SSadaf Ebrahimi                         signature,
141*62c56f98SSadaf Ebrahimi                         signature_size,
142*62c56f98SSadaf Ebrahimi                         signature_length );
143*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
144*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
145*62c56f98SSadaf Ebrahimi                 return( status );
146*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
147*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
148*62c56f98SSadaf Ebrahimi             break;
149*62c56f98SSadaf Ebrahimi 
150*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
151*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
152*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
153*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
154*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_signature_sign_message(
155*62c56f98SSadaf Ebrahimi                         attributes,
156*62c56f98SSadaf Ebrahimi                         key_buffer,
157*62c56f98SSadaf Ebrahimi                         key_buffer_size,
158*62c56f98SSadaf Ebrahimi                         alg,
159*62c56f98SSadaf Ebrahimi                         input,
160*62c56f98SSadaf Ebrahimi                         input_length,
161*62c56f98SSadaf Ebrahimi                         signature,
162*62c56f98SSadaf Ebrahimi                         signature_size,
163*62c56f98SSadaf Ebrahimi                         signature_length );
164*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
165*62c56f98SSadaf Ebrahimi                 return( status );
166*62c56f98SSadaf Ebrahimi             break;
167*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
168*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
169*62c56f98SSadaf Ebrahimi         default:
170*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
171*62c56f98SSadaf Ebrahimi             (void)status;
172*62c56f98SSadaf Ebrahimi             break;
173*62c56f98SSadaf Ebrahimi     }
174*62c56f98SSadaf Ebrahimi 
175*62c56f98SSadaf Ebrahimi     return( psa_sign_message_builtin( attributes,
176*62c56f98SSadaf Ebrahimi                                       key_buffer,
177*62c56f98SSadaf Ebrahimi                                       key_buffer_size,
178*62c56f98SSadaf Ebrahimi                                       alg,
179*62c56f98SSadaf Ebrahimi                                       input,
180*62c56f98SSadaf Ebrahimi                                       input_length,
181*62c56f98SSadaf Ebrahimi                                       signature,
182*62c56f98SSadaf Ebrahimi                                       signature_size,
183*62c56f98SSadaf Ebrahimi                                       signature_length ) );
184*62c56f98SSadaf Ebrahimi }
185*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_verify_message(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * input,size_t input_length,const uint8_t * signature,size_t signature_length)186*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_verify_message(
187*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
188*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
189*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
190*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
191*62c56f98SSadaf Ebrahimi     const uint8_t *input,
192*62c56f98SSadaf Ebrahimi     size_t input_length,
193*62c56f98SSadaf Ebrahimi     const uint8_t *signature,
194*62c56f98SSadaf Ebrahimi     size_t signature_length )
195*62c56f98SSadaf Ebrahimi {
196*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
197*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
198*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
199*62c56f98SSadaf Ebrahimi 
200*62c56f98SSadaf Ebrahimi     switch( location )
201*62c56f98SSadaf Ebrahimi     {
202*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
203*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
204*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
205*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
206*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
207*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_signature_verify_message(
208*62c56f98SSadaf Ebrahimi                         attributes,
209*62c56f98SSadaf Ebrahimi                         key_buffer,
210*62c56f98SSadaf Ebrahimi                         key_buffer_size,
211*62c56f98SSadaf Ebrahimi                         alg,
212*62c56f98SSadaf Ebrahimi                         input,
213*62c56f98SSadaf Ebrahimi                         input_length,
214*62c56f98SSadaf Ebrahimi                         signature,
215*62c56f98SSadaf Ebrahimi                         signature_length );
216*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
217*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
218*62c56f98SSadaf Ebrahimi                 return( status );
219*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
220*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
221*62c56f98SSadaf Ebrahimi             break;
222*62c56f98SSadaf Ebrahimi 
223*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
224*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
225*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
226*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
227*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_signature_verify_message(
228*62c56f98SSadaf Ebrahimi                         attributes,
229*62c56f98SSadaf Ebrahimi                         key_buffer,
230*62c56f98SSadaf Ebrahimi                         key_buffer_size,
231*62c56f98SSadaf Ebrahimi                         alg,
232*62c56f98SSadaf Ebrahimi                         input,
233*62c56f98SSadaf Ebrahimi                         input_length,
234*62c56f98SSadaf Ebrahimi                         signature,
235*62c56f98SSadaf Ebrahimi                         signature_length ) );
236*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
237*62c56f98SSadaf Ebrahimi                 return( status );
238*62c56f98SSadaf Ebrahimi             break;
239*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
240*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
241*62c56f98SSadaf Ebrahimi         default:
242*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
243*62c56f98SSadaf Ebrahimi             (void)status;
244*62c56f98SSadaf Ebrahimi             break;
245*62c56f98SSadaf Ebrahimi     }
246*62c56f98SSadaf Ebrahimi 
247*62c56f98SSadaf Ebrahimi     return( psa_verify_message_builtin( attributes,
248*62c56f98SSadaf Ebrahimi                                         key_buffer,
249*62c56f98SSadaf Ebrahimi                                         key_buffer_size,
250*62c56f98SSadaf Ebrahimi                                         alg,
251*62c56f98SSadaf Ebrahimi                                         input,
252*62c56f98SSadaf Ebrahimi                                         input_length,
253*62c56f98SSadaf Ebrahimi                                         signature,
254*62c56f98SSadaf Ebrahimi                                         signature_length ) );
255*62c56f98SSadaf Ebrahimi }
256*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_sign_hash(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * hash,size_t hash_length,uint8_t * signature,size_t signature_size,size_t * signature_length)257*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_sign_hash(
258*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
259*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer, size_t key_buffer_size,
260*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
261*62c56f98SSadaf Ebrahimi     uint8_t *signature, size_t signature_size, size_t *signature_length )
262*62c56f98SSadaf Ebrahimi {
263*62c56f98SSadaf Ebrahimi     /* Try dynamically-registered SE interface first */
264*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
265*62c56f98SSadaf Ebrahimi     const psa_drv_se_t *drv;
266*62c56f98SSadaf Ebrahimi     psa_drv_se_context_t *drv_context;
267*62c56f98SSadaf Ebrahimi 
268*62c56f98SSadaf Ebrahimi     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
269*62c56f98SSadaf Ebrahimi     {
270*62c56f98SSadaf Ebrahimi         if( drv->asymmetric == NULL ||
271*62c56f98SSadaf Ebrahimi             drv->asymmetric->p_sign == NULL )
272*62c56f98SSadaf Ebrahimi         {
273*62c56f98SSadaf Ebrahimi             /* Key is defined in SE, but we have no way to exercise it */
274*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
275*62c56f98SSadaf Ebrahimi         }
276*62c56f98SSadaf Ebrahimi         return( drv->asymmetric->p_sign(
277*62c56f98SSadaf Ebrahimi                     drv_context, *( (psa_key_slot_number_t *)key_buffer ),
278*62c56f98SSadaf Ebrahimi                     alg, hash, hash_length,
279*62c56f98SSadaf Ebrahimi                     signature, signature_size, signature_length ) );
280*62c56f98SSadaf Ebrahimi     }
281*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
282*62c56f98SSadaf Ebrahimi 
283*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
284*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
285*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
286*62c56f98SSadaf Ebrahimi 
287*62c56f98SSadaf Ebrahimi     switch( location )
288*62c56f98SSadaf Ebrahimi     {
289*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
290*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
291*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
292*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
293*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
294*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_signature_sign_hash( attributes,
295*62c56f98SSadaf Ebrahimi                                                            key_buffer,
296*62c56f98SSadaf Ebrahimi                                                            key_buffer_size,
297*62c56f98SSadaf Ebrahimi                                                            alg,
298*62c56f98SSadaf Ebrahimi                                                            hash,
299*62c56f98SSadaf Ebrahimi                                                            hash_length,
300*62c56f98SSadaf Ebrahimi                                                            signature,
301*62c56f98SSadaf Ebrahimi                                                            signature_size,
302*62c56f98SSadaf Ebrahimi                                                            signature_length );
303*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
304*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
305*62c56f98SSadaf Ebrahimi                 return( status );
306*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
307*62c56f98SSadaf Ebrahimi #if defined (MBEDTLS_PSA_P256M_DRIVER_ENABLED)
308*62c56f98SSadaf Ebrahimi             if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) &&
309*62c56f98SSadaf Ebrahimi                 PSA_ALG_IS_ECDSA(alg) &&
310*62c56f98SSadaf Ebrahimi                 !PSA_ALG_ECDSA_IS_DETERMINISTIC( alg ) &&
311*62c56f98SSadaf Ebrahimi                 PSA_KEY_TYPE_ECC_GET_FAMILY(attributes->core.type) == PSA_ECC_FAMILY_SECP_R1 &&
312*62c56f98SSadaf Ebrahimi                 attributes->core.bits == 256 )
313*62c56f98SSadaf Ebrahimi             {
314*62c56f98SSadaf Ebrahimi                 status = p256_transparent_sign_hash( attributes,
315*62c56f98SSadaf Ebrahimi                                                      key_buffer,
316*62c56f98SSadaf Ebrahimi                                                      key_buffer_size,
317*62c56f98SSadaf Ebrahimi                                                      alg,
318*62c56f98SSadaf Ebrahimi                                                      hash,
319*62c56f98SSadaf Ebrahimi                                                      hash_length,
320*62c56f98SSadaf Ebrahimi                                                      signature,
321*62c56f98SSadaf Ebrahimi                                                      signature_size,
322*62c56f98SSadaf Ebrahimi                                                      signature_length );
323*62c56f98SSadaf Ebrahimi                 if( status != PSA_ERROR_NOT_SUPPORTED )
324*62c56f98SSadaf Ebrahimi                 return( status );
325*62c56f98SSadaf Ebrahimi             }
326*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_P256M_DRIVER_ENABLED */
327*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
328*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
329*62c56f98SSadaf Ebrahimi             return( psa_sign_hash_builtin( attributes,
330*62c56f98SSadaf Ebrahimi                                            key_buffer,
331*62c56f98SSadaf Ebrahimi                                            key_buffer_size,
332*62c56f98SSadaf Ebrahimi                                            alg,
333*62c56f98SSadaf Ebrahimi                                            hash,
334*62c56f98SSadaf Ebrahimi                                            hash_length,
335*62c56f98SSadaf Ebrahimi                                            signature,
336*62c56f98SSadaf Ebrahimi                                            signature_size,
337*62c56f98SSadaf Ebrahimi                                            signature_length ) );
338*62c56f98SSadaf Ebrahimi 
339*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
340*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
341*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
342*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
343*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_signature_sign_hash( attributes,
344*62c56f98SSadaf Ebrahimi                                                              key_buffer,
345*62c56f98SSadaf Ebrahimi                                                              key_buffer_size,
346*62c56f98SSadaf Ebrahimi                                                              alg,
347*62c56f98SSadaf Ebrahimi                                                              hash,
348*62c56f98SSadaf Ebrahimi                                                              hash_length,
349*62c56f98SSadaf Ebrahimi                                                              signature,
350*62c56f98SSadaf Ebrahimi                                                              signature_size,
351*62c56f98SSadaf Ebrahimi                                                              signature_length ) );
352*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
353*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
354*62c56f98SSadaf Ebrahimi         default:
355*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
356*62c56f98SSadaf Ebrahimi             (void)status;
357*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
358*62c56f98SSadaf Ebrahimi     }
359*62c56f98SSadaf Ebrahimi }
360*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_verify_hash(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * hash,size_t hash_length,const uint8_t * signature,size_t signature_length)361*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_verify_hash(
362*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
363*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer, size_t key_buffer_size,
364*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
365*62c56f98SSadaf Ebrahimi     const uint8_t *signature, size_t signature_length )
366*62c56f98SSadaf Ebrahimi {
367*62c56f98SSadaf Ebrahimi     /* Try dynamically-registered SE interface first */
368*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
369*62c56f98SSadaf Ebrahimi     const psa_drv_se_t *drv;
370*62c56f98SSadaf Ebrahimi     psa_drv_se_context_t *drv_context;
371*62c56f98SSadaf Ebrahimi 
372*62c56f98SSadaf Ebrahimi     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
373*62c56f98SSadaf Ebrahimi     {
374*62c56f98SSadaf Ebrahimi         if( drv->asymmetric == NULL ||
375*62c56f98SSadaf Ebrahimi             drv->asymmetric->p_verify == NULL )
376*62c56f98SSadaf Ebrahimi         {
377*62c56f98SSadaf Ebrahimi             /* Key is defined in SE, but we have no way to exercise it */
378*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
379*62c56f98SSadaf Ebrahimi         }
380*62c56f98SSadaf Ebrahimi         return( drv->asymmetric->p_verify(
381*62c56f98SSadaf Ebrahimi                     drv_context, *( (psa_key_slot_number_t *)key_buffer ),
382*62c56f98SSadaf Ebrahimi                     alg, hash, hash_length,
383*62c56f98SSadaf Ebrahimi                     signature, signature_length ) );
384*62c56f98SSadaf Ebrahimi     }
385*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
386*62c56f98SSadaf Ebrahimi 
387*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
388*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
389*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
390*62c56f98SSadaf Ebrahimi 
391*62c56f98SSadaf Ebrahimi     switch( location )
392*62c56f98SSadaf Ebrahimi     {
393*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
394*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
395*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
396*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
397*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
398*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_signature_verify_hash(
399*62c56f98SSadaf Ebrahimi                          attributes,
400*62c56f98SSadaf Ebrahimi                          key_buffer,
401*62c56f98SSadaf Ebrahimi                          key_buffer_size,
402*62c56f98SSadaf Ebrahimi                          alg,
403*62c56f98SSadaf Ebrahimi                          hash,
404*62c56f98SSadaf Ebrahimi                          hash_length,
405*62c56f98SSadaf Ebrahimi                          signature,
406*62c56f98SSadaf Ebrahimi                          signature_length );
407*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
408*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
409*62c56f98SSadaf Ebrahimi                 return( status );
410*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
411*62c56f98SSadaf Ebrahimi #if defined (MBEDTLS_PSA_P256M_DRIVER_ENABLED)
412*62c56f98SSadaf Ebrahimi             if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) &&
413*62c56f98SSadaf Ebrahimi                 PSA_ALG_IS_ECDSA(alg) &&
414*62c56f98SSadaf Ebrahimi                 !PSA_ALG_ECDSA_IS_DETERMINISTIC( alg ) &&
415*62c56f98SSadaf Ebrahimi                 PSA_KEY_TYPE_ECC_GET_FAMILY(attributes->core.type) == PSA_ECC_FAMILY_SECP_R1 &&
416*62c56f98SSadaf Ebrahimi                 attributes->core.bits == 256 )
417*62c56f98SSadaf Ebrahimi             {
418*62c56f98SSadaf Ebrahimi                 status = p256_transparent_verify_hash( attributes,
419*62c56f98SSadaf Ebrahimi                                                        key_buffer,
420*62c56f98SSadaf Ebrahimi                                                        key_buffer_size,
421*62c56f98SSadaf Ebrahimi                                                        alg,
422*62c56f98SSadaf Ebrahimi                                                        hash,
423*62c56f98SSadaf Ebrahimi                                                        hash_length,
424*62c56f98SSadaf Ebrahimi                                                        signature,
425*62c56f98SSadaf Ebrahimi                                                        signature_length );
426*62c56f98SSadaf Ebrahimi                 if( status != PSA_ERROR_NOT_SUPPORTED )
427*62c56f98SSadaf Ebrahimi                 return( status );
428*62c56f98SSadaf Ebrahimi             }
429*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_P256M_DRIVER_ENABLED */
430*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
431*62c56f98SSadaf Ebrahimi 
432*62c56f98SSadaf Ebrahimi             return( psa_verify_hash_builtin( attributes,
433*62c56f98SSadaf Ebrahimi                                              key_buffer,
434*62c56f98SSadaf Ebrahimi                                              key_buffer_size,
435*62c56f98SSadaf Ebrahimi                                              alg,
436*62c56f98SSadaf Ebrahimi                                              hash,
437*62c56f98SSadaf Ebrahimi                                              hash_length,
438*62c56f98SSadaf Ebrahimi                                              signature,
439*62c56f98SSadaf Ebrahimi                                              signature_length ) );
440*62c56f98SSadaf Ebrahimi 
441*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
442*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
443*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
444*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
445*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_signature_verify_hash( attributes,
446*62c56f98SSadaf Ebrahimi                                                                key_buffer,
447*62c56f98SSadaf Ebrahimi                                                                key_buffer_size,
448*62c56f98SSadaf Ebrahimi                                                                alg,
449*62c56f98SSadaf Ebrahimi                                                                hash,
450*62c56f98SSadaf Ebrahimi                                                                hash_length,
451*62c56f98SSadaf Ebrahimi                                                                signature,
452*62c56f98SSadaf Ebrahimi                                                                signature_length ) );
453*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
454*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
455*62c56f98SSadaf Ebrahimi         default:
456*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
457*62c56f98SSadaf Ebrahimi             (void)status;
458*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
459*62c56f98SSadaf Ebrahimi     }
460*62c56f98SSadaf Ebrahimi }
461*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_sign_hash_get_num_ops(psa_sign_hash_interruptible_operation_t * operation)462*62c56f98SSadaf Ebrahimi static inline uint32_t psa_driver_wrapper_sign_hash_get_num_ops(
463*62c56f98SSadaf Ebrahimi     psa_sign_hash_interruptible_operation_t *operation )
464*62c56f98SSadaf Ebrahimi {
465*62c56f98SSadaf Ebrahimi     switch( operation->id )
466*62c56f98SSadaf Ebrahimi     {
467*62c56f98SSadaf Ebrahimi         /* If uninitialised, return 0, as no work can have been done. */
468*62c56f98SSadaf Ebrahimi         case 0:
469*62c56f98SSadaf Ebrahimi             return 0;
470*62c56f98SSadaf Ebrahimi 
471*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
472*62c56f98SSadaf Ebrahimi             return(mbedtls_psa_sign_hash_get_num_ops(&operation->ctx.mbedtls_ctx));
473*62c56f98SSadaf Ebrahimi 
474*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
475*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
476*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
477*62c56f98SSadaf Ebrahimi 
478*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
479*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
480*62c56f98SSadaf Ebrahimi     }
481*62c56f98SSadaf Ebrahimi 
482*62c56f98SSadaf Ebrahimi     /* Can't happen (see discussion in #8271) */
483*62c56f98SSadaf Ebrahimi     return 0;
484*62c56f98SSadaf Ebrahimi }
485*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_verify_hash_get_num_ops(psa_verify_hash_interruptible_operation_t * operation)486*62c56f98SSadaf Ebrahimi static inline uint32_t psa_driver_wrapper_verify_hash_get_num_ops(
487*62c56f98SSadaf Ebrahimi     psa_verify_hash_interruptible_operation_t *operation )
488*62c56f98SSadaf Ebrahimi {
489*62c56f98SSadaf Ebrahimi     switch( operation->id )
490*62c56f98SSadaf Ebrahimi     {
491*62c56f98SSadaf Ebrahimi         /* If uninitialised, return 0, as no work can have been done. */
492*62c56f98SSadaf Ebrahimi         case 0:
493*62c56f98SSadaf Ebrahimi             return 0;
494*62c56f98SSadaf Ebrahimi 
495*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
496*62c56f98SSadaf Ebrahimi             return (mbedtls_psa_verify_hash_get_num_ops(&operation->ctx.mbedtls_ctx));
497*62c56f98SSadaf Ebrahimi 
498*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
499*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
500*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
501*62c56f98SSadaf Ebrahimi 
502*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
503*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
504*62c56f98SSadaf Ebrahimi 
505*62c56f98SSadaf Ebrahimi     }
506*62c56f98SSadaf Ebrahimi 
507*62c56f98SSadaf Ebrahimi     /* Can't happen (see discussion in #8271) */
508*62c56f98SSadaf Ebrahimi     return 0;
509*62c56f98SSadaf Ebrahimi }
510*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_sign_hash_start(psa_sign_hash_interruptible_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * hash,size_t hash_length)511*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_sign_hash_start(
512*62c56f98SSadaf Ebrahimi     psa_sign_hash_interruptible_operation_t *operation,
513*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes, const uint8_t *key_buffer,
514*62c56f98SSadaf Ebrahimi     size_t key_buffer_size, psa_algorithm_t alg,
515*62c56f98SSadaf Ebrahimi     const uint8_t *hash, size_t hash_length )
516*62c56f98SSadaf Ebrahimi {
517*62c56f98SSadaf Ebrahimi     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
518*62c56f98SSadaf Ebrahimi                                                     attributes->core.lifetime );
519*62c56f98SSadaf Ebrahimi 
520*62c56f98SSadaf Ebrahimi     switch( location )
521*62c56f98SSadaf Ebrahimi     {
522*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
523*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
524*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
525*62c56f98SSadaf Ebrahimi 
526*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
527*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
528*62c56f98SSadaf Ebrahimi 
529*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
530*62c56f98SSadaf Ebrahimi 
531*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
532*62c56f98SSadaf Ebrahimi 
533*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
534*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
535*62c56f98SSadaf Ebrahimi 
536*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
537*62c56f98SSadaf Ebrahimi             operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
538*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_sign_hash_start( &operation->ctx.mbedtls_ctx,
539*62c56f98SSadaf Ebrahimi                                                  attributes,
540*62c56f98SSadaf Ebrahimi                                                  key_buffer, key_buffer_size,
541*62c56f98SSadaf Ebrahimi                                                  alg, hash, hash_length ) );
542*62c56f98SSadaf Ebrahimi             break;
543*62c56f98SSadaf Ebrahimi 
544*62c56f98SSadaf Ebrahimi             /* Add cases for opaque driver here */
545*62c56f98SSadaf Ebrahimi 
546*62c56f98SSadaf Ebrahimi         default:
547*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
548*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
549*62c56f98SSadaf Ebrahimi     }
550*62c56f98SSadaf Ebrahimi }
551*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_sign_hash_complete(psa_sign_hash_interruptible_operation_t * operation,uint8_t * signature,size_t signature_size,size_t * signature_length)552*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_sign_hash_complete(
553*62c56f98SSadaf Ebrahimi     psa_sign_hash_interruptible_operation_t *operation,
554*62c56f98SSadaf Ebrahimi     uint8_t *signature, size_t signature_size,
555*62c56f98SSadaf Ebrahimi     size_t *signature_length )
556*62c56f98SSadaf Ebrahimi {
557*62c56f98SSadaf Ebrahimi     switch( operation->id )
558*62c56f98SSadaf Ebrahimi     {
559*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
560*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_sign_hash_complete( &operation->ctx.mbedtls_ctx,
561*62c56f98SSadaf Ebrahimi                                                     signature, signature_size,
562*62c56f98SSadaf Ebrahimi                                                     signature_length ) );
563*62c56f98SSadaf Ebrahimi 
564*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
565*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
566*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
567*62c56f98SSadaf Ebrahimi 
568*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
569*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
570*62c56f98SSadaf Ebrahimi     }
571*62c56f98SSadaf Ebrahimi 
572*62c56f98SSadaf Ebrahimi     ( void ) signature;
573*62c56f98SSadaf Ebrahimi     ( void ) signature_size;
574*62c56f98SSadaf Ebrahimi     ( void ) signature_length;
575*62c56f98SSadaf Ebrahimi 
576*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
577*62c56f98SSadaf Ebrahimi }
578*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_sign_hash_abort(psa_sign_hash_interruptible_operation_t * operation)579*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_sign_hash_abort(
580*62c56f98SSadaf Ebrahimi     psa_sign_hash_interruptible_operation_t *operation )
581*62c56f98SSadaf Ebrahimi {
582*62c56f98SSadaf Ebrahimi     switch( operation->id )
583*62c56f98SSadaf Ebrahimi     {
584*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
585*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_sign_hash_abort( &operation->ctx.mbedtls_ctx ) );
586*62c56f98SSadaf Ebrahimi 
587*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
588*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
589*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
590*62c56f98SSadaf Ebrahimi 
591*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
592*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
593*62c56f98SSadaf Ebrahimi     }
594*62c56f98SSadaf Ebrahimi 
595*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
596*62c56f98SSadaf Ebrahimi }
597*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_verify_hash_start(psa_verify_hash_interruptible_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * hash,size_t hash_length,const uint8_t * signature,size_t signature_length)598*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_verify_hash_start(
599*62c56f98SSadaf Ebrahimi     psa_verify_hash_interruptible_operation_t *operation,
600*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes, const uint8_t *key_buffer,
601*62c56f98SSadaf Ebrahimi     size_t key_buffer_size, psa_algorithm_t alg,
602*62c56f98SSadaf Ebrahimi     const uint8_t *hash, size_t hash_length,
603*62c56f98SSadaf Ebrahimi     const uint8_t *signature, size_t signature_length )
604*62c56f98SSadaf Ebrahimi {
605*62c56f98SSadaf Ebrahimi     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
606*62c56f98SSadaf Ebrahimi                                                     attributes->core.lifetime );
607*62c56f98SSadaf Ebrahimi 
608*62c56f98SSadaf Ebrahimi     switch( location )
609*62c56f98SSadaf Ebrahimi     {
610*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
611*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
612*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
613*62c56f98SSadaf Ebrahimi 
614*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
615*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
616*62c56f98SSadaf Ebrahimi 
617*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
618*62c56f98SSadaf Ebrahimi 
619*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
620*62c56f98SSadaf Ebrahimi 
621*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
622*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
623*62c56f98SSadaf Ebrahimi 
624*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
625*62c56f98SSadaf Ebrahimi             operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
626*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_verify_hash_start( &operation->ctx.mbedtls_ctx,
627*62c56f98SSadaf Ebrahimi                                                    attributes,
628*62c56f98SSadaf Ebrahimi                                                    key_buffer, key_buffer_size,
629*62c56f98SSadaf Ebrahimi                                                    alg, hash, hash_length,
630*62c56f98SSadaf Ebrahimi                                                    signature, signature_length
631*62c56f98SSadaf Ebrahimi                                                    ) );
632*62c56f98SSadaf Ebrahimi             break;
633*62c56f98SSadaf Ebrahimi 
634*62c56f98SSadaf Ebrahimi             /* Add cases for opaque driver here */
635*62c56f98SSadaf Ebrahimi 
636*62c56f98SSadaf Ebrahimi         default:
637*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
638*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
639*62c56f98SSadaf Ebrahimi     }
640*62c56f98SSadaf Ebrahimi }
641*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_verify_hash_complete(psa_verify_hash_interruptible_operation_t * operation)642*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_verify_hash_complete(
643*62c56f98SSadaf Ebrahimi     psa_verify_hash_interruptible_operation_t *operation )
644*62c56f98SSadaf Ebrahimi {
645*62c56f98SSadaf Ebrahimi     switch( operation->id )
646*62c56f98SSadaf Ebrahimi     {
647*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
648*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_verify_hash_complete(
649*62c56f98SSadaf Ebrahimi                                                      &operation->ctx.mbedtls_ctx
650*62c56f98SSadaf Ebrahimi                                                      ) );
651*62c56f98SSadaf Ebrahimi 
652*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
653*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
654*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
655*62c56f98SSadaf Ebrahimi 
656*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
657*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
658*62c56f98SSadaf Ebrahimi     }
659*62c56f98SSadaf Ebrahimi 
660*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
661*62c56f98SSadaf Ebrahimi }
662*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_verify_hash_abort(psa_verify_hash_interruptible_operation_t * operation)663*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_verify_hash_abort(
664*62c56f98SSadaf Ebrahimi     psa_verify_hash_interruptible_operation_t *operation )
665*62c56f98SSadaf Ebrahimi {
666*62c56f98SSadaf Ebrahimi     switch( operation->id )
667*62c56f98SSadaf Ebrahimi     {
668*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
669*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_verify_hash_abort( &operation->ctx.mbedtls_ctx
670*62c56f98SSadaf Ebrahimi                                                  ) );
671*62c56f98SSadaf Ebrahimi 
672*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
673*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
674*62c56f98SSadaf Ebrahimi             /* Add test driver tests here */
675*62c56f98SSadaf Ebrahimi 
676*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
677*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
678*62c56f98SSadaf Ebrahimi     }
679*62c56f98SSadaf Ebrahimi 
680*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
681*62c56f98SSadaf Ebrahimi }
682*62c56f98SSadaf Ebrahimi 
683*62c56f98SSadaf Ebrahimi /** Calculate the key buffer size required to store the key material of a key
684*62c56f98SSadaf Ebrahimi  *  associated with an opaque driver from input key data.
685*62c56f98SSadaf Ebrahimi  *
686*62c56f98SSadaf Ebrahimi  * \param[in] attributes        The key attributes
687*62c56f98SSadaf Ebrahimi  * \param[in] data              The input key data.
688*62c56f98SSadaf Ebrahimi  * \param[in] data_length       The input data length.
689*62c56f98SSadaf Ebrahimi  * \param[out] key_buffer_size  Minimum buffer size to contain the key material.
690*62c56f98SSadaf Ebrahimi  *
691*62c56f98SSadaf Ebrahimi  * \retval #PSA_SUCCESS \emptydescription
692*62c56f98SSadaf Ebrahimi  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
693*62c56f98SSadaf Ebrahimi  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
694*62c56f98SSadaf Ebrahimi  */
psa_driver_wrapper_get_key_buffer_size_from_key_data(const psa_key_attributes_t * attributes,const uint8_t * data,size_t data_length,size_t * key_buffer_size)695*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_get_key_buffer_size_from_key_data(
696*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
697*62c56f98SSadaf Ebrahimi     const uint8_t *data,
698*62c56f98SSadaf Ebrahimi     size_t data_length,
699*62c56f98SSadaf Ebrahimi     size_t *key_buffer_size )
700*62c56f98SSadaf Ebrahimi {
701*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
702*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
703*62c56f98SSadaf Ebrahimi     psa_key_type_t key_type = attributes->core.type;
704*62c56f98SSadaf Ebrahimi 
705*62c56f98SSadaf Ebrahimi     *key_buffer_size = 0;
706*62c56f98SSadaf Ebrahimi     switch( location )
707*62c56f98SSadaf Ebrahimi     {
708*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
709*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
710*62c56f98SSadaf Ebrahimi             *key_buffer_size = mbedtls_test_opaque_size_function( key_type,
711*62c56f98SSadaf Ebrahimi                                      PSA_BYTES_TO_BITS( data_length ) );
712*62c56f98SSadaf Ebrahimi             return( ( *key_buffer_size != 0 ) ?
713*62c56f98SSadaf Ebrahimi                     PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
714*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
715*62c56f98SSadaf Ebrahimi 
716*62c56f98SSadaf Ebrahimi         default:
717*62c56f98SSadaf Ebrahimi             (void)key_type;
718*62c56f98SSadaf Ebrahimi             (void)data;
719*62c56f98SSadaf Ebrahimi             (void)data_length;
720*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
721*62c56f98SSadaf Ebrahimi     }
722*62c56f98SSadaf Ebrahimi }
723*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_generate_key(const psa_key_attributes_t * attributes,uint8_t * key_buffer,size_t key_buffer_size,size_t * key_buffer_length)724*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_generate_key(
725*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
726*62c56f98SSadaf Ebrahimi     uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
727*62c56f98SSadaf Ebrahimi {
728*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
729*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
730*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
731*62c56f98SSadaf Ebrahimi 
732*62c56f98SSadaf Ebrahimi     /* Try dynamically-registered SE interface first */
733*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
734*62c56f98SSadaf Ebrahimi     const psa_drv_se_t *drv;
735*62c56f98SSadaf Ebrahimi     psa_drv_se_context_t *drv_context;
736*62c56f98SSadaf Ebrahimi 
737*62c56f98SSadaf Ebrahimi     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
738*62c56f98SSadaf Ebrahimi     {
739*62c56f98SSadaf Ebrahimi         size_t pubkey_length = 0; /* We don't support this feature yet */
740*62c56f98SSadaf Ebrahimi         if( drv->key_management == NULL ||
741*62c56f98SSadaf Ebrahimi             drv->key_management->p_generate == NULL )
742*62c56f98SSadaf Ebrahimi         {
743*62c56f98SSadaf Ebrahimi             /* Key is defined as being in SE, but we have no way to generate it */
744*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
745*62c56f98SSadaf Ebrahimi         }
746*62c56f98SSadaf Ebrahimi         return( drv->key_management->p_generate(
747*62c56f98SSadaf Ebrahimi             drv_context,
748*62c56f98SSadaf Ebrahimi             *( (psa_key_slot_number_t *)key_buffer ),
749*62c56f98SSadaf Ebrahimi             attributes, NULL, 0, &pubkey_length ) );
750*62c56f98SSadaf Ebrahimi     }
751*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
752*62c56f98SSadaf Ebrahimi 
753*62c56f98SSadaf Ebrahimi     switch( location )
754*62c56f98SSadaf Ebrahimi     {
755*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
756*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
757*62c56f98SSadaf Ebrahimi             /* Transparent drivers are limited to generating asymmetric keys */
758*62c56f98SSadaf Ebrahimi             if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
759*62c56f98SSadaf Ebrahimi             {
760*62c56f98SSadaf Ebrahimi             /* Cycle through all known transparent accelerators */
761*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
762*62c56f98SSadaf Ebrahimi                 status = mbedtls_test_transparent_generate_key(
763*62c56f98SSadaf Ebrahimi                     attributes, key_buffer, key_buffer_size,
764*62c56f98SSadaf Ebrahimi                     key_buffer_length );
765*62c56f98SSadaf Ebrahimi                 /* Declared with fallback == true */
766*62c56f98SSadaf Ebrahimi                 if( status != PSA_ERROR_NOT_SUPPORTED )
767*62c56f98SSadaf Ebrahimi                     break;
768*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
769*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_P256M_DRIVER_ENABLED)
770*62c56f98SSadaf Ebrahimi                 if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) &&
771*62c56f98SSadaf Ebrahimi                     attributes->core.type == PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1) &&
772*62c56f98SSadaf Ebrahimi                     attributes->core.bits == 256 )
773*62c56f98SSadaf Ebrahimi                 {
774*62c56f98SSadaf Ebrahimi                     status = p256_transparent_generate_key( attributes,
775*62c56f98SSadaf Ebrahimi                                                             key_buffer,
776*62c56f98SSadaf Ebrahimi                                                             key_buffer_size,
777*62c56f98SSadaf Ebrahimi                                                             key_buffer_length );
778*62c56f98SSadaf Ebrahimi                     if( status != PSA_ERROR_NOT_SUPPORTED )
779*62c56f98SSadaf Ebrahimi                         break;
780*62c56f98SSadaf Ebrahimi                 }
781*62c56f98SSadaf Ebrahimi 
782*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_P256M_DRIVER_ENABLED */
783*62c56f98SSadaf Ebrahimi             }
784*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
785*62c56f98SSadaf Ebrahimi 
786*62c56f98SSadaf Ebrahimi             /* Software fallback */
787*62c56f98SSadaf Ebrahimi             status = psa_generate_key_internal(
788*62c56f98SSadaf Ebrahimi                 attributes, key_buffer, key_buffer_size, key_buffer_length );
789*62c56f98SSadaf Ebrahimi             break;
790*62c56f98SSadaf Ebrahimi 
791*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
792*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
793*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
794*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
795*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_generate_key(
796*62c56f98SSadaf Ebrahimi                 attributes, key_buffer, key_buffer_size, key_buffer_length );
797*62c56f98SSadaf Ebrahimi             break;
798*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
799*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
800*62c56f98SSadaf Ebrahimi 
801*62c56f98SSadaf Ebrahimi         default:
802*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
803*62c56f98SSadaf Ebrahimi             status = PSA_ERROR_INVALID_ARGUMENT;
804*62c56f98SSadaf Ebrahimi             break;
805*62c56f98SSadaf Ebrahimi     }
806*62c56f98SSadaf Ebrahimi 
807*62c56f98SSadaf Ebrahimi     return( status );
808*62c56f98SSadaf Ebrahimi }
809*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_import_key(const psa_key_attributes_t * attributes,const uint8_t * data,size_t data_length,uint8_t * key_buffer,size_t key_buffer_size,size_t * key_buffer_length,size_t * bits)810*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_import_key(
811*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
812*62c56f98SSadaf Ebrahimi     const uint8_t *data,
813*62c56f98SSadaf Ebrahimi     size_t data_length,
814*62c56f98SSadaf Ebrahimi     uint8_t *key_buffer,
815*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
816*62c56f98SSadaf Ebrahimi     size_t *key_buffer_length,
817*62c56f98SSadaf Ebrahimi     size_t *bits )
818*62c56f98SSadaf Ebrahimi {
819*62c56f98SSadaf Ebrahimi 
820*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
821*62c56f98SSadaf Ebrahimi     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
822*62c56f98SSadaf Ebrahimi                                       psa_get_key_lifetime( attributes ) );
823*62c56f98SSadaf Ebrahimi 
824*62c56f98SSadaf Ebrahimi     /* Try dynamically-registered SE interface first */
825*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
826*62c56f98SSadaf Ebrahimi     const psa_drv_se_t *drv;
827*62c56f98SSadaf Ebrahimi     psa_drv_se_context_t *drv_context;
828*62c56f98SSadaf Ebrahimi 
829*62c56f98SSadaf Ebrahimi     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
830*62c56f98SSadaf Ebrahimi     {
831*62c56f98SSadaf Ebrahimi         if( drv->key_management == NULL ||
832*62c56f98SSadaf Ebrahimi             drv->key_management->p_import == NULL )
833*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
834*62c56f98SSadaf Ebrahimi 
835*62c56f98SSadaf Ebrahimi         /* The driver should set the number of key bits, however in
836*62c56f98SSadaf Ebrahimi          * case it doesn't, we initialize bits to an invalid value. */
837*62c56f98SSadaf Ebrahimi         *bits = PSA_MAX_KEY_BITS + 1;
838*62c56f98SSadaf Ebrahimi         status = drv->key_management->p_import(
839*62c56f98SSadaf Ebrahimi             drv_context,
840*62c56f98SSadaf Ebrahimi             *( (psa_key_slot_number_t *)key_buffer ),
841*62c56f98SSadaf Ebrahimi             attributes, data, data_length, bits );
842*62c56f98SSadaf Ebrahimi 
843*62c56f98SSadaf Ebrahimi         if( status != PSA_SUCCESS )
844*62c56f98SSadaf Ebrahimi             return( status );
845*62c56f98SSadaf Ebrahimi 
846*62c56f98SSadaf Ebrahimi         if( (*bits) > PSA_MAX_KEY_BITS )
847*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
848*62c56f98SSadaf Ebrahimi 
849*62c56f98SSadaf Ebrahimi         return( PSA_SUCCESS );
850*62c56f98SSadaf Ebrahimi     }
851*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
852*62c56f98SSadaf Ebrahimi 
853*62c56f98SSadaf Ebrahimi     switch( location )
854*62c56f98SSadaf Ebrahimi     {
855*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
856*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
857*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
858*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
859*62c56f98SSadaf Ebrahimi 
860*62c56f98SSadaf Ebrahimi #if (defined(PSA_CRYPTO_DRIVER_TEST) )
861*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_import_key
862*62c56f98SSadaf Ebrahimi                 (attributes,
863*62c56f98SSadaf Ebrahimi                                 data,
864*62c56f98SSadaf Ebrahimi                                 data_length,
865*62c56f98SSadaf Ebrahimi                                 key_buffer,
866*62c56f98SSadaf Ebrahimi                                 key_buffer_size,
867*62c56f98SSadaf Ebrahimi                                 key_buffer_length,
868*62c56f98SSadaf Ebrahimi                                 bits
869*62c56f98SSadaf Ebrahimi             );
870*62c56f98SSadaf Ebrahimi 
871*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
872*62c56f98SSadaf Ebrahimi                 return( status );
873*62c56f98SSadaf Ebrahimi #endif
874*62c56f98SSadaf Ebrahimi 
875*62c56f98SSadaf Ebrahimi #if (defined(MBEDTLS_PSA_P256M_DRIVER_ENABLED) )
876*62c56f98SSadaf Ebrahimi             status = p256_transparent_import_key
877*62c56f98SSadaf Ebrahimi                 (attributes,
878*62c56f98SSadaf Ebrahimi                                 data,
879*62c56f98SSadaf Ebrahimi                                 data_length,
880*62c56f98SSadaf Ebrahimi                                 key_buffer,
881*62c56f98SSadaf Ebrahimi                                 key_buffer_size,
882*62c56f98SSadaf Ebrahimi                                 key_buffer_length,
883*62c56f98SSadaf Ebrahimi                                 bits
884*62c56f98SSadaf Ebrahimi             );
885*62c56f98SSadaf Ebrahimi 
886*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
887*62c56f98SSadaf Ebrahimi                 return( status );
888*62c56f98SSadaf Ebrahimi #endif
889*62c56f98SSadaf Ebrahimi 
890*62c56f98SSadaf Ebrahimi 
891*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
892*62c56f98SSadaf Ebrahimi 
893*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
894*62c56f98SSadaf Ebrahimi             return( psa_import_key_into_slot( attributes,
895*62c56f98SSadaf Ebrahimi                                               data, data_length,
896*62c56f98SSadaf Ebrahimi                                               key_buffer, key_buffer_size,
897*62c56f98SSadaf Ebrahimi                                               key_buffer_length, bits ) );
898*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
899*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
900*62c56f98SSadaf Ebrahimi 
901*62c56f98SSadaf Ebrahimi #if (defined(PSA_CRYPTO_DRIVER_TEST) )
902*62c56f98SSadaf Ebrahimi         case 0x7fffff:
903*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_import_key
904*62c56f98SSadaf Ebrahimi             (attributes,
905*62c56f98SSadaf Ebrahimi                             data,
906*62c56f98SSadaf Ebrahimi                             data_length,
907*62c56f98SSadaf Ebrahimi                             key_buffer,
908*62c56f98SSadaf Ebrahimi                             key_buffer_size,
909*62c56f98SSadaf Ebrahimi                             key_buffer_length,
910*62c56f98SSadaf Ebrahimi                             bits
911*62c56f98SSadaf Ebrahimi         ));
912*62c56f98SSadaf Ebrahimi #endif
913*62c56f98SSadaf Ebrahimi 
914*62c56f98SSadaf Ebrahimi 
915*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
916*62c56f98SSadaf Ebrahimi         default:
917*62c56f98SSadaf Ebrahimi             (void)status;
918*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
919*62c56f98SSadaf Ebrahimi     }
920*62c56f98SSadaf Ebrahimi 
921*62c56f98SSadaf Ebrahimi }
922*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_export_key(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,uint8_t * data,size_t data_size,size_t * data_length)923*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_export_key(
924*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
925*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer, size_t key_buffer_size,
926*62c56f98SSadaf Ebrahimi     uint8_t *data, size_t data_size, size_t *data_length )
927*62c56f98SSadaf Ebrahimi 
928*62c56f98SSadaf Ebrahimi {
929*62c56f98SSadaf Ebrahimi 
930*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
931*62c56f98SSadaf Ebrahimi     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
932*62c56f98SSadaf Ebrahimi                                       psa_get_key_lifetime( attributes ) );
933*62c56f98SSadaf Ebrahimi 
934*62c56f98SSadaf Ebrahimi     /* Try dynamically-registered SE interface first */
935*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
936*62c56f98SSadaf Ebrahimi     const psa_drv_se_t *drv;
937*62c56f98SSadaf Ebrahimi     psa_drv_se_context_t *drv_context;
938*62c56f98SSadaf Ebrahimi 
939*62c56f98SSadaf Ebrahimi     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
940*62c56f98SSadaf Ebrahimi     {
941*62c56f98SSadaf Ebrahimi         if( ( drv->key_management == NULL   ) ||
942*62c56f98SSadaf Ebrahimi             ( drv->key_management->p_export == NULL ) )
943*62c56f98SSadaf Ebrahimi         {
944*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
945*62c56f98SSadaf Ebrahimi         }
946*62c56f98SSadaf Ebrahimi 
947*62c56f98SSadaf Ebrahimi         return( drv->key_management->p_export(
948*62c56f98SSadaf Ebrahimi                      drv_context,
949*62c56f98SSadaf Ebrahimi                      *( (psa_key_slot_number_t *)key_buffer ),
950*62c56f98SSadaf Ebrahimi                      data, data_size, data_length ) );
951*62c56f98SSadaf Ebrahimi     }
952*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
953*62c56f98SSadaf Ebrahimi 
954*62c56f98SSadaf Ebrahimi     switch( location )
955*62c56f98SSadaf Ebrahimi     {
956*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
957*62c56f98SSadaf Ebrahimi             return( psa_export_key_internal( attributes,
958*62c56f98SSadaf Ebrahimi                                              key_buffer,
959*62c56f98SSadaf Ebrahimi                                              key_buffer_size,
960*62c56f98SSadaf Ebrahimi                                              data,
961*62c56f98SSadaf Ebrahimi                                              data_size,
962*62c56f98SSadaf Ebrahimi                                              data_length ) );
963*62c56f98SSadaf Ebrahimi 
964*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
965*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
966*62c56f98SSadaf Ebrahimi 
967*62c56f98SSadaf Ebrahimi #if (defined(PSA_CRYPTO_DRIVER_TEST) )
968*62c56f98SSadaf Ebrahimi         case 0x7fffff:
969*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_export_key
970*62c56f98SSadaf Ebrahimi             (attributes,
971*62c56f98SSadaf Ebrahimi                             key_buffer,
972*62c56f98SSadaf Ebrahimi                             key_buffer_size,
973*62c56f98SSadaf Ebrahimi                             data,
974*62c56f98SSadaf Ebrahimi                             data_size,
975*62c56f98SSadaf Ebrahimi                             data_length
976*62c56f98SSadaf Ebrahimi         ));
977*62c56f98SSadaf Ebrahimi #endif
978*62c56f98SSadaf Ebrahimi 
979*62c56f98SSadaf Ebrahimi 
980*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
981*62c56f98SSadaf Ebrahimi         default:
982*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
983*62c56f98SSadaf Ebrahimi             return( status );
984*62c56f98SSadaf Ebrahimi     }
985*62c56f98SSadaf Ebrahimi 
986*62c56f98SSadaf Ebrahimi }
987*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_copy_key(psa_key_attributes_t * attributes,const uint8_t * source_key,size_t source_key_length,uint8_t * target_key_buffer,size_t target_key_buffer_size,size_t * target_key_buffer_length)988*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_copy_key(
989*62c56f98SSadaf Ebrahimi     psa_key_attributes_t *attributes,
990*62c56f98SSadaf Ebrahimi     const uint8_t *source_key, size_t source_key_length,
991*62c56f98SSadaf Ebrahimi     uint8_t *target_key_buffer, size_t target_key_buffer_size,
992*62c56f98SSadaf Ebrahimi     size_t *target_key_buffer_length )
993*62c56f98SSadaf Ebrahimi {
994*62c56f98SSadaf Ebrahimi 
995*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
996*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
997*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
998*62c56f98SSadaf Ebrahimi 
999*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
1000*62c56f98SSadaf Ebrahimi     const psa_drv_se_t *drv;
1001*62c56f98SSadaf Ebrahimi     psa_drv_se_context_t *drv_context;
1002*62c56f98SSadaf Ebrahimi 
1003*62c56f98SSadaf Ebrahimi     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
1004*62c56f98SSadaf Ebrahimi     {
1005*62c56f98SSadaf Ebrahimi         /* Copying to a secure element is not implemented yet. */
1006*62c56f98SSadaf Ebrahimi         return( PSA_ERROR_NOT_SUPPORTED );
1007*62c56f98SSadaf Ebrahimi     }
1008*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
1009*62c56f98SSadaf Ebrahimi 
1010*62c56f98SSadaf Ebrahimi     switch( location )
1011*62c56f98SSadaf Ebrahimi     {
1012*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1013*62c56f98SSadaf Ebrahimi 
1014*62c56f98SSadaf Ebrahimi #if (defined(PSA_CRYPTO_DRIVER_TEST) )
1015*62c56f98SSadaf Ebrahimi         case 0x7fffff:
1016*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_copy_key
1017*62c56f98SSadaf Ebrahimi             (attributes,
1018*62c56f98SSadaf Ebrahimi                             source_key,
1019*62c56f98SSadaf Ebrahimi                             source_key_length,
1020*62c56f98SSadaf Ebrahimi                             target_key_buffer,
1021*62c56f98SSadaf Ebrahimi                             target_key_buffer_size,
1022*62c56f98SSadaf Ebrahimi                             target_key_buffer_length
1023*62c56f98SSadaf Ebrahimi         ));
1024*62c56f98SSadaf Ebrahimi #endif
1025*62c56f98SSadaf Ebrahimi 
1026*62c56f98SSadaf Ebrahimi 
1027*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1028*62c56f98SSadaf Ebrahimi         default:
1029*62c56f98SSadaf Ebrahimi             (void)source_key;
1030*62c56f98SSadaf Ebrahimi             (void)source_key_length;
1031*62c56f98SSadaf Ebrahimi             (void)target_key_buffer;
1032*62c56f98SSadaf Ebrahimi             (void)target_key_buffer_size;
1033*62c56f98SSadaf Ebrahimi             (void)target_key_buffer_length;
1034*62c56f98SSadaf Ebrahimi             status = PSA_ERROR_INVALID_ARGUMENT;
1035*62c56f98SSadaf Ebrahimi     }
1036*62c56f98SSadaf Ebrahimi     return( status );
1037*62c56f98SSadaf Ebrahimi 
1038*62c56f98SSadaf Ebrahimi }
1039*62c56f98SSadaf Ebrahimi 
1040*62c56f98SSadaf Ebrahimi /*
1041*62c56f98SSadaf Ebrahimi  * Cipher functions
1042*62c56f98SSadaf Ebrahimi  */
psa_driver_wrapper_cipher_encrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * iv,size_t iv_length,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)1043*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_encrypt(
1044*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
1045*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
1046*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
1047*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
1048*62c56f98SSadaf Ebrahimi     const uint8_t *iv,
1049*62c56f98SSadaf Ebrahimi     size_t iv_length,
1050*62c56f98SSadaf Ebrahimi     const uint8_t *input,
1051*62c56f98SSadaf Ebrahimi     size_t input_length,
1052*62c56f98SSadaf Ebrahimi     uint8_t *output,
1053*62c56f98SSadaf Ebrahimi     size_t output_size,
1054*62c56f98SSadaf Ebrahimi     size_t *output_length )
1055*62c56f98SSadaf Ebrahimi {
1056*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1057*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1058*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1059*62c56f98SSadaf Ebrahimi 
1060*62c56f98SSadaf Ebrahimi     switch( location )
1061*62c56f98SSadaf Ebrahimi     {
1062*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1063*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1064*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1065*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1066*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1067*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_cipher_encrypt( attributes,
1068*62c56f98SSadaf Ebrahimi                                                               key_buffer,
1069*62c56f98SSadaf Ebrahimi                                                               key_buffer_size,
1070*62c56f98SSadaf Ebrahimi                                                               alg,
1071*62c56f98SSadaf Ebrahimi                                                               iv,
1072*62c56f98SSadaf Ebrahimi                                                               iv_length,
1073*62c56f98SSadaf Ebrahimi                                                               input,
1074*62c56f98SSadaf Ebrahimi                                                               input_length,
1075*62c56f98SSadaf Ebrahimi                                                               output,
1076*62c56f98SSadaf Ebrahimi                                                               output_size,
1077*62c56f98SSadaf Ebrahimi                                                               output_length );
1078*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1079*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1080*62c56f98SSadaf Ebrahimi                 return( status );
1081*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1082*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1083*62c56f98SSadaf Ebrahimi 
1084*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1085*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_cipher_encrypt( attributes,
1086*62c56f98SSadaf Ebrahimi                                                 key_buffer,
1087*62c56f98SSadaf Ebrahimi                                                 key_buffer_size,
1088*62c56f98SSadaf Ebrahimi                                                 alg,
1089*62c56f98SSadaf Ebrahimi                                                 iv,
1090*62c56f98SSadaf Ebrahimi                                                 iv_length,
1091*62c56f98SSadaf Ebrahimi                                                 input,
1092*62c56f98SSadaf Ebrahimi                                                 input_length,
1093*62c56f98SSadaf Ebrahimi                                                 output,
1094*62c56f98SSadaf Ebrahimi                                                 output_size,
1095*62c56f98SSadaf Ebrahimi                                                 output_length ) );
1096*62c56f98SSadaf Ebrahimi #else
1097*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
1098*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1099*62c56f98SSadaf Ebrahimi 
1100*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1101*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1102*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1103*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1104*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_cipher_encrypt( attributes,
1105*62c56f98SSadaf Ebrahimi                                                         key_buffer,
1106*62c56f98SSadaf Ebrahimi                                                         key_buffer_size,
1107*62c56f98SSadaf Ebrahimi                                                         alg,
1108*62c56f98SSadaf Ebrahimi                                                         iv,
1109*62c56f98SSadaf Ebrahimi                                                         iv_length,
1110*62c56f98SSadaf Ebrahimi                                                         input,
1111*62c56f98SSadaf Ebrahimi                                                         input_length,
1112*62c56f98SSadaf Ebrahimi                                                         output,
1113*62c56f98SSadaf Ebrahimi                                                         output_size,
1114*62c56f98SSadaf Ebrahimi                                                         output_length ) );
1115*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1116*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1117*62c56f98SSadaf Ebrahimi 
1118*62c56f98SSadaf Ebrahimi         default:
1119*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1120*62c56f98SSadaf Ebrahimi             (void)status;
1121*62c56f98SSadaf Ebrahimi             (void)key_buffer;
1122*62c56f98SSadaf Ebrahimi             (void)key_buffer_size;
1123*62c56f98SSadaf Ebrahimi             (void)alg;
1124*62c56f98SSadaf Ebrahimi             (void)iv;
1125*62c56f98SSadaf Ebrahimi             (void)iv_length;
1126*62c56f98SSadaf Ebrahimi             (void)input;
1127*62c56f98SSadaf Ebrahimi             (void)input_length;
1128*62c56f98SSadaf Ebrahimi             (void)output;
1129*62c56f98SSadaf Ebrahimi             (void)output_size;
1130*62c56f98SSadaf Ebrahimi             (void)output_length;
1131*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1132*62c56f98SSadaf Ebrahimi     }
1133*62c56f98SSadaf Ebrahimi }
1134*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_cipher_decrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)1135*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_decrypt(
1136*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
1137*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
1138*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
1139*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
1140*62c56f98SSadaf Ebrahimi     const uint8_t *input,
1141*62c56f98SSadaf Ebrahimi     size_t input_length,
1142*62c56f98SSadaf Ebrahimi     uint8_t *output,
1143*62c56f98SSadaf Ebrahimi     size_t output_size,
1144*62c56f98SSadaf Ebrahimi     size_t *output_length )
1145*62c56f98SSadaf Ebrahimi {
1146*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1147*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1148*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1149*62c56f98SSadaf Ebrahimi 
1150*62c56f98SSadaf Ebrahimi     switch( location )
1151*62c56f98SSadaf Ebrahimi     {
1152*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1153*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1154*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1155*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1156*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1157*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_cipher_decrypt( attributes,
1158*62c56f98SSadaf Ebrahimi                                                               key_buffer,
1159*62c56f98SSadaf Ebrahimi                                                               key_buffer_size,
1160*62c56f98SSadaf Ebrahimi                                                               alg,
1161*62c56f98SSadaf Ebrahimi                                                               input,
1162*62c56f98SSadaf Ebrahimi                                                               input_length,
1163*62c56f98SSadaf Ebrahimi                                                               output,
1164*62c56f98SSadaf Ebrahimi                                                               output_size,
1165*62c56f98SSadaf Ebrahimi                                                               output_length );
1166*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1167*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1168*62c56f98SSadaf Ebrahimi                 return( status );
1169*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1170*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1171*62c56f98SSadaf Ebrahimi 
1172*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1173*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_cipher_decrypt( attributes,
1174*62c56f98SSadaf Ebrahimi                                                 key_buffer,
1175*62c56f98SSadaf Ebrahimi                                                 key_buffer_size,
1176*62c56f98SSadaf Ebrahimi                                                 alg,
1177*62c56f98SSadaf Ebrahimi                                                 input,
1178*62c56f98SSadaf Ebrahimi                                                 input_length,
1179*62c56f98SSadaf Ebrahimi                                                 output,
1180*62c56f98SSadaf Ebrahimi                                                 output_size,
1181*62c56f98SSadaf Ebrahimi                                                 output_length ) );
1182*62c56f98SSadaf Ebrahimi #else
1183*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
1184*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1185*62c56f98SSadaf Ebrahimi 
1186*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1187*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1188*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1189*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1190*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_cipher_decrypt( attributes,
1191*62c56f98SSadaf Ebrahimi                                                         key_buffer,
1192*62c56f98SSadaf Ebrahimi                                                         key_buffer_size,
1193*62c56f98SSadaf Ebrahimi                                                         alg,
1194*62c56f98SSadaf Ebrahimi                                                         input,
1195*62c56f98SSadaf Ebrahimi                                                         input_length,
1196*62c56f98SSadaf Ebrahimi                                                         output,
1197*62c56f98SSadaf Ebrahimi                                                         output_size,
1198*62c56f98SSadaf Ebrahimi                                                         output_length ) );
1199*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1200*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1201*62c56f98SSadaf Ebrahimi 
1202*62c56f98SSadaf Ebrahimi         default:
1203*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1204*62c56f98SSadaf Ebrahimi             (void)status;
1205*62c56f98SSadaf Ebrahimi             (void)key_buffer;
1206*62c56f98SSadaf Ebrahimi             (void)key_buffer_size;
1207*62c56f98SSadaf Ebrahimi             (void)alg;
1208*62c56f98SSadaf Ebrahimi             (void)input;
1209*62c56f98SSadaf Ebrahimi             (void)input_length;
1210*62c56f98SSadaf Ebrahimi             (void)output;
1211*62c56f98SSadaf Ebrahimi             (void)output_size;
1212*62c56f98SSadaf Ebrahimi             (void)output_length;
1213*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1214*62c56f98SSadaf Ebrahimi     }
1215*62c56f98SSadaf Ebrahimi }
1216*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_cipher_encrypt_setup(psa_cipher_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg)1217*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
1218*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t *operation,
1219*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
1220*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer, size_t key_buffer_size,
1221*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg )
1222*62c56f98SSadaf Ebrahimi {
1223*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1224*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1225*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1226*62c56f98SSadaf Ebrahimi 
1227*62c56f98SSadaf Ebrahimi     switch( location )
1228*62c56f98SSadaf Ebrahimi     {
1229*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1230*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1231*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1232*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1233*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1234*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_cipher_encrypt_setup(
1235*62c56f98SSadaf Ebrahimi                 &operation->ctx.transparent_test_driver_ctx,
1236*62c56f98SSadaf Ebrahimi                 attributes,
1237*62c56f98SSadaf Ebrahimi                 key_buffer,
1238*62c56f98SSadaf Ebrahimi                 key_buffer_size,
1239*62c56f98SSadaf Ebrahimi                 alg );
1240*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1241*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
1242*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
1243*62c56f98SSadaf Ebrahimi 
1244*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1245*62c56f98SSadaf Ebrahimi                 return( status );
1246*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1247*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1248*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1249*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
1250*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
1251*62c56f98SSadaf Ebrahimi                                                        attributes,
1252*62c56f98SSadaf Ebrahimi                                                        key_buffer,
1253*62c56f98SSadaf Ebrahimi                                                        key_buffer_size,
1254*62c56f98SSadaf Ebrahimi                                                        alg );
1255*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
1256*62c56f98SSadaf Ebrahimi                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1257*62c56f98SSadaf Ebrahimi 
1258*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1259*62c56f98SSadaf Ebrahimi                 return( status );
1260*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1261*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
1262*62c56f98SSadaf Ebrahimi 
1263*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1264*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1265*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1266*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1267*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_cipher_encrypt_setup(
1268*62c56f98SSadaf Ebrahimi                 &operation->ctx.opaque_test_driver_ctx,
1269*62c56f98SSadaf Ebrahimi                 attributes,
1270*62c56f98SSadaf Ebrahimi                 key_buffer, key_buffer_size,
1271*62c56f98SSadaf Ebrahimi                 alg );
1272*62c56f98SSadaf Ebrahimi 
1273*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
1274*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_OPAQUE_DRIVER_ID;
1275*62c56f98SSadaf Ebrahimi 
1276*62c56f98SSadaf Ebrahimi             return( status );
1277*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1278*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1279*62c56f98SSadaf Ebrahimi         default:
1280*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1281*62c56f98SSadaf Ebrahimi             (void)status;
1282*62c56f98SSadaf Ebrahimi             (void)operation;
1283*62c56f98SSadaf Ebrahimi             (void)key_buffer;
1284*62c56f98SSadaf Ebrahimi             (void)key_buffer_size;
1285*62c56f98SSadaf Ebrahimi             (void)alg;
1286*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1287*62c56f98SSadaf Ebrahimi     }
1288*62c56f98SSadaf Ebrahimi }
1289*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_cipher_decrypt_setup(psa_cipher_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg)1290*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
1291*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t *operation,
1292*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
1293*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer, size_t key_buffer_size,
1294*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg )
1295*62c56f98SSadaf Ebrahimi {
1296*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
1297*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1298*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1299*62c56f98SSadaf Ebrahimi 
1300*62c56f98SSadaf Ebrahimi     switch( location )
1301*62c56f98SSadaf Ebrahimi     {
1302*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1303*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1304*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1305*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1306*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1307*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_cipher_decrypt_setup(
1308*62c56f98SSadaf Ebrahimi                 &operation->ctx.transparent_test_driver_ctx,
1309*62c56f98SSadaf Ebrahimi                 attributes,
1310*62c56f98SSadaf Ebrahimi                 key_buffer,
1311*62c56f98SSadaf Ebrahimi                 key_buffer_size,
1312*62c56f98SSadaf Ebrahimi                 alg );
1313*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1314*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
1315*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
1316*62c56f98SSadaf Ebrahimi 
1317*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1318*62c56f98SSadaf Ebrahimi                 return( status );
1319*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1320*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1321*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1322*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
1323*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
1324*62c56f98SSadaf Ebrahimi                                                        attributes,
1325*62c56f98SSadaf Ebrahimi                                                        key_buffer,
1326*62c56f98SSadaf Ebrahimi                                                        key_buffer_size,
1327*62c56f98SSadaf Ebrahimi                                                        alg );
1328*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
1329*62c56f98SSadaf Ebrahimi                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1330*62c56f98SSadaf Ebrahimi 
1331*62c56f98SSadaf Ebrahimi             return( status );
1332*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_PSA_BUILTIN_CIPHER */
1333*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
1334*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1335*62c56f98SSadaf Ebrahimi 
1336*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1337*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1338*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1339*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1340*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_cipher_decrypt_setup(
1341*62c56f98SSadaf Ebrahimi                          &operation->ctx.opaque_test_driver_ctx,
1342*62c56f98SSadaf Ebrahimi                          attributes,
1343*62c56f98SSadaf Ebrahimi                          key_buffer, key_buffer_size,
1344*62c56f98SSadaf Ebrahimi                          alg );
1345*62c56f98SSadaf Ebrahimi 
1346*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
1347*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_OPAQUE_DRIVER_ID;
1348*62c56f98SSadaf Ebrahimi 
1349*62c56f98SSadaf Ebrahimi             return( status );
1350*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1351*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1352*62c56f98SSadaf Ebrahimi         default:
1353*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1354*62c56f98SSadaf Ebrahimi             (void)status;
1355*62c56f98SSadaf Ebrahimi             (void)operation;
1356*62c56f98SSadaf Ebrahimi             (void)key_buffer;
1357*62c56f98SSadaf Ebrahimi             (void)key_buffer_size;
1358*62c56f98SSadaf Ebrahimi             (void)alg;
1359*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1360*62c56f98SSadaf Ebrahimi     }
1361*62c56f98SSadaf Ebrahimi }
1362*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_cipher_set_iv(psa_cipher_operation_t * operation,const uint8_t * iv,size_t iv_length)1363*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_set_iv(
1364*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t *operation,
1365*62c56f98SSadaf Ebrahimi     const uint8_t *iv,
1366*62c56f98SSadaf Ebrahimi     size_t iv_length )
1367*62c56f98SSadaf Ebrahimi {
1368*62c56f98SSadaf Ebrahimi     switch( operation->id )
1369*62c56f98SSadaf Ebrahimi     {
1370*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1371*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1372*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
1373*62c56f98SSadaf Ebrahimi                                                iv,
1374*62c56f98SSadaf Ebrahimi                                                iv_length ) );
1375*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1376*62c56f98SSadaf Ebrahimi 
1377*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1378*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1379*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1380*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_cipher_set_iv(
1381*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
1382*62c56f98SSadaf Ebrahimi                         iv, iv_length ) );
1383*62c56f98SSadaf Ebrahimi 
1384*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
1385*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_cipher_set_iv(
1386*62c56f98SSadaf Ebrahimi                         &operation->ctx.opaque_test_driver_ctx,
1387*62c56f98SSadaf Ebrahimi                         iv, iv_length ) );
1388*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1389*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1390*62c56f98SSadaf Ebrahimi     }
1391*62c56f98SSadaf Ebrahimi 
1392*62c56f98SSadaf Ebrahimi     (void)iv;
1393*62c56f98SSadaf Ebrahimi     (void)iv_length;
1394*62c56f98SSadaf Ebrahimi 
1395*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
1396*62c56f98SSadaf Ebrahimi }
1397*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_cipher_update(psa_cipher_operation_t * operation,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)1398*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_update(
1399*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t *operation,
1400*62c56f98SSadaf Ebrahimi     const uint8_t *input,
1401*62c56f98SSadaf Ebrahimi     size_t input_length,
1402*62c56f98SSadaf Ebrahimi     uint8_t *output,
1403*62c56f98SSadaf Ebrahimi     size_t output_size,
1404*62c56f98SSadaf Ebrahimi     size_t *output_length )
1405*62c56f98SSadaf Ebrahimi {
1406*62c56f98SSadaf Ebrahimi     switch( operation->id )
1407*62c56f98SSadaf Ebrahimi     {
1408*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1409*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1410*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
1411*62c56f98SSadaf Ebrahimi                                                input,
1412*62c56f98SSadaf Ebrahimi                                                input_length,
1413*62c56f98SSadaf Ebrahimi                                                output,
1414*62c56f98SSadaf Ebrahimi                                                output_size,
1415*62c56f98SSadaf Ebrahimi                                                output_length ) );
1416*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1417*62c56f98SSadaf Ebrahimi 
1418*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1419*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1420*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1421*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_cipher_update(
1422*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
1423*62c56f98SSadaf Ebrahimi                         input, input_length,
1424*62c56f98SSadaf Ebrahimi                         output, output_size, output_length ) );
1425*62c56f98SSadaf Ebrahimi 
1426*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
1427*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_cipher_update(
1428*62c56f98SSadaf Ebrahimi                         &operation->ctx.opaque_test_driver_ctx,
1429*62c56f98SSadaf Ebrahimi                         input, input_length,
1430*62c56f98SSadaf Ebrahimi                         output, output_size, output_length ) );
1431*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1432*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1433*62c56f98SSadaf Ebrahimi     }
1434*62c56f98SSadaf Ebrahimi 
1435*62c56f98SSadaf Ebrahimi     (void)input;
1436*62c56f98SSadaf Ebrahimi     (void)input_length;
1437*62c56f98SSadaf Ebrahimi     (void)output;
1438*62c56f98SSadaf Ebrahimi     (void)output_size;
1439*62c56f98SSadaf Ebrahimi     (void)output_length;
1440*62c56f98SSadaf Ebrahimi 
1441*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
1442*62c56f98SSadaf Ebrahimi }
1443*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_cipher_finish(psa_cipher_operation_t * operation,uint8_t * output,size_t output_size,size_t * output_length)1444*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_finish(
1445*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t *operation,
1446*62c56f98SSadaf Ebrahimi     uint8_t *output,
1447*62c56f98SSadaf Ebrahimi     size_t output_size,
1448*62c56f98SSadaf Ebrahimi     size_t *output_length )
1449*62c56f98SSadaf Ebrahimi {
1450*62c56f98SSadaf Ebrahimi     switch( operation->id )
1451*62c56f98SSadaf Ebrahimi     {
1452*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1453*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1454*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
1455*62c56f98SSadaf Ebrahimi                                                output,
1456*62c56f98SSadaf Ebrahimi                                                output_size,
1457*62c56f98SSadaf Ebrahimi                                                output_length ) );
1458*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1459*62c56f98SSadaf Ebrahimi 
1460*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1461*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1462*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1463*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_cipher_finish(
1464*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
1465*62c56f98SSadaf Ebrahimi                         output, output_size, output_length ) );
1466*62c56f98SSadaf Ebrahimi 
1467*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
1468*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_cipher_finish(
1469*62c56f98SSadaf Ebrahimi                         &operation->ctx.opaque_test_driver_ctx,
1470*62c56f98SSadaf Ebrahimi                         output, output_size, output_length ) );
1471*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1472*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1473*62c56f98SSadaf Ebrahimi     }
1474*62c56f98SSadaf Ebrahimi 
1475*62c56f98SSadaf Ebrahimi     (void)output;
1476*62c56f98SSadaf Ebrahimi     (void)output_size;
1477*62c56f98SSadaf Ebrahimi     (void)output_length;
1478*62c56f98SSadaf Ebrahimi 
1479*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
1480*62c56f98SSadaf Ebrahimi }
1481*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_cipher_abort(psa_cipher_operation_t * operation)1482*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_cipher_abort(
1483*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t *operation )
1484*62c56f98SSadaf Ebrahimi {
1485*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1486*62c56f98SSadaf Ebrahimi 
1487*62c56f98SSadaf Ebrahimi     switch( operation->id )
1488*62c56f98SSadaf Ebrahimi     {
1489*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1490*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1491*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
1492*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1493*62c56f98SSadaf Ebrahimi 
1494*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1495*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1496*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1497*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_cipher_abort(
1498*62c56f98SSadaf Ebrahimi                          &operation->ctx.transparent_test_driver_ctx );
1499*62c56f98SSadaf Ebrahimi             mbedtls_platform_zeroize(
1500*62c56f98SSadaf Ebrahimi                 &operation->ctx.transparent_test_driver_ctx,
1501*62c56f98SSadaf Ebrahimi                 sizeof( operation->ctx.transparent_test_driver_ctx ) );
1502*62c56f98SSadaf Ebrahimi             return( status );
1503*62c56f98SSadaf Ebrahimi 
1504*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
1505*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_cipher_abort(
1506*62c56f98SSadaf Ebrahimi                          &operation->ctx.opaque_test_driver_ctx );
1507*62c56f98SSadaf Ebrahimi             mbedtls_platform_zeroize(
1508*62c56f98SSadaf Ebrahimi                 &operation->ctx.opaque_test_driver_ctx,
1509*62c56f98SSadaf Ebrahimi                 sizeof( operation->ctx.opaque_test_driver_ctx ) );
1510*62c56f98SSadaf Ebrahimi             return( status );
1511*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1512*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1513*62c56f98SSadaf Ebrahimi     }
1514*62c56f98SSadaf Ebrahimi 
1515*62c56f98SSadaf Ebrahimi     (void)status;
1516*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
1517*62c56f98SSadaf Ebrahimi }
1518*62c56f98SSadaf Ebrahimi 
1519*62c56f98SSadaf Ebrahimi /*
1520*62c56f98SSadaf Ebrahimi  * Hashing functions
1521*62c56f98SSadaf Ebrahimi  */
psa_driver_wrapper_hash_compute(psa_algorithm_t alg,const uint8_t * input,size_t input_length,uint8_t * hash,size_t hash_size,size_t * hash_length)1522*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_hash_compute(
1523*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
1524*62c56f98SSadaf Ebrahimi     const uint8_t *input,
1525*62c56f98SSadaf Ebrahimi     size_t input_length,
1526*62c56f98SSadaf Ebrahimi     uint8_t *hash,
1527*62c56f98SSadaf Ebrahimi     size_t hash_size,
1528*62c56f98SSadaf Ebrahimi     size_t *hash_length)
1529*62c56f98SSadaf Ebrahimi {
1530*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1531*62c56f98SSadaf Ebrahimi 
1532*62c56f98SSadaf Ebrahimi     /* Try accelerators first */
1533*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1534*62c56f98SSadaf Ebrahimi     status = mbedtls_test_transparent_hash_compute(
1535*62c56f98SSadaf Ebrahimi                 alg, input, input_length, hash, hash_size, hash_length );
1536*62c56f98SSadaf Ebrahimi     if( status != PSA_ERROR_NOT_SUPPORTED )
1537*62c56f98SSadaf Ebrahimi         return( status );
1538*62c56f98SSadaf Ebrahimi #endif
1539*62c56f98SSadaf Ebrahimi 
1540*62c56f98SSadaf Ebrahimi     /* If software fallback is compiled in, try fallback */
1541*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1542*62c56f98SSadaf Ebrahimi     status = mbedtls_psa_hash_compute( alg, input, input_length,
1543*62c56f98SSadaf Ebrahimi                                        hash, hash_size, hash_length );
1544*62c56f98SSadaf Ebrahimi     if( status != PSA_ERROR_NOT_SUPPORTED )
1545*62c56f98SSadaf Ebrahimi         return( status );
1546*62c56f98SSadaf Ebrahimi #endif
1547*62c56f98SSadaf Ebrahimi     (void) status;
1548*62c56f98SSadaf Ebrahimi     (void) alg;
1549*62c56f98SSadaf Ebrahimi     (void) input;
1550*62c56f98SSadaf Ebrahimi     (void) input_length;
1551*62c56f98SSadaf Ebrahimi     (void) hash;
1552*62c56f98SSadaf Ebrahimi     (void) hash_size;
1553*62c56f98SSadaf Ebrahimi     (void) hash_length;
1554*62c56f98SSadaf Ebrahimi 
1555*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_NOT_SUPPORTED );
1556*62c56f98SSadaf Ebrahimi }
1557*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_hash_setup(psa_hash_operation_t * operation,psa_algorithm_t alg)1558*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_hash_setup(
1559*62c56f98SSadaf Ebrahimi     psa_hash_operation_t *operation,
1560*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg )
1561*62c56f98SSadaf Ebrahimi {
1562*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1563*62c56f98SSadaf Ebrahimi 
1564*62c56f98SSadaf Ebrahimi     /* Try setup on accelerators first */
1565*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1566*62c56f98SSadaf Ebrahimi     status = mbedtls_test_transparent_hash_setup(
1567*62c56f98SSadaf Ebrahimi                 &operation->ctx.test_driver_ctx, alg );
1568*62c56f98SSadaf Ebrahimi     if( status == PSA_SUCCESS )
1569*62c56f98SSadaf Ebrahimi         operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
1570*62c56f98SSadaf Ebrahimi 
1571*62c56f98SSadaf Ebrahimi     if( status != PSA_ERROR_NOT_SUPPORTED )
1572*62c56f98SSadaf Ebrahimi         return( status );
1573*62c56f98SSadaf Ebrahimi #endif
1574*62c56f98SSadaf Ebrahimi 
1575*62c56f98SSadaf Ebrahimi     /* If software fallback is compiled in, try fallback */
1576*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1577*62c56f98SSadaf Ebrahimi     status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
1578*62c56f98SSadaf Ebrahimi     if( status == PSA_SUCCESS )
1579*62c56f98SSadaf Ebrahimi         operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1580*62c56f98SSadaf Ebrahimi 
1581*62c56f98SSadaf Ebrahimi     if( status != PSA_ERROR_NOT_SUPPORTED )
1582*62c56f98SSadaf Ebrahimi         return( status );
1583*62c56f98SSadaf Ebrahimi #endif
1584*62c56f98SSadaf Ebrahimi     /* Nothing left to try if we fall through here */
1585*62c56f98SSadaf Ebrahimi     (void) status;
1586*62c56f98SSadaf Ebrahimi     (void) operation;
1587*62c56f98SSadaf Ebrahimi     (void) alg;
1588*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_NOT_SUPPORTED );
1589*62c56f98SSadaf Ebrahimi }
1590*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_hash_clone(const psa_hash_operation_t * source_operation,psa_hash_operation_t * target_operation)1591*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_hash_clone(
1592*62c56f98SSadaf Ebrahimi     const psa_hash_operation_t *source_operation,
1593*62c56f98SSadaf Ebrahimi     psa_hash_operation_t *target_operation )
1594*62c56f98SSadaf Ebrahimi {
1595*62c56f98SSadaf Ebrahimi     switch( source_operation->id )
1596*62c56f98SSadaf Ebrahimi     {
1597*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1598*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1599*62c56f98SSadaf Ebrahimi             target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1600*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1601*62c56f98SSadaf Ebrahimi                                             &target_operation->ctx.mbedtls_ctx ) );
1602*62c56f98SSadaf Ebrahimi #endif
1603*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1604*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1605*62c56f98SSadaf Ebrahimi             target_operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
1606*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_hash_clone(
1607*62c56f98SSadaf Ebrahimi                         &source_operation->ctx.test_driver_ctx,
1608*62c56f98SSadaf Ebrahimi                         &target_operation->ctx.test_driver_ctx ) );
1609*62c56f98SSadaf Ebrahimi #endif
1610*62c56f98SSadaf Ebrahimi         default:
1611*62c56f98SSadaf Ebrahimi             (void) target_operation;
1612*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_BAD_STATE );
1613*62c56f98SSadaf Ebrahimi     }
1614*62c56f98SSadaf Ebrahimi }
1615*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_hash_update(psa_hash_operation_t * operation,const uint8_t * input,size_t input_length)1616*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_hash_update(
1617*62c56f98SSadaf Ebrahimi     psa_hash_operation_t *operation,
1618*62c56f98SSadaf Ebrahimi     const uint8_t *input,
1619*62c56f98SSadaf Ebrahimi     size_t input_length )
1620*62c56f98SSadaf Ebrahimi {
1621*62c56f98SSadaf Ebrahimi     switch( operation->id )
1622*62c56f98SSadaf Ebrahimi     {
1623*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1624*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1625*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1626*62c56f98SSadaf Ebrahimi                                              input, input_length ) );
1627*62c56f98SSadaf Ebrahimi #endif
1628*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1629*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1630*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_hash_update(
1631*62c56f98SSadaf Ebrahimi                         &operation->ctx.test_driver_ctx,
1632*62c56f98SSadaf Ebrahimi                         input, input_length ) );
1633*62c56f98SSadaf Ebrahimi #endif
1634*62c56f98SSadaf Ebrahimi         default:
1635*62c56f98SSadaf Ebrahimi             (void) input;
1636*62c56f98SSadaf Ebrahimi             (void) input_length;
1637*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_BAD_STATE );
1638*62c56f98SSadaf Ebrahimi     }
1639*62c56f98SSadaf Ebrahimi }
1640*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_hash_finish(psa_hash_operation_t * operation,uint8_t * hash,size_t hash_size,size_t * hash_length)1641*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_hash_finish(
1642*62c56f98SSadaf Ebrahimi     psa_hash_operation_t *operation,
1643*62c56f98SSadaf Ebrahimi     uint8_t *hash,
1644*62c56f98SSadaf Ebrahimi     size_t hash_size,
1645*62c56f98SSadaf Ebrahimi     size_t *hash_length )
1646*62c56f98SSadaf Ebrahimi {
1647*62c56f98SSadaf Ebrahimi     switch( operation->id )
1648*62c56f98SSadaf Ebrahimi     {
1649*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1650*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1651*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1652*62c56f98SSadaf Ebrahimi                                              hash, hash_size, hash_length ) );
1653*62c56f98SSadaf Ebrahimi #endif
1654*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1655*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1656*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_hash_finish(
1657*62c56f98SSadaf Ebrahimi                         &operation->ctx.test_driver_ctx,
1658*62c56f98SSadaf Ebrahimi                         hash, hash_size, hash_length ) );
1659*62c56f98SSadaf Ebrahimi #endif
1660*62c56f98SSadaf Ebrahimi         default:
1661*62c56f98SSadaf Ebrahimi             (void) hash;
1662*62c56f98SSadaf Ebrahimi             (void) hash_size;
1663*62c56f98SSadaf Ebrahimi             (void) hash_length;
1664*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_BAD_STATE );
1665*62c56f98SSadaf Ebrahimi     }
1666*62c56f98SSadaf Ebrahimi }
1667*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_hash_abort(psa_hash_operation_t * operation)1668*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_hash_abort(
1669*62c56f98SSadaf Ebrahimi     psa_hash_operation_t *operation )
1670*62c56f98SSadaf Ebrahimi {
1671*62c56f98SSadaf Ebrahimi     switch( operation->id )
1672*62c56f98SSadaf Ebrahimi     {
1673*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1674*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1675*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1676*62c56f98SSadaf Ebrahimi #endif
1677*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1678*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1679*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_hash_abort(
1680*62c56f98SSadaf Ebrahimi                         &operation->ctx.test_driver_ctx ) );
1681*62c56f98SSadaf Ebrahimi #endif
1682*62c56f98SSadaf Ebrahimi         default:
1683*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_BAD_STATE );
1684*62c56f98SSadaf Ebrahimi     }
1685*62c56f98SSadaf Ebrahimi }
1686*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_encrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * nonce,size_t nonce_length,const uint8_t * additional_data,size_t additional_data_length,const uint8_t * plaintext,size_t plaintext_length,uint8_t * ciphertext,size_t ciphertext_size,size_t * ciphertext_length)1687*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_encrypt(
1688*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
1689*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer, size_t key_buffer_size,
1690*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
1691*62c56f98SSadaf Ebrahimi     const uint8_t *nonce, size_t nonce_length,
1692*62c56f98SSadaf Ebrahimi     const uint8_t *additional_data, size_t additional_data_length,
1693*62c56f98SSadaf Ebrahimi     const uint8_t *plaintext, size_t plaintext_length,
1694*62c56f98SSadaf Ebrahimi     uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1695*62c56f98SSadaf Ebrahimi {
1696*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1697*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1698*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1699*62c56f98SSadaf Ebrahimi 
1700*62c56f98SSadaf Ebrahimi     switch( location )
1701*62c56f98SSadaf Ebrahimi     {
1702*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1703*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1704*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1705*62c56f98SSadaf Ebrahimi 
1706*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1707*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1708*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_aead_encrypt(
1709*62c56f98SSadaf Ebrahimi                          attributes, key_buffer, key_buffer_size,
1710*62c56f98SSadaf Ebrahimi                          alg,
1711*62c56f98SSadaf Ebrahimi                          nonce, nonce_length,
1712*62c56f98SSadaf Ebrahimi                          additional_data, additional_data_length,
1713*62c56f98SSadaf Ebrahimi                          plaintext, plaintext_length,
1714*62c56f98SSadaf Ebrahimi                          ciphertext, ciphertext_size, ciphertext_length );
1715*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1716*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1717*62c56f98SSadaf Ebrahimi                 return( status );
1718*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1719*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1720*62c56f98SSadaf Ebrahimi 
1721*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
1722*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_encrypt(
1723*62c56f98SSadaf Ebrahimi                         attributes, key_buffer, key_buffer_size,
1724*62c56f98SSadaf Ebrahimi                         alg,
1725*62c56f98SSadaf Ebrahimi                         nonce, nonce_length,
1726*62c56f98SSadaf Ebrahimi                         additional_data, additional_data_length,
1727*62c56f98SSadaf Ebrahimi                         plaintext, plaintext_length,
1728*62c56f98SSadaf Ebrahimi                         ciphertext, ciphertext_size, ciphertext_length ) );
1729*62c56f98SSadaf Ebrahimi 
1730*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1731*62c56f98SSadaf Ebrahimi 
1732*62c56f98SSadaf Ebrahimi         default:
1733*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1734*62c56f98SSadaf Ebrahimi             (void)status;
1735*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1736*62c56f98SSadaf Ebrahimi     }
1737*62c56f98SSadaf Ebrahimi }
1738*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_decrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * nonce,size_t nonce_length,const uint8_t * additional_data,size_t additional_data_length,const uint8_t * ciphertext,size_t ciphertext_length,uint8_t * plaintext,size_t plaintext_size,size_t * plaintext_length)1739*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_decrypt(
1740*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
1741*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer, size_t key_buffer_size,
1742*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
1743*62c56f98SSadaf Ebrahimi     const uint8_t *nonce, size_t nonce_length,
1744*62c56f98SSadaf Ebrahimi     const uint8_t *additional_data, size_t additional_data_length,
1745*62c56f98SSadaf Ebrahimi     const uint8_t *ciphertext, size_t ciphertext_length,
1746*62c56f98SSadaf Ebrahimi     uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1747*62c56f98SSadaf Ebrahimi {
1748*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1749*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1750*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1751*62c56f98SSadaf Ebrahimi 
1752*62c56f98SSadaf Ebrahimi     switch( location )
1753*62c56f98SSadaf Ebrahimi     {
1754*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1755*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1756*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1757*62c56f98SSadaf Ebrahimi 
1758*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1759*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1760*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_aead_decrypt(
1761*62c56f98SSadaf Ebrahimi                         attributes, key_buffer, key_buffer_size,
1762*62c56f98SSadaf Ebrahimi                         alg,
1763*62c56f98SSadaf Ebrahimi                         nonce, nonce_length,
1764*62c56f98SSadaf Ebrahimi                         additional_data, additional_data_length,
1765*62c56f98SSadaf Ebrahimi                         ciphertext, ciphertext_length,
1766*62c56f98SSadaf Ebrahimi                         plaintext, plaintext_size, plaintext_length );
1767*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1768*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1769*62c56f98SSadaf Ebrahimi                 return( status );
1770*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1771*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1772*62c56f98SSadaf Ebrahimi 
1773*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
1774*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_decrypt(
1775*62c56f98SSadaf Ebrahimi                         attributes, key_buffer, key_buffer_size,
1776*62c56f98SSadaf Ebrahimi                         alg,
1777*62c56f98SSadaf Ebrahimi                         nonce, nonce_length,
1778*62c56f98SSadaf Ebrahimi                         additional_data, additional_data_length,
1779*62c56f98SSadaf Ebrahimi                         ciphertext, ciphertext_length,
1780*62c56f98SSadaf Ebrahimi                         plaintext, plaintext_size, plaintext_length ) );
1781*62c56f98SSadaf Ebrahimi 
1782*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1783*62c56f98SSadaf Ebrahimi 
1784*62c56f98SSadaf Ebrahimi         default:
1785*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1786*62c56f98SSadaf Ebrahimi             (void)status;
1787*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1788*62c56f98SSadaf Ebrahimi     }
1789*62c56f98SSadaf Ebrahimi }
1790*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_encrypt_setup(psa_aead_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg)1791*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_encrypt_setup(
1792*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
1793*62c56f98SSadaf Ebrahimi    const psa_key_attributes_t *attributes,
1794*62c56f98SSadaf Ebrahimi    const uint8_t *key_buffer, size_t key_buffer_size,
1795*62c56f98SSadaf Ebrahimi    psa_algorithm_t alg )
1796*62c56f98SSadaf Ebrahimi {
1797*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1798*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1799*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1800*62c56f98SSadaf Ebrahimi 
1801*62c56f98SSadaf Ebrahimi     switch( location )
1802*62c56f98SSadaf Ebrahimi     {
1803*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1804*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1805*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1806*62c56f98SSadaf Ebrahimi 
1807*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1808*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1809*62c56f98SSadaf Ebrahimi             operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
1810*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_aead_encrypt_setup(
1811*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
1812*62c56f98SSadaf Ebrahimi                         attributes, key_buffer, key_buffer_size,
1813*62c56f98SSadaf Ebrahimi                         alg );
1814*62c56f98SSadaf Ebrahimi 
1815*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1816*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1817*62c56f98SSadaf Ebrahimi                 return( status );
1818*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1819*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1820*62c56f98SSadaf Ebrahimi 
1821*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
1822*62c56f98SSadaf Ebrahimi             operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1823*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_aead_encrypt_setup(
1824*62c56f98SSadaf Ebrahimi                         &operation->ctx.mbedtls_ctx, attributes,
1825*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size,
1826*62c56f98SSadaf Ebrahimi                         alg );
1827*62c56f98SSadaf Ebrahimi 
1828*62c56f98SSadaf Ebrahimi             return( status );
1829*62c56f98SSadaf Ebrahimi 
1830*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1831*62c56f98SSadaf Ebrahimi 
1832*62c56f98SSadaf Ebrahimi         default:
1833*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1834*62c56f98SSadaf Ebrahimi             (void)status;
1835*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1836*62c56f98SSadaf Ebrahimi     }
1837*62c56f98SSadaf Ebrahimi }
1838*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_decrypt_setup(psa_aead_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg)1839*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_decrypt_setup(
1840*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
1841*62c56f98SSadaf Ebrahimi    const psa_key_attributes_t *attributes,
1842*62c56f98SSadaf Ebrahimi    const uint8_t *key_buffer, size_t key_buffer_size,
1843*62c56f98SSadaf Ebrahimi    psa_algorithm_t alg )
1844*62c56f98SSadaf Ebrahimi {
1845*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1846*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
1847*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1848*62c56f98SSadaf Ebrahimi 
1849*62c56f98SSadaf Ebrahimi     switch( location )
1850*62c56f98SSadaf Ebrahimi     {
1851*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1852*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
1853*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
1854*62c56f98SSadaf Ebrahimi 
1855*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1856*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1857*62c56f98SSadaf Ebrahimi             operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
1858*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_aead_decrypt_setup(
1859*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
1860*62c56f98SSadaf Ebrahimi                         attributes,
1861*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size,
1862*62c56f98SSadaf Ebrahimi                         alg );
1863*62c56f98SSadaf Ebrahimi 
1864*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
1865*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
1866*62c56f98SSadaf Ebrahimi                 return( status );
1867*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1868*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1869*62c56f98SSadaf Ebrahimi 
1870*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
1871*62c56f98SSadaf Ebrahimi             operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1872*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_aead_decrypt_setup(
1873*62c56f98SSadaf Ebrahimi                         &operation->ctx.mbedtls_ctx,
1874*62c56f98SSadaf Ebrahimi                         attributes,
1875*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size,
1876*62c56f98SSadaf Ebrahimi                         alg );
1877*62c56f98SSadaf Ebrahimi 
1878*62c56f98SSadaf Ebrahimi             return( status );
1879*62c56f98SSadaf Ebrahimi 
1880*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1881*62c56f98SSadaf Ebrahimi 
1882*62c56f98SSadaf Ebrahimi         default:
1883*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
1884*62c56f98SSadaf Ebrahimi             (void)status;
1885*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
1886*62c56f98SSadaf Ebrahimi     }
1887*62c56f98SSadaf Ebrahimi }
1888*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_set_nonce(psa_aead_operation_t * operation,const uint8_t * nonce,size_t nonce_length)1889*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_set_nonce(
1890*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
1891*62c56f98SSadaf Ebrahimi    const uint8_t *nonce,
1892*62c56f98SSadaf Ebrahimi    size_t nonce_length )
1893*62c56f98SSadaf Ebrahimi {
1894*62c56f98SSadaf Ebrahimi     switch( operation->id )
1895*62c56f98SSadaf Ebrahimi     {
1896*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_AEAD)
1897*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1898*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_set_nonce( &operation->ctx.mbedtls_ctx,
1899*62c56f98SSadaf Ebrahimi                                                 nonce,
1900*62c56f98SSadaf Ebrahimi                                                 nonce_length ) );
1901*62c56f98SSadaf Ebrahimi 
1902*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_AEAD */
1903*62c56f98SSadaf Ebrahimi 
1904*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1905*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1906*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1907*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_aead_set_nonce(
1908*62c56f98SSadaf Ebrahimi                          &operation->ctx.transparent_test_driver_ctx,
1909*62c56f98SSadaf Ebrahimi                          nonce, nonce_length ) );
1910*62c56f98SSadaf Ebrahimi 
1911*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1912*62c56f98SSadaf Ebrahimi 
1913*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1914*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1915*62c56f98SSadaf Ebrahimi     }
1916*62c56f98SSadaf Ebrahimi 
1917*62c56f98SSadaf Ebrahimi     (void)nonce;
1918*62c56f98SSadaf Ebrahimi     (void)nonce_length;
1919*62c56f98SSadaf Ebrahimi 
1920*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
1921*62c56f98SSadaf Ebrahimi }
1922*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_set_lengths(psa_aead_operation_t * operation,size_t ad_length,size_t plaintext_length)1923*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_set_lengths(
1924*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
1925*62c56f98SSadaf Ebrahimi    size_t ad_length,
1926*62c56f98SSadaf Ebrahimi    size_t plaintext_length )
1927*62c56f98SSadaf Ebrahimi {
1928*62c56f98SSadaf Ebrahimi     switch( operation->id )
1929*62c56f98SSadaf Ebrahimi     {
1930*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_AEAD)
1931*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1932*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_set_lengths( &operation->ctx.mbedtls_ctx,
1933*62c56f98SSadaf Ebrahimi                                                   ad_length,
1934*62c56f98SSadaf Ebrahimi                                                   plaintext_length ) );
1935*62c56f98SSadaf Ebrahimi 
1936*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_AEAD */
1937*62c56f98SSadaf Ebrahimi 
1938*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1939*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1940*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1941*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_aead_set_lengths(
1942*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
1943*62c56f98SSadaf Ebrahimi                         ad_length, plaintext_length ) );
1944*62c56f98SSadaf Ebrahimi 
1945*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1946*62c56f98SSadaf Ebrahimi 
1947*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1948*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1949*62c56f98SSadaf Ebrahimi     }
1950*62c56f98SSadaf Ebrahimi 
1951*62c56f98SSadaf Ebrahimi     (void)ad_length;
1952*62c56f98SSadaf Ebrahimi     (void)plaintext_length;
1953*62c56f98SSadaf Ebrahimi 
1954*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
1955*62c56f98SSadaf Ebrahimi }
1956*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_update_ad(psa_aead_operation_t * operation,const uint8_t * input,size_t input_length)1957*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_update_ad(
1958*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
1959*62c56f98SSadaf Ebrahimi    const uint8_t *input,
1960*62c56f98SSadaf Ebrahimi    size_t input_length )
1961*62c56f98SSadaf Ebrahimi {
1962*62c56f98SSadaf Ebrahimi     switch( operation->id )
1963*62c56f98SSadaf Ebrahimi     {
1964*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_AEAD)
1965*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1966*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_update_ad( &operation->ctx.mbedtls_ctx,
1967*62c56f98SSadaf Ebrahimi                                                 input,
1968*62c56f98SSadaf Ebrahimi                                                 input_length ) );
1969*62c56f98SSadaf Ebrahimi 
1970*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_AEAD */
1971*62c56f98SSadaf Ebrahimi 
1972*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1973*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
1974*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
1975*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_aead_update_ad(
1976*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
1977*62c56f98SSadaf Ebrahimi                         input, input_length ) );
1978*62c56f98SSadaf Ebrahimi 
1979*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
1980*62c56f98SSadaf Ebrahimi 
1981*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
1982*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1983*62c56f98SSadaf Ebrahimi     }
1984*62c56f98SSadaf Ebrahimi 
1985*62c56f98SSadaf Ebrahimi     (void)input;
1986*62c56f98SSadaf Ebrahimi     (void)input_length;
1987*62c56f98SSadaf Ebrahimi 
1988*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
1989*62c56f98SSadaf Ebrahimi }
1990*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_update(psa_aead_operation_t * operation,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)1991*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_update(
1992*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
1993*62c56f98SSadaf Ebrahimi    const uint8_t *input,
1994*62c56f98SSadaf Ebrahimi    size_t input_length,
1995*62c56f98SSadaf Ebrahimi    uint8_t *output,
1996*62c56f98SSadaf Ebrahimi    size_t output_size,
1997*62c56f98SSadaf Ebrahimi    size_t *output_length )
1998*62c56f98SSadaf Ebrahimi {
1999*62c56f98SSadaf Ebrahimi     switch( operation->id )
2000*62c56f98SSadaf Ebrahimi     {
2001*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_AEAD)
2002*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2003*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_update( &operation->ctx.mbedtls_ctx,
2004*62c56f98SSadaf Ebrahimi                                              input, input_length,
2005*62c56f98SSadaf Ebrahimi                                              output, output_size,
2006*62c56f98SSadaf Ebrahimi                                              output_length ) );
2007*62c56f98SSadaf Ebrahimi 
2008*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_AEAD */
2009*62c56f98SSadaf Ebrahimi 
2010*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2011*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2012*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2013*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_aead_update(
2014*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
2015*62c56f98SSadaf Ebrahimi                         input, input_length, output, output_size,
2016*62c56f98SSadaf Ebrahimi                         output_length ) );
2017*62c56f98SSadaf Ebrahimi 
2018*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2019*62c56f98SSadaf Ebrahimi 
2020*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2021*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2022*62c56f98SSadaf Ebrahimi     }
2023*62c56f98SSadaf Ebrahimi 
2024*62c56f98SSadaf Ebrahimi     (void)input;
2025*62c56f98SSadaf Ebrahimi     (void)input_length;
2026*62c56f98SSadaf Ebrahimi     (void)output;
2027*62c56f98SSadaf Ebrahimi     (void)output_size;
2028*62c56f98SSadaf Ebrahimi     (void)output_length;
2029*62c56f98SSadaf Ebrahimi 
2030*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
2031*62c56f98SSadaf Ebrahimi }
2032*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_finish(psa_aead_operation_t * operation,uint8_t * ciphertext,size_t ciphertext_size,size_t * ciphertext_length,uint8_t * tag,size_t tag_size,size_t * tag_length)2033*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_finish(
2034*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
2035*62c56f98SSadaf Ebrahimi    uint8_t *ciphertext,
2036*62c56f98SSadaf Ebrahimi    size_t ciphertext_size,
2037*62c56f98SSadaf Ebrahimi    size_t *ciphertext_length,
2038*62c56f98SSadaf Ebrahimi    uint8_t *tag,
2039*62c56f98SSadaf Ebrahimi    size_t tag_size,
2040*62c56f98SSadaf Ebrahimi    size_t *tag_length )
2041*62c56f98SSadaf Ebrahimi {
2042*62c56f98SSadaf Ebrahimi     switch( operation->id )
2043*62c56f98SSadaf Ebrahimi     {
2044*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_AEAD)
2045*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2046*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_finish( &operation->ctx.mbedtls_ctx,
2047*62c56f98SSadaf Ebrahimi                                              ciphertext,
2048*62c56f98SSadaf Ebrahimi                                              ciphertext_size,
2049*62c56f98SSadaf Ebrahimi                                              ciphertext_length, tag,
2050*62c56f98SSadaf Ebrahimi                                              tag_size, tag_length ) );
2051*62c56f98SSadaf Ebrahimi 
2052*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_AEAD */
2053*62c56f98SSadaf Ebrahimi 
2054*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2055*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2056*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2057*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_aead_finish(
2058*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
2059*62c56f98SSadaf Ebrahimi                         ciphertext, ciphertext_size,
2060*62c56f98SSadaf Ebrahimi                         ciphertext_length, tag, tag_size, tag_length ) );
2061*62c56f98SSadaf Ebrahimi 
2062*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2063*62c56f98SSadaf Ebrahimi 
2064*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2065*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2066*62c56f98SSadaf Ebrahimi     }
2067*62c56f98SSadaf Ebrahimi 
2068*62c56f98SSadaf Ebrahimi     (void)ciphertext;
2069*62c56f98SSadaf Ebrahimi     (void)ciphertext_size;
2070*62c56f98SSadaf Ebrahimi     (void)ciphertext_length;
2071*62c56f98SSadaf Ebrahimi     (void)tag;
2072*62c56f98SSadaf Ebrahimi     (void)tag_size;
2073*62c56f98SSadaf Ebrahimi     (void)tag_length;
2074*62c56f98SSadaf Ebrahimi 
2075*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
2076*62c56f98SSadaf Ebrahimi }
2077*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_verify(psa_aead_operation_t * operation,uint8_t * plaintext,size_t plaintext_size,size_t * plaintext_length,const uint8_t * tag,size_t tag_length)2078*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_verify(
2079*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation,
2080*62c56f98SSadaf Ebrahimi    uint8_t *plaintext,
2081*62c56f98SSadaf Ebrahimi    size_t plaintext_size,
2082*62c56f98SSadaf Ebrahimi    size_t *plaintext_length,
2083*62c56f98SSadaf Ebrahimi    const uint8_t *tag,
2084*62c56f98SSadaf Ebrahimi    size_t tag_length )
2085*62c56f98SSadaf Ebrahimi {
2086*62c56f98SSadaf Ebrahimi     switch( operation->id )
2087*62c56f98SSadaf Ebrahimi     {
2088*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_AEAD)
2089*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2090*62c56f98SSadaf Ebrahimi             {
2091*62c56f98SSadaf Ebrahimi                 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2092*62c56f98SSadaf Ebrahimi                 uint8_t check_tag[PSA_AEAD_TAG_MAX_SIZE];
2093*62c56f98SSadaf Ebrahimi                 size_t check_tag_length;
2094*62c56f98SSadaf Ebrahimi 
2095*62c56f98SSadaf Ebrahimi                 status = mbedtls_psa_aead_finish( &operation->ctx.mbedtls_ctx,
2096*62c56f98SSadaf Ebrahimi                                                   plaintext,
2097*62c56f98SSadaf Ebrahimi                                                   plaintext_size,
2098*62c56f98SSadaf Ebrahimi                                                   plaintext_length,
2099*62c56f98SSadaf Ebrahimi                                                   check_tag,
2100*62c56f98SSadaf Ebrahimi                                                   sizeof( check_tag ),
2101*62c56f98SSadaf Ebrahimi                                                   &check_tag_length );
2102*62c56f98SSadaf Ebrahimi 
2103*62c56f98SSadaf Ebrahimi                 if( status == PSA_SUCCESS )
2104*62c56f98SSadaf Ebrahimi                 {
2105*62c56f98SSadaf Ebrahimi                     if( tag_length != check_tag_length ||
2106*62c56f98SSadaf Ebrahimi                         mbedtls_ct_memcmp( tag, check_tag, tag_length )
2107*62c56f98SSadaf Ebrahimi                         != 0 )
2108*62c56f98SSadaf Ebrahimi                         status = PSA_ERROR_INVALID_SIGNATURE;
2109*62c56f98SSadaf Ebrahimi                 }
2110*62c56f98SSadaf Ebrahimi 
2111*62c56f98SSadaf Ebrahimi                 mbedtls_platform_zeroize( check_tag, sizeof( check_tag ) );
2112*62c56f98SSadaf Ebrahimi 
2113*62c56f98SSadaf Ebrahimi                 return( status );
2114*62c56f98SSadaf Ebrahimi             }
2115*62c56f98SSadaf Ebrahimi 
2116*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_AEAD */
2117*62c56f98SSadaf Ebrahimi 
2118*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2119*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2120*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2121*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_aead_verify(
2122*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
2123*62c56f98SSadaf Ebrahimi                         plaintext, plaintext_size,
2124*62c56f98SSadaf Ebrahimi                         plaintext_length, tag, tag_length ) );
2125*62c56f98SSadaf Ebrahimi 
2126*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2127*62c56f98SSadaf Ebrahimi 
2128*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2129*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2130*62c56f98SSadaf Ebrahimi     }
2131*62c56f98SSadaf Ebrahimi 
2132*62c56f98SSadaf Ebrahimi     (void)plaintext;
2133*62c56f98SSadaf Ebrahimi     (void)plaintext_size;
2134*62c56f98SSadaf Ebrahimi     (void)plaintext_length;
2135*62c56f98SSadaf Ebrahimi     (void)tag;
2136*62c56f98SSadaf Ebrahimi     (void)tag_length;
2137*62c56f98SSadaf Ebrahimi 
2138*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
2139*62c56f98SSadaf Ebrahimi }
2140*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_aead_abort(psa_aead_operation_t * operation)2141*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_aead_abort(
2142*62c56f98SSadaf Ebrahimi    psa_aead_operation_t *operation )
2143*62c56f98SSadaf Ebrahimi {
2144*62c56f98SSadaf Ebrahimi     switch( operation->id )
2145*62c56f98SSadaf Ebrahimi     {
2146*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_AEAD)
2147*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2148*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_aead_abort( &operation->ctx.mbedtls_ctx ) );
2149*62c56f98SSadaf Ebrahimi 
2150*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_AEAD */
2151*62c56f98SSadaf Ebrahimi 
2152*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2153*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2154*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2155*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_aead_abort(
2156*62c56f98SSadaf Ebrahimi                &operation->ctx.transparent_test_driver_ctx ) );
2157*62c56f98SSadaf Ebrahimi 
2158*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2159*62c56f98SSadaf Ebrahimi 
2160*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2161*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2162*62c56f98SSadaf Ebrahimi     }
2163*62c56f98SSadaf Ebrahimi 
2164*62c56f98SSadaf Ebrahimi     return( PSA_ERROR_INVALID_ARGUMENT );
2165*62c56f98SSadaf Ebrahimi }
2166*62c56f98SSadaf Ebrahimi 
2167*62c56f98SSadaf Ebrahimi /*
2168*62c56f98SSadaf Ebrahimi  * MAC functions
2169*62c56f98SSadaf Ebrahimi  */
psa_driver_wrapper_mac_compute(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * input,size_t input_length,uint8_t * mac,size_t mac_size,size_t * mac_length)2170*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_mac_compute(
2171*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
2172*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
2173*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
2174*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
2175*62c56f98SSadaf Ebrahimi     const uint8_t *input,
2176*62c56f98SSadaf Ebrahimi     size_t input_length,
2177*62c56f98SSadaf Ebrahimi     uint8_t *mac,
2178*62c56f98SSadaf Ebrahimi     size_t mac_size,
2179*62c56f98SSadaf Ebrahimi     size_t *mac_length )
2180*62c56f98SSadaf Ebrahimi {
2181*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2182*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
2183*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
2184*62c56f98SSadaf Ebrahimi 
2185*62c56f98SSadaf Ebrahimi     switch( location )
2186*62c56f98SSadaf Ebrahimi     {
2187*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
2188*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
2189*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
2190*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2191*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2192*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_mac_compute(
2193*62c56f98SSadaf Ebrahimi                 attributes, key_buffer, key_buffer_size, alg,
2194*62c56f98SSadaf Ebrahimi                 input, input_length,
2195*62c56f98SSadaf Ebrahimi                 mac, mac_size, mac_length );
2196*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
2197*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2198*62c56f98SSadaf Ebrahimi                 return( status );
2199*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2200*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2201*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_MAC)
2202*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
2203*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_mac_compute(
2204*62c56f98SSadaf Ebrahimi                 attributes, key_buffer, key_buffer_size, alg,
2205*62c56f98SSadaf Ebrahimi                 input, input_length,
2206*62c56f98SSadaf Ebrahimi                 mac, mac_size, mac_length );
2207*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2208*62c56f98SSadaf Ebrahimi                 return( status );
2209*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_MAC */
2210*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
2211*62c56f98SSadaf Ebrahimi 
2212*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2213*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2214*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2215*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
2216*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_mac_compute(
2217*62c56f98SSadaf Ebrahimi                 attributes, key_buffer, key_buffer_size, alg,
2218*62c56f98SSadaf Ebrahimi                 input, input_length,
2219*62c56f98SSadaf Ebrahimi                 mac, mac_size, mac_length );
2220*62c56f98SSadaf Ebrahimi             return( status );
2221*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2222*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2223*62c56f98SSadaf Ebrahimi         default:
2224*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
2225*62c56f98SSadaf Ebrahimi             (void) key_buffer;
2226*62c56f98SSadaf Ebrahimi             (void) key_buffer_size;
2227*62c56f98SSadaf Ebrahimi             (void) alg;
2228*62c56f98SSadaf Ebrahimi             (void) input;
2229*62c56f98SSadaf Ebrahimi             (void) input_length;
2230*62c56f98SSadaf Ebrahimi             (void) mac;
2231*62c56f98SSadaf Ebrahimi             (void) mac_size;
2232*62c56f98SSadaf Ebrahimi             (void) mac_length;
2233*62c56f98SSadaf Ebrahimi             (void) status;
2234*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2235*62c56f98SSadaf Ebrahimi     }
2236*62c56f98SSadaf Ebrahimi }
2237*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_mac_sign_setup(psa_mac_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg)2238*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_mac_sign_setup(
2239*62c56f98SSadaf Ebrahimi     psa_mac_operation_t *operation,
2240*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
2241*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
2242*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
2243*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg )
2244*62c56f98SSadaf Ebrahimi {
2245*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2246*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
2247*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
2248*62c56f98SSadaf Ebrahimi 
2249*62c56f98SSadaf Ebrahimi     switch( location )
2250*62c56f98SSadaf Ebrahimi     {
2251*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
2252*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
2253*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
2254*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2255*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2256*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_mac_sign_setup(
2257*62c56f98SSadaf Ebrahimi                 &operation->ctx.transparent_test_driver_ctx,
2258*62c56f98SSadaf Ebrahimi                 attributes,
2259*62c56f98SSadaf Ebrahimi                 key_buffer, key_buffer_size,
2260*62c56f98SSadaf Ebrahimi                 alg );
2261*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
2262*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2263*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
2264*62c56f98SSadaf Ebrahimi 
2265*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2266*62c56f98SSadaf Ebrahimi                 return( status );
2267*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2268*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2269*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_MAC)
2270*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
2271*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
2272*62c56f98SSadaf Ebrahimi                                                  attributes,
2273*62c56f98SSadaf Ebrahimi                                                  key_buffer, key_buffer_size,
2274*62c56f98SSadaf Ebrahimi                                                  alg );
2275*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2276*62c56f98SSadaf Ebrahimi                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
2277*62c56f98SSadaf Ebrahimi 
2278*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2279*62c56f98SSadaf Ebrahimi                 return( status );
2280*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_MAC */
2281*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
2282*62c56f98SSadaf Ebrahimi 
2283*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2284*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2285*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2286*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
2287*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_mac_sign_setup(
2288*62c56f98SSadaf Ebrahimi                 &operation->ctx.opaque_test_driver_ctx,
2289*62c56f98SSadaf Ebrahimi                 attributes,
2290*62c56f98SSadaf Ebrahimi                 key_buffer, key_buffer_size,
2291*62c56f98SSadaf Ebrahimi                 alg );
2292*62c56f98SSadaf Ebrahimi 
2293*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2294*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_OPAQUE_DRIVER_ID;
2295*62c56f98SSadaf Ebrahimi 
2296*62c56f98SSadaf Ebrahimi             return( status );
2297*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2298*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2299*62c56f98SSadaf Ebrahimi         default:
2300*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
2301*62c56f98SSadaf Ebrahimi             (void) status;
2302*62c56f98SSadaf Ebrahimi             (void) operation;
2303*62c56f98SSadaf Ebrahimi             (void) key_buffer;
2304*62c56f98SSadaf Ebrahimi             (void) key_buffer_size;
2305*62c56f98SSadaf Ebrahimi             (void) alg;
2306*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2307*62c56f98SSadaf Ebrahimi     }
2308*62c56f98SSadaf Ebrahimi }
2309*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_mac_verify_setup(psa_mac_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg)2310*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_mac_verify_setup(
2311*62c56f98SSadaf Ebrahimi     psa_mac_operation_t *operation,
2312*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
2313*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
2314*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
2315*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg )
2316*62c56f98SSadaf Ebrahimi {
2317*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2318*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
2319*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
2320*62c56f98SSadaf Ebrahimi 
2321*62c56f98SSadaf Ebrahimi     switch( location )
2322*62c56f98SSadaf Ebrahimi     {
2323*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
2324*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
2325*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
2326*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2327*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2328*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_mac_verify_setup(
2329*62c56f98SSadaf Ebrahimi                 &operation->ctx.transparent_test_driver_ctx,
2330*62c56f98SSadaf Ebrahimi                 attributes,
2331*62c56f98SSadaf Ebrahimi                 key_buffer, key_buffer_size,
2332*62c56f98SSadaf Ebrahimi                 alg );
2333*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
2334*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2335*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
2336*62c56f98SSadaf Ebrahimi 
2337*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2338*62c56f98SSadaf Ebrahimi                 return( status );
2339*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2340*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2341*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_MAC)
2342*62c56f98SSadaf Ebrahimi             /* Fell through, meaning no accelerator supports this operation */
2343*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
2344*62c56f98SSadaf Ebrahimi                                                    attributes,
2345*62c56f98SSadaf Ebrahimi                                                    key_buffer, key_buffer_size,
2346*62c56f98SSadaf Ebrahimi                                                    alg );
2347*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2348*62c56f98SSadaf Ebrahimi                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
2349*62c56f98SSadaf Ebrahimi 
2350*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2351*62c56f98SSadaf Ebrahimi                 return( status );
2352*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_MAC */
2353*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
2354*62c56f98SSadaf Ebrahimi 
2355*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2356*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2357*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2358*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
2359*62c56f98SSadaf Ebrahimi             status = mbedtls_test_opaque_mac_verify_setup(
2360*62c56f98SSadaf Ebrahimi                 &operation->ctx.opaque_test_driver_ctx,
2361*62c56f98SSadaf Ebrahimi                 attributes,
2362*62c56f98SSadaf Ebrahimi                 key_buffer, key_buffer_size,
2363*62c56f98SSadaf Ebrahimi                 alg );
2364*62c56f98SSadaf Ebrahimi 
2365*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2366*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_OPAQUE_DRIVER_ID;
2367*62c56f98SSadaf Ebrahimi 
2368*62c56f98SSadaf Ebrahimi             return( status );
2369*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2370*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2371*62c56f98SSadaf Ebrahimi         default:
2372*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
2373*62c56f98SSadaf Ebrahimi             (void) status;
2374*62c56f98SSadaf Ebrahimi             (void) operation;
2375*62c56f98SSadaf Ebrahimi             (void) key_buffer;
2376*62c56f98SSadaf Ebrahimi             (void) key_buffer_size;
2377*62c56f98SSadaf Ebrahimi             (void) alg;
2378*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2379*62c56f98SSadaf Ebrahimi     }
2380*62c56f98SSadaf Ebrahimi }
2381*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_mac_update(psa_mac_operation_t * operation,const uint8_t * input,size_t input_length)2382*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_mac_update(
2383*62c56f98SSadaf Ebrahimi     psa_mac_operation_t *operation,
2384*62c56f98SSadaf Ebrahimi     const uint8_t *input,
2385*62c56f98SSadaf Ebrahimi     size_t input_length )
2386*62c56f98SSadaf Ebrahimi {
2387*62c56f98SSadaf Ebrahimi     switch( operation->id )
2388*62c56f98SSadaf Ebrahimi     {
2389*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_MAC)
2390*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2391*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
2392*62c56f98SSadaf Ebrahimi                                             input, input_length ) );
2393*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_MAC */
2394*62c56f98SSadaf Ebrahimi 
2395*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2396*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2397*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2398*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_mac_update(
2399*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
2400*62c56f98SSadaf Ebrahimi                         input, input_length ) );
2401*62c56f98SSadaf Ebrahimi 
2402*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
2403*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_mac_update(
2404*62c56f98SSadaf Ebrahimi                         &operation->ctx.opaque_test_driver_ctx,
2405*62c56f98SSadaf Ebrahimi                         input, input_length ) );
2406*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2407*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2408*62c56f98SSadaf Ebrahimi         default:
2409*62c56f98SSadaf Ebrahimi             (void) input;
2410*62c56f98SSadaf Ebrahimi             (void) input_length;
2411*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2412*62c56f98SSadaf Ebrahimi     }
2413*62c56f98SSadaf Ebrahimi }
2414*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_mac_sign_finish(psa_mac_operation_t * operation,uint8_t * mac,size_t mac_size,size_t * mac_length)2415*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_mac_sign_finish(
2416*62c56f98SSadaf Ebrahimi     psa_mac_operation_t *operation,
2417*62c56f98SSadaf Ebrahimi     uint8_t *mac,
2418*62c56f98SSadaf Ebrahimi     size_t mac_size,
2419*62c56f98SSadaf Ebrahimi     size_t *mac_length )
2420*62c56f98SSadaf Ebrahimi {
2421*62c56f98SSadaf Ebrahimi     switch( operation->id )
2422*62c56f98SSadaf Ebrahimi     {
2423*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_MAC)
2424*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2425*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
2426*62c56f98SSadaf Ebrahimi                                                  mac, mac_size, mac_length ) );
2427*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_MAC */
2428*62c56f98SSadaf Ebrahimi 
2429*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2430*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2431*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2432*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_mac_sign_finish(
2433*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
2434*62c56f98SSadaf Ebrahimi                         mac, mac_size, mac_length ) );
2435*62c56f98SSadaf Ebrahimi 
2436*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
2437*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_mac_sign_finish(
2438*62c56f98SSadaf Ebrahimi                         &operation->ctx.opaque_test_driver_ctx,
2439*62c56f98SSadaf Ebrahimi                         mac, mac_size, mac_length ) );
2440*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2441*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2442*62c56f98SSadaf Ebrahimi         default:
2443*62c56f98SSadaf Ebrahimi             (void) mac;
2444*62c56f98SSadaf Ebrahimi             (void) mac_size;
2445*62c56f98SSadaf Ebrahimi             (void) mac_length;
2446*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2447*62c56f98SSadaf Ebrahimi     }
2448*62c56f98SSadaf Ebrahimi }
2449*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_mac_verify_finish(psa_mac_operation_t * operation,const uint8_t * mac,size_t mac_length)2450*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_mac_verify_finish(
2451*62c56f98SSadaf Ebrahimi     psa_mac_operation_t *operation,
2452*62c56f98SSadaf Ebrahimi     const uint8_t *mac,
2453*62c56f98SSadaf Ebrahimi     size_t mac_length )
2454*62c56f98SSadaf Ebrahimi {
2455*62c56f98SSadaf Ebrahimi     switch( operation->id )
2456*62c56f98SSadaf Ebrahimi     {
2457*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_MAC)
2458*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2459*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
2460*62c56f98SSadaf Ebrahimi                                                    mac, mac_length ) );
2461*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_MAC */
2462*62c56f98SSadaf Ebrahimi 
2463*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2464*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2465*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2466*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_mac_verify_finish(
2467*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx,
2468*62c56f98SSadaf Ebrahimi                         mac, mac_length ) );
2469*62c56f98SSadaf Ebrahimi 
2470*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
2471*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_mac_verify_finish(
2472*62c56f98SSadaf Ebrahimi                         &operation->ctx.opaque_test_driver_ctx,
2473*62c56f98SSadaf Ebrahimi                         mac, mac_length ) );
2474*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2475*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2476*62c56f98SSadaf Ebrahimi         default:
2477*62c56f98SSadaf Ebrahimi             (void) mac;
2478*62c56f98SSadaf Ebrahimi             (void) mac_length;
2479*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2480*62c56f98SSadaf Ebrahimi     }
2481*62c56f98SSadaf Ebrahimi }
2482*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_mac_abort(psa_mac_operation_t * operation)2483*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_mac_abort(
2484*62c56f98SSadaf Ebrahimi     psa_mac_operation_t *operation )
2485*62c56f98SSadaf Ebrahimi {
2486*62c56f98SSadaf Ebrahimi     switch( operation->id )
2487*62c56f98SSadaf Ebrahimi     {
2488*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_MAC)
2489*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2490*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
2491*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_MAC */
2492*62c56f98SSadaf Ebrahimi 
2493*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2494*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2495*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2496*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_mac_abort(
2497*62c56f98SSadaf Ebrahimi                         &operation->ctx.transparent_test_driver_ctx ) );
2498*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_OPAQUE_DRIVER_ID:
2499*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_mac_abort(
2500*62c56f98SSadaf Ebrahimi                         &operation->ctx.opaque_test_driver_ctx ) );
2501*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2502*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2503*62c56f98SSadaf Ebrahimi         default:
2504*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2505*62c56f98SSadaf Ebrahimi     }
2506*62c56f98SSadaf Ebrahimi }
2507*62c56f98SSadaf Ebrahimi 
2508*62c56f98SSadaf Ebrahimi /*
2509*62c56f98SSadaf Ebrahimi  * Asymmetric cryptography
2510*62c56f98SSadaf Ebrahimi  */
psa_driver_wrapper_asymmetric_encrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * input,size_t input_length,const uint8_t * salt,size_t salt_length,uint8_t * output,size_t output_size,size_t * output_length)2511*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_asymmetric_encrypt(
2512*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes, const uint8_t *key_buffer,
2513*62c56f98SSadaf Ebrahimi     size_t key_buffer_size, psa_algorithm_t alg, const uint8_t *input,
2514*62c56f98SSadaf Ebrahimi     size_t input_length, const uint8_t *salt, size_t salt_length,
2515*62c56f98SSadaf Ebrahimi     uint8_t *output, size_t output_size, size_t *output_length )
2516*62c56f98SSadaf Ebrahimi {
2517*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2518*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
2519*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
2520*62c56f98SSadaf Ebrahimi 
2521*62c56f98SSadaf Ebrahimi     switch( location )
2522*62c56f98SSadaf Ebrahimi     {
2523*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
2524*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
2525*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
2526*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2527*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2528*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_asymmetric_encrypt( attributes,
2529*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg, input, input_length,
2530*62c56f98SSadaf Ebrahimi                         salt, salt_length, output, output_size,
2531*62c56f98SSadaf Ebrahimi                         output_length );
2532*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
2533*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2534*62c56f98SSadaf Ebrahimi                 return( status );
2535*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2536*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2537*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_asymmetric_encrypt( attributes,
2538*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg, input, input_length,
2539*62c56f98SSadaf Ebrahimi                         salt, salt_length, output, output_size, output_length )
2540*62c56f98SSadaf Ebrahimi                   );
2541*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2542*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2543*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2544*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
2545*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_asymmetric_encrypt( attributes,
2546*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg, input, input_length,
2547*62c56f98SSadaf Ebrahimi                         salt, salt_length, output, output_size, output_length )
2548*62c56f98SSadaf Ebrahimi                   );
2549*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2550*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2551*62c56f98SSadaf Ebrahimi 
2552*62c56f98SSadaf Ebrahimi         default:
2553*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
2554*62c56f98SSadaf Ebrahimi             (void)status;
2555*62c56f98SSadaf Ebrahimi             (void)key_buffer;
2556*62c56f98SSadaf Ebrahimi             (void)key_buffer_size;
2557*62c56f98SSadaf Ebrahimi             (void)alg;
2558*62c56f98SSadaf Ebrahimi             (void)input;
2559*62c56f98SSadaf Ebrahimi             (void)input_length;
2560*62c56f98SSadaf Ebrahimi             (void)salt;
2561*62c56f98SSadaf Ebrahimi             (void)salt_length;
2562*62c56f98SSadaf Ebrahimi             (void)output;
2563*62c56f98SSadaf Ebrahimi             (void)output_size;
2564*62c56f98SSadaf Ebrahimi             (void)output_length;
2565*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2566*62c56f98SSadaf Ebrahimi     }
2567*62c56f98SSadaf Ebrahimi }
2568*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_asymmetric_decrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * input,size_t input_length,const uint8_t * salt,size_t salt_length,uint8_t * output,size_t output_size,size_t * output_length)2569*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_asymmetric_decrypt(
2570*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes, const uint8_t *key_buffer,
2571*62c56f98SSadaf Ebrahimi     size_t key_buffer_size, psa_algorithm_t alg, const uint8_t *input,
2572*62c56f98SSadaf Ebrahimi     size_t input_length, const uint8_t *salt, size_t salt_length,
2573*62c56f98SSadaf Ebrahimi     uint8_t *output, size_t output_size, size_t *output_length )
2574*62c56f98SSadaf Ebrahimi {
2575*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2576*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
2577*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
2578*62c56f98SSadaf Ebrahimi 
2579*62c56f98SSadaf Ebrahimi     switch( location )
2580*62c56f98SSadaf Ebrahimi     {
2581*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
2582*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
2583*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
2584*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2585*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2586*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_asymmetric_decrypt( attributes,
2587*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg, input, input_length,
2588*62c56f98SSadaf Ebrahimi                         salt, salt_length, output, output_size,
2589*62c56f98SSadaf Ebrahimi                         output_length );
2590*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
2591*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2592*62c56f98SSadaf Ebrahimi                 return( status );
2593*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2594*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2595*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_asymmetric_decrypt( attributes,
2596*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg,input, input_length,
2597*62c56f98SSadaf Ebrahimi                         salt, salt_length, output, output_size,
2598*62c56f98SSadaf Ebrahimi                         output_length ) );
2599*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2600*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2601*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2602*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
2603*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_asymmetric_decrypt( attributes,
2604*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg, input, input_length,
2605*62c56f98SSadaf Ebrahimi                         salt, salt_length, output, output_size,
2606*62c56f98SSadaf Ebrahimi                         output_length ) );
2607*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2608*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2609*62c56f98SSadaf Ebrahimi 
2610*62c56f98SSadaf Ebrahimi         default:
2611*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
2612*62c56f98SSadaf Ebrahimi             (void)status;
2613*62c56f98SSadaf Ebrahimi             (void)key_buffer;
2614*62c56f98SSadaf Ebrahimi             (void)key_buffer_size;
2615*62c56f98SSadaf Ebrahimi             (void)alg;
2616*62c56f98SSadaf Ebrahimi             (void)input;
2617*62c56f98SSadaf Ebrahimi             (void)input_length;
2618*62c56f98SSadaf Ebrahimi             (void)salt;
2619*62c56f98SSadaf Ebrahimi             (void)salt_length;
2620*62c56f98SSadaf Ebrahimi             (void)output;
2621*62c56f98SSadaf Ebrahimi             (void)output_size;
2622*62c56f98SSadaf Ebrahimi             (void)output_length;
2623*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2624*62c56f98SSadaf Ebrahimi     }
2625*62c56f98SSadaf Ebrahimi }
2626*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_key_agreement(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * peer_key,size_t peer_key_length,uint8_t * shared_secret,size_t shared_secret_size,size_t * shared_secret_length)2627*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_key_agreement(
2628*62c56f98SSadaf Ebrahimi     const psa_key_attributes_t *attributes,
2629*62c56f98SSadaf Ebrahimi     const uint8_t *key_buffer,
2630*62c56f98SSadaf Ebrahimi     size_t key_buffer_size,
2631*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg,
2632*62c56f98SSadaf Ebrahimi     const uint8_t *peer_key,
2633*62c56f98SSadaf Ebrahimi     size_t peer_key_length,
2634*62c56f98SSadaf Ebrahimi     uint8_t *shared_secret,
2635*62c56f98SSadaf Ebrahimi     size_t shared_secret_size,
2636*62c56f98SSadaf Ebrahimi     size_t *shared_secret_length
2637*62c56f98SSadaf Ebrahimi  )
2638*62c56f98SSadaf Ebrahimi {
2639*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2640*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
2641*62c56f98SSadaf Ebrahimi         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
2642*62c56f98SSadaf Ebrahimi 
2643*62c56f98SSadaf Ebrahimi     switch( location )
2644*62c56f98SSadaf Ebrahimi     {
2645*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
2646*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
2647*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
2648*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2649*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2650*62c56f98SSadaf Ebrahimi             status =
2651*62c56f98SSadaf Ebrahimi                 mbedtls_test_transparent_key_agreement( attributes,
2652*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg, peer_key,
2653*62c56f98SSadaf Ebrahimi                         peer_key_length, shared_secret, shared_secret_size,
2654*62c56f98SSadaf Ebrahimi                         shared_secret_length );
2655*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2656*62c56f98SSadaf Ebrahimi                 return( status );
2657*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2658*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_P256M_DRIVER_ENABLED)
2659*62c56f98SSadaf Ebrahimi             if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) &&
2660*62c56f98SSadaf Ebrahimi                 PSA_ALG_IS_ECDH(alg) &&
2661*62c56f98SSadaf Ebrahimi                 PSA_KEY_TYPE_ECC_GET_FAMILY(attributes->core.type) == PSA_ECC_FAMILY_SECP_R1 &&
2662*62c56f98SSadaf Ebrahimi                 attributes->core.bits == 256 )
2663*62c56f98SSadaf Ebrahimi             {
2664*62c56f98SSadaf Ebrahimi                 status = p256_transparent_key_agreement( attributes,
2665*62c56f98SSadaf Ebrahimi                                                          key_buffer,
2666*62c56f98SSadaf Ebrahimi                                                          key_buffer_size,
2667*62c56f98SSadaf Ebrahimi                                                          alg,
2668*62c56f98SSadaf Ebrahimi                                                          peer_key,
2669*62c56f98SSadaf Ebrahimi                                                          peer_key_length,
2670*62c56f98SSadaf Ebrahimi                                                          shared_secret,
2671*62c56f98SSadaf Ebrahimi                                                          shared_secret_size,
2672*62c56f98SSadaf Ebrahimi                                                          shared_secret_length );
2673*62c56f98SSadaf Ebrahimi                 if( status != PSA_ERROR_NOT_SUPPORTED)
2674*62c56f98SSadaf Ebrahimi                     return( status );
2675*62c56f98SSadaf Ebrahimi             }
2676*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_P256M_DRIVER_ENABLED */
2677*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2678*62c56f98SSadaf Ebrahimi 
2679*62c56f98SSadaf Ebrahimi             /* Software Fallback */
2680*62c56f98SSadaf Ebrahimi             status = psa_key_agreement_raw_builtin( attributes,
2681*62c56f98SSadaf Ebrahimi                                                     key_buffer,
2682*62c56f98SSadaf Ebrahimi                                                     key_buffer_size,
2683*62c56f98SSadaf Ebrahimi                                                     alg,
2684*62c56f98SSadaf Ebrahimi                                                     peer_key,
2685*62c56f98SSadaf Ebrahimi                                                     peer_key_length,
2686*62c56f98SSadaf Ebrahimi                                                     shared_secret,
2687*62c56f98SSadaf Ebrahimi                                                     shared_secret_size,
2688*62c56f98SSadaf Ebrahimi                                                     shared_secret_length );
2689*62c56f98SSadaf Ebrahimi             return( status );
2690*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2691*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2692*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
2693*62c56f98SSadaf Ebrahimi             return( mbedtls_test_opaque_key_agreement( attributes,
2694*62c56f98SSadaf Ebrahimi                         key_buffer, key_buffer_size, alg, peer_key,
2695*62c56f98SSadaf Ebrahimi                         peer_key_length, shared_secret, shared_secret_size,
2696*62c56f98SSadaf Ebrahimi                         shared_secret_length ) );
2697*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2698*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2699*62c56f98SSadaf Ebrahimi 
2700*62c56f98SSadaf Ebrahimi         default:
2701*62c56f98SSadaf Ebrahimi             (void) attributes;
2702*62c56f98SSadaf Ebrahimi             (void) key_buffer;
2703*62c56f98SSadaf Ebrahimi             (void) key_buffer_size;
2704*62c56f98SSadaf Ebrahimi             (void) peer_key;
2705*62c56f98SSadaf Ebrahimi             (void) peer_key_length;
2706*62c56f98SSadaf Ebrahimi             (void) shared_secret;
2707*62c56f98SSadaf Ebrahimi             (void) shared_secret_size;
2708*62c56f98SSadaf Ebrahimi             (void) shared_secret_length;
2709*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_NOT_SUPPORTED );
2710*62c56f98SSadaf Ebrahimi 
2711*62c56f98SSadaf Ebrahimi     }
2712*62c56f98SSadaf Ebrahimi }
2713*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_pake_setup(psa_pake_operation_t * operation,const psa_crypto_driver_pake_inputs_t * inputs)2714*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_pake_setup(
2715*62c56f98SSadaf Ebrahimi     psa_pake_operation_t *operation,
2716*62c56f98SSadaf Ebrahimi     const psa_crypto_driver_pake_inputs_t *inputs )
2717*62c56f98SSadaf Ebrahimi {
2718*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2719*62c56f98SSadaf Ebrahimi 
2720*62c56f98SSadaf Ebrahimi     psa_key_location_t location =
2721*62c56f98SSadaf Ebrahimi             PSA_KEY_LIFETIME_GET_LOCATION( psa_get_key_lifetime( &inputs->attributes ) );
2722*62c56f98SSadaf Ebrahimi 
2723*62c56f98SSadaf Ebrahimi     switch( location )
2724*62c56f98SSadaf Ebrahimi     {
2725*62c56f98SSadaf Ebrahimi         case PSA_KEY_LOCATION_LOCAL_STORAGE:
2726*62c56f98SSadaf Ebrahimi             /* Key is stored in the slot in export representation, so
2727*62c56f98SSadaf Ebrahimi              * cycle through all known transparent accelerators */
2728*62c56f98SSadaf Ebrahimi             status = PSA_ERROR_NOT_SUPPORTED;
2729*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2730*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2731*62c56f98SSadaf Ebrahimi             status = mbedtls_test_transparent_pake_setup(
2732*62c56f98SSadaf Ebrahimi                         &operation->data.ctx.transparent_test_driver_ctx,
2733*62c56f98SSadaf Ebrahimi                         inputs );
2734*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2735*62c56f98SSadaf Ebrahimi                 operation->id = MBEDTLS_TEST_TRANSPARENT_DRIVER_ID;
2736*62c56f98SSadaf Ebrahimi             /* Declared with fallback == true */
2737*62c56f98SSadaf Ebrahimi             if( status != PSA_ERROR_NOT_SUPPORTED )
2738*62c56f98SSadaf Ebrahimi                 return( status );
2739*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2740*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2741*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_PAKE)
2742*62c56f98SSadaf Ebrahimi             status = mbedtls_psa_pake_setup( &operation->data.ctx.mbedtls_ctx,
2743*62c56f98SSadaf Ebrahimi                         inputs );
2744*62c56f98SSadaf Ebrahimi             if( status == PSA_SUCCESS )
2745*62c56f98SSadaf Ebrahimi                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
2746*62c56f98SSadaf Ebrahimi #endif
2747*62c56f98SSadaf Ebrahimi             return status;
2748*62c56f98SSadaf Ebrahimi         /* Add cases for opaque driver here */
2749*62c56f98SSadaf Ebrahimi         default:
2750*62c56f98SSadaf Ebrahimi             /* Key is declared with a lifetime not known to us */
2751*62c56f98SSadaf Ebrahimi             (void)operation;
2752*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2753*62c56f98SSadaf Ebrahimi     }
2754*62c56f98SSadaf Ebrahimi }
2755*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_pake_output(psa_pake_operation_t * operation,psa_crypto_driver_pake_step_t step,uint8_t * output,size_t output_size,size_t * output_length)2756*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_pake_output(
2757*62c56f98SSadaf Ebrahimi     psa_pake_operation_t *operation,
2758*62c56f98SSadaf Ebrahimi     psa_crypto_driver_pake_step_t step,
2759*62c56f98SSadaf Ebrahimi     uint8_t *output,
2760*62c56f98SSadaf Ebrahimi     size_t output_size,
2761*62c56f98SSadaf Ebrahimi     size_t *output_length )
2762*62c56f98SSadaf Ebrahimi {
2763*62c56f98SSadaf Ebrahimi     switch( operation->id )
2764*62c56f98SSadaf Ebrahimi     {
2765*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_PAKE)
2766*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2767*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_pake_output( &operation->data.ctx.mbedtls_ctx, step,
2768*62c56f98SSadaf Ebrahimi                                              output, output_size, output_length ) );
2769*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_PAKE */
2770*62c56f98SSadaf Ebrahimi 
2771*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2772*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2773*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2774*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_pake_output(
2775*62c56f98SSadaf Ebrahimi                         &operation->data.ctx.transparent_test_driver_ctx,
2776*62c56f98SSadaf Ebrahimi                         step, output, output_size, output_length ) );
2777*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2778*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2779*62c56f98SSadaf Ebrahimi         default:
2780*62c56f98SSadaf Ebrahimi             (void) step;
2781*62c56f98SSadaf Ebrahimi             (void) output;
2782*62c56f98SSadaf Ebrahimi             (void) output_size;
2783*62c56f98SSadaf Ebrahimi             (void) output_length;
2784*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2785*62c56f98SSadaf Ebrahimi     }
2786*62c56f98SSadaf Ebrahimi }
2787*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_pake_input(psa_pake_operation_t * operation,psa_crypto_driver_pake_step_t step,const uint8_t * input,size_t input_length)2788*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_pake_input(
2789*62c56f98SSadaf Ebrahimi     psa_pake_operation_t *operation,
2790*62c56f98SSadaf Ebrahimi     psa_crypto_driver_pake_step_t step,
2791*62c56f98SSadaf Ebrahimi     const uint8_t *input,
2792*62c56f98SSadaf Ebrahimi     size_t input_length )
2793*62c56f98SSadaf Ebrahimi {
2794*62c56f98SSadaf Ebrahimi     switch( operation->id )
2795*62c56f98SSadaf Ebrahimi     {
2796*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_PAKE)
2797*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2798*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_pake_input( &operation->data.ctx.mbedtls_ctx,
2799*62c56f98SSadaf Ebrahimi                                             step, input,
2800*62c56f98SSadaf Ebrahimi                                             input_length ) );
2801*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_PAKE */
2802*62c56f98SSadaf Ebrahimi 
2803*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2804*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2805*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2806*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_pake_input(
2807*62c56f98SSadaf Ebrahimi                         &operation->data.ctx.transparent_test_driver_ctx,
2808*62c56f98SSadaf Ebrahimi                         step,
2809*62c56f98SSadaf Ebrahimi                         input, input_length ) );
2810*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2811*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2812*62c56f98SSadaf Ebrahimi         default:
2813*62c56f98SSadaf Ebrahimi             (void) step;
2814*62c56f98SSadaf Ebrahimi             (void) input;
2815*62c56f98SSadaf Ebrahimi             (void) input_length;
2816*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2817*62c56f98SSadaf Ebrahimi     }
2818*62c56f98SSadaf Ebrahimi }
2819*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_pake_get_implicit_key(psa_pake_operation_t * operation,uint8_t * output,size_t output_size,size_t * output_length)2820*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_pake_get_implicit_key(
2821*62c56f98SSadaf Ebrahimi     psa_pake_operation_t *operation,
2822*62c56f98SSadaf Ebrahimi     uint8_t *output, size_t output_size,
2823*62c56f98SSadaf Ebrahimi     size_t *output_length )
2824*62c56f98SSadaf Ebrahimi {
2825*62c56f98SSadaf Ebrahimi     switch( operation->id )
2826*62c56f98SSadaf Ebrahimi     {
2827*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_PAKE)
2828*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2829*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_pake_get_implicit_key( &operation->data.ctx.mbedtls_ctx,
2830*62c56f98SSadaf Ebrahimi                                                        output, output_size, output_length ) );
2831*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_PAKE */
2832*62c56f98SSadaf Ebrahimi 
2833*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2834*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2835*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2836*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_pake_get_implicit_key(
2837*62c56f98SSadaf Ebrahimi                         &operation->data.ctx.transparent_test_driver_ctx,
2838*62c56f98SSadaf Ebrahimi                         output, output_size, output_length ) );
2839*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2840*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2841*62c56f98SSadaf Ebrahimi         default:
2842*62c56f98SSadaf Ebrahimi             (void) output;
2843*62c56f98SSadaf Ebrahimi             (void) output_size;
2844*62c56f98SSadaf Ebrahimi             (void) output_length;
2845*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2846*62c56f98SSadaf Ebrahimi     }
2847*62c56f98SSadaf Ebrahimi }
2848*62c56f98SSadaf Ebrahimi 
psa_driver_wrapper_pake_abort(psa_pake_operation_t * operation)2849*62c56f98SSadaf Ebrahimi static inline psa_status_t psa_driver_wrapper_pake_abort(
2850*62c56f98SSadaf Ebrahimi     psa_pake_operation_t * operation )
2851*62c56f98SSadaf Ebrahimi {
2852*62c56f98SSadaf Ebrahimi     switch( operation->id )
2853*62c56f98SSadaf Ebrahimi     {
2854*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_BUILTIN_PAKE)
2855*62c56f98SSadaf Ebrahimi         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
2856*62c56f98SSadaf Ebrahimi             return( mbedtls_psa_pake_abort( &operation->data.ctx.mbedtls_ctx ) );
2857*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_BUILTIN_PAKE */
2858*62c56f98SSadaf Ebrahimi 
2859*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
2860*62c56f98SSadaf Ebrahimi #if defined(PSA_CRYPTO_DRIVER_TEST)
2861*62c56f98SSadaf Ebrahimi         case MBEDTLS_TEST_TRANSPARENT_DRIVER_ID:
2862*62c56f98SSadaf Ebrahimi             return( mbedtls_test_transparent_pake_abort(
2863*62c56f98SSadaf Ebrahimi                         &operation->data.ctx.transparent_test_driver_ctx ) );
2864*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_DRIVER_TEST */
2865*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2866*62c56f98SSadaf Ebrahimi         default:
2867*62c56f98SSadaf Ebrahimi             return( PSA_ERROR_INVALID_ARGUMENT );
2868*62c56f98SSadaf Ebrahimi     }
2869*62c56f98SSadaf Ebrahimi }
2870*62c56f98SSadaf Ebrahimi 
2871*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_C */
2872