1 /*
2  *  Functions to delegate cryptographic operations to an available
3  *  and appropriate accelerator.
4  *  Warning: This file will be auto-generated in the future.
5  */
6 /*  Copyright The Mbed TLS Contributors
7  *  SPDX-License-Identifier: Apache-2.0
8  *
9  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
10  *  not use this file except in compliance with the License.
11  *  You may obtain a copy of the License at
12  *
13  *  http://www.apache.org/licenses/LICENSE-2.0
14  *
15  *  Unless required by applicable law or agreed to in writing, software
16  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  *  See the License for the specific language governing permissions and
19  *  limitations under the License.
20  */
21 
22 #include "psa_crypto_aead.h"
23 #include "psa_crypto_cipher.h"
24 #include "psa_crypto_core.h"
25 #include "psa_crypto_driver_wrappers.h"
26 #include "psa_crypto_hash.h"
27 #include "psa_crypto_mac.h"
28 
29 #include "mbedtls/platform.h"
30 
31 #if defined(MBEDTLS_PSA_CRYPTO_C)
32 
33 #if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
34 
35 /* Include test driver definition when running tests */
36 #if defined(PSA_CRYPTO_DRIVER_TEST)
37 #ifndef PSA_CRYPTO_DRIVER_PRESENT
38 #define PSA_CRYPTO_DRIVER_PRESENT
39 #endif
40 #ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
41 #define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
42 #endif
43 #include "test/drivers/test_driver.h"
44 #endif /* PSA_CRYPTO_DRIVER_TEST */
45 
46 /* Repeat above block for each JSON-declared driver during autogeneration */
47 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
48 
49 /* Auto-generated values depending on which drivers are registered.
50  * ID 0 is reserved for unallocated operations.
51  * ID 1 is reserved for the Mbed TLS software driver. */
52 #define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
53 
54 #if defined(PSA_CRYPTO_DRIVER_TEST)
55 #define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
56 #define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
57 #endif /* PSA_CRYPTO_DRIVER_TEST */
58 
59 /* Support the 'old' SE interface when asked to */
60 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
61 /* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
62  * SE driver is present, to avoid unused argument errors at compile time. */
63 #ifndef PSA_CRYPTO_DRIVER_PRESENT
64 #define PSA_CRYPTO_DRIVER_PRESENT
65 #endif
66 #include "psa_crypto_se.h"
67 #endif
68 
psa_driver_wrapper_init(void)69 psa_status_t psa_driver_wrapper_init( void )
70 {
71     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
72 
73 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
74     status = psa_init_all_se_drivers( );
75     if( status != PSA_SUCCESS )
76         return( status );
77 #endif
78 
79 #if defined(PSA_CRYPTO_DRIVER_TEST)
80     status = mbedtls_test_transparent_init( );
81     if( status != PSA_SUCCESS )
82         return( status );
83 
84     status = mbedtls_test_opaque_init( );
85     if( status != PSA_SUCCESS )
86         return( status );
87 #endif
88 
89     (void) status;
90     return( PSA_SUCCESS );
91 }
92 
psa_driver_wrapper_free(void)93 void psa_driver_wrapper_free( void )
94 {
95 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
96     /* Unregister all secure element drivers, so that we restart from
97      * a pristine state. */
98     psa_unregister_all_se_drivers( );
99 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
100 
101 #if defined(PSA_CRYPTO_DRIVER_TEST)
102     mbedtls_test_transparent_free( );
103     mbedtls_test_opaque_free( );
104 #endif
105 }
106 
107 /* 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)108 psa_status_t psa_driver_wrapper_sign_message(
109     const psa_key_attributes_t *attributes,
110     const uint8_t *key_buffer,
111     size_t key_buffer_size,
112     psa_algorithm_t alg,
113     const uint8_t *input,
114     size_t input_length,
115     uint8_t *signature,
116     size_t signature_size,
117     size_t *signature_length )
118 {
119     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
120     psa_key_location_t location =
121         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
122 
123     switch( location )
124     {
125         case PSA_KEY_LOCATION_LOCAL_STORAGE:
126             /* Key is stored in the slot in export representation, so
127              * cycle through all known transparent accelerators */
128 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
129 #if defined(PSA_CRYPTO_DRIVER_TEST)
130             status = mbedtls_test_transparent_signature_sign_message(
131                         attributes,
132                         key_buffer,
133                         key_buffer_size,
134                         alg,
135                         input,
136                         input_length,
137                         signature,
138                         signature_size,
139                         signature_length );
140             /* Declared with fallback == true */
141             if( status != PSA_ERROR_NOT_SUPPORTED )
142                 return( status );
143 #endif /* PSA_CRYPTO_DRIVER_TEST */
144 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
145             break;
146 
147         /* Add cases for opaque driver here */
148 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
149 #if defined(PSA_CRYPTO_DRIVER_TEST)
150         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
151             status = mbedtls_test_opaque_signature_sign_message(
152                         attributes,
153                         key_buffer,
154                         key_buffer_size,
155                         alg,
156                         input,
157                         input_length,
158                         signature,
159                         signature_size,
160                         signature_length );
161             if( status != PSA_ERROR_NOT_SUPPORTED )
162                 return( status );
163             break;
164 #endif /* PSA_CRYPTO_DRIVER_TEST */
165 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
166         default:
167             /* Key is declared with a lifetime not known to us */
168             (void)status;
169             break;
170     }
171 
172     return( psa_sign_message_builtin( attributes,
173                                       key_buffer,
174                                       key_buffer_size,
175                                       alg,
176                                       input,
177                                       input_length,
178                                       signature,
179                                       signature_size,
180                                       signature_length ) );
181 }
182 
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)183 psa_status_t psa_driver_wrapper_verify_message(
184     const psa_key_attributes_t *attributes,
185     const uint8_t *key_buffer,
186     size_t key_buffer_size,
187     psa_algorithm_t alg,
188     const uint8_t *input,
189     size_t input_length,
190     const uint8_t *signature,
191     size_t signature_length )
192 {
193     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
194     psa_key_location_t location =
195         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
196 
197     switch( location )
198     {
199         case PSA_KEY_LOCATION_LOCAL_STORAGE:
200             /* Key is stored in the slot in export representation, so
201              * cycle through all known transparent accelerators */
202 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
203 #if defined(PSA_CRYPTO_DRIVER_TEST)
204             status = mbedtls_test_transparent_signature_verify_message(
205                         attributes,
206                         key_buffer,
207                         key_buffer_size,
208                         alg,
209                         input,
210                         input_length,
211                         signature,
212                         signature_length );
213             /* Declared with fallback == true */
214             if( status != PSA_ERROR_NOT_SUPPORTED )
215                 return( status );
216 #endif /* PSA_CRYPTO_DRIVER_TEST */
217 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
218             break;
219 
220         /* Add cases for opaque driver here */
221 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
222 #if defined(PSA_CRYPTO_DRIVER_TEST)
223         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
224             return( mbedtls_test_opaque_signature_verify_message(
225                         attributes,
226                         key_buffer,
227                         key_buffer_size,
228                         alg,
229                         input,
230                         input_length,
231                         signature,
232                         signature_length ) );
233             if( status != PSA_ERROR_NOT_SUPPORTED )
234                 return( status );
235             break;
236 #endif /* PSA_CRYPTO_DRIVER_TEST */
237 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
238         default:
239             /* Key is declared with a lifetime not known to us */
240             (void)status;
241             break;
242     }
243 
244     return( psa_verify_message_builtin( attributes,
245                                         key_buffer,
246                                         key_buffer_size,
247                                         alg,
248                                         input,
249                                         input_length,
250                                         signature,
251                                         signature_length ) );
252 }
253 
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)254 psa_status_t psa_driver_wrapper_sign_hash(
255     const psa_key_attributes_t *attributes,
256     const uint8_t *key_buffer, size_t key_buffer_size,
257     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
258     uint8_t *signature, size_t signature_size, size_t *signature_length )
259 {
260     /* Try dynamically-registered SE interface first */
261 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
262     const psa_drv_se_t *drv;
263     psa_drv_se_context_t *drv_context;
264 
265     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
266     {
267         if( drv->asymmetric == NULL ||
268             drv->asymmetric->p_sign == NULL )
269         {
270             /* Key is defined in SE, but we have no way to exercise it */
271             return( PSA_ERROR_NOT_SUPPORTED );
272         }
273         return( drv->asymmetric->p_sign(
274                     drv_context, *( (psa_key_slot_number_t *)key_buffer ),
275                     alg, hash, hash_length,
276                     signature, signature_size, signature_length ) );
277     }
278 #endif /* PSA_CRYPTO_SE_C */
279 
280     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
281     psa_key_location_t location =
282         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
283 
284     switch( location )
285     {
286         case PSA_KEY_LOCATION_LOCAL_STORAGE:
287             /* Key is stored in the slot in export representation, so
288              * cycle through all known transparent accelerators */
289 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
290 #if defined(PSA_CRYPTO_DRIVER_TEST)
291             status = mbedtls_test_transparent_signature_sign_hash( attributes,
292                                                            key_buffer,
293                                                            key_buffer_size,
294                                                            alg,
295                                                            hash,
296                                                            hash_length,
297                                                            signature,
298                                                            signature_size,
299                                                            signature_length );
300             /* Declared with fallback == true */
301             if( status != PSA_ERROR_NOT_SUPPORTED )
302                 return( status );
303 #endif /* PSA_CRYPTO_DRIVER_TEST */
304 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
305             /* Fell through, meaning no accelerator supports this operation */
306             return( psa_sign_hash_builtin( attributes,
307                                            key_buffer,
308                                            key_buffer_size,
309                                            alg,
310                                            hash,
311                                            hash_length,
312                                            signature,
313                                            signature_size,
314                                            signature_length ) );
315 
316         /* Add cases for opaque driver here */
317 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
318 #if defined(PSA_CRYPTO_DRIVER_TEST)
319         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
320             return( mbedtls_test_opaque_signature_sign_hash( attributes,
321                                                              key_buffer,
322                                                              key_buffer_size,
323                                                              alg,
324                                                              hash,
325                                                              hash_length,
326                                                              signature,
327                                                              signature_size,
328                                                              signature_length ) );
329 #endif /* PSA_CRYPTO_DRIVER_TEST */
330 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
331         default:
332             /* Key is declared with a lifetime not known to us */
333             (void)status;
334             return( PSA_ERROR_INVALID_ARGUMENT );
335     }
336 }
337 
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)338 psa_status_t psa_driver_wrapper_verify_hash(
339     const psa_key_attributes_t *attributes,
340     const uint8_t *key_buffer, size_t key_buffer_size,
341     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
342     const uint8_t *signature, size_t signature_length )
343 {
344     /* Try dynamically-registered SE interface first */
345 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
346     const psa_drv_se_t *drv;
347     psa_drv_se_context_t *drv_context;
348 
349     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
350     {
351         if( drv->asymmetric == NULL ||
352             drv->asymmetric->p_verify == NULL )
353         {
354             /* Key is defined in SE, but we have no way to exercise it */
355             return( PSA_ERROR_NOT_SUPPORTED );
356         }
357         return( drv->asymmetric->p_verify(
358                     drv_context, *( (psa_key_slot_number_t *)key_buffer ),
359                     alg, hash, hash_length,
360                     signature, signature_length ) );
361     }
362 #endif /* PSA_CRYPTO_SE_C */
363 
364     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
365     psa_key_location_t location =
366         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
367 
368     switch( location )
369     {
370         case PSA_KEY_LOCATION_LOCAL_STORAGE:
371             /* Key is stored in the slot in export representation, so
372              * cycle through all known transparent accelerators */
373 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
374 #if defined(PSA_CRYPTO_DRIVER_TEST)
375             status = mbedtls_test_transparent_signature_verify_hash(
376                          attributes,
377                          key_buffer,
378                          key_buffer_size,
379                          alg,
380                          hash,
381                          hash_length,
382                          signature,
383                          signature_length );
384             /* Declared with fallback == true */
385             if( status != PSA_ERROR_NOT_SUPPORTED )
386                 return( status );
387 #endif /* PSA_CRYPTO_DRIVER_TEST */
388 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
389 
390             return( psa_verify_hash_builtin( attributes,
391                                              key_buffer,
392                                              key_buffer_size,
393                                              alg,
394                                              hash,
395                                              hash_length,
396                                              signature,
397                                              signature_length ) );
398 
399         /* Add cases for opaque driver here */
400 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
401 #if defined(PSA_CRYPTO_DRIVER_TEST)
402         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
403             return( mbedtls_test_opaque_signature_verify_hash( attributes,
404                                                                key_buffer,
405                                                                key_buffer_size,
406                                                                alg,
407                                                                hash,
408                                                                hash_length,
409                                                                signature,
410                                                                signature_length ) );
411 #endif /* PSA_CRYPTO_DRIVER_TEST */
412 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
413         default:
414             /* Key is declared with a lifetime not known to us */
415             (void)status;
416             return( PSA_ERROR_INVALID_ARGUMENT );
417     }
418 }
419 
420 /** Get the key buffer size required to store the key material of a key
421  *  associated with an opaque driver without storage.
422  *
423  * \param[in] attributes  The key attributes.
424  * \param[out] key_buffer_size  Minimum buffer size to contain the key material
425  *
426  * \retval #PSA_SUCCESS
427  *         The minimum size for a buffer to contain the key material has been
428  *         returned successfully.
429  * \retval #PSA_ERROR_INVALID_ARGUMENT
430  *         The size in bits of the key is not valid.
431  * \retval #PSA_ERROR_NOT_SUPPORTED
432  *         The type and/or the size in bits of the key or the combination of
433  *         the two is not supported.
434  */
psa_driver_wrapper_get_key_buffer_size(const psa_key_attributes_t * attributes,size_t * key_buffer_size)435 psa_status_t psa_driver_wrapper_get_key_buffer_size(
436     const psa_key_attributes_t *attributes,
437     size_t *key_buffer_size )
438 {
439     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
440     psa_key_type_t key_type = attributes->core.type;
441     size_t key_bits = attributes->core.bits;
442 
443     *key_buffer_size = 0;
444     switch( location )
445     {
446 #if defined(PSA_CRYPTO_DRIVER_TEST)
447         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
448 #if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
449             /* Emulate property 'builtin_key_size' */
450             if( psa_key_id_is_builtin(
451                     MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
452                         psa_get_key_id( attributes ) ) ) )
453             {
454                 *key_buffer_size = sizeof( psa_drv_slot_number_t );
455                 return( PSA_SUCCESS );
456             }
457 #endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
458             *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
459             return( ( *key_buffer_size != 0 ) ?
460                     PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
461 #endif /* PSA_CRYPTO_DRIVER_TEST */
462 
463         default:
464             (void)key_type;
465             (void)key_bits;
466             return( PSA_ERROR_NOT_SUPPORTED );
467     }
468 }
469 
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)470 psa_status_t psa_driver_wrapper_generate_key(
471     const psa_key_attributes_t *attributes,
472     uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
473 {
474     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
475     psa_key_location_t location =
476         PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
477 
478     /* Try dynamically-registered SE interface first */
479 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
480     const psa_drv_se_t *drv;
481     psa_drv_se_context_t *drv_context;
482 
483     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
484     {
485         size_t pubkey_length = 0; /* We don't support this feature yet */
486         if( drv->key_management == NULL ||
487             drv->key_management->p_generate == NULL )
488         {
489             /* Key is defined as being in SE, but we have no way to generate it */
490             return( PSA_ERROR_NOT_SUPPORTED );
491         }
492         return( drv->key_management->p_generate(
493             drv_context,
494             *( (psa_key_slot_number_t *)key_buffer ),
495             attributes, NULL, 0, &pubkey_length ) );
496     }
497 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
498 
499     switch( location )
500     {
501         case PSA_KEY_LOCATION_LOCAL_STORAGE:
502 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
503             /* Transparent drivers are limited to generating asymmetric keys */
504             if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
505             {
506             /* Cycle through all known transparent accelerators */
507 #if defined(PSA_CRYPTO_DRIVER_TEST)
508                 status = mbedtls_test_transparent_generate_key(
509                     attributes, key_buffer, key_buffer_size,
510                     key_buffer_length );
511                 /* Declared with fallback == true */
512                 if( status != PSA_ERROR_NOT_SUPPORTED )
513                     break;
514 #endif /* PSA_CRYPTO_DRIVER_TEST */
515             }
516 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
517 
518             /* Software fallback */
519             status = psa_generate_key_internal(
520                 attributes, key_buffer, key_buffer_size, key_buffer_length );
521             break;
522 
523         /* Add cases for opaque driver here */
524 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
525 #if defined(PSA_CRYPTO_DRIVER_TEST)
526         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
527             status = mbedtls_test_opaque_generate_key(
528                 attributes, key_buffer, key_buffer_size, key_buffer_length );
529             break;
530 #endif /* PSA_CRYPTO_DRIVER_TEST */
531 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
532 
533         default:
534             /* Key is declared with a lifetime not known to us */
535             status = PSA_ERROR_INVALID_ARGUMENT;
536             break;
537     }
538 
539     return( status );
540 }
541 
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)542 psa_status_t psa_driver_wrapper_import_key(
543     const psa_key_attributes_t *attributes,
544     const uint8_t *data,
545     size_t data_length,
546     uint8_t *key_buffer,
547     size_t key_buffer_size,
548     size_t *key_buffer_length,
549     size_t *bits )
550 {
551     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
552     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
553                                       psa_get_key_lifetime( attributes ) );
554 
555     /* Try dynamically-registered SE interface first */
556 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
557     const psa_drv_se_t *drv;
558     psa_drv_se_context_t *drv_context;
559 
560     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
561     {
562         if( drv->key_management == NULL ||
563             drv->key_management->p_import == NULL )
564             return( PSA_ERROR_NOT_SUPPORTED );
565 
566         /* The driver should set the number of key bits, however in
567          * case it doesn't, we initialize bits to an invalid value. */
568         *bits = PSA_MAX_KEY_BITS + 1;
569         status = drv->key_management->p_import(
570             drv_context,
571             *( (psa_key_slot_number_t *)key_buffer ),
572             attributes, data, data_length, bits );
573 
574         if( status != PSA_SUCCESS )
575             return( status );
576 
577         if( (*bits) > PSA_MAX_KEY_BITS )
578             return( PSA_ERROR_NOT_SUPPORTED );
579 
580         return( PSA_SUCCESS );
581     }
582 #endif /* PSA_CRYPTO_SE_C */
583 
584     switch( location )
585     {
586         case PSA_KEY_LOCATION_LOCAL_STORAGE:
587             /* Key is stored in the slot in export representation, so
588              * cycle through all known transparent accelerators */
589 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
590 #if defined(PSA_CRYPTO_DRIVER_TEST)
591             status = mbedtls_test_transparent_import_key(
592                          attributes,
593                          data, data_length,
594                          key_buffer, key_buffer_size,
595                          key_buffer_length, bits );
596             /* Declared with fallback == true */
597             if( status != PSA_ERROR_NOT_SUPPORTED )
598                 return( status );
599 #endif /* PSA_CRYPTO_DRIVER_TEST */
600 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
601             /* Fell through, meaning no accelerator supports this operation */
602             return( psa_import_key_into_slot( attributes,
603                                               data, data_length,
604                                               key_buffer, key_buffer_size,
605                                               key_buffer_length, bits ) );
606 
607         default:
608             /* Importing a key with external storage in not yet supported.
609              * Return in error indicating that the lifetime is not valid. */
610             (void)status;
611             return( PSA_ERROR_INVALID_ARGUMENT );
612     }
613 
614 }
615 
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)616 psa_status_t psa_driver_wrapper_export_key(
617     const psa_key_attributes_t *attributes,
618     const uint8_t *key_buffer, size_t key_buffer_size,
619     uint8_t *data, size_t data_size, size_t *data_length )
620 
621 {
622     psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
623     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
624                                       psa_get_key_lifetime( attributes ) );
625 
626     /* Try dynamically-registered SE interface first */
627 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
628     const psa_drv_se_t *drv;
629     psa_drv_se_context_t *drv_context;
630 
631     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
632     {
633         if( ( drv->key_management == NULL   ) ||
634             ( drv->key_management->p_export == NULL ) )
635         {
636             return( PSA_ERROR_NOT_SUPPORTED );
637         }
638 
639         return( drv->key_management->p_export(
640                      drv_context,
641                      *( (psa_key_slot_number_t *)key_buffer ),
642                      data, data_size, data_length ) );
643     }
644 #endif /* PSA_CRYPTO_SE_C */
645 
646     switch( location )
647     {
648         case PSA_KEY_LOCATION_LOCAL_STORAGE:
649             return( psa_export_key_internal( attributes,
650                                              key_buffer,
651                                              key_buffer_size,
652                                              data,
653                                              data_size,
654                                              data_length ) );
655 
656         /* Add cases for opaque driver here */
657 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
658 #if defined(PSA_CRYPTO_DRIVER_TEST)
659         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
660             return( mbedtls_test_opaque_export_key( attributes,
661                                                     key_buffer,
662                                                     key_buffer_size,
663                                                     data,
664                                                     data_size,
665                                                     data_length ) );
666 #endif /* PSA_CRYPTO_DRIVER_TEST */
667 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
668         default:
669             /* Key is declared with a lifetime not known to us */
670             return( status );
671     }
672 }
673 
psa_driver_wrapper_export_public_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)674 psa_status_t psa_driver_wrapper_export_public_key(
675     const psa_key_attributes_t *attributes,
676     const uint8_t *key_buffer, size_t key_buffer_size,
677     uint8_t *data, size_t data_size, size_t *data_length )
678 
679 {
680     psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
681     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
682                                       psa_get_key_lifetime( attributes ) );
683 
684     /* Try dynamically-registered SE interface first */
685 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
686     const psa_drv_se_t *drv;
687     psa_drv_se_context_t *drv_context;
688 
689     if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
690     {
691         if( ( drv->key_management == NULL ) ||
692             ( drv->key_management->p_export_public == NULL ) )
693         {
694             return( PSA_ERROR_NOT_SUPPORTED );
695         }
696 
697         return( drv->key_management->p_export_public(
698                     drv_context,
699                     *( (psa_key_slot_number_t *)key_buffer ),
700                     data, data_size, data_length ) );
701     }
702 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
703 
704     switch( location )
705     {
706         case PSA_KEY_LOCATION_LOCAL_STORAGE:
707             /* Key is stored in the slot in export representation, so
708              * cycle through all known transparent accelerators */
709 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
710 #if defined(PSA_CRYPTO_DRIVER_TEST)
711             status = mbedtls_test_transparent_export_public_key(
712                          attributes,
713                          key_buffer,
714                          key_buffer_size,
715                          data,
716                          data_size,
717                          data_length );
718             /* Declared with fallback == true */
719             if( status != PSA_ERROR_NOT_SUPPORTED )
720                 return( status );
721 #endif /* PSA_CRYPTO_DRIVER_TEST */
722 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
723             /* Fell through, meaning no accelerator supports this operation */
724             return( psa_export_public_key_internal( attributes,
725                                                     key_buffer,
726                                                     key_buffer_size,
727                                                     data,
728                                                     data_size,
729                                                     data_length ) );
730 
731         /* Add cases for opaque driver here */
732 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
733 #if defined(PSA_CRYPTO_DRIVER_TEST)
734         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
735             return( mbedtls_test_opaque_export_public_key( attributes,
736                                                            key_buffer,
737                                                            key_buffer_size,
738                                                            data,
739                                                            data_size,
740                                                            data_length ) );
741 #endif /* PSA_CRYPTO_DRIVER_TEST */
742 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
743         default:
744             /* Key is declared with a lifetime not known to us */
745             return( status );
746     }
747 }
748 
psa_driver_wrapper_get_builtin_key(psa_drv_slot_number_t slot_number,psa_key_attributes_t * attributes,uint8_t * key_buffer,size_t key_buffer_size,size_t * key_buffer_length)749 psa_status_t psa_driver_wrapper_get_builtin_key(
750     psa_drv_slot_number_t slot_number,
751     psa_key_attributes_t *attributes,
752     uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
753 {
754     psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
755     switch( location )
756     {
757 #if defined(PSA_CRYPTO_DRIVER_TEST)
758         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
759             return( mbedtls_test_opaque_get_builtin_key(
760                         slot_number,
761                         attributes,
762                         key_buffer, key_buffer_size, key_buffer_length ) );
763 #endif /* PSA_CRYPTO_DRIVER_TEST */
764         default:
765             (void) slot_number;
766             (void) key_buffer;
767             (void) key_buffer_size;
768             (void) key_buffer_length;
769             return( PSA_ERROR_DOES_NOT_EXIST );
770     }
771 }
772 
773 /*
774  * Cipher functions
775  */
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)776 psa_status_t psa_driver_wrapper_cipher_encrypt(
777     const psa_key_attributes_t *attributes,
778     const uint8_t *key_buffer,
779     size_t key_buffer_size,
780     psa_algorithm_t alg,
781     const uint8_t *iv,
782     size_t iv_length,
783     const uint8_t *input,
784     size_t input_length,
785     uint8_t *output,
786     size_t output_size,
787     size_t *output_length )
788 {
789     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
790     psa_key_location_t location =
791         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
792 
793     switch( location )
794     {
795         case PSA_KEY_LOCATION_LOCAL_STORAGE:
796             /* Key is stored in the slot in export representation, so
797              * cycle through all known transparent accelerators */
798 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
799 #if defined(PSA_CRYPTO_DRIVER_TEST)
800             status = mbedtls_test_transparent_cipher_encrypt( attributes,
801                                                               key_buffer,
802                                                               key_buffer_size,
803                                                               alg,
804                                                               iv,
805                                                               iv_length,
806                                                               input,
807                                                               input_length,
808                                                               output,
809                                                               output_size,
810                                                               output_length );
811             /* Declared with fallback == true */
812             if( status != PSA_ERROR_NOT_SUPPORTED )
813                 return( status );
814 #endif /* PSA_CRYPTO_DRIVER_TEST */
815 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
816 
817 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
818             return( mbedtls_psa_cipher_encrypt( attributes,
819                                                 key_buffer,
820                                                 key_buffer_size,
821                                                 alg,
822                                                 iv,
823                                                 iv_length,
824                                                 input,
825                                                 input_length,
826                                                 output,
827                                                 output_size,
828                                                 output_length ) );
829 #else
830             return( PSA_ERROR_NOT_SUPPORTED );
831 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
832 
833         /* Add cases for opaque driver here */
834 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
835 #if defined(PSA_CRYPTO_DRIVER_TEST)
836         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
837             return( mbedtls_test_opaque_cipher_encrypt( attributes,
838                                                         key_buffer,
839                                                         key_buffer_size,
840                                                         alg,
841                                                         iv,
842                                                         iv_length,
843                                                         input,
844                                                         input_length,
845                                                         output,
846                                                         output_size,
847                                                         output_length ) );
848 #endif /* PSA_CRYPTO_DRIVER_TEST */
849 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
850 
851         default:
852             /* Key is declared with a lifetime not known to us */
853             (void)status;
854             (void)key_buffer;
855             (void)key_buffer_size;
856             (void)alg;
857             (void)input;
858             (void)input_length;
859             (void)output;
860             (void)output_size;
861             (void)output_length;
862             return( PSA_ERROR_INVALID_ARGUMENT );
863     }
864 }
865 
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)866 psa_status_t psa_driver_wrapper_cipher_decrypt(
867     const psa_key_attributes_t *attributes,
868     const uint8_t *key_buffer,
869     size_t key_buffer_size,
870     psa_algorithm_t alg,
871     const uint8_t *input,
872     size_t input_length,
873     uint8_t *output,
874     size_t output_size,
875     size_t *output_length )
876 {
877     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
878     psa_key_location_t location =
879         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
880 
881     switch( location )
882     {
883         case PSA_KEY_LOCATION_LOCAL_STORAGE:
884             /* Key is stored in the slot in export representation, so
885              * cycle through all known transparent accelerators */
886 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
887 #if defined(PSA_CRYPTO_DRIVER_TEST)
888             status = mbedtls_test_transparent_cipher_decrypt( attributes,
889                                                               key_buffer,
890                                                               key_buffer_size,
891                                                               alg,
892                                                               input,
893                                                               input_length,
894                                                               output,
895                                                               output_size,
896                                                               output_length );
897             /* Declared with fallback == true */
898             if( status != PSA_ERROR_NOT_SUPPORTED )
899                 return( status );
900 #endif /* PSA_CRYPTO_DRIVER_TEST */
901 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
902 
903 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
904             return( mbedtls_psa_cipher_decrypt( attributes,
905                                                 key_buffer,
906                                                 key_buffer_size,
907                                                 alg,
908                                                 input,
909                                                 input_length,
910                                                 output,
911                                                 output_size,
912                                                 output_length ) );
913 #else
914             return( PSA_ERROR_NOT_SUPPORTED );
915 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
916 
917         /* Add cases for opaque driver here */
918 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
919 #if defined(PSA_CRYPTO_DRIVER_TEST)
920         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
921             return( mbedtls_test_opaque_cipher_decrypt( attributes,
922                                                         key_buffer,
923                                                         key_buffer_size,
924                                                         alg,
925                                                         input,
926                                                         input_length,
927                                                         output,
928                                                         output_size,
929                                                         output_length ) );
930 #endif /* PSA_CRYPTO_DRIVER_TEST */
931 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
932 
933         default:
934             /* Key is declared with a lifetime not known to us */
935             (void)status;
936             (void)key_buffer;
937             (void)key_buffer_size;
938             (void)alg;
939             (void)input;
940             (void)input_length;
941             (void)output;
942             (void)output_size;
943             (void)output_length;
944             return( PSA_ERROR_INVALID_ARGUMENT );
945     }
946 }
947 
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)948 psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
949     psa_cipher_operation_t *operation,
950     const psa_key_attributes_t *attributes,
951     const uint8_t *key_buffer, size_t key_buffer_size,
952     psa_algorithm_t alg )
953 {
954     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
955     psa_key_location_t location =
956         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
957 
958     switch( location )
959     {
960         case PSA_KEY_LOCATION_LOCAL_STORAGE:
961             /* Key is stored in the slot in export representation, so
962              * cycle through all known transparent accelerators */
963 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
964 #if defined(PSA_CRYPTO_DRIVER_TEST)
965             status = mbedtls_test_transparent_cipher_encrypt_setup(
966                 &operation->ctx.transparent_test_driver_ctx,
967                 attributes,
968                 key_buffer,
969                 key_buffer_size,
970                 alg );
971             /* Declared with fallback == true */
972             if( status == PSA_SUCCESS )
973                 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
974 
975             if( status != PSA_ERROR_NOT_SUPPORTED )
976                 return( status );
977 #endif /* PSA_CRYPTO_DRIVER_TEST */
978 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
979 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
980             /* Fell through, meaning no accelerator supports this operation */
981             status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
982                                                        attributes,
983                                                        key_buffer,
984                                                        key_buffer_size,
985                                                        alg );
986             if( status == PSA_SUCCESS )
987                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
988 
989             if( status != PSA_ERROR_NOT_SUPPORTED )
990                 return( status );
991 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
992             return( PSA_ERROR_NOT_SUPPORTED );
993 
994         /* Add cases for opaque driver here */
995 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
996 #if defined(PSA_CRYPTO_DRIVER_TEST)
997         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
998             status = mbedtls_test_opaque_cipher_encrypt_setup(
999                 &operation->ctx.opaque_test_driver_ctx,
1000                 attributes,
1001                 key_buffer, key_buffer_size,
1002                 alg );
1003 
1004             if( status == PSA_SUCCESS )
1005                 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1006 
1007             return( status );
1008 #endif /* PSA_CRYPTO_DRIVER_TEST */
1009 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1010         default:
1011             /* Key is declared with a lifetime not known to us */
1012             (void)status;
1013             (void)operation;
1014             (void)key_buffer;
1015             (void)key_buffer_size;
1016             (void)alg;
1017             return( PSA_ERROR_INVALID_ARGUMENT );
1018     }
1019 }
1020 
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)1021 psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
1022     psa_cipher_operation_t *operation,
1023     const psa_key_attributes_t *attributes,
1024     const uint8_t *key_buffer, size_t key_buffer_size,
1025     psa_algorithm_t alg )
1026 {
1027     psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
1028     psa_key_location_t location =
1029         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1030 
1031     switch( location )
1032     {
1033         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1034             /* Key is stored in the slot in export representation, so
1035              * cycle through all known transparent accelerators */
1036 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1037 #if defined(PSA_CRYPTO_DRIVER_TEST)
1038             status = mbedtls_test_transparent_cipher_decrypt_setup(
1039                 &operation->ctx.transparent_test_driver_ctx,
1040                 attributes,
1041                 key_buffer,
1042                 key_buffer_size,
1043                 alg );
1044             /* Declared with fallback == true */
1045             if( status == PSA_SUCCESS )
1046                 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1047 
1048             if( status != PSA_ERROR_NOT_SUPPORTED )
1049                 return( status );
1050 #endif /* PSA_CRYPTO_DRIVER_TEST */
1051 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1052 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1053             /* Fell through, meaning no accelerator supports this operation */
1054             status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
1055                                                        attributes,
1056                                                        key_buffer,
1057                                                        key_buffer_size,
1058                                                        alg );
1059             if( status == PSA_SUCCESS )
1060                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1061 
1062             return( status );
1063 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1064             return( PSA_ERROR_NOT_SUPPORTED );
1065 
1066         /* Add cases for opaque driver here */
1067 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1068 #if defined(PSA_CRYPTO_DRIVER_TEST)
1069         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1070             status = mbedtls_test_opaque_cipher_decrypt_setup(
1071                          &operation->ctx.opaque_test_driver_ctx,
1072                          attributes,
1073                          key_buffer, key_buffer_size,
1074                          alg );
1075 
1076             if( status == PSA_SUCCESS )
1077                 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1078 
1079             return( status );
1080 #endif /* PSA_CRYPTO_DRIVER_TEST */
1081 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1082         default:
1083             /* Key is declared with a lifetime not known to us */
1084             (void)status;
1085             (void)operation;
1086             (void)key_buffer;
1087             (void)key_buffer_size;
1088             (void)alg;
1089             return( PSA_ERROR_INVALID_ARGUMENT );
1090     }
1091 }
1092 
psa_driver_wrapper_cipher_set_iv(psa_cipher_operation_t * operation,const uint8_t * iv,size_t iv_length)1093 psa_status_t psa_driver_wrapper_cipher_set_iv(
1094     psa_cipher_operation_t *operation,
1095     const uint8_t *iv,
1096     size_t iv_length )
1097 {
1098     switch( operation->id )
1099     {
1100 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1101         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1102             return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
1103                                                iv,
1104                                                iv_length ) );
1105 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1106 
1107 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1108 #if defined(PSA_CRYPTO_DRIVER_TEST)
1109         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1110             return( mbedtls_test_transparent_cipher_set_iv(
1111                         &operation->ctx.transparent_test_driver_ctx,
1112                         iv, iv_length ) );
1113 
1114         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1115             return( mbedtls_test_opaque_cipher_set_iv(
1116                         &operation->ctx.opaque_test_driver_ctx,
1117                         iv, iv_length ) );
1118 #endif /* PSA_CRYPTO_DRIVER_TEST */
1119 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1120     }
1121 
1122     (void)iv;
1123     (void)iv_length;
1124 
1125     return( PSA_ERROR_INVALID_ARGUMENT );
1126 }
1127 
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)1128 psa_status_t psa_driver_wrapper_cipher_update(
1129     psa_cipher_operation_t *operation,
1130     const uint8_t *input,
1131     size_t input_length,
1132     uint8_t *output,
1133     size_t output_size,
1134     size_t *output_length )
1135 {
1136     switch( operation->id )
1137     {
1138 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1139         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1140             return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
1141                                                input,
1142                                                input_length,
1143                                                output,
1144                                                output_size,
1145                                                output_length ) );
1146 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1147 
1148 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1149 #if defined(PSA_CRYPTO_DRIVER_TEST)
1150         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1151             return( mbedtls_test_transparent_cipher_update(
1152                         &operation->ctx.transparent_test_driver_ctx,
1153                         input, input_length,
1154                         output, output_size, output_length ) );
1155 
1156         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1157             return( mbedtls_test_opaque_cipher_update(
1158                         &operation->ctx.opaque_test_driver_ctx,
1159                         input, input_length,
1160                         output, output_size, output_length ) );
1161 #endif /* PSA_CRYPTO_DRIVER_TEST */
1162 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1163     }
1164 
1165     (void)input;
1166     (void)input_length;
1167     (void)output;
1168     (void)output_size;
1169     (void)output_length;
1170 
1171     return( PSA_ERROR_INVALID_ARGUMENT );
1172 }
1173 
psa_driver_wrapper_cipher_finish(psa_cipher_operation_t * operation,uint8_t * output,size_t output_size,size_t * output_length)1174 psa_status_t psa_driver_wrapper_cipher_finish(
1175     psa_cipher_operation_t *operation,
1176     uint8_t *output,
1177     size_t output_size,
1178     size_t *output_length )
1179 {
1180     switch( operation->id )
1181     {
1182 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1183         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1184             return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
1185                                                output,
1186                                                output_size,
1187                                                output_length ) );
1188 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1189 
1190 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1191 #if defined(PSA_CRYPTO_DRIVER_TEST)
1192         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1193             return( mbedtls_test_transparent_cipher_finish(
1194                         &operation->ctx.transparent_test_driver_ctx,
1195                         output, output_size, output_length ) );
1196 
1197         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1198             return( mbedtls_test_opaque_cipher_finish(
1199                         &operation->ctx.opaque_test_driver_ctx,
1200                         output, output_size, output_length ) );
1201 #endif /* PSA_CRYPTO_DRIVER_TEST */
1202 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1203     }
1204 
1205     (void)output;
1206     (void)output_size;
1207     (void)output_length;
1208 
1209     return( PSA_ERROR_INVALID_ARGUMENT );
1210 }
1211 
psa_driver_wrapper_cipher_abort(psa_cipher_operation_t * operation)1212 psa_status_t psa_driver_wrapper_cipher_abort(
1213     psa_cipher_operation_t *operation )
1214 {
1215     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1216 
1217     switch( operation->id )
1218     {
1219 #if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1220         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1221             return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
1222 #endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1223 
1224 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1225 #if defined(PSA_CRYPTO_DRIVER_TEST)
1226         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1227             status = mbedtls_test_transparent_cipher_abort(
1228                          &operation->ctx.transparent_test_driver_ctx );
1229             mbedtls_platform_zeroize(
1230                 &operation->ctx.transparent_test_driver_ctx,
1231                 sizeof( operation->ctx.transparent_test_driver_ctx ) );
1232             return( status );
1233 
1234         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1235             status = mbedtls_test_opaque_cipher_abort(
1236                          &operation->ctx.opaque_test_driver_ctx );
1237             mbedtls_platform_zeroize(
1238                 &operation->ctx.opaque_test_driver_ctx,
1239                 sizeof( operation->ctx.opaque_test_driver_ctx ) );
1240             return( status );
1241 #endif /* PSA_CRYPTO_DRIVER_TEST */
1242 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1243     }
1244 
1245     (void)status;
1246     return( PSA_ERROR_INVALID_ARGUMENT );
1247 }
1248 
1249 /*
1250  * Hashing functions
1251  */
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)1252 psa_status_t psa_driver_wrapper_hash_compute(
1253     psa_algorithm_t alg,
1254     const uint8_t *input,
1255     size_t input_length,
1256     uint8_t *hash,
1257     size_t hash_size,
1258     size_t *hash_length)
1259 {
1260     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1261 
1262     /* Try accelerators first */
1263 #if defined(PSA_CRYPTO_DRIVER_TEST)
1264     status = mbedtls_test_transparent_hash_compute(
1265                 alg, input, input_length, hash, hash_size, hash_length );
1266     if( status != PSA_ERROR_NOT_SUPPORTED )
1267         return( status );
1268 #endif
1269 
1270     /* If software fallback is compiled in, try fallback */
1271 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1272     status = mbedtls_psa_hash_compute( alg, input, input_length,
1273                                        hash, hash_size, hash_length );
1274     if( status != PSA_ERROR_NOT_SUPPORTED )
1275         return( status );
1276 #endif
1277     (void) status;
1278     (void) alg;
1279     (void) input;
1280     (void) input_length;
1281     (void) hash;
1282     (void) hash_size;
1283     (void) hash_length;
1284 
1285     return( PSA_ERROR_NOT_SUPPORTED );
1286 }
1287 
psa_driver_wrapper_hash_setup(psa_hash_operation_t * operation,psa_algorithm_t alg)1288 psa_status_t psa_driver_wrapper_hash_setup(
1289     psa_hash_operation_t *operation,
1290     psa_algorithm_t alg )
1291 {
1292     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1293 
1294     /* Try setup on accelerators first */
1295 #if defined(PSA_CRYPTO_DRIVER_TEST)
1296     status = mbedtls_test_transparent_hash_setup(
1297                 &operation->ctx.test_driver_ctx, alg );
1298     if( status == PSA_SUCCESS )
1299         operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1300 
1301     if( status != PSA_ERROR_NOT_SUPPORTED )
1302         return( status );
1303 #endif
1304 
1305     /* If software fallback is compiled in, try fallback */
1306 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1307     status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
1308     if( status == PSA_SUCCESS )
1309         operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1310 
1311     if( status != PSA_ERROR_NOT_SUPPORTED )
1312         return( status );
1313 #endif
1314     /* Nothing left to try if we fall through here */
1315     (void) status;
1316     (void) operation;
1317     (void) alg;
1318     return( PSA_ERROR_NOT_SUPPORTED );
1319 }
1320 
psa_driver_wrapper_hash_clone(const psa_hash_operation_t * source_operation,psa_hash_operation_t * target_operation)1321 psa_status_t psa_driver_wrapper_hash_clone(
1322     const psa_hash_operation_t *source_operation,
1323     psa_hash_operation_t *target_operation )
1324 {
1325     switch( source_operation->id )
1326     {
1327 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1328         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1329             target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1330             return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1331                                             &target_operation->ctx.mbedtls_ctx ) );
1332 #endif
1333 #if defined(PSA_CRYPTO_DRIVER_TEST)
1334         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1335             target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1336             return( mbedtls_test_transparent_hash_clone(
1337                         &source_operation->ctx.test_driver_ctx,
1338                         &target_operation->ctx.test_driver_ctx ) );
1339 #endif
1340         default:
1341             (void) target_operation;
1342             return( PSA_ERROR_BAD_STATE );
1343     }
1344 }
1345 
psa_driver_wrapper_hash_update(psa_hash_operation_t * operation,const uint8_t * input,size_t input_length)1346 psa_status_t psa_driver_wrapper_hash_update(
1347     psa_hash_operation_t *operation,
1348     const uint8_t *input,
1349     size_t input_length )
1350 {
1351     switch( operation->id )
1352     {
1353 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1354         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1355             return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1356                                              input, input_length ) );
1357 #endif
1358 #if defined(PSA_CRYPTO_DRIVER_TEST)
1359         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1360             return( mbedtls_test_transparent_hash_update(
1361                         &operation->ctx.test_driver_ctx,
1362                         input, input_length ) );
1363 #endif
1364         default:
1365             (void) input;
1366             (void) input_length;
1367             return( PSA_ERROR_BAD_STATE );
1368     }
1369 }
1370 
psa_driver_wrapper_hash_finish(psa_hash_operation_t * operation,uint8_t * hash,size_t hash_size,size_t * hash_length)1371 psa_status_t psa_driver_wrapper_hash_finish(
1372     psa_hash_operation_t *operation,
1373     uint8_t *hash,
1374     size_t hash_size,
1375     size_t *hash_length )
1376 {
1377     switch( operation->id )
1378     {
1379 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1380         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1381             return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1382                                              hash, hash_size, hash_length ) );
1383 #endif
1384 #if defined(PSA_CRYPTO_DRIVER_TEST)
1385         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1386             return( mbedtls_test_transparent_hash_finish(
1387                         &operation->ctx.test_driver_ctx,
1388                         hash, hash_size, hash_length ) );
1389 #endif
1390         default:
1391             (void) hash;
1392             (void) hash_size;
1393             (void) hash_length;
1394             return( PSA_ERROR_BAD_STATE );
1395     }
1396 }
1397 
psa_driver_wrapper_hash_abort(psa_hash_operation_t * operation)1398 psa_status_t psa_driver_wrapper_hash_abort(
1399     psa_hash_operation_t *operation )
1400 {
1401     switch( operation->id )
1402     {
1403 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
1404         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1405             return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1406 #endif
1407 #if defined(PSA_CRYPTO_DRIVER_TEST)
1408         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1409             return( mbedtls_test_transparent_hash_abort(
1410                         &operation->ctx.test_driver_ctx ) );
1411 #endif
1412         default:
1413             return( PSA_ERROR_BAD_STATE );
1414     }
1415 }
1416 
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)1417 psa_status_t psa_driver_wrapper_aead_encrypt(
1418     const psa_key_attributes_t *attributes,
1419     const uint8_t *key_buffer, size_t key_buffer_size,
1420     psa_algorithm_t alg,
1421     const uint8_t *nonce, size_t nonce_length,
1422     const uint8_t *additional_data, size_t additional_data_length,
1423     const uint8_t *plaintext, size_t plaintext_length,
1424     uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1425 {
1426     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1427     psa_key_location_t location =
1428         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1429 
1430     switch( location )
1431     {
1432         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1433             /* Key is stored in the slot in export representation, so
1434              * cycle through all known transparent accelerators */
1435 
1436 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1437 #if defined(PSA_CRYPTO_DRIVER_TEST)
1438             status = mbedtls_test_transparent_aead_encrypt(
1439                          attributes, key_buffer, key_buffer_size,
1440                          alg,
1441                          nonce, nonce_length,
1442                          additional_data, additional_data_length,
1443                          plaintext, plaintext_length,
1444                          ciphertext, ciphertext_size, ciphertext_length );
1445             /* Declared with fallback == true */
1446             if( status != PSA_ERROR_NOT_SUPPORTED )
1447                 return( status );
1448 #endif /* PSA_CRYPTO_DRIVER_TEST */
1449 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1450 
1451             /* Fell through, meaning no accelerator supports this operation */
1452             return( mbedtls_psa_aead_encrypt(
1453                         attributes, key_buffer, key_buffer_size,
1454                         alg,
1455                         nonce, nonce_length,
1456                         additional_data, additional_data_length,
1457                         plaintext, plaintext_length,
1458                         ciphertext, ciphertext_size, ciphertext_length ) );
1459 
1460         /* Add cases for opaque driver here */
1461 
1462         default:
1463             /* Key is declared with a lifetime not known to us */
1464             (void)status;
1465             return( PSA_ERROR_INVALID_ARGUMENT );
1466     }
1467 }
1468 
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)1469 psa_status_t psa_driver_wrapper_aead_decrypt(
1470     const psa_key_attributes_t *attributes,
1471     const uint8_t *key_buffer, size_t key_buffer_size,
1472     psa_algorithm_t alg,
1473     const uint8_t *nonce, size_t nonce_length,
1474     const uint8_t *additional_data, size_t additional_data_length,
1475     const uint8_t *ciphertext, size_t ciphertext_length,
1476     uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1477 {
1478     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1479     psa_key_location_t location =
1480         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1481 
1482     switch( location )
1483     {
1484         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1485             /* Key is stored in the slot in export representation, so
1486              * cycle through all known transparent accelerators */
1487 
1488 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1489 #if defined(PSA_CRYPTO_DRIVER_TEST)
1490             status = mbedtls_test_transparent_aead_decrypt(
1491                         attributes, key_buffer, key_buffer_size,
1492                         alg,
1493                         nonce, nonce_length,
1494                         additional_data, additional_data_length,
1495                         ciphertext, ciphertext_length,
1496                         plaintext, plaintext_size, plaintext_length );
1497             /* Declared with fallback == true */
1498             if( status != PSA_ERROR_NOT_SUPPORTED )
1499                 return( status );
1500 #endif /* PSA_CRYPTO_DRIVER_TEST */
1501 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1502 
1503             /* Fell through, meaning no accelerator supports this operation */
1504             return( mbedtls_psa_aead_decrypt(
1505                         attributes, key_buffer, key_buffer_size,
1506                         alg,
1507                         nonce, nonce_length,
1508                         additional_data, additional_data_length,
1509                         ciphertext, ciphertext_length,
1510                         plaintext, plaintext_size, plaintext_length ) );
1511 
1512         /* Add cases for opaque driver here */
1513 
1514         default:
1515             /* Key is declared with a lifetime not known to us */
1516             (void)status;
1517             return( PSA_ERROR_INVALID_ARGUMENT );
1518     }
1519 }
1520 
1521 
1522 /*
1523  * MAC functions
1524  */
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)1525 psa_status_t psa_driver_wrapper_mac_compute(
1526     const psa_key_attributes_t *attributes,
1527     const uint8_t *key_buffer,
1528     size_t key_buffer_size,
1529     psa_algorithm_t alg,
1530     const uint8_t *input,
1531     size_t input_length,
1532     uint8_t *mac,
1533     size_t mac_size,
1534     size_t *mac_length )
1535 {
1536     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1537     psa_key_location_t location =
1538         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1539 
1540     switch( location )
1541     {
1542         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1543             /* Key is stored in the slot in export representation, so
1544              * cycle through all known transparent accelerators */
1545 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1546 #if defined(PSA_CRYPTO_DRIVER_TEST)
1547             status = mbedtls_test_transparent_mac_compute(
1548                 attributes, key_buffer, key_buffer_size, alg,
1549                 input, input_length,
1550                 mac, mac_size, mac_length );
1551             /* Declared with fallback == true */
1552             if( status != PSA_ERROR_NOT_SUPPORTED )
1553                 return( status );
1554 #endif /* PSA_CRYPTO_DRIVER_TEST */
1555 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1556 #if defined(MBEDTLS_PSA_BUILTIN_MAC)
1557             /* Fell through, meaning no accelerator supports this operation */
1558             status = mbedtls_psa_mac_compute(
1559                 attributes, key_buffer, key_buffer_size, alg,
1560                 input, input_length,
1561                 mac, mac_size, mac_length );
1562             if( status != PSA_ERROR_NOT_SUPPORTED )
1563                 return( status );
1564 #endif /* MBEDTLS_PSA_BUILTIN_MAC */
1565             return( PSA_ERROR_NOT_SUPPORTED );
1566 
1567         /* Add cases for opaque driver here */
1568 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1569 #if defined(PSA_CRYPTO_DRIVER_TEST)
1570         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1571             status = mbedtls_test_opaque_mac_compute(
1572                 attributes, key_buffer, key_buffer_size, alg,
1573                 input, input_length,
1574                 mac, mac_size, mac_length );
1575             return( status );
1576 #endif /* PSA_CRYPTO_DRIVER_TEST */
1577 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1578         default:
1579             /* Key is declared with a lifetime not known to us */
1580             (void) key_buffer;
1581             (void) key_buffer_size;
1582             (void) alg;
1583             (void) input;
1584             (void) input_length;
1585             (void) mac;
1586             (void) mac_size;
1587             (void) mac_length;
1588             (void) status;
1589             return( PSA_ERROR_INVALID_ARGUMENT );
1590     }
1591 }
1592 
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)1593 psa_status_t psa_driver_wrapper_mac_sign_setup(
1594     psa_mac_operation_t *operation,
1595     const psa_key_attributes_t *attributes,
1596     const uint8_t *key_buffer,
1597     size_t key_buffer_size,
1598     psa_algorithm_t alg )
1599 {
1600     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1601     psa_key_location_t location =
1602         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1603 
1604     switch( location )
1605     {
1606         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1607             /* Key is stored in the slot in export representation, so
1608              * cycle through all known transparent accelerators */
1609 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1610 #if defined(PSA_CRYPTO_DRIVER_TEST)
1611             status = mbedtls_test_transparent_mac_sign_setup(
1612                 &operation->ctx.transparent_test_driver_ctx,
1613                 attributes,
1614                 key_buffer, key_buffer_size,
1615                 alg );
1616             /* Declared with fallback == true */
1617             if( status == PSA_SUCCESS )
1618                 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1619 
1620             if( status != PSA_ERROR_NOT_SUPPORTED )
1621                 return( status );
1622 #endif /* PSA_CRYPTO_DRIVER_TEST */
1623 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1624 #if defined(MBEDTLS_PSA_BUILTIN_MAC)
1625             /* Fell through, meaning no accelerator supports this operation */
1626             status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
1627                                                  attributes,
1628                                                  key_buffer, key_buffer_size,
1629                                                  alg );
1630             if( status == PSA_SUCCESS )
1631                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1632 
1633             if( status != PSA_ERROR_NOT_SUPPORTED )
1634                 return( status );
1635 #endif /* MBEDTLS_PSA_BUILTIN_MAC */
1636             return( PSA_ERROR_NOT_SUPPORTED );
1637 
1638         /* Add cases for opaque driver here */
1639 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1640 #if defined(PSA_CRYPTO_DRIVER_TEST)
1641         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1642             status = mbedtls_test_opaque_mac_sign_setup(
1643                 &operation->ctx.opaque_test_driver_ctx,
1644                 attributes,
1645                 key_buffer, key_buffer_size,
1646                 alg );
1647 
1648             if( status == PSA_SUCCESS )
1649                 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1650 
1651             return( status );
1652 #endif /* PSA_CRYPTO_DRIVER_TEST */
1653 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1654         default:
1655             /* Key is declared with a lifetime not known to us */
1656             (void) status;
1657             (void) operation;
1658             (void) key_buffer;
1659             (void) key_buffer_size;
1660             (void) alg;
1661             return( PSA_ERROR_INVALID_ARGUMENT );
1662     }
1663 }
1664 
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)1665 psa_status_t psa_driver_wrapper_mac_verify_setup(
1666     psa_mac_operation_t *operation,
1667     const psa_key_attributes_t *attributes,
1668     const uint8_t *key_buffer,
1669     size_t key_buffer_size,
1670     psa_algorithm_t alg )
1671 {
1672     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1673     psa_key_location_t location =
1674         PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1675 
1676     switch( location )
1677     {
1678         case PSA_KEY_LOCATION_LOCAL_STORAGE:
1679             /* Key is stored in the slot in export representation, so
1680              * cycle through all known transparent accelerators */
1681 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1682 #if defined(PSA_CRYPTO_DRIVER_TEST)
1683             status = mbedtls_test_transparent_mac_verify_setup(
1684                 &operation->ctx.transparent_test_driver_ctx,
1685                 attributes,
1686                 key_buffer, key_buffer_size,
1687                 alg );
1688             /* Declared with fallback == true */
1689             if( status == PSA_SUCCESS )
1690                 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1691 
1692             if( status != PSA_ERROR_NOT_SUPPORTED )
1693                 return( status );
1694 #endif /* PSA_CRYPTO_DRIVER_TEST */
1695 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1696 #if defined(MBEDTLS_PSA_BUILTIN_MAC)
1697             /* Fell through, meaning no accelerator supports this operation */
1698             status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
1699                                                    attributes,
1700                                                    key_buffer, key_buffer_size,
1701                                                    alg );
1702             if( status == PSA_SUCCESS )
1703                 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1704 
1705             if( status != PSA_ERROR_NOT_SUPPORTED )
1706                 return( status );
1707 #endif /* MBEDTLS_PSA_BUILTIN_MAC */
1708             return( PSA_ERROR_NOT_SUPPORTED );
1709 
1710         /* Add cases for opaque driver here */
1711 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1712 #if defined(PSA_CRYPTO_DRIVER_TEST)
1713         case PSA_CRYPTO_TEST_DRIVER_LOCATION:
1714             status = mbedtls_test_opaque_mac_verify_setup(
1715                 &operation->ctx.opaque_test_driver_ctx,
1716                 attributes,
1717                 key_buffer, key_buffer_size,
1718                 alg );
1719 
1720             if( status == PSA_SUCCESS )
1721                 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1722 
1723             return( status );
1724 #endif /* PSA_CRYPTO_DRIVER_TEST */
1725 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1726         default:
1727             /* Key is declared with a lifetime not known to us */
1728             (void) status;
1729             (void) operation;
1730             (void) key_buffer;
1731             (void) key_buffer_size;
1732             (void) alg;
1733             return( PSA_ERROR_INVALID_ARGUMENT );
1734     }
1735 }
1736 
psa_driver_wrapper_mac_update(psa_mac_operation_t * operation,const uint8_t * input,size_t input_length)1737 psa_status_t psa_driver_wrapper_mac_update(
1738     psa_mac_operation_t *operation,
1739     const uint8_t *input,
1740     size_t input_length )
1741 {
1742     switch( operation->id )
1743     {
1744 #if defined(MBEDTLS_PSA_BUILTIN_MAC)
1745         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1746             return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
1747                                             input, input_length ) );
1748 #endif /* MBEDTLS_PSA_BUILTIN_MAC */
1749 
1750 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1751 #if defined(PSA_CRYPTO_DRIVER_TEST)
1752         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1753             return( mbedtls_test_transparent_mac_update(
1754                         &operation->ctx.transparent_test_driver_ctx,
1755                         input, input_length ) );
1756 
1757         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1758             return( mbedtls_test_opaque_mac_update(
1759                         &operation->ctx.opaque_test_driver_ctx,
1760                         input, input_length ) );
1761 #endif /* PSA_CRYPTO_DRIVER_TEST */
1762 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1763         default:
1764             (void) input;
1765             (void) input_length;
1766             return( PSA_ERROR_INVALID_ARGUMENT );
1767     }
1768 }
1769 
psa_driver_wrapper_mac_sign_finish(psa_mac_operation_t * operation,uint8_t * mac,size_t mac_size,size_t * mac_length)1770 psa_status_t psa_driver_wrapper_mac_sign_finish(
1771     psa_mac_operation_t *operation,
1772     uint8_t *mac,
1773     size_t mac_size,
1774     size_t *mac_length )
1775 {
1776     switch( operation->id )
1777     {
1778 #if defined(MBEDTLS_PSA_BUILTIN_MAC)
1779         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1780             return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
1781                                                  mac, mac_size, mac_length ) );
1782 #endif /* MBEDTLS_PSA_BUILTIN_MAC */
1783 
1784 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1785 #if defined(PSA_CRYPTO_DRIVER_TEST)
1786         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1787             return( mbedtls_test_transparent_mac_sign_finish(
1788                         &operation->ctx.transparent_test_driver_ctx,
1789                         mac, mac_size, mac_length ) );
1790 
1791         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1792             return( mbedtls_test_opaque_mac_sign_finish(
1793                         &operation->ctx.opaque_test_driver_ctx,
1794                         mac, mac_size, mac_length ) );
1795 #endif /* PSA_CRYPTO_DRIVER_TEST */
1796 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1797         default:
1798             (void) mac;
1799             (void) mac_size;
1800             (void) mac_length;
1801             return( PSA_ERROR_INVALID_ARGUMENT );
1802     }
1803 }
1804 
psa_driver_wrapper_mac_verify_finish(psa_mac_operation_t * operation,const uint8_t * mac,size_t mac_length)1805 psa_status_t psa_driver_wrapper_mac_verify_finish(
1806     psa_mac_operation_t *operation,
1807     const uint8_t *mac,
1808     size_t mac_length )
1809 {
1810     switch( operation->id )
1811     {
1812 #if defined(MBEDTLS_PSA_BUILTIN_MAC)
1813         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1814             return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
1815                                                    mac, mac_length ) );
1816 #endif /* MBEDTLS_PSA_BUILTIN_MAC */
1817 
1818 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1819 #if defined(PSA_CRYPTO_DRIVER_TEST)
1820         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1821             return( mbedtls_test_transparent_mac_verify_finish(
1822                         &operation->ctx.transparent_test_driver_ctx,
1823                         mac, mac_length ) );
1824 
1825         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1826             return( mbedtls_test_opaque_mac_verify_finish(
1827                         &operation->ctx.opaque_test_driver_ctx,
1828                         mac, mac_length ) );
1829 #endif /* PSA_CRYPTO_DRIVER_TEST */
1830 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1831         default:
1832             (void) mac;
1833             (void) mac_length;
1834             return( PSA_ERROR_INVALID_ARGUMENT );
1835     }
1836 }
1837 
psa_driver_wrapper_mac_abort(psa_mac_operation_t * operation)1838 psa_status_t psa_driver_wrapper_mac_abort(
1839     psa_mac_operation_t *operation )
1840 {
1841     switch( operation->id )
1842     {
1843 #if defined(MBEDTLS_PSA_BUILTIN_MAC)
1844         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1845             return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
1846 #endif /* MBEDTLS_PSA_BUILTIN_MAC */
1847 
1848 #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1849 #if defined(PSA_CRYPTO_DRIVER_TEST)
1850         case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1851             return( mbedtls_test_transparent_mac_abort(
1852                         &operation->ctx.transparent_test_driver_ctx ) );
1853         case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
1854             return( mbedtls_test_opaque_mac_abort(
1855                         &operation->ctx.opaque_test_driver_ctx ) );
1856 #endif /* PSA_CRYPTO_DRIVER_TEST */
1857 #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1858         default:
1859             return( PSA_ERROR_INVALID_ARGUMENT );
1860     }
1861 }
1862 
1863 #endif /* MBEDTLS_PSA_CRYPTO_C */
1864