quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

psa_crypto.c (327192B)


      1 /*
      2  *  PSA crypto layer on top of Mbed TLS crypto
      3  */
      4 /*
      5  *  Copyright The Mbed TLS Contributors
      6  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
      7  */
      8 
      9 #include "common.h"
     10 #include "psa_crypto_core_common.h"
     11 
     12 #if defined(MBEDTLS_PSA_CRYPTO_C)
     13 
     14 #if defined(MBEDTLS_PSA_CRYPTO_CONFIG)
     15 #include "check_crypto_config.h"
     16 #endif
     17 
     18 #include "psa/crypto.h"
     19 #include "psa/crypto_values.h"
     20 
     21 #include "psa_crypto_cipher.h"
     22 #include "psa_crypto_core.h"
     23 #include "psa_crypto_invasive.h"
     24 #include "psa_crypto_driver_wrappers.h"
     25 #include "psa_crypto_driver_wrappers_no_static.h"
     26 #include "psa_crypto_ecp.h"
     27 #include "psa_crypto_ffdh.h"
     28 #include "psa_crypto_hash.h"
     29 #include "psa_crypto_mac.h"
     30 #include "psa_crypto_rsa.h"
     31 #include "psa_crypto_ecp.h"
     32 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
     33 #include "psa_crypto_se.h"
     34 #endif
     35 #include "psa_crypto_slot_management.h"
     36 /* Include internal declarations that are useful for implementing persistently
     37  * stored keys. */
     38 #include "psa_crypto_storage.h"
     39 
     40 #include "psa_crypto_random_impl.h"
     41 
     42 #include <stdlib.h>
     43 #include <string.h>
     44 #include "mbedtls/platform.h"
     45 
     46 #include "mbedtls/aes.h"
     47 #include "mbedtls/asn1.h"
     48 #include "mbedtls/asn1write.h"
     49 #include "mbedtls/bignum.h"
     50 #include "mbedtls/camellia.h"
     51 #include "mbedtls/chacha20.h"
     52 #include "mbedtls/chachapoly.h"
     53 #include "mbedtls/cipher.h"
     54 #include "mbedtls/ccm.h"
     55 #include "mbedtls/cmac.h"
     56 #include "mbedtls/constant_time.h"
     57 #include "mbedtls/des.h"
     58 #include "mbedtls/ecdh.h"
     59 #include "mbedtls/ecp.h"
     60 #include "mbedtls/entropy.h"
     61 #include "mbedtls/error.h"
     62 #include "mbedtls/gcm.h"
     63 #include "mbedtls/md5.h"
     64 #include "mbedtls/pk.h"
     65 #include "pk_wrap.h"
     66 #include "mbedtls/platform_util.h"
     67 #include "mbedtls/error.h"
     68 #include "mbedtls/ripemd160.h"
     69 #include "mbedtls/rsa.h"
     70 #include "mbedtls/sha1.h"
     71 #include "mbedtls/sha256.h"
     72 #include "mbedtls/sha512.h"
     73 #include "mbedtls/psa_util.h"
     74 #include "mbedtls/threading.h"
     75 
     76 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) ||          \
     77     defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT) ||  \
     78     defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXPAND)
     79 #define BUILTIN_ALG_ANY_HKDF 1
     80 #endif
     81 
     82 /****************************************************************/
     83 /* Global data, support functions and library management */
     84 /****************************************************************/
     85 
     86 static int key_type_is_raw_bytes(psa_key_type_t type)
     87 {
     88     return PSA_KEY_TYPE_IS_UNSTRUCTURED(type);
     89 }
     90 
     91 /* Values for psa_global_data_t::rng_state */
     92 #define RNG_NOT_INITIALIZED 0
     93 #define RNG_INITIALIZED 1
     94 #define RNG_SEEDED 2
     95 
     96 /* IDs for PSA crypto subsystems. Starts at 1 to catch potential uninitialized
     97  * variables as arguments. */
     98 typedef enum {
     99     PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS = 1,
    100     PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS,
    101     PSA_CRYPTO_SUBSYSTEM_RNG,
    102     PSA_CRYPTO_SUBSYSTEM_TRANSACTION,
    103 } mbedtls_psa_crypto_subsystem;
    104 
    105 /* Initialization flags for global_data::initialized */
    106 #define PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED    0x01
    107 #define PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS_INITIALIZED          0x02
    108 #define PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED        0x04
    109 
    110 #define PSA_CRYPTO_SUBSYSTEM_ALL_INITIALISED                ( \
    111         PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED | \
    112         PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS_INITIALIZED | \
    113         PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED)
    114 
    115 typedef struct {
    116     uint8_t initialized;
    117     uint8_t rng_state;
    118     mbedtls_psa_random_context_t rng;
    119 } psa_global_data_t;
    120 
    121 static psa_global_data_t global_data;
    122 
    123 static uint8_t psa_get_initialized(void)
    124 {
    125     uint8_t initialized;
    126 
    127 #if defined(MBEDTLS_THREADING_C)
    128     mbedtls_mutex_lock(&mbedtls_threading_psa_rngdata_mutex);
    129 #endif /* defined(MBEDTLS_THREADING_C) */
    130 
    131     initialized = global_data.rng_state == RNG_SEEDED;
    132 
    133 #if defined(MBEDTLS_THREADING_C)
    134     mbedtls_mutex_unlock(&mbedtls_threading_psa_rngdata_mutex);
    135 #endif /* defined(MBEDTLS_THREADING_C) */
    136 
    137 #if defined(MBEDTLS_THREADING_C)
    138     mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex);
    139 #endif /* defined(MBEDTLS_THREADING_C) */
    140 
    141     initialized =
    142         (initialized && (global_data.initialized == PSA_CRYPTO_SUBSYSTEM_ALL_INITIALISED));
    143 
    144 #if defined(MBEDTLS_THREADING_C)
    145     mbedtls_mutex_unlock(&mbedtls_threading_psa_globaldata_mutex);
    146 #endif /* defined(MBEDTLS_THREADING_C) */
    147 
    148     return initialized;
    149 }
    150 
    151 static uint8_t psa_get_drivers_initialized(void)
    152 {
    153     uint8_t initialized;
    154 
    155 #if defined(MBEDTLS_THREADING_C)
    156     mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex);
    157 #endif /* defined(MBEDTLS_THREADING_C) */
    158 
    159     initialized = (global_data.initialized & PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED) != 0;
    160 
    161 #if defined(MBEDTLS_THREADING_C)
    162     mbedtls_mutex_unlock(&mbedtls_threading_psa_globaldata_mutex);
    163 #endif /* defined(MBEDTLS_THREADING_C) */
    164 
    165     return initialized;
    166 }
    167 
    168 #define GUARD_MODULE_INITIALIZED        \
    169     if (psa_get_initialized() == 0)     \
    170     return PSA_ERROR_BAD_STATE;
    171 
    172 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
    173 
    174 /* Declare a local copy of an input buffer and a variable that will be used
    175  * to store a pointer to the start of the buffer.
    176  *
    177  * Note: This macro must be called before any operations which may jump to
    178  * the exit label, so that the local input copy object is safe to be freed.
    179  *
    180  * Assumptions:
    181  * - input is the name of a pointer to the buffer to be copied
    182  * - The name LOCAL_INPUT_COPY_OF_input is unused in the current scope
    183  * - input_copy_name is a name that is unused in the current scope
    184  */
    185 #define LOCAL_INPUT_DECLARE(input, input_copy_name) \
    186     psa_crypto_local_input_t LOCAL_INPUT_COPY_OF_##input = PSA_CRYPTO_LOCAL_INPUT_INIT; \
    187     const uint8_t *input_copy_name = NULL;
    188 
    189 /* Allocate a copy of the buffer input and set the pointer input_copy to
    190  * point to the start of the copy.
    191  *
    192  * Assumptions:
    193  * - psa_status_t status exists
    194  * - An exit label is declared
    195  * - input is the name of a pointer to the buffer to be copied
    196  * - LOCAL_INPUT_DECLARE(input, input_copy) has previously been called
    197  */
    198 #define LOCAL_INPUT_ALLOC(input, length, input_copy) \
    199     status = psa_crypto_local_input_alloc(input, length, \
    200                                           &LOCAL_INPUT_COPY_OF_##input); \
    201     if (status != PSA_SUCCESS) { \
    202         goto exit; \
    203     } \
    204     input_copy = LOCAL_INPUT_COPY_OF_##input.buffer;
    205 
    206 /* Free the local input copy allocated previously by LOCAL_INPUT_ALLOC()
    207  *
    208  * Assumptions:
    209  * - input_copy is the name of the input copy pointer set by LOCAL_INPUT_ALLOC()
    210  * - input is the name of the original buffer that was copied
    211  */
    212 #define LOCAL_INPUT_FREE(input, input_copy) \
    213     input_copy = NULL; \
    214     psa_crypto_local_input_free(&LOCAL_INPUT_COPY_OF_##input);
    215 
    216 /* Declare a local copy of an output buffer and a variable that will be used
    217  * to store a pointer to the start of the buffer.
    218  *
    219  * Note: This macro must be called before any operations which may jump to
    220  * the exit label, so that the local output copy object is safe to be freed.
    221  *
    222  * Assumptions:
    223  * - output is the name of a pointer to the buffer to be copied
    224  * - The name LOCAL_OUTPUT_COPY_OF_output is unused in the current scope
    225  * - output_copy_name is a name that is unused in the current scope
    226  */
    227 #define LOCAL_OUTPUT_DECLARE(output, output_copy_name) \
    228     psa_crypto_local_output_t LOCAL_OUTPUT_COPY_OF_##output = PSA_CRYPTO_LOCAL_OUTPUT_INIT; \
    229     uint8_t *output_copy_name = NULL;
    230 
    231 /* Allocate a copy of the buffer output and set the pointer output_copy to
    232  * point to the start of the copy.
    233  *
    234  * Assumptions:
    235  * - psa_status_t status exists
    236  * - An exit label is declared
    237  * - output is the name of a pointer to the buffer to be copied
    238  * - LOCAL_OUTPUT_DECLARE(output, output_copy) has previously been called
    239  */
    240 #define LOCAL_OUTPUT_ALLOC(output, length, output_copy) \
    241     status = psa_crypto_local_output_alloc(output, length, \
    242                                            &LOCAL_OUTPUT_COPY_OF_##output); \
    243     if (status != PSA_SUCCESS) { \
    244         goto exit; \
    245     } \
    246     output_copy = LOCAL_OUTPUT_COPY_OF_##output.buffer;
    247 
    248 /* Free the local output copy allocated previously by LOCAL_OUTPUT_ALLOC()
    249  * after first copying back its contents to the original buffer.
    250  *
    251  * Assumptions:
    252  * - psa_status_t status exists
    253  * - output_copy is the name of the output copy pointer set by LOCAL_OUTPUT_ALLOC()
    254  * - output is the name of the original buffer that was copied
    255  */
    256 #define LOCAL_OUTPUT_FREE(output, output_copy) \
    257     output_copy = NULL; \
    258     do { \
    259         psa_status_t local_output_status; \
    260         local_output_status = psa_crypto_local_output_free(&LOCAL_OUTPUT_COPY_OF_##output); \
    261         if (local_output_status != PSA_SUCCESS) { \
    262             /* Since this error case is an internal error, it's more serious than \
    263              * any existing error code and so it's fine to overwrite the existing \
    264              * status. */ \
    265             status = local_output_status; \
    266         } \
    267     } while (0)
    268 #else /* !MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS */
    269 #define LOCAL_INPUT_DECLARE(input, input_copy_name) \
    270     const uint8_t *input_copy_name = NULL;
    271 #define LOCAL_INPUT_ALLOC(input, length, input_copy) \
    272     input_copy = input;
    273 #define LOCAL_INPUT_FREE(input, input_copy) \
    274     input_copy = NULL;
    275 #define LOCAL_OUTPUT_DECLARE(output, output_copy_name) \
    276     uint8_t *output_copy_name = NULL;
    277 #define LOCAL_OUTPUT_ALLOC(output, length, output_copy) \
    278     output_copy = output;
    279 #define LOCAL_OUTPUT_FREE(output, output_copy) \
    280     output_copy = NULL;
    281 #endif /* !MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS */
    282 
    283 
    284 int psa_can_do_hash(psa_algorithm_t hash_alg)
    285 {
    286     (void) hash_alg;
    287     return psa_get_drivers_initialized();
    288 }
    289 
    290 int psa_can_do_cipher(psa_key_type_t key_type, psa_algorithm_t cipher_alg)
    291 {
    292     (void) key_type;
    293     (void) cipher_alg;
    294     return psa_get_drivers_initialized();
    295 }
    296 
    297 
    298 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_IMPORT) ||       \
    299     defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_PUBLIC_KEY) ||     \
    300     defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_GENERATE)
    301 static int psa_is_dh_key_size_valid(size_t bits)
    302 {
    303     switch (bits) {
    304 #if defined(PSA_WANT_DH_RFC7919_2048)
    305         case 2048:
    306             return 1;
    307 #endif /* PSA_WANT_DH_RFC7919_2048 */
    308 #if defined(PSA_WANT_DH_RFC7919_3072)
    309         case 3072:
    310             return 1;
    311 #endif /* PSA_WANT_DH_RFC7919_3072 */
    312 #if defined(PSA_WANT_DH_RFC7919_4096)
    313         case 4096:
    314             return 1;
    315 #endif /* PSA_WANT_DH_RFC7919_4096 */
    316 #if defined(PSA_WANT_DH_RFC7919_6144)
    317         case 6144:
    318             return 1;
    319 #endif /* PSA_WANT_DH_RFC7919_6144 */
    320 #if defined(PSA_WANT_DH_RFC7919_8192)
    321         case 8192:
    322             return 1;
    323 #endif /* PSA_WANT_DH_RFC7919_8192 */
    324         default:
    325             return 0;
    326     }
    327 }
    328 #endif /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_IMPORT ||
    329           MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_PUBLIC_KEY ||
    330           PSA_WANT_KEY_TYPE_DH_KEY_PAIR_GENERATE */
    331 
    332 psa_status_t mbedtls_to_psa_error(int ret)
    333 {
    334     /* Mbed TLS error codes can combine a high-level error code and a
    335      * low-level error code. The low-level error usually reflects the
    336      * root cause better, so dispatch on that preferably. */
    337     int low_level_ret = -(-ret & 0x007f);
    338     switch (low_level_ret != 0 ? low_level_ret : ret) {
    339         case 0:
    340             return PSA_SUCCESS;
    341 
    342 #if defined(MBEDTLS_AES_C)
    343         case MBEDTLS_ERR_AES_INVALID_KEY_LENGTH:
    344         case MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH:
    345             return PSA_ERROR_NOT_SUPPORTED;
    346         case MBEDTLS_ERR_AES_BAD_INPUT_DATA:
    347             return PSA_ERROR_INVALID_ARGUMENT;
    348 #endif
    349 
    350 #if defined(MBEDTLS_ASN1_PARSE_C) || defined(MBEDTLS_ASN1_WRITE_C)
    351         case MBEDTLS_ERR_ASN1_OUT_OF_DATA:
    352         case MBEDTLS_ERR_ASN1_UNEXPECTED_TAG:
    353         case MBEDTLS_ERR_ASN1_INVALID_LENGTH:
    354         case MBEDTLS_ERR_ASN1_LENGTH_MISMATCH:
    355         case MBEDTLS_ERR_ASN1_INVALID_DATA:
    356             return PSA_ERROR_INVALID_ARGUMENT;
    357         case MBEDTLS_ERR_ASN1_ALLOC_FAILED:
    358             return PSA_ERROR_INSUFFICIENT_MEMORY;
    359         case MBEDTLS_ERR_ASN1_BUF_TOO_SMALL:
    360             return PSA_ERROR_BUFFER_TOO_SMALL;
    361 #endif
    362 
    363 #if defined(MBEDTLS_CAMELLIA_C)
    364         case MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA:
    365         case MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH:
    366             return PSA_ERROR_NOT_SUPPORTED;
    367 #endif
    368 
    369 #if defined(MBEDTLS_CCM_C)
    370         case MBEDTLS_ERR_CCM_BAD_INPUT:
    371             return PSA_ERROR_INVALID_ARGUMENT;
    372         case MBEDTLS_ERR_CCM_AUTH_FAILED:
    373             return PSA_ERROR_INVALID_SIGNATURE;
    374 #endif
    375 
    376 #if defined(MBEDTLS_CHACHA20_C)
    377         case MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA:
    378             return PSA_ERROR_INVALID_ARGUMENT;
    379 #endif
    380 
    381 #if defined(MBEDTLS_CHACHAPOLY_C)
    382         case MBEDTLS_ERR_CHACHAPOLY_BAD_STATE:
    383             return PSA_ERROR_BAD_STATE;
    384         case MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED:
    385             return PSA_ERROR_INVALID_SIGNATURE;
    386 #endif
    387 
    388 #if defined(MBEDTLS_CIPHER_C)
    389         case MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE:
    390             return PSA_ERROR_NOT_SUPPORTED;
    391         case MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA:
    392             return PSA_ERROR_INVALID_ARGUMENT;
    393         case MBEDTLS_ERR_CIPHER_ALLOC_FAILED:
    394             return PSA_ERROR_INSUFFICIENT_MEMORY;
    395         case MBEDTLS_ERR_CIPHER_INVALID_PADDING:
    396             return PSA_ERROR_INVALID_PADDING;
    397         case MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED:
    398             return PSA_ERROR_INVALID_ARGUMENT;
    399         case MBEDTLS_ERR_CIPHER_AUTH_FAILED:
    400             return PSA_ERROR_INVALID_SIGNATURE;
    401         case MBEDTLS_ERR_CIPHER_INVALID_CONTEXT:
    402             return PSA_ERROR_CORRUPTION_DETECTED;
    403 #endif
    404 
    405 #if !(defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) ||      \
    406             defined(MBEDTLS_PSA_HMAC_DRBG_MD_TYPE))
    407         /* Only check CTR_DRBG error codes if underlying mbedtls_xxx
    408          * functions are passed a CTR_DRBG instance. */
    409         case MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED:
    410             return PSA_ERROR_INSUFFICIENT_ENTROPY;
    411         case MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG:
    412         case MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG:
    413             return PSA_ERROR_NOT_SUPPORTED;
    414         case MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR:
    415             return PSA_ERROR_INSUFFICIENT_ENTROPY;
    416 #endif
    417 
    418 #if defined(MBEDTLS_DES_C)
    419         case MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH:
    420             return PSA_ERROR_NOT_SUPPORTED;
    421 #endif
    422 
    423         case MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED:
    424         case MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE:
    425         case MBEDTLS_ERR_ENTROPY_SOURCE_FAILED:
    426             return PSA_ERROR_INSUFFICIENT_ENTROPY;
    427 
    428 #if defined(MBEDTLS_GCM_C)
    429         case MBEDTLS_ERR_GCM_AUTH_FAILED:
    430             return PSA_ERROR_INVALID_SIGNATURE;
    431         case MBEDTLS_ERR_GCM_BUFFER_TOO_SMALL:
    432             return PSA_ERROR_BUFFER_TOO_SMALL;
    433         case MBEDTLS_ERR_GCM_BAD_INPUT:
    434             return PSA_ERROR_INVALID_ARGUMENT;
    435 #endif
    436 
    437 #if !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) &&        \
    438             defined(MBEDTLS_PSA_HMAC_DRBG_MD_TYPE)
    439         /* Only check HMAC_DRBG error codes if underlying mbedtls_xxx
    440          * functions are passed a HMAC_DRBG instance. */
    441         case MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED:
    442             return PSA_ERROR_INSUFFICIENT_ENTROPY;
    443         case MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG:
    444         case MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG:
    445             return PSA_ERROR_NOT_SUPPORTED;
    446         case MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR:
    447             return PSA_ERROR_INSUFFICIENT_ENTROPY;
    448 #endif
    449 
    450 #if defined(MBEDTLS_MD_LIGHT)
    451         case MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE:
    452             return PSA_ERROR_NOT_SUPPORTED;
    453         case MBEDTLS_ERR_MD_BAD_INPUT_DATA:
    454             return PSA_ERROR_INVALID_ARGUMENT;
    455         case MBEDTLS_ERR_MD_ALLOC_FAILED:
    456             return PSA_ERROR_INSUFFICIENT_MEMORY;
    457 #if defined(MBEDTLS_FS_IO)
    458         case MBEDTLS_ERR_MD_FILE_IO_ERROR:
    459             return PSA_ERROR_STORAGE_FAILURE;
    460 #endif
    461 #endif
    462 
    463 #if defined(MBEDTLS_BIGNUM_C)
    464 #if defined(MBEDTLS_FS_IO)
    465         case MBEDTLS_ERR_MPI_FILE_IO_ERROR:
    466             return PSA_ERROR_STORAGE_FAILURE;
    467 #endif
    468         case MBEDTLS_ERR_MPI_BAD_INPUT_DATA:
    469             return PSA_ERROR_INVALID_ARGUMENT;
    470         case MBEDTLS_ERR_MPI_INVALID_CHARACTER:
    471             return PSA_ERROR_INVALID_ARGUMENT;
    472         case MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL:
    473             return PSA_ERROR_BUFFER_TOO_SMALL;
    474         case MBEDTLS_ERR_MPI_NEGATIVE_VALUE:
    475             return PSA_ERROR_INVALID_ARGUMENT;
    476         case MBEDTLS_ERR_MPI_DIVISION_BY_ZERO:
    477             return PSA_ERROR_INVALID_ARGUMENT;
    478         case MBEDTLS_ERR_MPI_NOT_ACCEPTABLE:
    479             return PSA_ERROR_INVALID_ARGUMENT;
    480         case MBEDTLS_ERR_MPI_ALLOC_FAILED:
    481             return PSA_ERROR_INSUFFICIENT_MEMORY;
    482 #endif
    483 
    484 #if defined(MBEDTLS_PK_C)
    485         case MBEDTLS_ERR_PK_ALLOC_FAILED:
    486             return PSA_ERROR_INSUFFICIENT_MEMORY;
    487         case MBEDTLS_ERR_PK_TYPE_MISMATCH:
    488         case MBEDTLS_ERR_PK_BAD_INPUT_DATA:
    489             return PSA_ERROR_INVALID_ARGUMENT;
    490 #if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) || defined(MBEDTLS_FS_IO) || \
    491             defined(MBEDTLS_PSA_ITS_FILE_C)
    492         case MBEDTLS_ERR_PK_FILE_IO_ERROR:
    493             return PSA_ERROR_STORAGE_FAILURE;
    494 #endif
    495         case MBEDTLS_ERR_PK_KEY_INVALID_VERSION:
    496         case MBEDTLS_ERR_PK_KEY_INVALID_FORMAT:
    497             return PSA_ERROR_INVALID_ARGUMENT;
    498         case MBEDTLS_ERR_PK_UNKNOWN_PK_ALG:
    499             return PSA_ERROR_NOT_SUPPORTED;
    500         case MBEDTLS_ERR_PK_PASSWORD_REQUIRED:
    501         case MBEDTLS_ERR_PK_PASSWORD_MISMATCH:
    502             return PSA_ERROR_NOT_PERMITTED;
    503         case MBEDTLS_ERR_PK_INVALID_PUBKEY:
    504             return PSA_ERROR_INVALID_ARGUMENT;
    505         case MBEDTLS_ERR_PK_INVALID_ALG:
    506         case MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE:
    507         case MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE:
    508             return PSA_ERROR_NOT_SUPPORTED;
    509         case MBEDTLS_ERR_PK_SIG_LEN_MISMATCH:
    510             return PSA_ERROR_INVALID_SIGNATURE;
    511         case MBEDTLS_ERR_PK_BUFFER_TOO_SMALL:
    512             return PSA_ERROR_BUFFER_TOO_SMALL;
    513 #endif
    514 
    515         case MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED:
    516             return PSA_ERROR_HARDWARE_FAILURE;
    517         case MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED:
    518             return PSA_ERROR_NOT_SUPPORTED;
    519 
    520 #if defined(MBEDTLS_RSA_C)
    521         case MBEDTLS_ERR_RSA_BAD_INPUT_DATA:
    522             return PSA_ERROR_INVALID_ARGUMENT;
    523         case MBEDTLS_ERR_RSA_INVALID_PADDING:
    524             return PSA_ERROR_INVALID_PADDING;
    525         case MBEDTLS_ERR_RSA_KEY_GEN_FAILED:
    526             return PSA_ERROR_HARDWARE_FAILURE;
    527         case MBEDTLS_ERR_RSA_KEY_CHECK_FAILED:
    528             return PSA_ERROR_INVALID_ARGUMENT;
    529         case MBEDTLS_ERR_RSA_PUBLIC_FAILED:
    530         case MBEDTLS_ERR_RSA_PRIVATE_FAILED:
    531             return PSA_ERROR_CORRUPTION_DETECTED;
    532         case MBEDTLS_ERR_RSA_VERIFY_FAILED:
    533             return PSA_ERROR_INVALID_SIGNATURE;
    534         case MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE:
    535             return PSA_ERROR_BUFFER_TOO_SMALL;
    536         case MBEDTLS_ERR_RSA_RNG_FAILED:
    537             return PSA_ERROR_INSUFFICIENT_ENTROPY;
    538 #endif
    539 
    540 #if defined(MBEDTLS_ECP_LIGHT)
    541         case MBEDTLS_ERR_ECP_BAD_INPUT_DATA:
    542         case MBEDTLS_ERR_ECP_INVALID_KEY:
    543             return PSA_ERROR_INVALID_ARGUMENT;
    544         case MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL:
    545             return PSA_ERROR_BUFFER_TOO_SMALL;
    546         case MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE:
    547             return PSA_ERROR_NOT_SUPPORTED;
    548         case MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH:
    549         case MBEDTLS_ERR_ECP_VERIFY_FAILED:
    550             return PSA_ERROR_INVALID_SIGNATURE;
    551         case MBEDTLS_ERR_ECP_ALLOC_FAILED:
    552             return PSA_ERROR_INSUFFICIENT_MEMORY;
    553         case MBEDTLS_ERR_ECP_RANDOM_FAILED:
    554             return PSA_ERROR_INSUFFICIENT_ENTROPY;
    555 
    556 #if defined(MBEDTLS_ECP_RESTARTABLE)
    557         case MBEDTLS_ERR_ECP_IN_PROGRESS:
    558             return PSA_OPERATION_INCOMPLETE;
    559 #endif
    560 #endif
    561 
    562         case MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED:
    563             return PSA_ERROR_CORRUPTION_DETECTED;
    564 
    565         default:
    566             return PSA_ERROR_GENERIC_ERROR;
    567     }
    568 }
    569 
    570 /**
    571  * \brief                       For output buffers which contain "tags"
    572  *                              (outputs that may be checked for validity like
    573  *                              hashes, MACs and signatures), fill the unused
    574  *                              part of the output buffer (the whole buffer on
    575  *                              error, the trailing part on success) with
    576  *                              something that isn't a valid tag (barring an
    577  *                              attack on the tag and deliberately-crafted
    578  *                              input), in case the caller doesn't check the
    579  *                              return status properly.
    580  *
    581  * \param output_buffer         Pointer to buffer to wipe. May not be NULL
    582  *                              unless \p output_buffer_size is zero.
    583  * \param status                Status of function called to generate
    584  *                              output_buffer originally
    585  * \param output_buffer_size    Size of output buffer. If zero, \p output_buffer
    586  *                              could be NULL.
    587  * \param output_buffer_length  Length of data written to output_buffer, must be
    588  *                              less than \p output_buffer_size
    589  */
    590 static void psa_wipe_tag_output_buffer(uint8_t *output_buffer, psa_status_t status,
    591                                        size_t output_buffer_size, size_t output_buffer_length)
    592 {
    593     size_t offset = 0;
    594 
    595     if (output_buffer_size == 0) {
    596         /* If output_buffer_size is 0 then we have nothing to do. We must not
    597            call memset because output_buffer may be NULL in this case */
    598         return;
    599     }
    600 
    601     if (status == PSA_SUCCESS) {
    602         offset = output_buffer_length;
    603     }
    604 
    605     memset(output_buffer + offset, '!', output_buffer_size - offset);
    606 }
    607 
    608 
    609 psa_status_t psa_validate_unstructured_key_bit_size(psa_key_type_t type,
    610                                                     size_t bits)
    611 {
    612     /* Check that the bit size is acceptable for the key type */
    613     switch (type) {
    614         case PSA_KEY_TYPE_RAW_DATA:
    615         case PSA_KEY_TYPE_HMAC:
    616         case PSA_KEY_TYPE_DERIVE:
    617         case PSA_KEY_TYPE_PASSWORD:
    618         case PSA_KEY_TYPE_PASSWORD_HASH:
    619             break;
    620 #if defined(PSA_WANT_KEY_TYPE_AES)
    621         case PSA_KEY_TYPE_AES:
    622             if (bits != 128 && bits != 192 && bits != 256) {
    623                 return PSA_ERROR_INVALID_ARGUMENT;
    624             }
    625             break;
    626 #endif
    627 #if defined(PSA_WANT_KEY_TYPE_ARIA)
    628         case PSA_KEY_TYPE_ARIA:
    629             if (bits != 128 && bits != 192 && bits != 256) {
    630                 return PSA_ERROR_INVALID_ARGUMENT;
    631             }
    632             break;
    633 #endif
    634 #if defined(PSA_WANT_KEY_TYPE_CAMELLIA)
    635         case PSA_KEY_TYPE_CAMELLIA:
    636             if (bits != 128 && bits != 192 && bits != 256) {
    637                 return PSA_ERROR_INVALID_ARGUMENT;
    638             }
    639             break;
    640 #endif
    641 #if defined(PSA_WANT_KEY_TYPE_DES)
    642         case PSA_KEY_TYPE_DES:
    643             if (bits != 64 && bits != 128 && bits != 192) {
    644                 return PSA_ERROR_INVALID_ARGUMENT;
    645             }
    646             break;
    647 #endif
    648 #if defined(PSA_WANT_KEY_TYPE_CHACHA20)
    649         case PSA_KEY_TYPE_CHACHA20:
    650             if (bits != 256) {
    651                 return PSA_ERROR_INVALID_ARGUMENT;
    652             }
    653             break;
    654 #endif
    655         default:
    656             return PSA_ERROR_NOT_SUPPORTED;
    657     }
    658     if (bits % 8 != 0) {
    659         return PSA_ERROR_INVALID_ARGUMENT;
    660     }
    661 
    662     return PSA_SUCCESS;
    663 }
    664 
    665 /** Check whether a given key type is valid for use with a given MAC algorithm
    666  *
    667  * Upon successful return of this function, the behavior of #PSA_MAC_LENGTH
    668  * when called with the validated \p algorithm and \p key_type is well-defined.
    669  *
    670  * \param[in] algorithm     The specific MAC algorithm (can be wildcard).
    671  * \param[in] key_type      The key type of the key to be used with the
    672  *                          \p algorithm.
    673  *
    674  * \retval #PSA_SUCCESS
    675  *         The \p key_type is valid for use with the \p algorithm
    676  * \retval #PSA_ERROR_INVALID_ARGUMENT
    677  *         The \p key_type is not valid for use with the \p algorithm
    678  */
    679 MBEDTLS_STATIC_TESTABLE psa_status_t psa_mac_key_can_do(
    680     psa_algorithm_t algorithm,
    681     psa_key_type_t key_type)
    682 {
    683     if (PSA_ALG_IS_HMAC(algorithm)) {
    684         if (key_type == PSA_KEY_TYPE_HMAC) {
    685             return PSA_SUCCESS;
    686         }
    687     }
    688 
    689     if (PSA_ALG_IS_BLOCK_CIPHER_MAC(algorithm)) {
    690         /* Check that we're calling PSA_BLOCK_CIPHER_BLOCK_LENGTH with a cipher
    691          * key. */
    692         if ((key_type & PSA_KEY_TYPE_CATEGORY_MASK) ==
    693             PSA_KEY_TYPE_CATEGORY_SYMMETRIC) {
    694             /* PSA_BLOCK_CIPHER_BLOCK_LENGTH returns 1 for stream ciphers and
    695              * the block length (larger than 1) for block ciphers. */
    696             if (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) > 1) {
    697                 return PSA_SUCCESS;
    698             }
    699         }
    700     }
    701 
    702     return PSA_ERROR_INVALID_ARGUMENT;
    703 }
    704 
    705 psa_status_t psa_allocate_buffer_to_slot(psa_key_slot_t *slot,
    706                                          size_t buffer_length)
    707 {
    708 #if defined(MBEDTLS_PSA_STATIC_KEY_SLOTS)
    709     if (buffer_length > ((size_t) MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE)) {
    710         return PSA_ERROR_NOT_SUPPORTED;
    711     }
    712 #else
    713     if (slot->key.data != NULL) {
    714         return PSA_ERROR_ALREADY_EXISTS;
    715     }
    716 
    717     slot->key.data = mbedtls_calloc(1, buffer_length);
    718     if (slot->key.data == NULL) {
    719         return PSA_ERROR_INSUFFICIENT_MEMORY;
    720     }
    721 #endif
    722 
    723     slot->key.bytes = buffer_length;
    724     return PSA_SUCCESS;
    725 }
    726 
    727 psa_status_t psa_copy_key_material_into_slot(psa_key_slot_t *slot,
    728                                              const uint8_t *data,
    729                                              size_t data_length)
    730 {
    731     psa_status_t status = psa_allocate_buffer_to_slot(slot,
    732                                                       data_length);
    733     if (status != PSA_SUCCESS) {
    734         return status;
    735     }
    736 
    737     memcpy(slot->key.data, data, data_length);
    738     return PSA_SUCCESS;
    739 }
    740 
    741 psa_status_t psa_import_key_into_slot(
    742     const psa_key_attributes_t *attributes,
    743     const uint8_t *data, size_t data_length,
    744     uint8_t *key_buffer, size_t key_buffer_size,
    745     size_t *key_buffer_length, size_t *bits)
    746 {
    747     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
    748     psa_key_type_t type = attributes->type;
    749 
    750     /* zero-length keys are never supported. */
    751     if (data_length == 0) {
    752         return PSA_ERROR_NOT_SUPPORTED;
    753     }
    754 
    755     if (key_type_is_raw_bytes(type)) {
    756         *bits = PSA_BYTES_TO_BITS(data_length);
    757 
    758         status = psa_validate_unstructured_key_bit_size(attributes->type,
    759                                                         *bits);
    760         if (status != PSA_SUCCESS) {
    761             return status;
    762         }
    763 
    764         /* Copy the key material. */
    765         memcpy(key_buffer, data, data_length);
    766         *key_buffer_length = data_length;
    767         (void) key_buffer_size;
    768 
    769         return PSA_SUCCESS;
    770     } else if (PSA_KEY_TYPE_IS_ASYMMETRIC(type)) {
    771 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_IMPORT) || \
    772         defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_PUBLIC_KEY)
    773         if (PSA_KEY_TYPE_IS_DH(type)) {
    774             if (psa_is_dh_key_size_valid(PSA_BYTES_TO_BITS(data_length)) == 0) {
    775                 return PSA_ERROR_NOT_SUPPORTED;
    776             }
    777             return mbedtls_psa_ffdh_import_key(attributes,
    778                                                data, data_length,
    779                                                key_buffer, key_buffer_size,
    780                                                key_buffer_length,
    781                                                bits);
    782         }
    783 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_IMPORT) ||
    784         * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_PUBLIC_KEY) */
    785 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_IMPORT) || \
    786         defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY)
    787         if (PSA_KEY_TYPE_IS_ECC(type)) {
    788             return mbedtls_psa_ecp_import_key(attributes,
    789                                               data, data_length,
    790                                               key_buffer, key_buffer_size,
    791                                               key_buffer_length,
    792                                               bits);
    793         }
    794 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_IMPORT) ||
    795         * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) */
    796 #if (defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_IMPORT) && \
    797         defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_EXPORT)) || \
    798         defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY)
    799         if (PSA_KEY_TYPE_IS_RSA(type)) {
    800             return mbedtls_psa_rsa_import_key(attributes,
    801                                               data, data_length,
    802                                               key_buffer, key_buffer_size,
    803                                               key_buffer_length,
    804                                               bits);
    805         }
    806 #endif /* (defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_IMPORT) &&
    807            defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_EXPORT)) ||
    808         * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */
    809     }
    810 
    811     return PSA_ERROR_NOT_SUPPORTED;
    812 }
    813 
    814 /** Calculate the intersection of two algorithm usage policies.
    815  *
    816  * Return 0 (which allows no operation) on incompatibility.
    817  */
    818 static psa_algorithm_t psa_key_policy_algorithm_intersection(
    819     psa_key_type_t key_type,
    820     psa_algorithm_t alg1,
    821     psa_algorithm_t alg2)
    822 {
    823     /* Common case: both sides actually specify the same policy. */
    824     if (alg1 == alg2) {
    825         return alg1;
    826     }
    827     /* If the policies are from the same hash-and-sign family, check
    828      * if one is a wildcard. If so the other has the specific algorithm. */
    829     if (PSA_ALG_IS_SIGN_HASH(alg1) &&
    830         PSA_ALG_IS_SIGN_HASH(alg2) &&
    831         (alg1 & ~PSA_ALG_HASH_MASK) == (alg2 & ~PSA_ALG_HASH_MASK)) {
    832         if (PSA_ALG_SIGN_GET_HASH(alg1) == PSA_ALG_ANY_HASH) {
    833             return alg2;
    834         }
    835         if (PSA_ALG_SIGN_GET_HASH(alg2) == PSA_ALG_ANY_HASH) {
    836             return alg1;
    837         }
    838     }
    839     /* If the policies are from the same AEAD family, check whether
    840      * one of them is a minimum-tag-length wildcard. Calculate the most
    841      * restrictive tag length. */
    842     if (PSA_ALG_IS_AEAD(alg1) && PSA_ALG_IS_AEAD(alg2) &&
    843         (PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg1, 0) ==
    844          PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg2, 0))) {
    845         size_t alg1_len = PSA_ALG_AEAD_GET_TAG_LENGTH(alg1);
    846         size_t alg2_len = PSA_ALG_AEAD_GET_TAG_LENGTH(alg2);
    847         size_t restricted_len = alg1_len > alg2_len ? alg1_len : alg2_len;
    848 
    849         /* If both are wildcards, return most restrictive wildcard */
    850         if (((alg1 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) &&
    851             ((alg2 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0)) {
    852             return PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(
    853                 alg1, restricted_len);
    854         }
    855         /* If only one is a wildcard, return specific algorithm if compatible. */
    856         if (((alg1 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) &&
    857             (alg1_len <= alg2_len)) {
    858             return alg2;
    859         }
    860         if (((alg2 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) &&
    861             (alg2_len <= alg1_len)) {
    862             return alg1;
    863         }
    864     }
    865     /* If the policies are from the same MAC family, check whether one
    866      * of them is a minimum-MAC-length policy. Calculate the most
    867      * restrictive tag length. */
    868     if (PSA_ALG_IS_MAC(alg1) && PSA_ALG_IS_MAC(alg2) &&
    869         (PSA_ALG_FULL_LENGTH_MAC(alg1) ==
    870          PSA_ALG_FULL_LENGTH_MAC(alg2))) {
    871         /* Validate the combination of key type and algorithm. Since the base
    872          * algorithm of alg1 and alg2 are the same, we only need this once. */
    873         if (PSA_SUCCESS != psa_mac_key_can_do(alg1, key_type)) {
    874             return 0;
    875         }
    876 
    877         /* Get the (exact or at-least) output lengths for both sides of the
    878          * requested intersection. None of the currently supported algorithms
    879          * have an output length dependent on the actual key size, so setting it
    880          * to a bogus value of 0 is currently OK.
    881          *
    882          * Note that for at-least-this-length wildcard algorithms, the output
    883          * length is set to the shortest allowed length, which allows us to
    884          * calculate the most restrictive tag length for the intersection. */
    885         size_t alg1_len = PSA_MAC_LENGTH(key_type, 0, alg1);
    886         size_t alg2_len = PSA_MAC_LENGTH(key_type, 0, alg2);
    887         size_t restricted_len = alg1_len > alg2_len ? alg1_len : alg2_len;
    888 
    889         /* If both are wildcards, return most restrictive wildcard */
    890         if (((alg1 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) &&
    891             ((alg2 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0)) {
    892             return PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg1, restricted_len);
    893         }
    894 
    895         /* If only one is an at-least-this-length policy, the intersection would
    896          * be the other (fixed-length) policy as long as said fixed length is
    897          * equal to or larger than the shortest allowed length. */
    898         if ((alg1 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) {
    899             return (alg1_len <= alg2_len) ? alg2 : 0;
    900         }
    901         if ((alg2 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) {
    902             return (alg2_len <= alg1_len) ? alg1 : 0;
    903         }
    904 
    905         /* If none of them are wildcards, check whether they define the same tag
    906          * length. This is still possible here when one is default-length and
    907          * the other specific-length. Ensure to always return the
    908          * specific-length version for the intersection. */
    909         if (alg1_len == alg2_len) {
    910             return PSA_ALG_TRUNCATED_MAC(alg1, alg1_len);
    911         }
    912     }
    913     /* If the policies are incompatible, allow nothing. */
    914     return 0;
    915 }
    916 
    917 static int psa_key_algorithm_permits(psa_key_type_t key_type,
    918                                      psa_algorithm_t policy_alg,
    919                                      psa_algorithm_t requested_alg)
    920 {
    921     /* Common case: the policy only allows requested_alg. */
    922     if (requested_alg == policy_alg) {
    923         return 1;
    924     }
    925     /* If policy_alg is a hash-and-sign with a wildcard for the hash,
    926      * and requested_alg is the same hash-and-sign family with any hash,
    927      * then requested_alg is compliant with policy_alg. */
    928     if (PSA_ALG_IS_SIGN_HASH(requested_alg) &&
    929         PSA_ALG_SIGN_GET_HASH(policy_alg) == PSA_ALG_ANY_HASH) {
    930         return (policy_alg & ~PSA_ALG_HASH_MASK) ==
    931                (requested_alg & ~PSA_ALG_HASH_MASK);
    932     }
    933     /* If policy_alg is a wildcard AEAD algorithm of the same base as
    934      * the requested algorithm, check the requested tag length to be
    935      * equal-length or longer than the wildcard-specified length. */
    936     if (PSA_ALG_IS_AEAD(policy_alg) &&
    937         PSA_ALG_IS_AEAD(requested_alg) &&
    938         (PSA_ALG_AEAD_WITH_SHORTENED_TAG(policy_alg, 0) ==
    939          PSA_ALG_AEAD_WITH_SHORTENED_TAG(requested_alg, 0)) &&
    940         ((policy_alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0)) {
    941         return PSA_ALG_AEAD_GET_TAG_LENGTH(policy_alg) <=
    942                PSA_ALG_AEAD_GET_TAG_LENGTH(requested_alg);
    943     }
    944     /* If policy_alg is a MAC algorithm of the same base as the requested
    945      * algorithm, check whether their MAC lengths are compatible. */
    946     if (PSA_ALG_IS_MAC(policy_alg) &&
    947         PSA_ALG_IS_MAC(requested_alg) &&
    948         (PSA_ALG_FULL_LENGTH_MAC(policy_alg) ==
    949          PSA_ALG_FULL_LENGTH_MAC(requested_alg))) {
    950         /* Validate the combination of key type and algorithm. Since the policy
    951          * and requested algorithms are the same, we only need this once. */
    952         if (PSA_SUCCESS != psa_mac_key_can_do(policy_alg, key_type)) {
    953             return 0;
    954         }
    955 
    956         /* Get both the requested output length for the algorithm which is to be
    957          * verified, and the default output length for the base algorithm.
    958          * Note that none of the currently supported algorithms have an output
    959          * length dependent on actual key size, so setting it to a bogus value
    960          * of 0 is currently OK. */
    961         size_t requested_output_length = PSA_MAC_LENGTH(
    962             key_type, 0, requested_alg);
    963         size_t default_output_length = PSA_MAC_LENGTH(
    964             key_type, 0,
    965             PSA_ALG_FULL_LENGTH_MAC(requested_alg));
    966 
    967         /* If the policy is default-length, only allow an algorithm with
    968          * a declared exact-length matching the default. */
    969         if (PSA_MAC_TRUNCATED_LENGTH(policy_alg) == 0) {
    970             return requested_output_length == default_output_length;
    971         }
    972 
    973         /* If the requested algorithm is default-length, allow it if the policy
    974          * length exactly matches the default length. */
    975         if (PSA_MAC_TRUNCATED_LENGTH(requested_alg) == 0 &&
    976             PSA_MAC_TRUNCATED_LENGTH(policy_alg) == default_output_length) {
    977             return 1;
    978         }
    979 
    980         /* If policy_alg is an at-least-this-length wildcard MAC algorithm,
    981          * check for the requested MAC length to be equal to or longer than the
    982          * minimum allowed length. */
    983         if ((policy_alg & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) {
    984             return PSA_MAC_TRUNCATED_LENGTH(policy_alg) <=
    985                    requested_output_length;
    986         }
    987     }
    988     /* If policy_alg is a generic key agreement operation, then using it for
    989      * a key derivation with that key agreement should also be allowed. This
    990      * behaviour is expected to be defined in a future specification version. */
    991     if (PSA_ALG_IS_RAW_KEY_AGREEMENT(policy_alg) &&
    992         PSA_ALG_IS_KEY_AGREEMENT(requested_alg)) {
    993         return PSA_ALG_KEY_AGREEMENT_GET_BASE(requested_alg) ==
    994                policy_alg;
    995     }
    996     /* If it isn't explicitly permitted, it's forbidden. */
    997     return 0;
    998 }
    999 
   1000 /** Test whether a policy permits an algorithm.
   1001  *
   1002  * The caller must test usage flags separately.
   1003  *
   1004  * \note This function requires providing the key type for which the policy is
   1005  *       being validated, since some algorithm policy definitions (e.g. MAC)
   1006  *       have different properties depending on what kind of cipher it is
   1007  *       combined with.
   1008  *
   1009  * \retval PSA_SUCCESS                  When \p alg is a specific algorithm
   1010  *                                      allowed by the \p policy.
   1011  * \retval PSA_ERROR_INVALID_ARGUMENT   When \p alg is not a specific algorithm
   1012  * \retval PSA_ERROR_NOT_PERMITTED      When \p alg is a specific algorithm, but
   1013  *                                      the \p policy does not allow it.
   1014  */
   1015 static psa_status_t psa_key_policy_permits(const psa_key_policy_t *policy,
   1016                                            psa_key_type_t key_type,
   1017                                            psa_algorithm_t alg)
   1018 {
   1019     /* '0' is not a valid algorithm */
   1020     if (alg == 0) {
   1021         return PSA_ERROR_INVALID_ARGUMENT;
   1022     }
   1023 
   1024     /* A requested algorithm cannot be a wildcard. */
   1025     if (PSA_ALG_IS_WILDCARD(alg)) {
   1026         return PSA_ERROR_INVALID_ARGUMENT;
   1027     }
   1028 
   1029     if (psa_key_algorithm_permits(key_type, policy->alg, alg) ||
   1030         psa_key_algorithm_permits(key_type, policy->alg2, alg)) {
   1031         return PSA_SUCCESS;
   1032     } else {
   1033         return PSA_ERROR_NOT_PERMITTED;
   1034     }
   1035 }
   1036 
   1037 /** Restrict a key policy based on a constraint.
   1038  *
   1039  * \note This function requires providing the key type for which the policy is
   1040  *       being restricted, since some algorithm policy definitions (e.g. MAC)
   1041  *       have different properties depending on what kind of cipher it is
   1042  *       combined with.
   1043  *
   1044  * \param[in] key_type      The key type for which to restrict the policy
   1045  * \param[in,out] policy    The policy to restrict.
   1046  * \param[in] constraint    The policy constraint to apply.
   1047  *
   1048  * \retval #PSA_SUCCESS
   1049  *         \c *policy contains the intersection of the original value of
   1050  *         \c *policy and \c *constraint.
   1051  * \retval #PSA_ERROR_INVALID_ARGUMENT
   1052  *         \c key_type, \c *policy and \c *constraint are incompatible.
   1053  *         \c *policy is unchanged.
   1054  */
   1055 static psa_status_t psa_restrict_key_policy(
   1056     psa_key_type_t key_type,
   1057     psa_key_policy_t *policy,
   1058     const psa_key_policy_t *constraint)
   1059 {
   1060     psa_algorithm_t intersection_alg =
   1061         psa_key_policy_algorithm_intersection(key_type, policy->alg,
   1062                                               constraint->alg);
   1063     psa_algorithm_t intersection_alg2 =
   1064         psa_key_policy_algorithm_intersection(key_type, policy->alg2,
   1065                                               constraint->alg2);
   1066     if (intersection_alg == 0 && policy->alg != 0 && constraint->alg != 0) {
   1067         return PSA_ERROR_INVALID_ARGUMENT;
   1068     }
   1069     if (intersection_alg2 == 0 && policy->alg2 != 0 && constraint->alg2 != 0) {
   1070         return PSA_ERROR_INVALID_ARGUMENT;
   1071     }
   1072     policy->usage &= constraint->usage;
   1073     policy->alg = intersection_alg;
   1074     policy->alg2 = intersection_alg2;
   1075     return PSA_SUCCESS;
   1076 }
   1077 
   1078 /** Get the description of a key given its identifier and policy constraints
   1079  *  and lock it.
   1080  *
   1081  * The key must have allow all the usage flags set in \p usage. If \p alg is
   1082  * nonzero, the key must allow operations with this algorithm. If \p alg is
   1083  * zero, the algorithm is not checked.
   1084  *
   1085  * In case of a persistent key, the function loads the description of the key
   1086  * into a key slot if not already done.
   1087  *
   1088  * On success, the returned key slot has been registered for reading.
   1089  * It is the responsibility of the caller to then unregister
   1090  * once they have finished reading the contents of the slot.
   1091  * The caller unregisters by calling psa_unregister_read() or
   1092  * psa_unregister_read_under_mutex(). psa_unregister_read() must be called
   1093  * if and only if the caller already holds the global key slot mutex
   1094  * (when mutexes are enabled). psa_unregister_read_under_mutex() encapsulates
   1095  * the unregister with mutex lock and unlock operations.
   1096  */
   1097 static psa_status_t psa_get_and_lock_key_slot_with_policy(
   1098     mbedtls_svc_key_id_t key,
   1099     psa_key_slot_t **p_slot,
   1100     psa_key_usage_t usage,
   1101     psa_algorithm_t alg)
   1102 {
   1103     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   1104     psa_key_slot_t *slot = NULL;
   1105 
   1106     status = psa_get_and_lock_key_slot(key, p_slot);
   1107     if (status != PSA_SUCCESS) {
   1108         return status;
   1109     }
   1110     slot = *p_slot;
   1111 
   1112     /* Enforce that usage policy for the key slot contains all the flags
   1113      * required by the usage parameter. There is one exception: public
   1114      * keys can always be exported, so we treat public key objects as
   1115      * if they had the export flag. */
   1116     if (PSA_KEY_TYPE_IS_PUBLIC_KEY(slot->attr.type)) {
   1117         usage &= ~PSA_KEY_USAGE_EXPORT;
   1118     }
   1119 
   1120     if ((slot->attr.policy.usage & usage) != usage) {
   1121         status = PSA_ERROR_NOT_PERMITTED;
   1122         goto error;
   1123     }
   1124 
   1125     /* Enforce that the usage policy permits the requested algorithm. */
   1126     if (alg != 0) {
   1127         status = psa_key_policy_permits(&slot->attr.policy,
   1128                                         slot->attr.type,
   1129                                         alg);
   1130         if (status != PSA_SUCCESS) {
   1131             goto error;
   1132         }
   1133     }
   1134 
   1135     return PSA_SUCCESS;
   1136 
   1137 error:
   1138     *p_slot = NULL;
   1139     psa_unregister_read_under_mutex(slot);
   1140 
   1141     return status;
   1142 }
   1143 
   1144 /** Get a key slot containing a transparent key and lock it.
   1145  *
   1146  * A transparent key is a key for which the key material is directly
   1147  * available, as opposed to a key in a secure element and/or to be used
   1148  * by a secure element.
   1149  *
   1150  * This is a temporary function that may be used instead of
   1151  * psa_get_and_lock_key_slot_with_policy() when there is no opaque key support
   1152  * for a cryptographic operation.
   1153  *
   1154  * On success, the returned key slot has been registered for reading.
   1155  * It is the responsibility of the caller to then unregister
   1156  * once they have finished reading the contents of the slot.
   1157  * The caller unregisters by calling psa_unregister_read() or
   1158  * psa_unregister_read_under_mutex(). psa_unregister_read() must be called
   1159  * if and only if the caller already holds the global key slot mutex
   1160  * (when mutexes are enabled). psa_unregister_read_under_mutex() encapsulates
   1161  * psa_unregister_read() with mutex lock and unlock operations.
   1162  */
   1163 static psa_status_t psa_get_and_lock_transparent_key_slot_with_policy(
   1164     mbedtls_svc_key_id_t key,
   1165     psa_key_slot_t **p_slot,
   1166     psa_key_usage_t usage,
   1167     psa_algorithm_t alg)
   1168 {
   1169     psa_status_t status = psa_get_and_lock_key_slot_with_policy(key, p_slot,
   1170                                                                 usage, alg);
   1171     if (status != PSA_SUCCESS) {
   1172         return status;
   1173     }
   1174 
   1175     if (psa_key_lifetime_is_external((*p_slot)->attr.lifetime)) {
   1176         psa_unregister_read_under_mutex(*p_slot);
   1177         *p_slot = NULL;
   1178         return PSA_ERROR_NOT_SUPPORTED;
   1179     }
   1180 
   1181     return PSA_SUCCESS;
   1182 }
   1183 
   1184 psa_status_t psa_remove_key_data_from_memory(psa_key_slot_t *slot)
   1185 {
   1186 #if defined(MBEDTLS_PSA_STATIC_KEY_SLOTS)
   1187     if (slot->key.bytes > 0) {
   1188         mbedtls_platform_zeroize(slot->key.data, MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE);
   1189     }
   1190 #else
   1191     if (slot->key.data != NULL) {
   1192         mbedtls_zeroize_and_free(slot->key.data, slot->key.bytes);
   1193     }
   1194 
   1195     slot->key.data = NULL;
   1196 #endif /* MBEDTLS_PSA_STATIC_KEY_SLOTS */
   1197 
   1198     slot->key.bytes = 0;
   1199 
   1200     return PSA_SUCCESS;
   1201 }
   1202 
   1203 /** Completely wipe a slot in memory, including its policy.
   1204  * Persistent storage is not affected. */
   1205 psa_status_t psa_wipe_key_slot(psa_key_slot_t *slot)
   1206 {
   1207     psa_status_t status = psa_remove_key_data_from_memory(slot);
   1208 
   1209     /*
   1210      * As the return error code may not be handled in case of multiple errors,
   1211      * do our best to report an unexpected amount of registered readers or
   1212      * an unexpected state.
   1213      * Assert with MBEDTLS_TEST_HOOK_TEST_ASSERT that the slot is valid for
   1214      * wiping.
   1215      * if the MBEDTLS_TEST_HOOKS configuration option is enabled and the
   1216      * function is called as part of the execution of a test suite, the
   1217      * execution of the test suite is stopped in error if the assertion fails.
   1218      */
   1219     switch (slot->state) {
   1220         case PSA_SLOT_FULL:
   1221         /* In this state psa_wipe_key_slot() must only be called if the
   1222          * caller is the last reader. */
   1223         case PSA_SLOT_PENDING_DELETION:
   1224             /* In this state psa_wipe_key_slot() must only be called if the
   1225              * caller is the last reader. */
   1226             if (slot->var.occupied.registered_readers != 1) {
   1227                 MBEDTLS_TEST_HOOK_TEST_ASSERT(slot->var.occupied.registered_readers == 1);
   1228                 status = PSA_ERROR_CORRUPTION_DETECTED;
   1229             }
   1230             break;
   1231         case PSA_SLOT_FILLING:
   1232             /* In this state registered_readers must be 0. */
   1233             if (slot->var.occupied.registered_readers != 0) {
   1234                 MBEDTLS_TEST_HOOK_TEST_ASSERT(slot->var.occupied.registered_readers == 0);
   1235                 status = PSA_ERROR_CORRUPTION_DETECTED;
   1236             }
   1237             break;
   1238         case PSA_SLOT_EMPTY:
   1239             /* The slot is already empty, it cannot be wiped. */
   1240             MBEDTLS_TEST_HOOK_TEST_ASSERT(slot->state != PSA_SLOT_EMPTY);
   1241             status = PSA_ERROR_CORRUPTION_DETECTED;
   1242             break;
   1243         default:
   1244             /* The slot's state is invalid. */
   1245             status = PSA_ERROR_CORRUPTION_DETECTED;
   1246     }
   1247 
   1248 #if defined(MBEDTLS_PSA_KEY_STORE_DYNAMIC)
   1249     size_t slice_index = slot->slice_index;
   1250 #endif /* MBEDTLS_PSA_KEY_STORE_DYNAMIC */
   1251 
   1252 
   1253     /* Multipart operations may still be using the key. This is safe
   1254      * because all multipart operation objects are independent from
   1255      * the key slot: if they need to access the key after the setup
   1256      * phase, they have a copy of the key. Note that this means that
   1257      * key material can linger until all operations are completed. */
   1258     /* At this point, key material and other type-specific content has
   1259      * been wiped. Clear remaining metadata. We can call memset and not
   1260      * zeroize because the metadata is not particularly sensitive.
   1261      * This memset also sets the slot's state to PSA_SLOT_EMPTY. */
   1262     memset(slot, 0, sizeof(*slot));
   1263 
   1264 #if defined(MBEDTLS_PSA_KEY_STORE_DYNAMIC)
   1265     /* If the slot is already corrupted, something went deeply wrong,
   1266      * like a thread still using the slot or a stray pointer leading
   1267      * to the slot's memory being used for another object. Let the slot
   1268      * leak rather than make the corruption worse. */
   1269     if (status == PSA_SUCCESS) {
   1270         status = psa_free_key_slot(slice_index, slot);
   1271     }
   1272 #endif /* MBEDTLS_PSA_KEY_STORE_DYNAMIC */
   1273 
   1274     return status;
   1275 }
   1276 
   1277 psa_status_t psa_destroy_key(mbedtls_svc_key_id_t key)
   1278 {
   1279     psa_key_slot_t *slot;
   1280     psa_status_t status; /* status of the last operation */
   1281     psa_status_t overall_status = PSA_SUCCESS;
   1282 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1283     psa_se_drv_table_entry_t *driver;
   1284 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1285 
   1286     if (mbedtls_svc_key_id_is_null(key)) {
   1287         return PSA_SUCCESS;
   1288     }
   1289 
   1290     /*
   1291      * Get the description of the key in a key slot, and register to read it.
   1292      * In the case of a persistent key, this will load the key description
   1293      * from persistent memory if not done yet.
   1294      * We cannot avoid this loading as without it we don't know if
   1295      * the key is operated by an SE or not and this information is needed by
   1296      * the current implementation. */
   1297     status = psa_get_and_lock_key_slot(key, &slot);
   1298     if (status != PSA_SUCCESS) {
   1299         return status;
   1300     }
   1301 
   1302 #if defined(MBEDTLS_THREADING_C)
   1303     /* We cannot unlock between setting the state to PENDING_DELETION
   1304      * and destroying the key in storage, as otherwise another thread
   1305      * could load the key into a new slot and the key will not be
   1306      * fully destroyed. */
   1307     PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_lock(
   1308                                     &mbedtls_threading_key_slot_mutex));
   1309 
   1310     if (slot->state == PSA_SLOT_PENDING_DELETION) {
   1311         /* Another thread has destroyed the key between us locking the slot
   1312          * and us gaining the mutex. Unregister from the slot,
   1313          * and report that the key does not exist. */
   1314         status = psa_unregister_read(slot);
   1315 
   1316         PSA_THREADING_CHK_RET(mbedtls_mutex_unlock(
   1317                                   &mbedtls_threading_key_slot_mutex));
   1318         return (status == PSA_SUCCESS) ? PSA_ERROR_INVALID_HANDLE : status;
   1319     }
   1320 #endif
   1321     /* Set the key slot containing the key description's state to
   1322      * PENDING_DELETION. This stops new operations from registering
   1323      * to read the slot. Current readers can safely continue to access
   1324      * the key within the slot; the last registered reader will
   1325      * automatically wipe the slot when they call psa_unregister_read().
   1326      * If the key is persistent, we can now delete the copy of the key
   1327      * from memory. If the key is opaque, we require the driver to
   1328      * deal with the deletion. */
   1329     overall_status = psa_key_slot_state_transition(slot, PSA_SLOT_FULL,
   1330                                                    PSA_SLOT_PENDING_DELETION);
   1331 
   1332     if (overall_status != PSA_SUCCESS) {
   1333         goto exit;
   1334     }
   1335 
   1336     if (PSA_KEY_LIFETIME_IS_READ_ONLY(slot->attr.lifetime)) {
   1337         /* Refuse the destruction of a read-only key (which may or may not work
   1338          * if we attempt it, depending on whether the key is merely read-only
   1339          * by policy or actually physically read-only).
   1340          * Just do the best we can, which is to wipe the copy in memory
   1341          * (done in this function's cleanup code). */
   1342         overall_status = PSA_ERROR_NOT_PERMITTED;
   1343         goto exit;
   1344     }
   1345 
   1346 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1347     driver = psa_get_se_driver_entry(slot->attr.lifetime);
   1348     if (driver != NULL) {
   1349         /* For a key in a secure element, we need to do three things:
   1350          * remove the key file in internal storage, destroy the
   1351          * key inside the secure element, and update the driver's
   1352          * persistent data. Start a transaction that will encompass these
   1353          * three actions. */
   1354         psa_crypto_prepare_transaction(PSA_CRYPTO_TRANSACTION_DESTROY_KEY);
   1355         psa_crypto_transaction.key.lifetime = slot->attr.lifetime;
   1356         psa_crypto_transaction.key.slot = psa_key_slot_get_slot_number(slot);
   1357         psa_crypto_transaction.key.id = slot->attr.id;
   1358         status = psa_crypto_save_transaction();
   1359         if (status != PSA_SUCCESS) {
   1360             (void) psa_crypto_stop_transaction();
   1361             /* We should still try to destroy the key in the secure
   1362              * element and the key metadata in storage. This is especially
   1363              * important if the error is that the storage is full.
   1364              * But how to do it exactly without risking an inconsistent
   1365              * state after a reset?
   1366              * https://github.com/ARMmbed/mbed-crypto/issues/215
   1367              */
   1368             overall_status = status;
   1369             goto exit;
   1370         }
   1371 
   1372         status = psa_destroy_se_key(driver,
   1373                                     psa_key_slot_get_slot_number(slot));
   1374         if (overall_status == PSA_SUCCESS) {
   1375             overall_status = status;
   1376         }
   1377     }
   1378 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1379 
   1380 #if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C)
   1381     if (!PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) {
   1382         /* Destroy the copy of the persistent key from storage.
   1383          * The slot will still hold a copy of the key until the last reader
   1384          * unregisters. */
   1385         status = psa_destroy_persistent_key(slot->attr.id);
   1386         if (overall_status == PSA_SUCCESS) {
   1387             overall_status = status;
   1388         }
   1389     }
   1390 #endif /* defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) */
   1391 
   1392 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1393     if (driver != NULL) {
   1394         status = psa_save_se_persistent_data(driver);
   1395         if (overall_status == PSA_SUCCESS) {
   1396             overall_status = status;
   1397         }
   1398         status = psa_crypto_stop_transaction();
   1399         if (overall_status == PSA_SUCCESS) {
   1400             overall_status = status;
   1401         }
   1402     }
   1403 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1404 
   1405 exit:
   1406     /* Unregister from reading the slot. If we are the last active reader
   1407      * then this will wipe the slot. */
   1408     status = psa_unregister_read(slot);
   1409     /* Prioritize CORRUPTION_DETECTED from unregistering over
   1410      * a storage error. */
   1411     if (status != PSA_SUCCESS) {
   1412         overall_status = status;
   1413     }
   1414 
   1415 #if defined(MBEDTLS_THREADING_C)
   1416     /* Don't overwrite existing errors if the unlock fails. */
   1417     status = overall_status;
   1418     PSA_THREADING_CHK_RET(mbedtls_mutex_unlock(
   1419                               &mbedtls_threading_key_slot_mutex));
   1420 #endif
   1421 
   1422     return overall_status;
   1423 }
   1424 
   1425 /** Retrieve all the publicly-accessible attributes of a key.
   1426  */
   1427 psa_status_t psa_get_key_attributes(mbedtls_svc_key_id_t key,
   1428                                     psa_key_attributes_t *attributes)
   1429 {
   1430     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   1431     psa_key_slot_t *slot;
   1432 
   1433     psa_reset_key_attributes(attributes);
   1434 
   1435     status = psa_get_and_lock_key_slot_with_policy(key, &slot, 0, 0);
   1436     if (status != PSA_SUCCESS) {
   1437         return status;
   1438     }
   1439 
   1440     *attributes = slot->attr;
   1441 
   1442 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1443     if (psa_get_se_driver_entry(slot->attr.lifetime) != NULL) {
   1444         psa_set_key_slot_number(attributes,
   1445                                 psa_key_slot_get_slot_number(slot));
   1446     }
   1447 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1448 
   1449     return psa_unregister_read_under_mutex(slot);
   1450 }
   1451 
   1452 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1453 psa_status_t psa_get_key_slot_number(
   1454     const psa_key_attributes_t *attributes,
   1455     psa_key_slot_number_t *slot_number)
   1456 {
   1457     if (attributes->has_slot_number) {
   1458         *slot_number = attributes->slot_number;
   1459         return PSA_SUCCESS;
   1460     } else {
   1461         return PSA_ERROR_INVALID_ARGUMENT;
   1462     }
   1463 }
   1464 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1465 
   1466 static psa_status_t psa_export_key_buffer_internal(const uint8_t *key_buffer,
   1467                                                    size_t key_buffer_size,
   1468                                                    uint8_t *data,
   1469                                                    size_t data_size,
   1470                                                    size_t *data_length)
   1471 {
   1472     if (key_buffer_size > data_size) {
   1473         return PSA_ERROR_BUFFER_TOO_SMALL;
   1474     }
   1475     memcpy(data, key_buffer, key_buffer_size);
   1476     memset(data + key_buffer_size, 0,
   1477            data_size - key_buffer_size);
   1478     *data_length = key_buffer_size;
   1479     return PSA_SUCCESS;
   1480 }
   1481 
   1482 psa_status_t psa_export_key_internal(
   1483     const psa_key_attributes_t *attributes,
   1484     const uint8_t *key_buffer, size_t key_buffer_size,
   1485     uint8_t *data, size_t data_size, size_t *data_length)
   1486 {
   1487     psa_key_type_t type = attributes->type;
   1488 
   1489     if (key_type_is_raw_bytes(type) ||
   1490         PSA_KEY_TYPE_IS_RSA(type)   ||
   1491         PSA_KEY_TYPE_IS_ECC(type)   ||
   1492         PSA_KEY_TYPE_IS_DH(type)) {
   1493         return psa_export_key_buffer_internal(
   1494             key_buffer, key_buffer_size,
   1495             data, data_size, data_length);
   1496     } else {
   1497         /* This shouldn't happen in the reference implementation, but
   1498            it is valid for a special-purpose implementation to omit
   1499            support for exporting certain key types. */
   1500         return PSA_ERROR_NOT_SUPPORTED;
   1501     }
   1502 }
   1503 
   1504 psa_status_t psa_export_key(mbedtls_svc_key_id_t key,
   1505                             uint8_t *data_external,
   1506                             size_t data_size,
   1507                             size_t *data_length)
   1508 {
   1509     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   1510     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   1511     psa_key_slot_t *slot;
   1512     LOCAL_OUTPUT_DECLARE(data_external, data);
   1513 
   1514     /* Reject a zero-length output buffer now, since this can never be a
   1515      * valid key representation. This way we know that data must be a valid
   1516      * pointer and we can do things like memset(data, ..., data_size). */
   1517     if (data_size == 0) {
   1518         return PSA_ERROR_BUFFER_TOO_SMALL;
   1519     }
   1520 
   1521     /* Set the key to empty now, so that even when there are errors, we always
   1522      * set data_length to a value between 0 and data_size. On error, setting
   1523      * the key to empty is a good choice because an empty key representation is
   1524      * unlikely to be accepted anywhere. */
   1525     *data_length = 0;
   1526 
   1527     /* Export requires the EXPORT flag. There is an exception for public keys,
   1528      * which don't require any flag, but
   1529      * psa_get_and_lock_key_slot_with_policy() takes care of this.
   1530      */
   1531     status = psa_get_and_lock_key_slot_with_policy(key, &slot,
   1532                                                    PSA_KEY_USAGE_EXPORT, 0);
   1533     if (status != PSA_SUCCESS) {
   1534         return status;
   1535     }
   1536 
   1537     LOCAL_OUTPUT_ALLOC(data_external, data_size, data);
   1538 
   1539     status = psa_driver_wrapper_export_key(&slot->attr,
   1540                                            slot->key.data, slot->key.bytes,
   1541                                            data, data_size, data_length);
   1542 
   1543 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   1544 exit:
   1545 #endif
   1546     unlock_status = psa_unregister_read_under_mutex(slot);
   1547 
   1548     LOCAL_OUTPUT_FREE(data_external, data);
   1549     return (status == PSA_SUCCESS) ? unlock_status : status;
   1550 }
   1551 
   1552 psa_status_t psa_export_public_key_internal(
   1553     const psa_key_attributes_t *attributes,
   1554     const uint8_t *key_buffer,
   1555     size_t key_buffer_size,
   1556     uint8_t *data,
   1557     size_t data_size,
   1558     size_t *data_length)
   1559 {
   1560     psa_key_type_t type = attributes->type;
   1561 
   1562     if (PSA_KEY_TYPE_IS_PUBLIC_KEY(type) &&
   1563         (PSA_KEY_TYPE_IS_RSA(type) || PSA_KEY_TYPE_IS_ECC(type) ||
   1564          PSA_KEY_TYPE_IS_DH(type))) {
   1565         /* Exporting public -> public */
   1566         return psa_export_key_buffer_internal(
   1567             key_buffer, key_buffer_size,
   1568             data, data_size, data_length);
   1569     } else if (PSA_KEY_TYPE_IS_RSA(type)) {
   1570 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_EXPORT) || \
   1571         defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY)
   1572         return mbedtls_psa_rsa_export_public_key(attributes,
   1573                                                  key_buffer,
   1574                                                  key_buffer_size,
   1575                                                  data,
   1576                                                  data_size,
   1577                                                  data_length);
   1578 #else
   1579         /* We don't know how to convert a private RSA key to public. */
   1580         return PSA_ERROR_NOT_SUPPORTED;
   1581 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_EXPORT) ||
   1582         * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */
   1583     } else if (PSA_KEY_TYPE_IS_ECC(type)) {
   1584 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_EXPORT) || \
   1585         defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY)
   1586         return mbedtls_psa_ecp_export_public_key(attributes,
   1587                                                  key_buffer,
   1588                                                  key_buffer_size,
   1589                                                  data,
   1590                                                  data_size,
   1591                                                  data_length);
   1592 #else
   1593         /* We don't know how to convert a private ECC key to public */
   1594         return PSA_ERROR_NOT_SUPPORTED;
   1595 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_EXPORT) ||
   1596         * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) */
   1597     } else if (PSA_KEY_TYPE_IS_DH(type)) {
   1598 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_EXPORT) || \
   1599         defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_PUBLIC_KEY)
   1600         return mbedtls_psa_ffdh_export_public_key(attributes,
   1601                                                   key_buffer,
   1602                                                   key_buffer_size,
   1603                                                   data, data_size,
   1604                                                   data_length);
   1605 #else
   1606         return PSA_ERROR_NOT_SUPPORTED;
   1607 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_EXPORT) ||
   1608         * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_PUBLIC_KEY) */
   1609     } else {
   1610         (void) key_buffer;
   1611         (void) key_buffer_size;
   1612         (void) data;
   1613         (void) data_size;
   1614         (void) data_length;
   1615         return PSA_ERROR_NOT_SUPPORTED;
   1616     }
   1617 }
   1618 
   1619 psa_status_t psa_export_public_key(mbedtls_svc_key_id_t key,
   1620                                    uint8_t *data_external,
   1621                                    size_t data_size,
   1622                                    size_t *data_length)
   1623 {
   1624     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   1625     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   1626     psa_key_slot_t *slot;
   1627 
   1628     LOCAL_OUTPUT_DECLARE(data_external, data);
   1629 
   1630     /* Reject a zero-length output buffer now, since this can never be a
   1631      * valid key representation. This way we know that data must be a valid
   1632      * pointer and we can do things like memset(data, ..., data_size). */
   1633     if (data_size == 0) {
   1634         return PSA_ERROR_BUFFER_TOO_SMALL;
   1635     }
   1636 
   1637     /* Set the key to empty now, so that even when there are errors, we always
   1638      * set data_length to a value between 0 and data_size. On error, setting
   1639      * the key to empty is a good choice because an empty key representation is
   1640      * unlikely to be accepted anywhere. */
   1641     *data_length = 0;
   1642 
   1643     /* Exporting a public key doesn't require a usage flag. */
   1644     status = psa_get_and_lock_key_slot_with_policy(key, &slot, 0, 0);
   1645     if (status != PSA_SUCCESS) {
   1646         return status;
   1647     }
   1648 
   1649     LOCAL_OUTPUT_ALLOC(data_external, data_size, data);
   1650 
   1651     if (!PSA_KEY_TYPE_IS_ASYMMETRIC(slot->attr.type)) {
   1652         status = PSA_ERROR_INVALID_ARGUMENT;
   1653         goto exit;
   1654     }
   1655 
   1656     status = psa_driver_wrapper_export_public_key(
   1657         &slot->attr, slot->key.data, slot->key.bytes,
   1658         data, data_size, data_length);
   1659 
   1660 exit:
   1661     unlock_status = psa_unregister_read_under_mutex(slot);
   1662 
   1663     LOCAL_OUTPUT_FREE(data_external, data);
   1664     return (status == PSA_SUCCESS) ? unlock_status : status;
   1665 }
   1666 
   1667 /** Validate that a key policy is internally well-formed.
   1668  *
   1669  * This function only rejects invalid policies. It does not validate the
   1670  * consistency of the policy with respect to other attributes of the key
   1671  * such as the key type.
   1672  */
   1673 static psa_status_t psa_validate_key_policy(const psa_key_policy_t *policy)
   1674 {
   1675     if ((policy->usage & ~(PSA_KEY_USAGE_EXPORT |
   1676                            PSA_KEY_USAGE_COPY |
   1677                            PSA_KEY_USAGE_ENCRYPT |
   1678                            PSA_KEY_USAGE_DECRYPT |
   1679                            PSA_KEY_USAGE_SIGN_MESSAGE |
   1680                            PSA_KEY_USAGE_VERIFY_MESSAGE |
   1681                            PSA_KEY_USAGE_SIGN_HASH |
   1682                            PSA_KEY_USAGE_VERIFY_HASH |
   1683                            PSA_KEY_USAGE_VERIFY_DERIVATION |
   1684                            PSA_KEY_USAGE_DERIVE)) != 0) {
   1685         return PSA_ERROR_INVALID_ARGUMENT;
   1686     }
   1687 
   1688     return PSA_SUCCESS;
   1689 }
   1690 
   1691 /** Validate the internal consistency of key attributes.
   1692  *
   1693  * This function only rejects invalid attribute values. If does not
   1694  * validate the consistency of the attributes with any key data that may
   1695  * be involved in the creation of the key.
   1696  *
   1697  * Call this function early in the key creation process.
   1698  *
   1699  * \param[in] attributes    Key attributes for the new key.
   1700  * \param[out] p_drv        On any return, the driver for the key, if any.
   1701  *                          NULL for a transparent key.
   1702  *
   1703  */
   1704 static psa_status_t psa_validate_key_attributes(
   1705     const psa_key_attributes_t *attributes,
   1706     psa_se_drv_table_entry_t **p_drv)
   1707 {
   1708     psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
   1709     psa_key_lifetime_t lifetime = psa_get_key_lifetime(attributes);
   1710     mbedtls_svc_key_id_t key = psa_get_key_id(attributes);
   1711 
   1712     status = psa_validate_key_location(lifetime, p_drv);
   1713     if (status != PSA_SUCCESS) {
   1714         return status;
   1715     }
   1716 
   1717     status = psa_validate_key_persistence(lifetime);
   1718     if (status != PSA_SUCCESS) {
   1719         return status;
   1720     }
   1721 
   1722     if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) {
   1723         if (MBEDTLS_SVC_KEY_ID_GET_KEY_ID(key) != 0) {
   1724             return PSA_ERROR_INVALID_ARGUMENT;
   1725         }
   1726     } else {
   1727         if (!psa_is_valid_key_id(psa_get_key_id(attributes), 0)) {
   1728             return PSA_ERROR_INVALID_ARGUMENT;
   1729         }
   1730     }
   1731 
   1732     status = psa_validate_key_policy(&attributes->policy);
   1733     if (status != PSA_SUCCESS) {
   1734         return status;
   1735     }
   1736 
   1737     /* Refuse to create overly large keys.
   1738      * Note that this doesn't trigger on import if the attributes don't
   1739      * explicitly specify a size (so psa_get_key_bits returns 0), so
   1740      * psa_import_key() needs its own checks. */
   1741     if (psa_get_key_bits(attributes) > PSA_MAX_KEY_BITS) {
   1742         return PSA_ERROR_NOT_SUPPORTED;
   1743     }
   1744 
   1745     return PSA_SUCCESS;
   1746 }
   1747 
   1748 /** Prepare a key slot to receive key material.
   1749  *
   1750  * This function allocates a key slot and sets its metadata.
   1751  *
   1752  * If this function fails, call psa_fail_key_creation().
   1753  *
   1754  * This function is intended to be used as follows:
   1755  * -# Call psa_start_key_creation() to allocate a key slot, prepare
   1756  *    it with the specified attributes, and in case of a volatile key assign it
   1757  *    a volatile key identifier.
   1758  * -# Populate the slot with the key material.
   1759  * -# Call psa_finish_key_creation() to finalize the creation of the slot.
   1760  * In case of failure at any step, stop the sequence and call
   1761  * psa_fail_key_creation().
   1762  *
   1763  * On success, the key slot's state is PSA_SLOT_FILLING.
   1764  * It is the responsibility of the caller to change the slot's state to
   1765  * PSA_SLOT_EMPTY/FULL once key creation has finished.
   1766  *
   1767  * \param method            An identification of the calling function.
   1768  * \param[in] attributes    Key attributes for the new key.
   1769  * \param[out] p_slot       On success, a pointer to the prepared slot.
   1770  * \param[out] p_drv        On any return, the driver for the key, if any.
   1771  *                          NULL for a transparent key.
   1772  *
   1773  * \retval #PSA_SUCCESS
   1774  *         The key slot is ready to receive key material.
   1775  * \return If this function fails, the key slot is an invalid state.
   1776  *         You must call psa_fail_key_creation() to wipe and free the slot.
   1777  */
   1778 static psa_status_t psa_start_key_creation(
   1779     psa_key_creation_method_t method,
   1780     const psa_key_attributes_t *attributes,
   1781     psa_key_slot_t **p_slot,
   1782     psa_se_drv_table_entry_t **p_drv)
   1783 {
   1784     psa_status_t status;
   1785 
   1786     (void) method;
   1787     *p_drv = NULL;
   1788 
   1789     status = psa_validate_key_attributes(attributes, p_drv);
   1790     if (status != PSA_SUCCESS) {
   1791         return status;
   1792     }
   1793 
   1794     int key_is_volatile = PSA_KEY_LIFETIME_IS_VOLATILE(attributes->lifetime);
   1795     psa_key_id_t volatile_key_id;
   1796 
   1797 #if defined(MBEDTLS_THREADING_C)
   1798     PSA_THREADING_CHK_RET(mbedtls_mutex_lock(
   1799                               &mbedtls_threading_key_slot_mutex));
   1800 #endif
   1801     status = psa_reserve_free_key_slot(
   1802         key_is_volatile ? &volatile_key_id : NULL,
   1803         p_slot);
   1804 #if defined(MBEDTLS_THREADING_C)
   1805     PSA_THREADING_CHK_RET(mbedtls_mutex_unlock(
   1806                               &mbedtls_threading_key_slot_mutex));
   1807 #endif
   1808     if (status != PSA_SUCCESS) {
   1809         return status;
   1810     }
   1811     psa_key_slot_t *slot = *p_slot;
   1812 
   1813     /* We're storing the declared bit-size of the key. It's up to each
   1814      * creation mechanism to verify that this information is correct.
   1815      * It's automatically correct for mechanisms that use the bit-size as
   1816      * an input (generate, device) but not for those where the bit-size
   1817      * is optional (import, copy). In case of a volatile key, assign it the
   1818      * volatile key identifier associated to the slot returned to contain its
   1819      * definition. */
   1820 
   1821     slot->attr = *attributes;
   1822     if (key_is_volatile) {
   1823 #if !defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER)
   1824         slot->attr.id = volatile_key_id;
   1825 #else
   1826         slot->attr.id.key_id = volatile_key_id;
   1827 #endif
   1828     }
   1829 
   1830 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1831     /* For a key in a secure element, we need to do three things
   1832      * when creating or registering a persistent key:
   1833      * create the key file in internal storage, create the
   1834      * key inside the secure element, and update the driver's
   1835      * persistent data. This is done by starting a transaction that will
   1836      * encompass these three actions.
   1837      * For registering a volatile key, we just need to find an appropriate
   1838      * slot number inside the SE. Since the key is designated volatile, creating
   1839      * a transaction is not required. */
   1840     /* The first thing to do is to find a slot number for the new key.
   1841      * We save the slot number in persistent storage as part of the
   1842      * transaction data. It will be needed to recover if the power
   1843      * fails during the key creation process, to clean up on the secure
   1844      * element side after restarting. Obtaining a slot number from the
   1845      * secure element driver updates its persistent state, but we do not yet
   1846      * save the driver's persistent state, so that if the power fails,
   1847      * we can roll back to a state where the key doesn't exist. */
   1848     if (*p_drv != NULL) {
   1849         psa_key_slot_number_t slot_number;
   1850         status = psa_find_se_slot_for_key(attributes, method, *p_drv,
   1851                                           &slot_number);
   1852         if (status != PSA_SUCCESS) {
   1853             return status;
   1854         }
   1855 
   1856         if (!PSA_KEY_LIFETIME_IS_VOLATILE(attributes->lifetime)) {
   1857             psa_crypto_prepare_transaction(PSA_CRYPTO_TRANSACTION_CREATE_KEY);
   1858             psa_crypto_transaction.key.lifetime = slot->attr.lifetime;
   1859             psa_crypto_transaction.key.slot = slot_number;
   1860             psa_crypto_transaction.key.id = slot->attr.id;
   1861             status = psa_crypto_save_transaction();
   1862             if (status != PSA_SUCCESS) {
   1863                 (void) psa_crypto_stop_transaction();
   1864                 return status;
   1865             }
   1866         }
   1867 
   1868         status = psa_copy_key_material_into_slot(
   1869             slot, (uint8_t *) (&slot_number), sizeof(slot_number));
   1870         if (status != PSA_SUCCESS) {
   1871             return status;
   1872         }
   1873     }
   1874 
   1875     if (*p_drv == NULL && method == PSA_KEY_CREATION_REGISTER) {
   1876         /* Key registration only makes sense with a secure element. */
   1877         return PSA_ERROR_INVALID_ARGUMENT;
   1878     }
   1879 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1880 
   1881     return PSA_SUCCESS;
   1882 }
   1883 
   1884 /** Finalize the creation of a key once its key material has been set.
   1885  *
   1886  * This entails writing the key to persistent storage.
   1887  *
   1888  * If this function fails, call psa_fail_key_creation().
   1889  * See the documentation of psa_start_key_creation() for the intended use
   1890  * of this function.
   1891  *
   1892  * If the finalization succeeds, the function sets the key slot's state to
   1893  * PSA_SLOT_FULL, and the key slot can no longer be accessed as part of the
   1894  * key creation process.
   1895  *
   1896  * \param[in,out] slot  Pointer to the slot with key material.
   1897  * \param[in] driver    The secure element driver for the key,
   1898  *                      or NULL for a transparent key.
   1899  * \param[out] key      On success, identifier of the key. Note that the
   1900  *                      key identifier is also stored in the key slot.
   1901  *
   1902  * \retval #PSA_SUCCESS
   1903  *         The key was successfully created.
   1904  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
   1905  * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription
   1906  * \retval #PSA_ERROR_ALREADY_EXISTS \emptydescription
   1907  * \retval #PSA_ERROR_DATA_INVALID \emptydescription
   1908  * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription
   1909  * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription
   1910  *
   1911  * \return If this function fails, the key slot is an invalid state.
   1912  *         You must call psa_fail_key_creation() to wipe and free the slot.
   1913  */
   1914 static psa_status_t psa_finish_key_creation(
   1915     psa_key_slot_t *slot,
   1916     psa_se_drv_table_entry_t *driver,
   1917     mbedtls_svc_key_id_t *key)
   1918 {
   1919     psa_status_t status = PSA_SUCCESS;
   1920     (void) slot;
   1921     (void) driver;
   1922 
   1923 #if defined(MBEDTLS_THREADING_C)
   1924     PSA_THREADING_CHK_RET(mbedtls_mutex_lock(
   1925                               &mbedtls_threading_key_slot_mutex));
   1926 #endif
   1927 
   1928 #if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C)
   1929     if (!PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) {
   1930 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1931         if (driver != NULL) {
   1932             psa_se_key_data_storage_t data;
   1933             psa_key_slot_number_t slot_number =
   1934                 psa_key_slot_get_slot_number(slot);
   1935 
   1936             MBEDTLS_STATIC_ASSERT(sizeof(slot_number) ==
   1937                                   sizeof(data.slot_number),
   1938                                   "Slot number size does not match psa_se_key_data_storage_t");
   1939 
   1940             memcpy(&data.slot_number, &slot_number, sizeof(slot_number));
   1941             status = psa_save_persistent_key(&slot->attr,
   1942                                              (uint8_t *) &data,
   1943                                              sizeof(data));
   1944         } else
   1945 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1946         {
   1947             /* Key material is saved in export representation in the slot, so
   1948              * just pass the slot buffer for storage. */
   1949             status = psa_save_persistent_key(&slot->attr,
   1950                                              slot->key.data,
   1951                                              slot->key.bytes);
   1952         }
   1953     }
   1954 #endif /* defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) */
   1955 
   1956 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   1957     /* Finish the transaction for a key creation. This does not
   1958      * happen when registering an existing key. Detect this case
   1959      * by checking whether a transaction is in progress (actual
   1960      * creation of a persistent key in a secure element requires a transaction,
   1961      * but registration or volatile key creation doesn't use one). */
   1962     if (driver != NULL &&
   1963         psa_crypto_transaction.unknown.type == PSA_CRYPTO_TRANSACTION_CREATE_KEY) {
   1964         status = psa_save_se_persistent_data(driver);
   1965         if (status != PSA_SUCCESS) {
   1966             psa_destroy_persistent_key(slot->attr.id);
   1967 
   1968 #if defined(MBEDTLS_THREADING_C)
   1969             PSA_THREADING_CHK_RET(mbedtls_mutex_unlock(
   1970                                       &mbedtls_threading_key_slot_mutex));
   1971 #endif
   1972             return status;
   1973         }
   1974         status = psa_crypto_stop_transaction();
   1975     }
   1976 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   1977 
   1978     if (status == PSA_SUCCESS) {
   1979         *key = slot->attr.id;
   1980         status = psa_key_slot_state_transition(slot, PSA_SLOT_FILLING,
   1981                                                PSA_SLOT_FULL);
   1982         if (status != PSA_SUCCESS) {
   1983             *key = MBEDTLS_SVC_KEY_ID_INIT;
   1984         }
   1985     }
   1986 
   1987 #if defined(MBEDTLS_THREADING_C)
   1988     PSA_THREADING_CHK_RET(mbedtls_mutex_unlock(
   1989                               &mbedtls_threading_key_slot_mutex));
   1990 #endif
   1991     return status;
   1992 }
   1993 
   1994 /** Abort the creation of a key.
   1995  *
   1996  * You may call this function after calling psa_start_key_creation(),
   1997  * or after psa_finish_key_creation() fails. In other circumstances, this
   1998  * function may not clean up persistent storage.
   1999  * See the documentation of psa_start_key_creation() for the intended use
   2000  * of this function. Sets the slot's state to PSA_SLOT_EMPTY.
   2001  *
   2002  * \param[in,out] slot  Pointer to the slot with key material.
   2003  * \param[in] driver    The secure element driver for the key,
   2004  *                      or NULL for a transparent key.
   2005  */
   2006 static void psa_fail_key_creation(psa_key_slot_t *slot,
   2007                                   psa_se_drv_table_entry_t *driver)
   2008 {
   2009     (void) driver;
   2010 
   2011     if (slot == NULL) {
   2012         return;
   2013     }
   2014 
   2015 #if defined(MBEDTLS_THREADING_C)
   2016     /* If the lock operation fails we still wipe the slot.
   2017      * Operations will no longer work after a failed lock,
   2018      * but we still need to wipe the slot of confidential data. */
   2019     mbedtls_mutex_lock(&mbedtls_threading_key_slot_mutex);
   2020 #endif
   2021 
   2022 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   2023     /* TODO: If the key has already been created in the secure
   2024      * element, and the failure happened later (when saving metadata
   2025      * to internal storage), we need to destroy the key in the secure
   2026      * element.
   2027      * https://github.com/ARMmbed/mbed-crypto/issues/217
   2028      */
   2029 
   2030     /* Abort the ongoing transaction if any (there may not be one if
   2031      * the creation process failed before starting one, or if the
   2032      * key creation is a registration of a key in a secure element).
   2033      * Earlier functions must already have done what it takes to undo any
   2034      * partial creation. All that's left is to update the transaction data
   2035      * itself. */
   2036     (void) psa_crypto_stop_transaction();
   2037 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   2038 
   2039     psa_wipe_key_slot(slot);
   2040 
   2041 #if defined(MBEDTLS_THREADING_C)
   2042     mbedtls_mutex_unlock(&mbedtls_threading_key_slot_mutex);
   2043 #endif
   2044 }
   2045 
   2046 /** Validate optional attributes during key creation.
   2047  *
   2048  * Some key attributes are optional during key creation. If they are
   2049  * specified in the attributes structure, check that they are consistent
   2050  * with the data in the slot.
   2051  *
   2052  * This function should be called near the end of key creation, after
   2053  * the slot in memory is fully populated but before saving persistent data.
   2054  */
   2055 static psa_status_t psa_validate_optional_attributes(
   2056     const psa_key_slot_t *slot,
   2057     const psa_key_attributes_t *attributes)
   2058 {
   2059     if (attributes->type != 0) {
   2060         if (attributes->type != slot->attr.type) {
   2061             return PSA_ERROR_INVALID_ARGUMENT;
   2062         }
   2063     }
   2064 
   2065     if (attributes->bits != 0) {
   2066         if (attributes->bits != slot->attr.bits) {
   2067             return PSA_ERROR_INVALID_ARGUMENT;
   2068         }
   2069     }
   2070 
   2071     return PSA_SUCCESS;
   2072 }
   2073 
   2074 psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
   2075                             const uint8_t *data_external,
   2076                             size_t data_length,
   2077                             mbedtls_svc_key_id_t *key)
   2078 {
   2079     psa_status_t status;
   2080     LOCAL_INPUT_DECLARE(data_external, data);
   2081     psa_key_slot_t *slot = NULL;
   2082     psa_se_drv_table_entry_t *driver = NULL;
   2083     size_t bits;
   2084     size_t storage_size = data_length;
   2085 
   2086     *key = MBEDTLS_SVC_KEY_ID_INIT;
   2087 
   2088     /* Reject zero-length symmetric keys (including raw data key objects).
   2089      * This also rejects any key which might be encoded as an empty string,
   2090      * which is never valid. */
   2091     if (data_length == 0) {
   2092         return PSA_ERROR_INVALID_ARGUMENT;
   2093     }
   2094 
   2095     /* Ensure that the bytes-to-bits conversion cannot overflow. */
   2096     if (data_length > SIZE_MAX / 8) {
   2097         return PSA_ERROR_NOT_SUPPORTED;
   2098     }
   2099 
   2100     LOCAL_INPUT_ALLOC(data_external, data_length, data);
   2101 
   2102     status = psa_start_key_creation(PSA_KEY_CREATION_IMPORT, attributes,
   2103                                     &slot, &driver);
   2104     if (status != PSA_SUCCESS) {
   2105         goto exit;
   2106     }
   2107 
   2108     /* In the case of a transparent key or an opaque key stored in local
   2109      * storage ( thus not in the case of importing a key in a secure element
   2110      * with storage ( MBEDTLS_PSA_CRYPTO_SE_C ) ),we have to allocate a
   2111      * buffer to hold the imported key material. */
   2112     if (slot->key.bytes == 0) {
   2113         if (psa_key_lifetime_is_external(attributes->lifetime)) {
   2114             status = psa_driver_wrapper_get_key_buffer_size_from_key_data(
   2115                 attributes, data, data_length, &storage_size);
   2116             if (status != PSA_SUCCESS) {
   2117                 goto exit;
   2118             }
   2119         }
   2120         status = psa_allocate_buffer_to_slot(slot, storage_size);
   2121         if (status != PSA_SUCCESS) {
   2122             goto exit;
   2123         }
   2124     }
   2125 
   2126     bits = slot->attr.bits;
   2127     status = psa_driver_wrapper_import_key(attributes,
   2128                                            data, data_length,
   2129                                            slot->key.data,
   2130                                            slot->key.bytes,
   2131                                            &slot->key.bytes, &bits);
   2132     if (status != PSA_SUCCESS) {
   2133         goto exit;
   2134     }
   2135 
   2136     if (slot->attr.bits == 0) {
   2137         slot->attr.bits = (psa_key_bits_t) bits;
   2138     } else if (bits != slot->attr.bits) {
   2139         status = PSA_ERROR_INVALID_ARGUMENT;
   2140         goto exit;
   2141     }
   2142 
   2143     /* Enforce a size limit, and in particular ensure that the bit
   2144      * size fits in its representation type.*/
   2145     if (bits > PSA_MAX_KEY_BITS) {
   2146         status = PSA_ERROR_NOT_SUPPORTED;
   2147         goto exit;
   2148     }
   2149     status = psa_validate_optional_attributes(slot, attributes);
   2150     if (status != PSA_SUCCESS) {
   2151         goto exit;
   2152     }
   2153 
   2154     status = psa_finish_key_creation(slot, driver, key);
   2155 exit:
   2156     LOCAL_INPUT_FREE(data_external, data);
   2157     if (status != PSA_SUCCESS) {
   2158         psa_fail_key_creation(slot, driver);
   2159     }
   2160 
   2161     return status;
   2162 }
   2163 
   2164 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   2165 psa_status_t mbedtls_psa_register_se_key(
   2166     const psa_key_attributes_t *attributes)
   2167 {
   2168     psa_status_t status;
   2169     psa_key_slot_t *slot = NULL;
   2170     psa_se_drv_table_entry_t *driver = NULL;
   2171     mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
   2172 
   2173     /* Leaving attributes unspecified is not currently supported.
   2174      * It could make sense to query the key type and size from the
   2175      * secure element, but not all secure elements support this
   2176      * and the driver HAL doesn't currently support it. */
   2177     if (psa_get_key_type(attributes) == PSA_KEY_TYPE_NONE) {
   2178         return PSA_ERROR_NOT_SUPPORTED;
   2179     }
   2180     if (psa_get_key_bits(attributes) == 0) {
   2181         return PSA_ERROR_NOT_SUPPORTED;
   2182     }
   2183 
   2184     /* Not usable with volatile keys, even with an appropriate location,
   2185      * due to the API design.
   2186      * https://github.com/Mbed-TLS/mbedtls/issues/9253
   2187      */
   2188     if (PSA_KEY_LIFETIME_IS_VOLATILE(psa_get_key_lifetime(attributes))) {
   2189         return PSA_ERROR_INVALID_ARGUMENT;
   2190     }
   2191 
   2192     status = psa_start_key_creation(PSA_KEY_CREATION_REGISTER, attributes,
   2193                                     &slot, &driver);
   2194     if (status != PSA_SUCCESS) {
   2195         goto exit;
   2196     }
   2197 
   2198     status = psa_finish_key_creation(slot, driver, &key);
   2199 
   2200 exit:
   2201     if (status != PSA_SUCCESS) {
   2202         psa_fail_key_creation(slot, driver);
   2203     }
   2204 
   2205     /* Registration doesn't keep the key in RAM. */
   2206     psa_close_key(key);
   2207     return status;
   2208 }
   2209 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   2210 
   2211 psa_status_t psa_copy_key(mbedtls_svc_key_id_t source_key,
   2212                           const psa_key_attributes_t *specified_attributes,
   2213                           mbedtls_svc_key_id_t *target_key)
   2214 {
   2215     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2216     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   2217     psa_key_slot_t *source_slot = NULL;
   2218     psa_key_slot_t *target_slot = NULL;
   2219     psa_key_attributes_t actual_attributes = *specified_attributes;
   2220     psa_se_drv_table_entry_t *driver = NULL;
   2221     size_t storage_size = 0;
   2222 
   2223     *target_key = MBEDTLS_SVC_KEY_ID_INIT;
   2224 
   2225     status = psa_get_and_lock_key_slot_with_policy(
   2226         source_key, &source_slot, PSA_KEY_USAGE_COPY, 0);
   2227     if (status != PSA_SUCCESS) {
   2228         goto exit;
   2229     }
   2230 
   2231     status = psa_validate_optional_attributes(source_slot,
   2232                                               specified_attributes);
   2233     if (status != PSA_SUCCESS) {
   2234         goto exit;
   2235     }
   2236 
   2237     /* The target key type and number of bits have been validated by
   2238      * psa_validate_optional_attributes() to be either equal to zero or
   2239      * equal to the ones of the source key. So it is safe to inherit
   2240      * them from the source key now."
   2241      * */
   2242     actual_attributes.bits = source_slot->attr.bits;
   2243     actual_attributes.type = source_slot->attr.type;
   2244 
   2245 
   2246     status = psa_restrict_key_policy(source_slot->attr.type,
   2247                                      &actual_attributes.policy,
   2248                                      &source_slot->attr.policy);
   2249     if (status != PSA_SUCCESS) {
   2250         goto exit;
   2251     }
   2252 
   2253     status = psa_start_key_creation(PSA_KEY_CREATION_COPY, &actual_attributes,
   2254                                     &target_slot, &driver);
   2255     if (status != PSA_SUCCESS) {
   2256         goto exit;
   2257     }
   2258     if (PSA_KEY_LIFETIME_GET_LOCATION(target_slot->attr.lifetime) !=
   2259         PSA_KEY_LIFETIME_GET_LOCATION(source_slot->attr.lifetime)) {
   2260         /*
   2261          * If the source and target keys are stored in different locations,
   2262          * the source key would need to be exported as plaintext and re-imported
   2263          * in the other location. This has security implications which have not
   2264          * been fully mapped. For now, this can be achieved through
   2265          * appropriate API invocations from the application, if needed.
   2266          * */
   2267         status = PSA_ERROR_NOT_SUPPORTED;
   2268         goto exit;
   2269     }
   2270     /*
   2271      * When the source and target keys are within the same location,
   2272      * - For transparent keys it is a blind copy without any driver invocation,
   2273      * - For opaque keys this translates to an invocation of the drivers'
   2274      *   copy_key entry point through the dispatch layer.
   2275      * */
   2276     if (psa_key_lifetime_is_external(actual_attributes.lifetime)) {
   2277         status = psa_driver_wrapper_get_key_buffer_size(&actual_attributes,
   2278                                                         &storage_size);
   2279         if (status != PSA_SUCCESS) {
   2280             goto exit;
   2281         }
   2282 
   2283         status = psa_allocate_buffer_to_slot(target_slot, storage_size);
   2284         if (status != PSA_SUCCESS) {
   2285             goto exit;
   2286         }
   2287 
   2288         status = psa_driver_wrapper_copy_key(&actual_attributes,
   2289                                              source_slot->key.data,
   2290                                              source_slot->key.bytes,
   2291                                              target_slot->key.data,
   2292                                              target_slot->key.bytes,
   2293                                              &target_slot->key.bytes);
   2294         if (status != PSA_SUCCESS) {
   2295             goto exit;
   2296         }
   2297     } else {
   2298         status = psa_copy_key_material_into_slot(target_slot,
   2299                                                  source_slot->key.data,
   2300                                                  source_slot->key.bytes);
   2301         if (status != PSA_SUCCESS) {
   2302             goto exit;
   2303         }
   2304     }
   2305     status = psa_finish_key_creation(target_slot, driver, target_key);
   2306 exit:
   2307     if (status != PSA_SUCCESS) {
   2308         psa_fail_key_creation(target_slot, driver);
   2309     }
   2310 
   2311     unlock_status = psa_unregister_read_under_mutex(source_slot);
   2312 
   2313     return (status == PSA_SUCCESS) ? unlock_status : status;
   2314 }
   2315 
   2316 
   2317 
   2318 /****************************************************************/
   2319 /* Message digests */
   2320 /****************************************************************/
   2321 
   2322 static int is_hash_supported(psa_algorithm_t alg)
   2323 {
   2324     switch (alg) {
   2325 #if defined(PSA_WANT_ALG_MD5)
   2326         case PSA_ALG_MD5:
   2327             return 1;
   2328 #endif
   2329 #if defined(PSA_WANT_ALG_RIPEMD160)
   2330         case PSA_ALG_RIPEMD160:
   2331             return 1;
   2332 #endif
   2333 #if defined(PSA_WANT_ALG_SHA_1)
   2334         case PSA_ALG_SHA_1:
   2335             return 1;
   2336 #endif
   2337 #if defined(PSA_WANT_ALG_SHA_224)
   2338         case PSA_ALG_SHA_224:
   2339             return 1;
   2340 #endif
   2341 #if defined(PSA_WANT_ALG_SHA_256)
   2342         case PSA_ALG_SHA_256:
   2343             return 1;
   2344 #endif
   2345 #if defined(PSA_WANT_ALG_SHA_384)
   2346         case PSA_ALG_SHA_384:
   2347             return 1;
   2348 #endif
   2349 #if defined(PSA_WANT_ALG_SHA_512)
   2350         case PSA_ALG_SHA_512:
   2351             return 1;
   2352 #endif
   2353 #if defined(PSA_WANT_ALG_SHA3_224)
   2354         case PSA_ALG_SHA3_224:
   2355             return 1;
   2356 #endif
   2357 #if defined(PSA_WANT_ALG_SHA3_256)
   2358         case PSA_ALG_SHA3_256:
   2359             return 1;
   2360 #endif
   2361 #if defined(PSA_WANT_ALG_SHA3_384)
   2362         case PSA_ALG_SHA3_384:
   2363             return 1;
   2364 #endif
   2365 #if defined(PSA_WANT_ALG_SHA3_512)
   2366         case PSA_ALG_SHA3_512:
   2367             return 1;
   2368 #endif
   2369         default:
   2370             return 0;
   2371     }
   2372 }
   2373 
   2374 psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
   2375 {
   2376     /* Aborting a non-active operation is allowed */
   2377     if (operation->id == 0) {
   2378         return PSA_SUCCESS;
   2379     }
   2380 
   2381     psa_status_t status = psa_driver_wrapper_hash_abort(operation);
   2382     operation->id = 0;
   2383 
   2384     return status;
   2385 }
   2386 
   2387 psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
   2388                             psa_algorithm_t alg)
   2389 {
   2390     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2391 
   2392     /* A context must be freshly initialized before it can be set up. */
   2393     if (operation->id != 0) {
   2394         status = PSA_ERROR_BAD_STATE;
   2395         goto exit;
   2396     }
   2397 
   2398     if (!PSA_ALG_IS_HASH(alg)) {
   2399         status = PSA_ERROR_INVALID_ARGUMENT;
   2400         goto exit;
   2401     }
   2402 
   2403     /* Make sure the driver-dependent part of the operation is zeroed.
   2404      * This is a guarantee we make to drivers. Initializing the operation
   2405      * does not necessarily take care of it, since the context is a
   2406      * union and initializing a union does not necessarily initialize
   2407      * all of its members. */
   2408     memset(&operation->ctx, 0, sizeof(operation->ctx));
   2409 
   2410     status = psa_driver_wrapper_hash_setup(operation, alg);
   2411 
   2412 exit:
   2413     if (status != PSA_SUCCESS) {
   2414         psa_hash_abort(operation);
   2415     }
   2416 
   2417     return status;
   2418 }
   2419 
   2420 psa_status_t psa_hash_update(psa_hash_operation_t *operation,
   2421                              const uint8_t *input_external,
   2422                              size_t input_length)
   2423 {
   2424     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2425     LOCAL_INPUT_DECLARE(input_external, input);
   2426 
   2427     if (operation->id == 0) {
   2428         status = PSA_ERROR_BAD_STATE;
   2429         goto exit;
   2430     }
   2431 
   2432     /* Don't require hash implementations to behave correctly on a
   2433      * zero-length input, which may have an invalid pointer. */
   2434     if (input_length == 0) {
   2435         return PSA_SUCCESS;
   2436     }
   2437 
   2438     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   2439     status = psa_driver_wrapper_hash_update(operation, input, input_length);
   2440 
   2441 exit:
   2442     if (status != PSA_SUCCESS) {
   2443         psa_hash_abort(operation);
   2444     }
   2445 
   2446     LOCAL_INPUT_FREE(input_external, input);
   2447     return status;
   2448 }
   2449 
   2450 static psa_status_t psa_hash_finish_internal(psa_hash_operation_t *operation,
   2451                                              uint8_t *hash,
   2452                                              size_t hash_size,
   2453                                              size_t *hash_length)
   2454 {
   2455     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2456 
   2457     *hash_length = 0;
   2458     if (operation->id == 0) {
   2459         return PSA_ERROR_BAD_STATE;
   2460     }
   2461 
   2462     status = psa_driver_wrapper_hash_finish(
   2463         operation, hash, hash_size, hash_length);
   2464     psa_hash_abort(operation);
   2465 
   2466     return status;
   2467 }
   2468 
   2469 psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
   2470                              uint8_t *hash_external,
   2471                              size_t hash_size,
   2472                              size_t *hash_length)
   2473 {
   2474     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2475     LOCAL_OUTPUT_DECLARE(hash_external, hash);
   2476 
   2477     LOCAL_OUTPUT_ALLOC(hash_external, hash_size, hash);
   2478     status = psa_hash_finish_internal(operation, hash, hash_size, hash_length);
   2479 
   2480 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   2481 exit:
   2482 #endif
   2483     LOCAL_OUTPUT_FREE(hash_external, hash);
   2484     return status;
   2485 }
   2486 
   2487 psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
   2488                              const uint8_t *hash_external,
   2489                              size_t hash_length)
   2490 {
   2491     uint8_t actual_hash[PSA_HASH_MAX_SIZE];
   2492     size_t actual_hash_length;
   2493     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2494     LOCAL_INPUT_DECLARE(hash_external, hash);
   2495 
   2496     status = psa_hash_finish_internal(
   2497         operation,
   2498         actual_hash, sizeof(actual_hash),
   2499         &actual_hash_length);
   2500 
   2501     if (status != PSA_SUCCESS) {
   2502         goto exit;
   2503     }
   2504 
   2505     if (actual_hash_length != hash_length) {
   2506         status = PSA_ERROR_INVALID_SIGNATURE;
   2507         goto exit;
   2508     }
   2509 
   2510     LOCAL_INPUT_ALLOC(hash_external, hash_length, hash);
   2511     if (mbedtls_ct_memcmp(hash, actual_hash, actual_hash_length) != 0) {
   2512         status = PSA_ERROR_INVALID_SIGNATURE;
   2513     }
   2514 
   2515 exit:
   2516     mbedtls_platform_zeroize(actual_hash, sizeof(actual_hash));
   2517     if (status != PSA_SUCCESS) {
   2518         psa_hash_abort(operation);
   2519     }
   2520     LOCAL_INPUT_FREE(hash_external, hash);
   2521     return status;
   2522 }
   2523 
   2524 psa_status_t psa_hash_compute(psa_algorithm_t alg,
   2525                               const uint8_t *input_external, size_t input_length,
   2526                               uint8_t *hash_external, size_t hash_size,
   2527                               size_t *hash_length)
   2528 {
   2529     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2530     LOCAL_INPUT_DECLARE(input_external, input);
   2531     LOCAL_OUTPUT_DECLARE(hash_external, hash);
   2532 
   2533     *hash_length = 0;
   2534     if (!PSA_ALG_IS_HASH(alg)) {
   2535         return PSA_ERROR_INVALID_ARGUMENT;
   2536     }
   2537 
   2538     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   2539     LOCAL_OUTPUT_ALLOC(hash_external, hash_size, hash);
   2540     status = psa_driver_wrapper_hash_compute(alg, input, input_length,
   2541                                              hash, hash_size, hash_length);
   2542 
   2543 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   2544 exit:
   2545 #endif
   2546     LOCAL_INPUT_FREE(input_external, input);
   2547     LOCAL_OUTPUT_FREE(hash_external, hash);
   2548     return status;
   2549 }
   2550 
   2551 psa_status_t psa_hash_compare(psa_algorithm_t alg,
   2552                               const uint8_t *input_external, size_t input_length,
   2553                               const uint8_t *hash_external, size_t hash_length)
   2554 {
   2555     uint8_t actual_hash[PSA_HASH_MAX_SIZE];
   2556     size_t actual_hash_length;
   2557     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2558 
   2559     LOCAL_INPUT_DECLARE(input_external, input);
   2560     LOCAL_INPUT_DECLARE(hash_external, hash);
   2561 
   2562     if (!PSA_ALG_IS_HASH(alg)) {
   2563         status = PSA_ERROR_INVALID_ARGUMENT;
   2564         return status;
   2565     }
   2566 
   2567     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   2568     status = psa_driver_wrapper_hash_compute(
   2569         alg, input, input_length,
   2570         actual_hash, sizeof(actual_hash),
   2571         &actual_hash_length);
   2572     if (status != PSA_SUCCESS) {
   2573         goto exit;
   2574     }
   2575     if (actual_hash_length != hash_length) {
   2576         status = PSA_ERROR_INVALID_SIGNATURE;
   2577         goto exit;
   2578     }
   2579 
   2580     LOCAL_INPUT_ALLOC(hash_external, hash_length, hash);
   2581     if (mbedtls_ct_memcmp(hash, actual_hash, actual_hash_length) != 0) {
   2582         status = PSA_ERROR_INVALID_SIGNATURE;
   2583     }
   2584 
   2585 exit:
   2586     mbedtls_platform_zeroize(actual_hash, sizeof(actual_hash));
   2587 
   2588     LOCAL_INPUT_FREE(input_external, input);
   2589     LOCAL_INPUT_FREE(hash_external, hash);
   2590 
   2591     return status;
   2592 }
   2593 
   2594 psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
   2595                             psa_hash_operation_t *target_operation)
   2596 {
   2597     if (source_operation->id == 0 ||
   2598         target_operation->id != 0) {
   2599         return PSA_ERROR_BAD_STATE;
   2600     }
   2601 
   2602     /* Make sure the driver-dependent part of the operation is zeroed.
   2603      * This is a guarantee we make to drivers. Initializing the operation
   2604      * does not necessarily take care of it, since the context is a
   2605      * union and initializing a union does not necessarily initialize
   2606      * all of its members. */
   2607     memset(&target_operation->ctx, 0, sizeof(target_operation->ctx));
   2608 
   2609     psa_status_t status = psa_driver_wrapper_hash_clone(source_operation,
   2610                                                         target_operation);
   2611     if (status != PSA_SUCCESS) {
   2612         psa_hash_abort(target_operation);
   2613     }
   2614 
   2615     return status;
   2616 }
   2617 
   2618 
   2619 /****************************************************************/
   2620 /* MAC */
   2621 /****************************************************************/
   2622 
   2623 psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
   2624 {
   2625     /* Aborting a non-active operation is allowed */
   2626     if (operation->id == 0) {
   2627         return PSA_SUCCESS;
   2628     }
   2629 
   2630     psa_status_t status = psa_driver_wrapper_mac_abort(operation);
   2631     operation->mac_size = 0;
   2632     operation->is_sign = 0;
   2633     operation->id = 0;
   2634 
   2635     return status;
   2636 }
   2637 
   2638 static psa_status_t psa_mac_finalize_alg_and_key_validation(
   2639     psa_algorithm_t alg,
   2640     const psa_key_attributes_t *attributes,
   2641     uint8_t *mac_size)
   2642 {
   2643     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2644     psa_key_type_t key_type = psa_get_key_type(attributes);
   2645     size_t key_bits = psa_get_key_bits(attributes);
   2646 
   2647     if (!PSA_ALG_IS_MAC(alg)) {
   2648         return PSA_ERROR_INVALID_ARGUMENT;
   2649     }
   2650 
   2651     /* Validate the combination of key type and algorithm */
   2652     status = psa_mac_key_can_do(alg, key_type);
   2653     if (status != PSA_SUCCESS) {
   2654         return status;
   2655     }
   2656 
   2657     /* Get the output length for the algorithm and key combination */
   2658     *mac_size = PSA_MAC_LENGTH(key_type, key_bits, alg);
   2659 
   2660     if (*mac_size < 4) {
   2661         /* A very short MAC is too short for security since it can be
   2662          * brute-forced. Ancient protocols with 32-bit MACs do exist,
   2663          * so we make this our minimum, even though 32 bits is still
   2664          * too small for security. */
   2665         return PSA_ERROR_NOT_SUPPORTED;
   2666     }
   2667 
   2668     if (*mac_size > PSA_MAC_LENGTH(key_type, key_bits,
   2669                                    PSA_ALG_FULL_LENGTH_MAC(alg))) {
   2670         /* It's impossible to "truncate" to a larger length than the full length
   2671          * of the algorithm. */
   2672         return PSA_ERROR_INVALID_ARGUMENT;
   2673     }
   2674 
   2675     if (*mac_size > PSA_MAC_MAX_SIZE) {
   2676         /* PSA_MAC_LENGTH returns the correct length even for a MAC algorithm
   2677          * that is disabled in the compile-time configuration. The result can
   2678          * therefore be larger than PSA_MAC_MAX_SIZE, which does take the
   2679          * configuration into account. In this case, force a return of
   2680          * PSA_ERROR_NOT_SUPPORTED here. Otherwise psa_mac_verify(), or
   2681          * psa_mac_compute(mac_size=PSA_MAC_MAX_SIZE), would return
   2682          * PSA_ERROR_BUFFER_TOO_SMALL for an unsupported algorithm whose MAC size
   2683          * is larger than PSA_MAC_MAX_SIZE, which is misleading and which breaks
   2684          * systematically generated tests. */
   2685         return PSA_ERROR_NOT_SUPPORTED;
   2686     }
   2687 
   2688     return PSA_SUCCESS;
   2689 }
   2690 
   2691 static psa_status_t psa_mac_setup(psa_mac_operation_t *operation,
   2692                                   mbedtls_svc_key_id_t key,
   2693                                   psa_algorithm_t alg,
   2694                                   int is_sign)
   2695 {
   2696     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2697     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   2698     psa_key_slot_t *slot = NULL;
   2699 
   2700     /* A context must be freshly initialized before it can be set up. */
   2701     if (operation->id != 0) {
   2702         status = PSA_ERROR_BAD_STATE;
   2703         goto exit;
   2704     }
   2705 
   2706     /* Make sure the driver-dependent part of the operation is zeroed.
   2707      * This is a guarantee we make to drivers. Initializing the operation
   2708      * does not necessarily take care of it, since the context is a
   2709      * union and initializing a union does not necessarily initialize
   2710      * all of its members. */
   2711     memset(&operation->ctx, 0, sizeof(operation->ctx));
   2712 
   2713     status = psa_get_and_lock_key_slot_with_policy(
   2714         key,
   2715         &slot,
   2716         is_sign ? PSA_KEY_USAGE_SIGN_MESSAGE : PSA_KEY_USAGE_VERIFY_MESSAGE,
   2717         alg);
   2718     if (status != PSA_SUCCESS) {
   2719         goto exit;
   2720     }
   2721 
   2722     status = psa_mac_finalize_alg_and_key_validation(alg, &slot->attr,
   2723                                                      &operation->mac_size);
   2724     if (status != PSA_SUCCESS) {
   2725         goto exit;
   2726     }
   2727 
   2728     operation->is_sign = is_sign;
   2729     /* Dispatch the MAC setup call with validated input */
   2730     if (is_sign) {
   2731         status = psa_driver_wrapper_mac_sign_setup(operation,
   2732                                                    &slot->attr,
   2733                                                    slot->key.data,
   2734                                                    slot->key.bytes,
   2735                                                    alg);
   2736     } else {
   2737         status = psa_driver_wrapper_mac_verify_setup(operation,
   2738                                                      &slot->attr,
   2739                                                      slot->key.data,
   2740                                                      slot->key.bytes,
   2741                                                      alg);
   2742     }
   2743 
   2744 exit:
   2745     if (status != PSA_SUCCESS) {
   2746         psa_mac_abort(operation);
   2747     }
   2748 
   2749     unlock_status = psa_unregister_read_under_mutex(slot);
   2750 
   2751     return (status == PSA_SUCCESS) ? unlock_status : status;
   2752 }
   2753 
   2754 psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
   2755                                 mbedtls_svc_key_id_t key,
   2756                                 psa_algorithm_t alg)
   2757 {
   2758     return psa_mac_setup(operation, key, alg, 1);
   2759 }
   2760 
   2761 psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
   2762                                   mbedtls_svc_key_id_t key,
   2763                                   psa_algorithm_t alg)
   2764 {
   2765     return psa_mac_setup(operation, key, alg, 0);
   2766 }
   2767 
   2768 psa_status_t psa_mac_update(psa_mac_operation_t *operation,
   2769                             const uint8_t *input_external,
   2770                             size_t input_length)
   2771 {
   2772     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2773     LOCAL_INPUT_DECLARE(input_external, input);
   2774 
   2775     if (operation->id == 0) {
   2776         status = PSA_ERROR_BAD_STATE;
   2777         return status;
   2778     }
   2779 
   2780     /* Don't require hash implementations to behave correctly on a
   2781      * zero-length input, which may have an invalid pointer. */
   2782     if (input_length == 0) {
   2783         status = PSA_SUCCESS;
   2784         return status;
   2785     }
   2786 
   2787     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   2788     status = psa_driver_wrapper_mac_update(operation, input, input_length);
   2789 
   2790     if (status != PSA_SUCCESS) {
   2791         psa_mac_abort(operation);
   2792     }
   2793 
   2794 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   2795 exit:
   2796 #endif
   2797     LOCAL_INPUT_FREE(input_external, input);
   2798 
   2799     return status;
   2800 }
   2801 
   2802 psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
   2803                                  uint8_t *mac_external,
   2804                                  size_t mac_size,
   2805                                  size_t *mac_length)
   2806 {
   2807     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2808     psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
   2809     LOCAL_OUTPUT_DECLARE(mac_external, mac);
   2810     LOCAL_OUTPUT_ALLOC(mac_external, mac_size, mac);
   2811 
   2812     if (operation->id == 0) {
   2813         status = PSA_ERROR_BAD_STATE;
   2814         goto exit;
   2815     }
   2816 
   2817     if (!operation->is_sign) {
   2818         status = PSA_ERROR_BAD_STATE;
   2819         goto exit;
   2820     }
   2821 
   2822     /* Sanity check. This will guarantee that mac_size != 0 (and so mac != NULL)
   2823      * once all the error checks are done. */
   2824     if (operation->mac_size == 0) {
   2825         status = PSA_ERROR_BAD_STATE;
   2826         goto exit;
   2827     }
   2828 
   2829     if (mac_size < operation->mac_size) {
   2830         status = PSA_ERROR_BUFFER_TOO_SMALL;
   2831         goto exit;
   2832     }
   2833 
   2834 
   2835     status = psa_driver_wrapper_mac_sign_finish(operation,
   2836                                                 mac, operation->mac_size,
   2837                                                 mac_length);
   2838 
   2839 exit:
   2840     /* In case of success, set the potential excess room in the output buffer
   2841      * to an invalid value, to avoid potentially leaking a longer MAC.
   2842      * In case of error, set the output length and content to a safe default,
   2843      * such that in case the caller misses an error check, the output would be
   2844      * an unachievable MAC.
   2845      */
   2846     if (status != PSA_SUCCESS) {
   2847         *mac_length = mac_size;
   2848         operation->mac_size = 0;
   2849     }
   2850 
   2851     if (mac != NULL) {
   2852         psa_wipe_tag_output_buffer(mac, status, mac_size, *mac_length);
   2853     }
   2854 
   2855     abort_status = psa_mac_abort(operation);
   2856     LOCAL_OUTPUT_FREE(mac_external, mac);
   2857 
   2858     return status == PSA_SUCCESS ? abort_status : status;
   2859 }
   2860 
   2861 psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
   2862                                    const uint8_t *mac_external,
   2863                                    size_t mac_length)
   2864 {
   2865     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2866     psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
   2867     LOCAL_INPUT_DECLARE(mac_external, mac);
   2868 
   2869     if (operation->id == 0) {
   2870         status = PSA_ERROR_BAD_STATE;
   2871         goto exit;
   2872     }
   2873 
   2874     if (operation->is_sign) {
   2875         status = PSA_ERROR_BAD_STATE;
   2876         goto exit;
   2877     }
   2878 
   2879     if (operation->mac_size != mac_length) {
   2880         status = PSA_ERROR_INVALID_SIGNATURE;
   2881         goto exit;
   2882     }
   2883 
   2884     LOCAL_INPUT_ALLOC(mac_external, mac_length, mac);
   2885     status = psa_driver_wrapper_mac_verify_finish(operation,
   2886                                                   mac, mac_length);
   2887 
   2888 exit:
   2889     abort_status = psa_mac_abort(operation);
   2890     LOCAL_INPUT_FREE(mac_external, mac);
   2891 
   2892     return status == PSA_SUCCESS ? abort_status : status;
   2893 }
   2894 
   2895 static psa_status_t psa_mac_compute_internal(mbedtls_svc_key_id_t key,
   2896                                              psa_algorithm_t alg,
   2897                                              const uint8_t *input,
   2898                                              size_t input_length,
   2899                                              uint8_t *mac,
   2900                                              size_t mac_size,
   2901                                              size_t *mac_length,
   2902                                              int is_sign)
   2903 {
   2904     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2905     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   2906     psa_key_slot_t *slot;
   2907     uint8_t operation_mac_size = 0;
   2908 
   2909     status = psa_get_and_lock_key_slot_with_policy(
   2910         key,
   2911         &slot,
   2912         is_sign ? PSA_KEY_USAGE_SIGN_MESSAGE : PSA_KEY_USAGE_VERIFY_MESSAGE,
   2913         alg);
   2914     if (status != PSA_SUCCESS) {
   2915         goto exit;
   2916     }
   2917 
   2918     status = psa_mac_finalize_alg_and_key_validation(alg, &slot->attr,
   2919                                                      &operation_mac_size);
   2920     if (status != PSA_SUCCESS) {
   2921         goto exit;
   2922     }
   2923 
   2924     if (mac_size < operation_mac_size) {
   2925         status = PSA_ERROR_BUFFER_TOO_SMALL;
   2926         goto exit;
   2927     }
   2928 
   2929     status = psa_driver_wrapper_mac_compute(
   2930         &slot->attr,
   2931         slot->key.data, slot->key.bytes,
   2932         alg,
   2933         input, input_length,
   2934         mac, operation_mac_size, mac_length);
   2935 
   2936 exit:
   2937     /* In case of success, set the potential excess room in the output buffer
   2938      * to an invalid value, to avoid potentially leaking a longer MAC.
   2939      * In case of error, set the output length and content to a safe default,
   2940      * such that in case the caller misses an error check, the output would be
   2941      * an unachievable MAC.
   2942      */
   2943     if (status != PSA_SUCCESS) {
   2944         *mac_length = mac_size;
   2945         operation_mac_size = 0;
   2946     }
   2947 
   2948     psa_wipe_tag_output_buffer(mac, status, mac_size, *mac_length);
   2949 
   2950     unlock_status = psa_unregister_read_under_mutex(slot);
   2951 
   2952     return (status == PSA_SUCCESS) ? unlock_status : status;
   2953 }
   2954 
   2955 psa_status_t psa_mac_compute(mbedtls_svc_key_id_t key,
   2956                              psa_algorithm_t alg,
   2957                              const uint8_t *input_external,
   2958                              size_t input_length,
   2959                              uint8_t *mac_external,
   2960                              size_t mac_size,
   2961                              size_t *mac_length)
   2962 {
   2963     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2964     LOCAL_INPUT_DECLARE(input_external, input);
   2965     LOCAL_OUTPUT_DECLARE(mac_external, mac);
   2966 
   2967     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   2968     LOCAL_OUTPUT_ALLOC(mac_external, mac_size, mac);
   2969     status = psa_mac_compute_internal(key, alg,
   2970                                       input, input_length,
   2971                                       mac, mac_size, mac_length, 1);
   2972 
   2973 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   2974 exit:
   2975 #endif
   2976     LOCAL_INPUT_FREE(input_external, input);
   2977     LOCAL_OUTPUT_FREE(mac_external, mac);
   2978 
   2979     return status;
   2980 }
   2981 
   2982 psa_status_t psa_mac_verify(mbedtls_svc_key_id_t key,
   2983                             psa_algorithm_t alg,
   2984                             const uint8_t *input_external,
   2985                             size_t input_length,
   2986                             const uint8_t *mac_external,
   2987                             size_t mac_length)
   2988 {
   2989     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   2990     uint8_t actual_mac[PSA_MAC_MAX_SIZE];
   2991     size_t actual_mac_length;
   2992     LOCAL_INPUT_DECLARE(input_external, input);
   2993     LOCAL_INPUT_DECLARE(mac_external, mac);
   2994 
   2995     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   2996     status = psa_mac_compute_internal(key, alg,
   2997                                       input, input_length,
   2998                                       actual_mac, sizeof(actual_mac),
   2999                                       &actual_mac_length, 0);
   3000     if (status != PSA_SUCCESS) {
   3001         goto exit;
   3002     }
   3003 
   3004     if (mac_length != actual_mac_length) {
   3005         status = PSA_ERROR_INVALID_SIGNATURE;
   3006         goto exit;
   3007     }
   3008 
   3009     LOCAL_INPUT_ALLOC(mac_external, mac_length, mac);
   3010     if (mbedtls_ct_memcmp(mac, actual_mac, actual_mac_length) != 0) {
   3011         status = PSA_ERROR_INVALID_SIGNATURE;
   3012         goto exit;
   3013     }
   3014 
   3015 exit:
   3016     mbedtls_platform_zeroize(actual_mac, sizeof(actual_mac));
   3017     LOCAL_INPUT_FREE(input_external, input);
   3018     LOCAL_INPUT_FREE(mac_external, mac);
   3019 
   3020     return status;
   3021 }
   3022 
   3023 /****************************************************************/
   3024 /* Asymmetric cryptography */
   3025 /****************************************************************/
   3026 
   3027 static psa_status_t psa_sign_verify_check_alg(int input_is_message,
   3028                                               psa_algorithm_t alg)
   3029 {
   3030     if (input_is_message) {
   3031         if (!PSA_ALG_IS_SIGN_MESSAGE(alg)) {
   3032             return PSA_ERROR_INVALID_ARGUMENT;
   3033         }
   3034     }
   3035 
   3036     psa_algorithm_t hash_alg = 0;
   3037     if (PSA_ALG_IS_SIGN_HASH(alg)) {
   3038         hash_alg = PSA_ALG_SIGN_GET_HASH(alg);
   3039     }
   3040 
   3041     /* Now hash_alg==0 if alg by itself doesn't need a hash.
   3042      * This is good enough for sign-hash, but a guaranteed failure for
   3043      * sign-message which needs to hash first for all algorithms
   3044      * supported at the moment. */
   3045 
   3046     if (hash_alg == 0 && input_is_message) {
   3047         return PSA_ERROR_INVALID_ARGUMENT;
   3048     }
   3049     if (hash_alg == PSA_ALG_ANY_HASH) {
   3050         return PSA_ERROR_INVALID_ARGUMENT;
   3051     }
   3052     /* Give up immediately if the hash is not supported. This has
   3053      * several advantages:
   3054      * - For mechanisms that don't use the hash at all (e.g.
   3055      *   ECDSA verification, randomized ECDSA signature), without
   3056      *   this check, the operation would succeed even though it has
   3057      *   been given an invalid argument. This would not be insecure
   3058      *   since the hash was not necessary, but it would be weird.
   3059      * - For mechanisms that do use the hash, we avoid an error
   3060      *   deep inside the execution. In principle this doesn't matter,
   3061      *   but there is a little more risk of a bug in error handling
   3062      *   deep inside than in this preliminary check.
   3063      * - When calling a driver, the driver might be capable of using
   3064      *   a hash that the core doesn't support. This could potentially
   3065      *   result in a buffer overflow if the hash is larger than the
   3066      *   maximum hash size assumed by the core.
   3067      * - Returning a consistent error makes it possible to test
   3068      *   not-supported hashes in a consistent way.
   3069      */
   3070     if (hash_alg != 0 && !is_hash_supported(hash_alg)) {
   3071         return PSA_ERROR_NOT_SUPPORTED;
   3072     }
   3073 
   3074     return PSA_SUCCESS;
   3075 }
   3076 
   3077 static psa_status_t psa_sign_internal(mbedtls_svc_key_id_t key,
   3078                                       int input_is_message,
   3079                                       psa_algorithm_t alg,
   3080                                       const uint8_t *input,
   3081                                       size_t input_length,
   3082                                       uint8_t *signature,
   3083                                       size_t signature_size,
   3084                                       size_t *signature_length)
   3085 {
   3086     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3087     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   3088     psa_key_slot_t *slot;
   3089 
   3090     *signature_length = 0;
   3091 
   3092     status = psa_sign_verify_check_alg(input_is_message, alg);
   3093     if (status != PSA_SUCCESS) {
   3094         return status;
   3095     }
   3096 
   3097     /* Immediately reject a zero-length signature buffer. This guarantees
   3098      * that signature must be a valid pointer. (On the other hand, the input
   3099      * buffer can in principle be empty since it doesn't actually have
   3100      * to be a hash.) */
   3101     if (signature_size == 0) {
   3102         return PSA_ERROR_BUFFER_TOO_SMALL;
   3103     }
   3104 
   3105     status = psa_get_and_lock_key_slot_with_policy(
   3106         key, &slot,
   3107         input_is_message ? PSA_KEY_USAGE_SIGN_MESSAGE :
   3108         PSA_KEY_USAGE_SIGN_HASH,
   3109         alg);
   3110 
   3111     if (status != PSA_SUCCESS) {
   3112         goto exit;
   3113     }
   3114 
   3115     if (!PSA_KEY_TYPE_IS_KEY_PAIR(slot->attr.type)) {
   3116         status = PSA_ERROR_INVALID_ARGUMENT;
   3117         goto exit;
   3118     }
   3119 
   3120     if (input_is_message) {
   3121         status = psa_driver_wrapper_sign_message(
   3122             &slot->attr, slot->key.data, slot->key.bytes,
   3123             alg, input, input_length,
   3124             signature, signature_size, signature_length);
   3125     } else {
   3126 
   3127         status = psa_driver_wrapper_sign_hash(
   3128             &slot->attr, slot->key.data, slot->key.bytes,
   3129             alg, input, input_length,
   3130             signature, signature_size, signature_length);
   3131     }
   3132 
   3133 
   3134 exit:
   3135     psa_wipe_tag_output_buffer(signature, status, signature_size,
   3136                                *signature_length);
   3137 
   3138     unlock_status = psa_unregister_read_under_mutex(slot);
   3139 
   3140     return (status == PSA_SUCCESS) ? unlock_status : status;
   3141 }
   3142 
   3143 static psa_status_t psa_verify_internal(mbedtls_svc_key_id_t key,
   3144                                         int input_is_message,
   3145                                         psa_algorithm_t alg,
   3146                                         const uint8_t *input,
   3147                                         size_t input_length,
   3148                                         const uint8_t *signature,
   3149                                         size_t signature_length)
   3150 {
   3151     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3152     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   3153     psa_key_slot_t *slot;
   3154 
   3155     status = psa_sign_verify_check_alg(input_is_message, alg);
   3156     if (status != PSA_SUCCESS) {
   3157         return status;
   3158     }
   3159 
   3160     status = psa_get_and_lock_key_slot_with_policy(
   3161         key, &slot,
   3162         input_is_message ? PSA_KEY_USAGE_VERIFY_MESSAGE :
   3163         PSA_KEY_USAGE_VERIFY_HASH,
   3164         alg);
   3165 
   3166     if (status != PSA_SUCCESS) {
   3167         return status;
   3168     }
   3169 
   3170     if (input_is_message) {
   3171         status = psa_driver_wrapper_verify_message(
   3172             &slot->attr, slot->key.data, slot->key.bytes,
   3173             alg, input, input_length,
   3174             signature, signature_length);
   3175     } else {
   3176         status = psa_driver_wrapper_verify_hash(
   3177             &slot->attr, slot->key.data, slot->key.bytes,
   3178             alg, input, input_length,
   3179             signature, signature_length);
   3180     }
   3181 
   3182     unlock_status = psa_unregister_read_under_mutex(slot);
   3183 
   3184     return (status == PSA_SUCCESS) ? unlock_status : status;
   3185 
   3186 }
   3187 
   3188 psa_status_t psa_sign_message_builtin(
   3189     const psa_key_attributes_t *attributes,
   3190     const uint8_t *key_buffer,
   3191     size_t key_buffer_size,
   3192     psa_algorithm_t alg,
   3193     const uint8_t *input,
   3194     size_t input_length,
   3195     uint8_t *signature,
   3196     size_t signature_size,
   3197     size_t *signature_length)
   3198 {
   3199     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3200 
   3201     if (PSA_ALG_IS_SIGN_HASH(alg)) {
   3202         size_t hash_length;
   3203         uint8_t hash[PSA_HASH_MAX_SIZE];
   3204 
   3205         status = psa_driver_wrapper_hash_compute(
   3206             PSA_ALG_SIGN_GET_HASH(alg),
   3207             input, input_length,
   3208             hash, sizeof(hash), &hash_length);
   3209 
   3210         if (status != PSA_SUCCESS) {
   3211             return status;
   3212         }
   3213 
   3214         return psa_driver_wrapper_sign_hash(
   3215             attributes, key_buffer, key_buffer_size,
   3216             alg, hash, hash_length,
   3217             signature, signature_size, signature_length);
   3218     }
   3219 
   3220     return PSA_ERROR_NOT_SUPPORTED;
   3221 }
   3222 
   3223 psa_status_t psa_sign_message(mbedtls_svc_key_id_t key,
   3224                               psa_algorithm_t alg,
   3225                               const uint8_t *input_external,
   3226                               size_t input_length,
   3227                               uint8_t *signature_external,
   3228                               size_t signature_size,
   3229                               size_t *signature_length)
   3230 {
   3231     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3232     LOCAL_INPUT_DECLARE(input_external, input);
   3233     LOCAL_OUTPUT_DECLARE(signature_external, signature);
   3234 
   3235     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   3236     LOCAL_OUTPUT_ALLOC(signature_external, signature_size, signature);
   3237     status = psa_sign_internal(key, 1, alg, input, input_length, signature,
   3238                                signature_size, signature_length);
   3239 
   3240 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   3241 exit:
   3242 #endif
   3243     LOCAL_INPUT_FREE(input_external, input);
   3244     LOCAL_OUTPUT_FREE(signature_external, signature);
   3245     return status;
   3246 }
   3247 
   3248 psa_status_t psa_verify_message_builtin(
   3249     const psa_key_attributes_t *attributes,
   3250     const uint8_t *key_buffer,
   3251     size_t key_buffer_size,
   3252     psa_algorithm_t alg,
   3253     const uint8_t *input,
   3254     size_t input_length,
   3255     const uint8_t *signature,
   3256     size_t signature_length)
   3257 {
   3258     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3259 
   3260     if (PSA_ALG_IS_SIGN_HASH(alg)) {
   3261         size_t hash_length;
   3262         uint8_t hash[PSA_HASH_MAX_SIZE];
   3263 
   3264         status = psa_driver_wrapper_hash_compute(
   3265             PSA_ALG_SIGN_GET_HASH(alg),
   3266             input, input_length,
   3267             hash, sizeof(hash), &hash_length);
   3268 
   3269         if (status != PSA_SUCCESS) {
   3270             return status;
   3271         }
   3272 
   3273         return psa_driver_wrapper_verify_hash(
   3274             attributes, key_buffer, key_buffer_size,
   3275             alg, hash, hash_length,
   3276             signature, signature_length);
   3277     }
   3278 
   3279     return PSA_ERROR_NOT_SUPPORTED;
   3280 }
   3281 
   3282 psa_status_t psa_verify_message(mbedtls_svc_key_id_t key,
   3283                                 psa_algorithm_t alg,
   3284                                 const uint8_t *input_external,
   3285                                 size_t input_length,
   3286                                 const uint8_t *signature_external,
   3287                                 size_t signature_length)
   3288 {
   3289     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3290     LOCAL_INPUT_DECLARE(input_external, input);
   3291     LOCAL_INPUT_DECLARE(signature_external, signature);
   3292 
   3293     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   3294     LOCAL_INPUT_ALLOC(signature_external, signature_length, signature);
   3295     status = psa_verify_internal(key, 1, alg, input, input_length, signature,
   3296                                  signature_length);
   3297 
   3298 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   3299 exit:
   3300 #endif
   3301     LOCAL_INPUT_FREE(input_external, input);
   3302     LOCAL_INPUT_FREE(signature_external, signature);
   3303 
   3304     return status;
   3305 }
   3306 
   3307 psa_status_t psa_sign_hash_builtin(
   3308     const psa_key_attributes_t *attributes,
   3309     const uint8_t *key_buffer, size_t key_buffer_size,
   3310     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
   3311     uint8_t *signature, size_t signature_size, size_t *signature_length)
   3312 {
   3313     if (attributes->type == PSA_KEY_TYPE_RSA_KEY_PAIR) {
   3314         if (PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) ||
   3315             PSA_ALG_IS_RSA_PSS(alg)) {
   3316 #if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
   3317             defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
   3318             return mbedtls_psa_rsa_sign_hash(
   3319                 attributes,
   3320                 key_buffer, key_buffer_size,
   3321                 alg, hash, hash_length,
   3322                 signature, signature_size, signature_length);
   3323 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) ||
   3324         * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) */
   3325         } else {
   3326             return PSA_ERROR_INVALID_ARGUMENT;
   3327         }
   3328     } else if (PSA_KEY_TYPE_IS_ECC(attributes->type)) {
   3329         if (PSA_ALG_IS_ECDSA(alg)) {
   3330 #if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   3331             defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
   3332             return mbedtls_psa_ecdsa_sign_hash(
   3333                 attributes,
   3334                 key_buffer, key_buffer_size,
   3335                 alg, hash, hash_length,
   3336                 signature, signature_size, signature_length);
   3337 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   3338         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
   3339         } else {
   3340             return PSA_ERROR_INVALID_ARGUMENT;
   3341         }
   3342     }
   3343 
   3344     (void) key_buffer;
   3345     (void) key_buffer_size;
   3346     (void) hash;
   3347     (void) hash_length;
   3348     (void) signature;
   3349     (void) signature_size;
   3350     (void) signature_length;
   3351 
   3352     return PSA_ERROR_NOT_SUPPORTED;
   3353 }
   3354 
   3355 psa_status_t psa_sign_hash(mbedtls_svc_key_id_t key,
   3356                            psa_algorithm_t alg,
   3357                            const uint8_t *hash_external,
   3358                            size_t hash_length,
   3359                            uint8_t *signature_external,
   3360                            size_t signature_size,
   3361                            size_t *signature_length)
   3362 {
   3363     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3364     LOCAL_INPUT_DECLARE(hash_external, hash);
   3365     LOCAL_OUTPUT_DECLARE(signature_external, signature);
   3366 
   3367     LOCAL_INPUT_ALLOC(hash_external, hash_length, hash);
   3368     LOCAL_OUTPUT_ALLOC(signature_external, signature_size, signature);
   3369     status = psa_sign_internal(key, 0, alg, hash, hash_length, signature,
   3370                                signature_size, signature_length);
   3371 
   3372 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   3373 exit:
   3374 #endif
   3375     LOCAL_INPUT_FREE(hash_external, hash);
   3376     LOCAL_OUTPUT_FREE(signature_external, signature);
   3377 
   3378     return status;
   3379 }
   3380 
   3381 psa_status_t psa_verify_hash_builtin(
   3382     const psa_key_attributes_t *attributes,
   3383     const uint8_t *key_buffer, size_t key_buffer_size,
   3384     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
   3385     const uint8_t *signature, size_t signature_length)
   3386 {
   3387     if (PSA_KEY_TYPE_IS_RSA(attributes->type)) {
   3388         if (PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) ||
   3389             PSA_ALG_IS_RSA_PSS(alg)) {
   3390 #if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
   3391             defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
   3392             return mbedtls_psa_rsa_verify_hash(
   3393                 attributes,
   3394                 key_buffer, key_buffer_size,
   3395                 alg, hash, hash_length,
   3396                 signature, signature_length);
   3397 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) ||
   3398         * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) */
   3399         } else {
   3400             return PSA_ERROR_INVALID_ARGUMENT;
   3401         }
   3402     } else if (PSA_KEY_TYPE_IS_ECC(attributes->type)) {
   3403         if (PSA_ALG_IS_ECDSA(alg)) {
   3404 #if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   3405             defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
   3406             return mbedtls_psa_ecdsa_verify_hash(
   3407                 attributes,
   3408                 key_buffer, key_buffer_size,
   3409                 alg, hash, hash_length,
   3410                 signature, signature_length);
   3411 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   3412         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
   3413         } else {
   3414             return PSA_ERROR_INVALID_ARGUMENT;
   3415         }
   3416     }
   3417 
   3418     (void) key_buffer;
   3419     (void) key_buffer_size;
   3420     (void) hash;
   3421     (void) hash_length;
   3422     (void) signature;
   3423     (void) signature_length;
   3424 
   3425     return PSA_ERROR_NOT_SUPPORTED;
   3426 }
   3427 
   3428 psa_status_t psa_verify_hash(mbedtls_svc_key_id_t key,
   3429                              psa_algorithm_t alg,
   3430                              const uint8_t *hash_external,
   3431                              size_t hash_length,
   3432                              const uint8_t *signature_external,
   3433                              size_t signature_length)
   3434 {
   3435     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3436     LOCAL_INPUT_DECLARE(hash_external, hash);
   3437     LOCAL_INPUT_DECLARE(signature_external, signature);
   3438 
   3439     LOCAL_INPUT_ALLOC(hash_external, hash_length, hash);
   3440     LOCAL_INPUT_ALLOC(signature_external, signature_length, signature);
   3441     status = psa_verify_internal(key, 0, alg, hash, hash_length, signature,
   3442                                  signature_length);
   3443 
   3444 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   3445 exit:
   3446 #endif
   3447     LOCAL_INPUT_FREE(hash_external, hash);
   3448     LOCAL_INPUT_FREE(signature_external, signature);
   3449 
   3450     return status;
   3451 }
   3452 
   3453 psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key,
   3454                                     psa_algorithm_t alg,
   3455                                     const uint8_t *input_external,
   3456                                     size_t input_length,
   3457                                     const uint8_t *salt_external,
   3458                                     size_t salt_length,
   3459                                     uint8_t *output_external,
   3460                                     size_t output_size,
   3461                                     size_t *output_length)
   3462 {
   3463     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3464     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   3465     psa_key_slot_t *slot;
   3466 
   3467     LOCAL_INPUT_DECLARE(input_external, input);
   3468     LOCAL_INPUT_DECLARE(salt_external, salt);
   3469     LOCAL_OUTPUT_DECLARE(output_external, output);
   3470 
   3471     (void) input;
   3472     (void) input_length;
   3473     (void) salt;
   3474     (void) output;
   3475     (void) output_size;
   3476 
   3477     *output_length = 0;
   3478 
   3479     if (!PSA_ALG_IS_RSA_OAEP(alg) && salt_length != 0) {
   3480         return PSA_ERROR_INVALID_ARGUMENT;
   3481     }
   3482 
   3483     status = psa_get_and_lock_key_slot_with_policy(
   3484         key, &slot, PSA_KEY_USAGE_ENCRYPT, alg);
   3485     if (status != PSA_SUCCESS) {
   3486         return status;
   3487     }
   3488     if (!(PSA_KEY_TYPE_IS_PUBLIC_KEY(slot->attr.type) ||
   3489           PSA_KEY_TYPE_IS_KEY_PAIR(slot->attr.type))) {
   3490         status = PSA_ERROR_INVALID_ARGUMENT;
   3491         goto exit;
   3492     }
   3493 
   3494     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   3495     LOCAL_INPUT_ALLOC(salt_external, salt_length, salt);
   3496     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   3497 
   3498     status = psa_driver_wrapper_asymmetric_encrypt(
   3499         &slot->attr, slot->key.data, slot->key.bytes,
   3500         alg, input, input_length, salt, salt_length,
   3501         output, output_size, output_length);
   3502 exit:
   3503     unlock_status = psa_unregister_read_under_mutex(slot);
   3504 
   3505     LOCAL_INPUT_FREE(input_external, input);
   3506     LOCAL_INPUT_FREE(salt_external, salt);
   3507     LOCAL_OUTPUT_FREE(output_external, output);
   3508 
   3509     return (status == PSA_SUCCESS) ? unlock_status : status;
   3510 }
   3511 
   3512 psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key,
   3513                                     psa_algorithm_t alg,
   3514                                     const uint8_t *input_external,
   3515                                     size_t input_length,
   3516                                     const uint8_t *salt_external,
   3517                                     size_t salt_length,
   3518                                     uint8_t *output_external,
   3519                                     size_t output_size,
   3520                                     size_t *output_length)
   3521 {
   3522     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3523     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   3524     psa_key_slot_t *slot;
   3525 
   3526     LOCAL_INPUT_DECLARE(input_external, input);
   3527     LOCAL_INPUT_DECLARE(salt_external, salt);
   3528     LOCAL_OUTPUT_DECLARE(output_external, output);
   3529 
   3530     (void) input;
   3531     (void) input_length;
   3532     (void) salt;
   3533     (void) output;
   3534     (void) output_size;
   3535 
   3536     *output_length = 0;
   3537 
   3538     if (!PSA_ALG_IS_RSA_OAEP(alg) && salt_length != 0) {
   3539         return PSA_ERROR_INVALID_ARGUMENT;
   3540     }
   3541 
   3542     status = psa_get_and_lock_key_slot_with_policy(
   3543         key, &slot, PSA_KEY_USAGE_DECRYPT, alg);
   3544     if (status != PSA_SUCCESS) {
   3545         return status;
   3546     }
   3547     if (!PSA_KEY_TYPE_IS_KEY_PAIR(slot->attr.type)) {
   3548         status = PSA_ERROR_INVALID_ARGUMENT;
   3549         goto exit;
   3550     }
   3551 
   3552     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   3553     LOCAL_INPUT_ALLOC(salt_external, salt_length, salt);
   3554     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   3555 
   3556     status = psa_driver_wrapper_asymmetric_decrypt(
   3557         &slot->attr, slot->key.data, slot->key.bytes,
   3558         alg, input, input_length, salt, salt_length,
   3559         output, output_size, output_length);
   3560 
   3561 exit:
   3562     unlock_status = psa_unregister_read_under_mutex(slot);
   3563 
   3564     LOCAL_INPUT_FREE(input_external, input);
   3565     LOCAL_INPUT_FREE(salt_external, salt);
   3566     LOCAL_OUTPUT_FREE(output_external, output);
   3567 
   3568     return (status == PSA_SUCCESS) ? unlock_status : status;
   3569 }
   3570 
   3571 /****************************************************************/
   3572 /* Asymmetric interruptible cryptography                        */
   3573 /****************************************************************/
   3574 
   3575 static uint32_t psa_interruptible_max_ops = PSA_INTERRUPTIBLE_MAX_OPS_UNLIMITED;
   3576 
   3577 void psa_interruptible_set_max_ops(uint32_t max_ops)
   3578 {
   3579     psa_interruptible_max_ops = max_ops;
   3580 }
   3581 
   3582 uint32_t psa_interruptible_get_max_ops(void)
   3583 {
   3584     return psa_interruptible_max_ops;
   3585 }
   3586 
   3587 uint32_t psa_sign_hash_get_num_ops(
   3588     const psa_sign_hash_interruptible_operation_t *operation)
   3589 {
   3590     return operation->num_ops;
   3591 }
   3592 
   3593 uint32_t psa_verify_hash_get_num_ops(
   3594     const psa_verify_hash_interruptible_operation_t *operation)
   3595 {
   3596     return operation->num_ops;
   3597 }
   3598 
   3599 static psa_status_t psa_sign_hash_abort_internal(
   3600     psa_sign_hash_interruptible_operation_t *operation)
   3601 {
   3602     if (operation->id == 0) {
   3603         /* The object has (apparently) been initialized but it is not (yet)
   3604          * in use. It's ok to call abort on such an object, and there's
   3605          * nothing to do. */
   3606         return PSA_SUCCESS;
   3607     }
   3608 
   3609     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3610 
   3611     status = psa_driver_wrapper_sign_hash_abort(operation);
   3612 
   3613     operation->id = 0;
   3614 
   3615     /* Do not clear either the error_occurred or num_ops elements here as they
   3616      * only want to be cleared by the application calling abort, not by abort
   3617      * being called at completion of an operation. */
   3618 
   3619     return status;
   3620 }
   3621 
   3622 psa_status_t psa_sign_hash_start(
   3623     psa_sign_hash_interruptible_operation_t *operation,
   3624     mbedtls_svc_key_id_t key, psa_algorithm_t alg,
   3625     const uint8_t *hash_external, size_t hash_length)
   3626 {
   3627     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3628     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   3629     psa_key_slot_t *slot;
   3630 
   3631     LOCAL_INPUT_DECLARE(hash_external, hash);
   3632 
   3633     /* Check that start has not been previously called, or operation has not
   3634      * previously errored. */
   3635     if (operation->id != 0 || operation->error_occurred) {
   3636         return PSA_ERROR_BAD_STATE;
   3637     }
   3638 
   3639     /* Make sure the driver-dependent part of the operation is zeroed.
   3640      * This is a guarantee we make to drivers. Initializing the operation
   3641      * does not necessarily take care of it, since the context is a
   3642      * union and initializing a union does not necessarily initialize
   3643      * all of its members. */
   3644     memset(&operation->ctx, 0, sizeof(operation->ctx));
   3645 
   3646     status = psa_sign_verify_check_alg(0, alg);
   3647     if (status != PSA_SUCCESS) {
   3648         operation->error_occurred = 1;
   3649         return status;
   3650     }
   3651 
   3652     status = psa_get_and_lock_key_slot_with_policy(key, &slot,
   3653                                                    PSA_KEY_USAGE_SIGN_HASH,
   3654                                                    alg);
   3655 
   3656     if (status != PSA_SUCCESS) {
   3657         goto exit;
   3658     }
   3659 
   3660     if (!PSA_KEY_TYPE_IS_KEY_PAIR(slot->attr.type)) {
   3661         status = PSA_ERROR_INVALID_ARGUMENT;
   3662         goto exit;
   3663     }
   3664 
   3665     LOCAL_INPUT_ALLOC(hash_external, hash_length, hash);
   3666 
   3667     /* Ensure ops count gets reset, in case of operation re-use. */
   3668     operation->num_ops = 0;
   3669 
   3670     status = psa_driver_wrapper_sign_hash_start(operation, &slot->attr,
   3671                                                 slot->key.data,
   3672                                                 slot->key.bytes, alg,
   3673                                                 hash, hash_length);
   3674 exit:
   3675 
   3676     if (status != PSA_SUCCESS) {
   3677         operation->error_occurred = 1;
   3678         psa_sign_hash_abort_internal(operation);
   3679     }
   3680 
   3681     unlock_status = psa_unregister_read_under_mutex(slot);
   3682 
   3683     if (unlock_status != PSA_SUCCESS) {
   3684         operation->error_occurred = 1;
   3685     }
   3686 
   3687     LOCAL_INPUT_FREE(hash_external, hash);
   3688 
   3689     return (status == PSA_SUCCESS) ? unlock_status : status;
   3690 }
   3691 
   3692 
   3693 psa_status_t psa_sign_hash_complete(
   3694     psa_sign_hash_interruptible_operation_t *operation,
   3695     uint8_t *signature_external, size_t signature_size,
   3696     size_t *signature_length)
   3697 {
   3698     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3699 
   3700     LOCAL_OUTPUT_DECLARE(signature_external, signature);
   3701 
   3702     *signature_length = 0;
   3703 
   3704     /* Check that start has been called first, and that operation has not
   3705      * previously errored. */
   3706     if (operation->id == 0 || operation->error_occurred) {
   3707         status = PSA_ERROR_BAD_STATE;
   3708         goto exit;
   3709     }
   3710 
   3711     /* Immediately reject a zero-length signature buffer. This guarantees that
   3712      * signature must be a valid pointer. */
   3713     if (signature_size == 0) {
   3714         status = PSA_ERROR_BUFFER_TOO_SMALL;
   3715         goto exit;
   3716     }
   3717 
   3718     LOCAL_OUTPUT_ALLOC(signature_external, signature_size, signature);
   3719 
   3720     status = psa_driver_wrapper_sign_hash_complete(operation, signature,
   3721                                                    signature_size,
   3722                                                    signature_length);
   3723 
   3724     /* Update ops count with work done. */
   3725     operation->num_ops = psa_driver_wrapper_sign_hash_get_num_ops(operation);
   3726 
   3727 exit:
   3728 
   3729     if (signature != NULL) {
   3730         psa_wipe_tag_output_buffer(signature, status, signature_size,
   3731                                    *signature_length);
   3732     }
   3733 
   3734     if (status != PSA_OPERATION_INCOMPLETE) {
   3735         if (status != PSA_SUCCESS) {
   3736             operation->error_occurred = 1;
   3737         }
   3738 
   3739         psa_sign_hash_abort_internal(operation);
   3740     }
   3741 
   3742     LOCAL_OUTPUT_FREE(signature_external, signature);
   3743 
   3744     return status;
   3745 }
   3746 
   3747 psa_status_t psa_sign_hash_abort(
   3748     psa_sign_hash_interruptible_operation_t *operation)
   3749 {
   3750     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3751 
   3752     status = psa_sign_hash_abort_internal(operation);
   3753 
   3754     /* We clear the number of ops done here, so that it is not cleared when
   3755      * the operation fails or succeeds, only on manual abort. */
   3756     operation->num_ops = 0;
   3757 
   3758     /* Likewise, failure state. */
   3759     operation->error_occurred = 0;
   3760 
   3761     return status;
   3762 }
   3763 
   3764 static psa_status_t psa_verify_hash_abort_internal(
   3765     psa_verify_hash_interruptible_operation_t *operation)
   3766 {
   3767     if (operation->id == 0) {
   3768         /* The object has (apparently) been initialized but it is not (yet)
   3769          * in use. It's ok to call abort on such an object, and there's
   3770          * nothing to do. */
   3771         return PSA_SUCCESS;
   3772     }
   3773 
   3774     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3775 
   3776     status = psa_driver_wrapper_verify_hash_abort(operation);
   3777 
   3778     operation->id = 0;
   3779 
   3780     /* Do not clear either the error_occurred or num_ops elements here as they
   3781      * only want to be cleared by the application calling abort, not by abort
   3782      * being called at completion of an operation. */
   3783 
   3784     return status;
   3785 }
   3786 
   3787 psa_status_t psa_verify_hash_start(
   3788     psa_verify_hash_interruptible_operation_t *operation,
   3789     mbedtls_svc_key_id_t key, psa_algorithm_t alg,
   3790     const uint8_t *hash_external, size_t hash_length,
   3791     const uint8_t *signature_external, size_t signature_length)
   3792 {
   3793     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3794     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   3795     psa_key_slot_t *slot;
   3796 
   3797     LOCAL_INPUT_DECLARE(hash_external, hash);
   3798     LOCAL_INPUT_DECLARE(signature_external, signature);
   3799 
   3800     /* Check that start has not been previously called, or operation has not
   3801      * previously errored. */
   3802     if (operation->id != 0 || operation->error_occurred) {
   3803         return PSA_ERROR_BAD_STATE;
   3804     }
   3805 
   3806     /* Make sure the driver-dependent part of the operation is zeroed.
   3807      * This is a guarantee we make to drivers. Initializing the operation
   3808      * does not necessarily take care of it, since the context is a
   3809      * union and initializing a union does not necessarily initialize
   3810      * all of its members. */
   3811     memset(&operation->ctx, 0, sizeof(operation->ctx));
   3812 
   3813     status = psa_sign_verify_check_alg(0, alg);
   3814     if (status != PSA_SUCCESS) {
   3815         operation->error_occurred = 1;
   3816         return status;
   3817     }
   3818 
   3819     status = psa_get_and_lock_key_slot_with_policy(key, &slot,
   3820                                                    PSA_KEY_USAGE_VERIFY_HASH,
   3821                                                    alg);
   3822 
   3823     if (status != PSA_SUCCESS) {
   3824         operation->error_occurred = 1;
   3825         return status;
   3826     }
   3827 
   3828     LOCAL_INPUT_ALLOC(hash_external, hash_length, hash);
   3829     LOCAL_INPUT_ALLOC(signature_external, signature_length, signature);
   3830 
   3831     /* Ensure ops count gets reset, in case of operation re-use. */
   3832     operation->num_ops = 0;
   3833 
   3834     status = psa_driver_wrapper_verify_hash_start(operation, &slot->attr,
   3835                                                   slot->key.data,
   3836                                                   slot->key.bytes,
   3837                                                   alg, hash, hash_length,
   3838                                                   signature, signature_length);
   3839 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   3840 exit:
   3841 #endif
   3842 
   3843     if (status != PSA_SUCCESS) {
   3844         operation->error_occurred = 1;
   3845         psa_verify_hash_abort_internal(operation);
   3846     }
   3847 
   3848     unlock_status = psa_unregister_read_under_mutex(slot);
   3849 
   3850     if (unlock_status != PSA_SUCCESS) {
   3851         operation->error_occurred = 1;
   3852     }
   3853 
   3854     LOCAL_INPUT_FREE(hash_external, hash);
   3855     LOCAL_INPUT_FREE(signature_external, signature);
   3856 
   3857     return (status == PSA_SUCCESS) ? unlock_status : status;
   3858 }
   3859 
   3860 psa_status_t psa_verify_hash_complete(
   3861     psa_verify_hash_interruptible_operation_t *operation)
   3862 {
   3863     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3864 
   3865     /* Check that start has been called first, and that operation has not
   3866      * previously errored. */
   3867     if (operation->id == 0 || operation->error_occurred) {
   3868         status = PSA_ERROR_BAD_STATE;
   3869         goto exit;
   3870     }
   3871 
   3872     status = psa_driver_wrapper_verify_hash_complete(operation);
   3873 
   3874     /* Update ops count with work done. */
   3875     operation->num_ops = psa_driver_wrapper_verify_hash_get_num_ops(
   3876         operation);
   3877 
   3878 exit:
   3879 
   3880     if (status != PSA_OPERATION_INCOMPLETE) {
   3881         if (status != PSA_SUCCESS) {
   3882             operation->error_occurred = 1;
   3883         }
   3884 
   3885         psa_verify_hash_abort_internal(operation);
   3886     }
   3887 
   3888     return status;
   3889 }
   3890 
   3891 psa_status_t psa_verify_hash_abort(
   3892     psa_verify_hash_interruptible_operation_t *operation)
   3893 {
   3894     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   3895 
   3896     status = psa_verify_hash_abort_internal(operation);
   3897 
   3898     /* We clear the number of ops done here, so that it is not cleared when
   3899      * the operation fails or succeeds, only on manual abort. */
   3900     operation->num_ops = 0;
   3901 
   3902     /* Likewise, failure state. */
   3903     operation->error_occurred = 0;
   3904 
   3905     return status;
   3906 }
   3907 
   3908 /****************************************************************/
   3909 /* Asymmetric interruptible cryptography internal               */
   3910 /* implementations                                              */
   3911 /****************************************************************/
   3912 
   3913 void mbedtls_psa_interruptible_set_max_ops(uint32_t max_ops)
   3914 {
   3915 
   3916 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   3917     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   3918     defined(MBEDTLS_ECP_RESTARTABLE)
   3919 
   3920     /* Internal implementation uses zero to indicate infinite number max ops,
   3921      * therefore avoid this value, and set to minimum possible. */
   3922     if (max_ops == 0) {
   3923         max_ops = 1;
   3924     }
   3925 
   3926     mbedtls_ecp_set_max_ops(max_ops);
   3927 #else
   3928     (void) max_ops;
   3929 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   3930         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   3931         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   3932 }
   3933 
   3934 uint32_t mbedtls_psa_sign_hash_get_num_ops(
   3935     const mbedtls_psa_sign_hash_interruptible_operation_t *operation)
   3936 {
   3937 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   3938     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   3939     defined(MBEDTLS_ECP_RESTARTABLE)
   3940 
   3941     return operation->num_ops;
   3942 #else
   3943     (void) operation;
   3944     return 0;
   3945 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   3946         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   3947         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   3948 }
   3949 
   3950 uint32_t mbedtls_psa_verify_hash_get_num_ops(
   3951     const mbedtls_psa_verify_hash_interruptible_operation_t *operation)
   3952 {
   3953     #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   3954     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   3955     defined(MBEDTLS_ECP_RESTARTABLE)
   3956 
   3957     return operation->num_ops;
   3958 #else
   3959     (void) operation;
   3960     return 0;
   3961 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   3962         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   3963         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   3964 }
   3965 
   3966 /* Detect supported interruptible sign/verify mechanisms precisely.
   3967  * This is not strictly needed: we could accept everything, and let the
   3968  * code fail later during complete() if the mechanism is unsupported
   3969  * (e.g. attempting deterministic ECDSA when only the randomized variant
   3970  * is available). But it's easier for applications and especially for our
   3971  * test code to detect all not-supported errors during start().
   3972  *
   3973  * Note that this function ignores the hash component. The core code
   3974  * is supposed to check the hash part by calling is_hash_supported().
   3975  */
   3976 static inline int can_do_interruptible_sign_verify(psa_algorithm_t alg)
   3977 {
   3978 #if defined(MBEDTLS_ECP_RESTARTABLE)
   3979 #if defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
   3980     if (PSA_ALG_IS_DETERMINISTIC_ECDSA(alg)) {
   3981         return 1;
   3982     }
   3983 #endif
   3984 #if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA)
   3985     if (PSA_ALG_IS_RANDOMIZED_ECDSA(alg)) {
   3986         return 1;
   3987     }
   3988 #endif
   3989 #endif /* defined(MBEDTLS_ECP_RESTARTABLE) */
   3990     (void) alg;
   3991     return 0;
   3992 }
   3993 
   3994 psa_status_t mbedtls_psa_sign_hash_start(
   3995     mbedtls_psa_sign_hash_interruptible_operation_t *operation,
   3996     const psa_key_attributes_t *attributes, const uint8_t *key_buffer,
   3997     size_t key_buffer_size, psa_algorithm_t alg,
   3998     const uint8_t *hash, size_t hash_length)
   3999 {
   4000     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4001     size_t required_hash_length;
   4002 
   4003     if (!PSA_KEY_TYPE_IS_ECC_KEY_PAIR(attributes->type)) {
   4004         return PSA_ERROR_NOT_SUPPORTED;
   4005     }
   4006     psa_ecc_family_t curve = PSA_KEY_TYPE_ECC_GET_FAMILY(attributes->type);
   4007     if (!PSA_ECC_FAMILY_IS_WEIERSTRASS(curve)) {
   4008         return PSA_ERROR_INVALID_ARGUMENT;
   4009     }
   4010 
   4011     if (!can_do_interruptible_sign_verify(alg)) {
   4012         return PSA_ERROR_NOT_SUPPORTED;
   4013     }
   4014 
   4015 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   4016     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   4017     defined(MBEDTLS_ECP_RESTARTABLE)
   4018 
   4019     mbedtls_ecdsa_restart_init(&operation->restart_ctx);
   4020 
   4021     /* Ensure num_ops is zero'ed in case of context re-use. */
   4022     operation->num_ops = 0;
   4023 
   4024     status = mbedtls_psa_ecp_load_representation(attributes->type,
   4025                                                  attributes->bits,
   4026                                                  key_buffer,
   4027                                                  key_buffer_size,
   4028                                                  &operation->ctx);
   4029 
   4030     if (status != PSA_SUCCESS) {
   4031         return status;
   4032     }
   4033 
   4034     operation->coordinate_bytes = PSA_BITS_TO_BYTES(
   4035         operation->ctx->grp.nbits);
   4036 
   4037     psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH(alg);
   4038     operation->md_alg = mbedtls_md_type_from_psa_alg(hash_alg);
   4039     operation->alg = alg;
   4040 
   4041     /* We only need to store the same length of hash as the private key size
   4042      * here, it would be truncated by the internal implementation anyway. */
   4043     required_hash_length = (hash_length < operation->coordinate_bytes ?
   4044                             hash_length : operation->coordinate_bytes);
   4045 
   4046     if (required_hash_length > sizeof(operation->hash)) {
   4047         /* Shouldn't happen, but better safe than sorry. */
   4048         return PSA_ERROR_CORRUPTION_DETECTED;
   4049     }
   4050 
   4051     memcpy(operation->hash, hash, required_hash_length);
   4052     operation->hash_length = required_hash_length;
   4053 
   4054     return PSA_SUCCESS;
   4055 
   4056 #else
   4057     (void) operation;
   4058     (void) key_buffer;
   4059     (void) key_buffer_size;
   4060     (void) alg;
   4061     (void) hash;
   4062     (void) hash_length;
   4063     (void) status;
   4064     (void) required_hash_length;
   4065 
   4066     return PSA_ERROR_NOT_SUPPORTED;
   4067 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   4068         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   4069         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   4070 }
   4071 
   4072 psa_status_t mbedtls_psa_sign_hash_complete(
   4073     mbedtls_psa_sign_hash_interruptible_operation_t *operation,
   4074     uint8_t *signature, size_t signature_size,
   4075     size_t *signature_length)
   4076 {
   4077 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   4078     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   4079     defined(MBEDTLS_ECP_RESTARTABLE)
   4080 
   4081     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4082     mbedtls_mpi r;
   4083     mbedtls_mpi s;
   4084 
   4085     mbedtls_mpi_init(&r);
   4086     mbedtls_mpi_init(&s);
   4087 
   4088     /* Ensure max_ops is set to the current value (or default). */
   4089     mbedtls_psa_interruptible_set_max_ops(psa_interruptible_get_max_ops());
   4090 
   4091     if (signature_size < 2 * operation->coordinate_bytes) {
   4092         status = PSA_ERROR_BUFFER_TOO_SMALL;
   4093         goto exit;
   4094     }
   4095 
   4096     if (PSA_ALG_ECDSA_IS_DETERMINISTIC(operation->alg)) {
   4097 
   4098 #if defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
   4099         status = mbedtls_to_psa_error(
   4100             mbedtls_ecdsa_sign_det_restartable(&operation->ctx->grp,
   4101                                                &r,
   4102                                                &s,
   4103                                                &operation->ctx->d,
   4104                                                operation->hash,
   4105                                                operation->hash_length,
   4106                                                operation->md_alg,
   4107                                                mbedtls_psa_get_random,
   4108                                                MBEDTLS_PSA_RANDOM_STATE,
   4109                                                &operation->restart_ctx));
   4110 #else /* defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
   4111         status = PSA_ERROR_NOT_SUPPORTED;
   4112         goto exit;
   4113 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
   4114     } else {
   4115         status = mbedtls_to_psa_error(
   4116             mbedtls_ecdsa_sign_restartable(&operation->ctx->grp,
   4117                                            &r,
   4118                                            &s,
   4119                                            &operation->ctx->d,
   4120                                            operation->hash,
   4121                                            operation->hash_length,
   4122                                            mbedtls_psa_get_random,
   4123                                            MBEDTLS_PSA_RANDOM_STATE,
   4124                                            mbedtls_psa_get_random,
   4125                                            MBEDTLS_PSA_RANDOM_STATE,
   4126                                            &operation->restart_ctx));
   4127     }
   4128 
   4129     /* Hide the fact that the restart context only holds a delta of number of
   4130      * ops done during the last operation, not an absolute value. */
   4131     operation->num_ops += operation->restart_ctx.ecp.ops_done;
   4132 
   4133     if (status == PSA_SUCCESS) {
   4134         status =  mbedtls_to_psa_error(
   4135             mbedtls_mpi_write_binary(&r,
   4136                                      signature,
   4137                                      operation->coordinate_bytes)
   4138             );
   4139 
   4140         if (status != PSA_SUCCESS) {
   4141             goto exit;
   4142         }
   4143 
   4144         status =  mbedtls_to_psa_error(
   4145             mbedtls_mpi_write_binary(&s,
   4146                                      signature +
   4147                                      operation->coordinate_bytes,
   4148                                      operation->coordinate_bytes)
   4149             );
   4150 
   4151         if (status != PSA_SUCCESS) {
   4152             goto exit;
   4153         }
   4154 
   4155         *signature_length = operation->coordinate_bytes * 2;
   4156 
   4157         status = PSA_SUCCESS;
   4158     }
   4159 
   4160 exit:
   4161 
   4162     mbedtls_mpi_free(&r);
   4163     mbedtls_mpi_free(&s);
   4164     return status;
   4165 
   4166  #else
   4167 
   4168     (void) operation;
   4169     (void) signature;
   4170     (void) signature_size;
   4171     (void) signature_length;
   4172 
   4173     return PSA_ERROR_NOT_SUPPORTED;
   4174 
   4175 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   4176         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   4177         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   4178 }
   4179 
   4180 psa_status_t mbedtls_psa_sign_hash_abort(
   4181     mbedtls_psa_sign_hash_interruptible_operation_t *operation)
   4182 {
   4183 
   4184 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   4185     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   4186     defined(MBEDTLS_ECP_RESTARTABLE)
   4187 
   4188     if (operation->ctx) {
   4189         mbedtls_ecdsa_free(operation->ctx);
   4190         mbedtls_free(operation->ctx);
   4191         operation->ctx = NULL;
   4192     }
   4193 
   4194     mbedtls_ecdsa_restart_free(&operation->restart_ctx);
   4195 
   4196     operation->num_ops = 0;
   4197 
   4198     return PSA_SUCCESS;
   4199 
   4200 #else
   4201 
   4202     (void) operation;
   4203 
   4204     return PSA_ERROR_NOT_SUPPORTED;
   4205 
   4206 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   4207         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   4208         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   4209 }
   4210 
   4211 psa_status_t mbedtls_psa_verify_hash_start(
   4212     mbedtls_psa_verify_hash_interruptible_operation_t *operation,
   4213     const psa_key_attributes_t *attributes,
   4214     const uint8_t *key_buffer, size_t key_buffer_size,
   4215     psa_algorithm_t alg,
   4216     const uint8_t *hash, size_t hash_length,
   4217     const uint8_t *signature, size_t signature_length)
   4218 {
   4219     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4220     size_t coordinate_bytes = 0;
   4221     size_t required_hash_length = 0;
   4222 
   4223     if (!PSA_KEY_TYPE_IS_ECC(attributes->type)) {
   4224         return PSA_ERROR_NOT_SUPPORTED;
   4225     }
   4226     psa_ecc_family_t curve = PSA_KEY_TYPE_ECC_GET_FAMILY(attributes->type);
   4227     if (!PSA_ECC_FAMILY_IS_WEIERSTRASS(curve)) {
   4228         return PSA_ERROR_INVALID_ARGUMENT;
   4229     }
   4230 
   4231     if (!can_do_interruptible_sign_verify(alg)) {
   4232         return PSA_ERROR_NOT_SUPPORTED;
   4233     }
   4234 
   4235 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   4236     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   4237     defined(MBEDTLS_ECP_RESTARTABLE)
   4238 
   4239     mbedtls_ecdsa_restart_init(&operation->restart_ctx);
   4240     mbedtls_mpi_init(&operation->r);
   4241     mbedtls_mpi_init(&operation->s);
   4242 
   4243     /* Ensure num_ops is zero'ed in case of context re-use. */
   4244     operation->num_ops = 0;
   4245 
   4246     status = mbedtls_psa_ecp_load_representation(attributes->type,
   4247                                                  attributes->bits,
   4248                                                  key_buffer,
   4249                                                  key_buffer_size,
   4250                                                  &operation->ctx);
   4251 
   4252     if (status != PSA_SUCCESS) {
   4253         return status;
   4254     }
   4255 
   4256     coordinate_bytes = PSA_BITS_TO_BYTES(operation->ctx->grp.nbits);
   4257 
   4258     if (signature_length != 2 * coordinate_bytes) {
   4259         return PSA_ERROR_INVALID_SIGNATURE;
   4260     }
   4261 
   4262     status = mbedtls_to_psa_error(
   4263         mbedtls_mpi_read_binary(&operation->r,
   4264                                 signature,
   4265                                 coordinate_bytes));
   4266 
   4267     if (status != PSA_SUCCESS) {
   4268         return status;
   4269     }
   4270 
   4271     status = mbedtls_to_psa_error(
   4272         mbedtls_mpi_read_binary(&operation->s,
   4273                                 signature +
   4274                                 coordinate_bytes,
   4275                                 coordinate_bytes));
   4276 
   4277     if (status != PSA_SUCCESS) {
   4278         return status;
   4279     }
   4280 
   4281     status = mbedtls_psa_ecp_load_public_part(operation->ctx);
   4282 
   4283     if (status != PSA_SUCCESS) {
   4284         return status;
   4285     }
   4286 
   4287     /* We only need to store the same length of hash as the private key size
   4288      * here, it would be truncated by the internal implementation anyway. */
   4289     required_hash_length = (hash_length < coordinate_bytes ? hash_length :
   4290                             coordinate_bytes);
   4291 
   4292     if (required_hash_length > sizeof(operation->hash)) {
   4293         /* Shouldn't happen, but better safe than sorry. */
   4294         return PSA_ERROR_CORRUPTION_DETECTED;
   4295     }
   4296 
   4297     memcpy(operation->hash, hash, required_hash_length);
   4298     operation->hash_length = required_hash_length;
   4299 
   4300     return PSA_SUCCESS;
   4301 #else
   4302     (void) operation;
   4303     (void) key_buffer;
   4304     (void) key_buffer_size;
   4305     (void) alg;
   4306     (void) hash;
   4307     (void) hash_length;
   4308     (void) signature;
   4309     (void) signature_length;
   4310     (void) status;
   4311     (void) coordinate_bytes;
   4312     (void) required_hash_length;
   4313 
   4314     return PSA_ERROR_NOT_SUPPORTED;
   4315 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   4316         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   4317         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   4318 }
   4319 
   4320 psa_status_t mbedtls_psa_verify_hash_complete(
   4321     mbedtls_psa_verify_hash_interruptible_operation_t *operation)
   4322 {
   4323 
   4324 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   4325     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   4326     defined(MBEDTLS_ECP_RESTARTABLE)
   4327 
   4328     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4329 
   4330     /* Ensure max_ops is set to the current value (or default). */
   4331     mbedtls_psa_interruptible_set_max_ops(psa_interruptible_get_max_ops());
   4332 
   4333     status = mbedtls_to_psa_error(
   4334         mbedtls_ecdsa_verify_restartable(&operation->ctx->grp,
   4335                                          operation->hash,
   4336                                          operation->hash_length,
   4337                                          &operation->ctx->Q,
   4338                                          &operation->r,
   4339                                          &operation->s,
   4340                                          &operation->restart_ctx));
   4341 
   4342     /* Hide the fact that the restart context only holds a delta of number of
   4343      * ops done during the last operation, not an absolute value. */
   4344     operation->num_ops += operation->restart_ctx.ecp.ops_done;
   4345 
   4346     return status;
   4347 #else
   4348     (void) operation;
   4349 
   4350     return PSA_ERROR_NOT_SUPPORTED;
   4351 
   4352 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   4353         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   4354         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   4355 }
   4356 
   4357 psa_status_t mbedtls_psa_verify_hash_abort(
   4358     mbedtls_psa_verify_hash_interruptible_operation_t *operation)
   4359 {
   4360 
   4361 #if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
   4362     defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
   4363     defined(MBEDTLS_ECP_RESTARTABLE)
   4364 
   4365     if (operation->ctx) {
   4366         mbedtls_ecdsa_free(operation->ctx);
   4367         mbedtls_free(operation->ctx);
   4368         operation->ctx = NULL;
   4369     }
   4370 
   4371     mbedtls_ecdsa_restart_free(&operation->restart_ctx);
   4372 
   4373     operation->num_ops = 0;
   4374 
   4375     mbedtls_mpi_free(&operation->r);
   4376     mbedtls_mpi_free(&operation->s);
   4377 
   4378     return PSA_SUCCESS;
   4379 
   4380 #else
   4381     (void) operation;
   4382 
   4383     return PSA_ERROR_NOT_SUPPORTED;
   4384 
   4385 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
   4386         * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) &&
   4387         * defined( MBEDTLS_ECP_RESTARTABLE ) */
   4388 }
   4389 
   4390 static psa_status_t psa_generate_random_internal(uint8_t *output,
   4391                                                  size_t output_size)
   4392 {
   4393     GUARD_MODULE_INITIALIZED;
   4394 
   4395 #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
   4396 
   4397     psa_status_t status;
   4398     size_t output_length = 0;
   4399     status = mbedtls_psa_external_get_random(&global_data.rng,
   4400                                              output, output_size,
   4401                                              &output_length);
   4402     if (status != PSA_SUCCESS) {
   4403         return status;
   4404     }
   4405     /* Breaking up a request into smaller chunks is currently not supported
   4406      * for the external RNG interface. */
   4407     if (output_length != output_size) {
   4408         return PSA_ERROR_INSUFFICIENT_ENTROPY;
   4409     }
   4410     return PSA_SUCCESS;
   4411 
   4412 #else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   4413 
   4414     while (output_size > 0) {
   4415         int ret = MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED;
   4416         size_t request_size =
   4417             (output_size > MBEDTLS_PSA_RANDOM_MAX_REQUEST ?
   4418              MBEDTLS_PSA_RANDOM_MAX_REQUEST :
   4419              output_size);
   4420 #if defined(MBEDTLS_CTR_DRBG_C)
   4421         ret = mbedtls_ctr_drbg_random(&global_data.rng.drbg, output, request_size);
   4422 #elif defined(MBEDTLS_HMAC_DRBG_C)
   4423         ret = mbedtls_hmac_drbg_random(&global_data.rng.drbg, output, request_size);
   4424 #endif /* !MBEDTLS_CTR_DRBG_C && !MBEDTLS_HMAC_DRBG_C */
   4425         if (ret != 0) {
   4426             return mbedtls_to_psa_error(ret);
   4427         }
   4428         output_size -= request_size;
   4429         output += request_size;
   4430     }
   4431     return PSA_SUCCESS;
   4432 #endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   4433 }
   4434 
   4435 
   4436 /****************************************************************/
   4437 /* Symmetric cryptography */
   4438 /****************************************************************/
   4439 
   4440 static psa_status_t psa_cipher_setup(psa_cipher_operation_t *operation,
   4441                                      mbedtls_svc_key_id_t key,
   4442                                      psa_algorithm_t alg,
   4443                                      mbedtls_operation_t cipher_operation)
   4444 {
   4445     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4446     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   4447     psa_key_slot_t *slot = NULL;
   4448     psa_key_usage_t usage = (cipher_operation == MBEDTLS_ENCRYPT ?
   4449                              PSA_KEY_USAGE_ENCRYPT :
   4450                              PSA_KEY_USAGE_DECRYPT);
   4451 
   4452     /* A context must be freshly initialized before it can be set up. */
   4453     if (operation->id != 0) {
   4454         status = PSA_ERROR_BAD_STATE;
   4455         goto exit;
   4456     }
   4457 
   4458     if (!PSA_ALG_IS_CIPHER(alg)) {
   4459         status = PSA_ERROR_INVALID_ARGUMENT;
   4460         goto exit;
   4461     }
   4462 
   4463     status = psa_get_and_lock_key_slot_with_policy(key, &slot, usage, alg);
   4464     if (status != PSA_SUCCESS) {
   4465         goto exit;
   4466     }
   4467 
   4468     /* Initialize the operation struct members, except for id. The id member
   4469      * is used to indicate to psa_cipher_abort that there are resources to free,
   4470      * so we only set it (in the driver wrapper) after resources have been
   4471      * allocated/initialized. */
   4472     operation->iv_set = 0;
   4473     if (alg == PSA_ALG_ECB_NO_PADDING) {
   4474         operation->iv_required = 0;
   4475     } else {
   4476         operation->iv_required = 1;
   4477     }
   4478     operation->default_iv_length = PSA_CIPHER_IV_LENGTH(slot->attr.type, alg);
   4479 
   4480 
   4481     /* Make sure the driver-dependent part of the operation is zeroed.
   4482      * This is a guarantee we make to drivers. Initializing the operation
   4483      * does not necessarily take care of it, since the context is a
   4484      * union and initializing a union does not necessarily initialize
   4485      * all of its members. */
   4486     memset(&operation->ctx, 0, sizeof(operation->ctx));
   4487 
   4488     /* Try doing the operation through a driver before using software fallback. */
   4489     if (cipher_operation == MBEDTLS_ENCRYPT) {
   4490         status = psa_driver_wrapper_cipher_encrypt_setup(operation,
   4491                                                          &slot->attr,
   4492                                                          slot->key.data,
   4493                                                          slot->key.bytes,
   4494                                                          alg);
   4495     } else {
   4496         status = psa_driver_wrapper_cipher_decrypt_setup(operation,
   4497                                                          &slot->attr,
   4498                                                          slot->key.data,
   4499                                                          slot->key.bytes,
   4500                                                          alg);
   4501     }
   4502 
   4503 exit:
   4504     if (status != PSA_SUCCESS) {
   4505         psa_cipher_abort(operation);
   4506     }
   4507 
   4508     unlock_status = psa_unregister_read_under_mutex(slot);
   4509 
   4510     return (status == PSA_SUCCESS) ? unlock_status : status;
   4511 }
   4512 
   4513 psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
   4514                                       mbedtls_svc_key_id_t key,
   4515                                       psa_algorithm_t alg)
   4516 {
   4517     return psa_cipher_setup(operation, key, alg, MBEDTLS_ENCRYPT);
   4518 }
   4519 
   4520 psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
   4521                                       mbedtls_svc_key_id_t key,
   4522                                       psa_algorithm_t alg)
   4523 {
   4524     return psa_cipher_setup(operation, key, alg, MBEDTLS_DECRYPT);
   4525 }
   4526 
   4527 psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
   4528                                     uint8_t *iv_external,
   4529                                     size_t iv_size,
   4530                                     size_t *iv_length)
   4531 {
   4532     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4533     size_t default_iv_length = 0;
   4534 
   4535     LOCAL_OUTPUT_DECLARE(iv_external, iv);
   4536 
   4537     if (operation->id == 0) {
   4538         status = PSA_ERROR_BAD_STATE;
   4539         goto exit;
   4540     }
   4541 
   4542     if (operation->iv_set || !operation->iv_required) {
   4543         status = PSA_ERROR_BAD_STATE;
   4544         goto exit;
   4545     }
   4546 
   4547     default_iv_length = operation->default_iv_length;
   4548     if (iv_size < default_iv_length) {
   4549         status = PSA_ERROR_BUFFER_TOO_SMALL;
   4550         goto exit;
   4551     }
   4552 
   4553     if (default_iv_length > PSA_CIPHER_IV_MAX_SIZE) {
   4554         status = PSA_ERROR_GENERIC_ERROR;
   4555         goto exit;
   4556     }
   4557 
   4558     LOCAL_OUTPUT_ALLOC(iv_external, default_iv_length, iv);
   4559 
   4560     status = psa_generate_random_internal(iv, default_iv_length);
   4561     if (status != PSA_SUCCESS) {
   4562         goto exit;
   4563     }
   4564 
   4565     status = psa_driver_wrapper_cipher_set_iv(operation,
   4566                                               iv, default_iv_length);
   4567 
   4568 exit:
   4569     if (status == PSA_SUCCESS) {
   4570         *iv_length = default_iv_length;
   4571         operation->iv_set = 1;
   4572     } else {
   4573         *iv_length = 0;
   4574         psa_cipher_abort(operation);
   4575         if (iv != NULL) {
   4576             mbedtls_platform_zeroize(iv, default_iv_length);
   4577         }
   4578     }
   4579 
   4580     LOCAL_OUTPUT_FREE(iv_external, iv);
   4581     return status;
   4582 }
   4583 
   4584 psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
   4585                                const uint8_t *iv_external,
   4586                                size_t iv_length)
   4587 {
   4588     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4589 
   4590     LOCAL_INPUT_DECLARE(iv_external, iv);
   4591 
   4592     if (operation->id == 0) {
   4593         status = PSA_ERROR_BAD_STATE;
   4594         goto exit;
   4595     }
   4596 
   4597     if (operation->iv_set || !operation->iv_required) {
   4598         status = PSA_ERROR_BAD_STATE;
   4599         goto exit;
   4600     }
   4601 
   4602     if (iv_length > PSA_CIPHER_IV_MAX_SIZE) {
   4603         status = PSA_ERROR_INVALID_ARGUMENT;
   4604         goto exit;
   4605     }
   4606 
   4607     LOCAL_INPUT_ALLOC(iv_external, iv_length, iv);
   4608 
   4609     status = psa_driver_wrapper_cipher_set_iv(operation,
   4610                                               iv,
   4611                                               iv_length);
   4612 
   4613 exit:
   4614     if (status == PSA_SUCCESS) {
   4615         operation->iv_set = 1;
   4616     } else {
   4617         psa_cipher_abort(operation);
   4618     }
   4619 
   4620     LOCAL_INPUT_FREE(iv_external, iv);
   4621 
   4622     return status;
   4623 }
   4624 
   4625 psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
   4626                                const uint8_t *input_external,
   4627                                size_t input_length,
   4628                                uint8_t *output_external,
   4629                                size_t output_size,
   4630                                size_t *output_length)
   4631 {
   4632     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4633 
   4634     LOCAL_INPUT_DECLARE(input_external, input);
   4635     LOCAL_OUTPUT_DECLARE(output_external, output);
   4636 
   4637     if (operation->id == 0) {
   4638         status = PSA_ERROR_BAD_STATE;
   4639         goto exit;
   4640     }
   4641 
   4642     if (operation->iv_required && !operation->iv_set) {
   4643         status = PSA_ERROR_BAD_STATE;
   4644         goto exit;
   4645     }
   4646 
   4647     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   4648     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   4649 
   4650     status = psa_driver_wrapper_cipher_update(operation,
   4651                                               input,
   4652                                               input_length,
   4653                                               output,
   4654                                               output_size,
   4655                                               output_length);
   4656 
   4657 exit:
   4658     if (status != PSA_SUCCESS) {
   4659         psa_cipher_abort(operation);
   4660     }
   4661 
   4662     LOCAL_INPUT_FREE(input_external, input);
   4663     LOCAL_OUTPUT_FREE(output_external, output);
   4664 
   4665     return status;
   4666 }
   4667 
   4668 psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
   4669                                uint8_t *output_external,
   4670                                size_t output_size,
   4671                                size_t *output_length)
   4672 {
   4673     psa_status_t status = PSA_ERROR_GENERIC_ERROR;
   4674 
   4675     LOCAL_OUTPUT_DECLARE(output_external, output);
   4676 
   4677     if (operation->id == 0) {
   4678         status = PSA_ERROR_BAD_STATE;
   4679         goto exit;
   4680     }
   4681 
   4682     if (operation->iv_required && !operation->iv_set) {
   4683         status = PSA_ERROR_BAD_STATE;
   4684         goto exit;
   4685     }
   4686 
   4687     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   4688 
   4689     status = psa_driver_wrapper_cipher_finish(operation,
   4690                                               output,
   4691                                               output_size,
   4692                                               output_length);
   4693 
   4694 exit:
   4695     if (status == PSA_SUCCESS) {
   4696         status = psa_cipher_abort(operation);
   4697     } else {
   4698         *output_length = 0;
   4699         (void) psa_cipher_abort(operation);
   4700     }
   4701 
   4702     LOCAL_OUTPUT_FREE(output_external, output);
   4703 
   4704     return status;
   4705 }
   4706 
   4707 psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
   4708 {
   4709     if (operation->id == 0) {
   4710         /* The object has (apparently) been initialized but it is not (yet)
   4711          * in use. It's ok to call abort on such an object, and there's
   4712          * nothing to do. */
   4713         return PSA_SUCCESS;
   4714     }
   4715 
   4716     psa_driver_wrapper_cipher_abort(operation);
   4717 
   4718     operation->id = 0;
   4719     operation->iv_set = 0;
   4720     operation->iv_required = 0;
   4721 
   4722     return PSA_SUCCESS;
   4723 }
   4724 
   4725 psa_status_t psa_cipher_encrypt(mbedtls_svc_key_id_t key,
   4726                                 psa_algorithm_t alg,
   4727                                 const uint8_t *input_external,
   4728                                 size_t input_length,
   4729                                 uint8_t *output_external,
   4730                                 size_t output_size,
   4731                                 size_t *output_length)
   4732 {
   4733     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4734     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   4735     psa_key_slot_t *slot = NULL;
   4736     uint8_t local_iv[PSA_CIPHER_IV_MAX_SIZE];
   4737     size_t default_iv_length = 0;
   4738 
   4739     LOCAL_INPUT_DECLARE(input_external, input);
   4740     LOCAL_OUTPUT_DECLARE(output_external, output);
   4741 
   4742     if (!PSA_ALG_IS_CIPHER(alg)) {
   4743         status = PSA_ERROR_INVALID_ARGUMENT;
   4744         goto exit;
   4745     }
   4746 
   4747     status = psa_get_and_lock_key_slot_with_policy(key, &slot,
   4748                                                    PSA_KEY_USAGE_ENCRYPT,
   4749                                                    alg);
   4750     if (status != PSA_SUCCESS) {
   4751         goto exit;
   4752     }
   4753 
   4754     default_iv_length = PSA_CIPHER_IV_LENGTH(slot->attr.type, alg);
   4755     if (default_iv_length > PSA_CIPHER_IV_MAX_SIZE) {
   4756         status = PSA_ERROR_GENERIC_ERROR;
   4757         goto exit;
   4758     }
   4759 
   4760     if (default_iv_length > 0) {
   4761         if (output_size < default_iv_length) {
   4762             status = PSA_ERROR_BUFFER_TOO_SMALL;
   4763             goto exit;
   4764         }
   4765 
   4766         status = psa_generate_random_internal(local_iv, default_iv_length);
   4767         if (status != PSA_SUCCESS) {
   4768             goto exit;
   4769         }
   4770     }
   4771 
   4772     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   4773     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   4774 
   4775     status = psa_driver_wrapper_cipher_encrypt(
   4776         &slot->attr, slot->key.data, slot->key.bytes,
   4777         alg, local_iv, default_iv_length, input, input_length,
   4778         psa_crypto_buffer_offset(output, default_iv_length),
   4779         output_size - default_iv_length, output_length);
   4780 
   4781 exit:
   4782     unlock_status = psa_unregister_read_under_mutex(slot);
   4783     if (status == PSA_SUCCESS) {
   4784         status = unlock_status;
   4785     }
   4786 
   4787     if (status == PSA_SUCCESS) {
   4788         if (default_iv_length > 0) {
   4789             memcpy(output, local_iv, default_iv_length);
   4790         }
   4791         *output_length += default_iv_length;
   4792     } else {
   4793         *output_length = 0;
   4794     }
   4795 
   4796     LOCAL_INPUT_FREE(input_external, input);
   4797     LOCAL_OUTPUT_FREE(output_external, output);
   4798 
   4799     return status;
   4800 }
   4801 
   4802 psa_status_t psa_cipher_decrypt(mbedtls_svc_key_id_t key,
   4803                                 psa_algorithm_t alg,
   4804                                 const uint8_t *input_external,
   4805                                 size_t input_length,
   4806                                 uint8_t *output_external,
   4807                                 size_t output_size,
   4808                                 size_t *output_length)
   4809 {
   4810     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4811     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   4812     psa_key_slot_t *slot = NULL;
   4813 
   4814     LOCAL_INPUT_DECLARE(input_external, input);
   4815     LOCAL_OUTPUT_DECLARE(output_external, output);
   4816 
   4817     if (!PSA_ALG_IS_CIPHER(alg)) {
   4818         status = PSA_ERROR_INVALID_ARGUMENT;
   4819         goto exit;
   4820     }
   4821 
   4822     status = psa_get_and_lock_key_slot_with_policy(key, &slot,
   4823                                                    PSA_KEY_USAGE_DECRYPT,
   4824                                                    alg);
   4825     if (status != PSA_SUCCESS) {
   4826         goto exit;
   4827     }
   4828 
   4829     if (input_length < PSA_CIPHER_IV_LENGTH(slot->attr.type, alg)) {
   4830         status = PSA_ERROR_INVALID_ARGUMENT;
   4831         goto exit;
   4832     }
   4833 
   4834     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   4835     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   4836 
   4837     status = psa_driver_wrapper_cipher_decrypt(
   4838         &slot->attr, slot->key.data, slot->key.bytes,
   4839         alg, input, input_length,
   4840         output, output_size, output_length);
   4841 
   4842 exit:
   4843     unlock_status = psa_unregister_read_under_mutex(slot);
   4844     if (status == PSA_SUCCESS) {
   4845         status = unlock_status;
   4846     }
   4847 
   4848     if (status != PSA_SUCCESS) {
   4849         *output_length = 0;
   4850     }
   4851 
   4852     LOCAL_INPUT_FREE(input_external, input);
   4853     LOCAL_OUTPUT_FREE(output_external, output);
   4854 
   4855     return status;
   4856 }
   4857 
   4858 
   4859 /****************************************************************/
   4860 /* AEAD */
   4861 /****************************************************************/
   4862 
   4863 /* Helper function to get the base algorithm from its variants. */
   4864 static psa_algorithm_t psa_aead_get_base_algorithm(psa_algorithm_t alg)
   4865 {
   4866     return PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(alg);
   4867 }
   4868 
   4869 /* Helper function to perform common nonce length checks. */
   4870 static psa_status_t psa_aead_check_nonce_length(psa_algorithm_t alg,
   4871                                                 size_t nonce_length)
   4872 {
   4873     psa_algorithm_t base_alg = psa_aead_get_base_algorithm(alg);
   4874 
   4875     switch (base_alg) {
   4876 #if defined(PSA_WANT_ALG_GCM)
   4877         case PSA_ALG_GCM:
   4878             /* Not checking max nonce size here as GCM spec allows almost
   4879              * arbitrarily large nonces. Please note that we do not generally
   4880              * recommend the usage of nonces of greater length than
   4881              * PSA_AEAD_NONCE_MAX_SIZE, as large nonces are hashed to a shorter
   4882              * size, which can then lead to collisions if you encrypt a very
   4883              * large number of messages.*/
   4884             if (nonce_length != 0) {
   4885                 return PSA_SUCCESS;
   4886             }
   4887             break;
   4888 #endif /* PSA_WANT_ALG_GCM */
   4889 #if defined(PSA_WANT_ALG_CCM)
   4890         case PSA_ALG_CCM:
   4891             if (nonce_length >= 7 && nonce_length <= 13) {
   4892                 return PSA_SUCCESS;
   4893             }
   4894             break;
   4895 #endif /* PSA_WANT_ALG_CCM */
   4896 #if defined(PSA_WANT_ALG_CHACHA20_POLY1305)
   4897         case PSA_ALG_CHACHA20_POLY1305:
   4898             if (nonce_length == 12) {
   4899                 return PSA_SUCCESS;
   4900             } else if (nonce_length == 8) {
   4901                 return PSA_ERROR_NOT_SUPPORTED;
   4902             }
   4903             break;
   4904 #endif /* PSA_WANT_ALG_CHACHA20_POLY1305 */
   4905         default:
   4906             (void) nonce_length;
   4907             return PSA_ERROR_NOT_SUPPORTED;
   4908     }
   4909 
   4910     return PSA_ERROR_INVALID_ARGUMENT;
   4911 }
   4912 
   4913 static psa_status_t psa_aead_check_algorithm(psa_algorithm_t alg)
   4914 {
   4915     if (!PSA_ALG_IS_AEAD(alg) || PSA_ALG_IS_WILDCARD(alg)) {
   4916         return PSA_ERROR_INVALID_ARGUMENT;
   4917     }
   4918 
   4919     return PSA_SUCCESS;
   4920 }
   4921 
   4922 psa_status_t psa_aead_encrypt(mbedtls_svc_key_id_t key,
   4923                               psa_algorithm_t alg,
   4924                               const uint8_t *nonce_external,
   4925                               size_t nonce_length,
   4926                               const uint8_t *additional_data_external,
   4927                               size_t additional_data_length,
   4928                               const uint8_t *plaintext_external,
   4929                               size_t plaintext_length,
   4930                               uint8_t *ciphertext_external,
   4931                               size_t ciphertext_size,
   4932                               size_t *ciphertext_length)
   4933 {
   4934     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   4935     psa_key_slot_t *slot;
   4936 
   4937     LOCAL_INPUT_DECLARE(nonce_external, nonce);
   4938     LOCAL_INPUT_DECLARE(additional_data_external, additional_data);
   4939     LOCAL_INPUT_DECLARE(plaintext_external, plaintext);
   4940     LOCAL_OUTPUT_DECLARE(ciphertext_external, ciphertext);
   4941 
   4942     *ciphertext_length = 0;
   4943 
   4944     status = psa_aead_check_algorithm(alg);
   4945     if (status != PSA_SUCCESS) {
   4946         return status;
   4947     }
   4948 
   4949     status = psa_get_and_lock_key_slot_with_policy(
   4950         key, &slot, PSA_KEY_USAGE_ENCRYPT, alg);
   4951     if (status != PSA_SUCCESS) {
   4952         return status;
   4953     }
   4954 
   4955     LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce);
   4956     LOCAL_INPUT_ALLOC(additional_data_external, additional_data_length, additional_data);
   4957     LOCAL_INPUT_ALLOC(plaintext_external, plaintext_length, plaintext);
   4958     LOCAL_OUTPUT_ALLOC(ciphertext_external, ciphertext_size, ciphertext);
   4959 
   4960     status = psa_aead_check_nonce_length(alg, nonce_length);
   4961     if (status != PSA_SUCCESS) {
   4962         goto exit;
   4963     }
   4964 
   4965     status = psa_driver_wrapper_aead_encrypt(
   4966         &slot->attr, slot->key.data, slot->key.bytes,
   4967         alg,
   4968         nonce, nonce_length,
   4969         additional_data, additional_data_length,
   4970         plaintext, plaintext_length,
   4971         ciphertext, ciphertext_size, ciphertext_length);
   4972 
   4973     if (status != PSA_SUCCESS && ciphertext_size != 0) {
   4974         memset(ciphertext, 0, ciphertext_size);
   4975     }
   4976 
   4977 exit:
   4978     LOCAL_INPUT_FREE(nonce_external, nonce);
   4979     LOCAL_INPUT_FREE(additional_data_external, additional_data);
   4980     LOCAL_INPUT_FREE(plaintext_external, plaintext);
   4981     LOCAL_OUTPUT_FREE(ciphertext_external, ciphertext);
   4982 
   4983     psa_unregister_read_under_mutex(slot);
   4984 
   4985     return status;
   4986 }
   4987 
   4988 psa_status_t psa_aead_decrypt(mbedtls_svc_key_id_t key,
   4989                               psa_algorithm_t alg,
   4990                               const uint8_t *nonce_external,
   4991                               size_t nonce_length,
   4992                               const uint8_t *additional_data_external,
   4993                               size_t additional_data_length,
   4994                               const uint8_t *ciphertext_external,
   4995                               size_t ciphertext_length,
   4996                               uint8_t *plaintext_external,
   4997                               size_t plaintext_size,
   4998                               size_t *plaintext_length)
   4999 {
   5000     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5001     psa_key_slot_t *slot;
   5002 
   5003     LOCAL_INPUT_DECLARE(nonce_external, nonce);
   5004     LOCAL_INPUT_DECLARE(additional_data_external, additional_data);
   5005     LOCAL_INPUT_DECLARE(ciphertext_external, ciphertext);
   5006     LOCAL_OUTPUT_DECLARE(plaintext_external, plaintext);
   5007 
   5008     *plaintext_length = 0;
   5009 
   5010     status = psa_aead_check_algorithm(alg);
   5011     if (status != PSA_SUCCESS) {
   5012         return status;
   5013     }
   5014 
   5015     status = psa_get_and_lock_key_slot_with_policy(
   5016         key, &slot, PSA_KEY_USAGE_DECRYPT, alg);
   5017     if (status != PSA_SUCCESS) {
   5018         return status;
   5019     }
   5020 
   5021     LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce);
   5022     LOCAL_INPUT_ALLOC(additional_data_external, additional_data_length,
   5023                       additional_data);
   5024     LOCAL_INPUT_ALLOC(ciphertext_external, ciphertext_length, ciphertext);
   5025     LOCAL_OUTPUT_ALLOC(plaintext_external, plaintext_size, plaintext);
   5026 
   5027     status = psa_aead_check_nonce_length(alg, nonce_length);
   5028     if (status != PSA_SUCCESS) {
   5029         goto exit;
   5030     }
   5031 
   5032     status = psa_driver_wrapper_aead_decrypt(
   5033         &slot->attr, slot->key.data, slot->key.bytes,
   5034         alg,
   5035         nonce, nonce_length,
   5036         additional_data, additional_data_length,
   5037         ciphertext, ciphertext_length,
   5038         plaintext, plaintext_size, plaintext_length);
   5039 
   5040     if (status != PSA_SUCCESS && plaintext_size != 0) {
   5041         memset(plaintext, 0, plaintext_size);
   5042     }
   5043 
   5044 exit:
   5045     LOCAL_INPUT_FREE(nonce_external, nonce);
   5046     LOCAL_INPUT_FREE(additional_data_external, additional_data);
   5047     LOCAL_INPUT_FREE(ciphertext_external, ciphertext);
   5048     LOCAL_OUTPUT_FREE(plaintext_external, plaintext);
   5049 
   5050     psa_unregister_read_under_mutex(slot);
   5051 
   5052     return status;
   5053 }
   5054 
   5055 static psa_status_t psa_validate_tag_length(psa_algorithm_t alg)
   5056 {
   5057     const uint8_t tag_len = PSA_ALG_AEAD_GET_TAG_LENGTH(alg);
   5058 
   5059     switch (PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, 0)) {
   5060 #if defined(PSA_WANT_ALG_CCM)
   5061         case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, 0):
   5062             /* CCM allows the following tag lengths: 4, 6, 8, 10, 12, 14, 16.*/
   5063             if (tag_len < 4 || tag_len > 16 || tag_len % 2) {
   5064                 return PSA_ERROR_INVALID_ARGUMENT;
   5065             }
   5066             break;
   5067 #endif /* PSA_WANT_ALG_CCM */
   5068 
   5069 #if defined(PSA_WANT_ALG_GCM)
   5070         case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 0):
   5071             /* GCM allows the following tag lengths: 4, 8, 12, 13, 14, 15, 16. */
   5072             if (tag_len != 4 && tag_len != 8 && (tag_len < 12 || tag_len > 16)) {
   5073                 return PSA_ERROR_INVALID_ARGUMENT;
   5074             }
   5075             break;
   5076 #endif /* PSA_WANT_ALG_GCM */
   5077 
   5078 #if defined(PSA_WANT_ALG_CHACHA20_POLY1305)
   5079         case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CHACHA20_POLY1305, 0):
   5080             /* We only support the default tag length. */
   5081             if (tag_len != 16) {
   5082                 return PSA_ERROR_INVALID_ARGUMENT;
   5083             }
   5084             break;
   5085 #endif /* PSA_WANT_ALG_CHACHA20_POLY1305 */
   5086 
   5087         default:
   5088             (void) tag_len;
   5089             return PSA_ERROR_NOT_SUPPORTED;
   5090     }
   5091     return PSA_SUCCESS;
   5092 }
   5093 
   5094 /* Set the key for a multipart authenticated operation. */
   5095 static psa_status_t psa_aead_setup(psa_aead_operation_t *operation,
   5096                                    int is_encrypt,
   5097                                    mbedtls_svc_key_id_t key,
   5098                                    psa_algorithm_t alg)
   5099 {
   5100     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5101     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   5102     psa_key_slot_t *slot = NULL;
   5103     psa_key_usage_t key_usage = 0;
   5104 
   5105     status = psa_aead_check_algorithm(alg);
   5106     if (status != PSA_SUCCESS) {
   5107         goto exit;
   5108     }
   5109 
   5110     if (operation->id != 0) {
   5111         status = PSA_ERROR_BAD_STATE;
   5112         goto exit;
   5113     }
   5114 
   5115     if (operation->nonce_set || operation->lengths_set ||
   5116         operation->ad_started || operation->body_started) {
   5117         status = PSA_ERROR_BAD_STATE;
   5118         goto exit;
   5119     }
   5120 
   5121     /* Make sure the driver-dependent part of the operation is zeroed.
   5122      * This is a guarantee we make to drivers. Initializing the operation
   5123      * does not necessarily take care of it, since the context is a
   5124      * union and initializing a union does not necessarily initialize
   5125      * all of its members. */
   5126     memset(&operation->ctx, 0, sizeof(operation->ctx));
   5127 
   5128     if (is_encrypt) {
   5129         key_usage = PSA_KEY_USAGE_ENCRYPT;
   5130     } else {
   5131         key_usage = PSA_KEY_USAGE_DECRYPT;
   5132     }
   5133 
   5134     status = psa_get_and_lock_key_slot_with_policy(key, &slot, key_usage,
   5135                                                    alg);
   5136     if (status != PSA_SUCCESS) {
   5137         goto exit;
   5138     }
   5139 
   5140     if ((status = psa_validate_tag_length(alg)) != PSA_SUCCESS) {
   5141         goto exit;
   5142     }
   5143 
   5144     if (is_encrypt) {
   5145         status = psa_driver_wrapper_aead_encrypt_setup(operation,
   5146                                                        &slot->attr,
   5147                                                        slot->key.data,
   5148                                                        slot->key.bytes,
   5149                                                        alg);
   5150     } else {
   5151         status = psa_driver_wrapper_aead_decrypt_setup(operation,
   5152                                                        &slot->attr,
   5153                                                        slot->key.data,
   5154                                                        slot->key.bytes,
   5155                                                        alg);
   5156     }
   5157     if (status != PSA_SUCCESS) {
   5158         goto exit;
   5159     }
   5160 
   5161     operation->key_type = psa_get_key_type(&slot->attr);
   5162 
   5163 exit:
   5164     unlock_status = psa_unregister_read_under_mutex(slot);
   5165 
   5166     if (status == PSA_SUCCESS) {
   5167         status = unlock_status;
   5168         operation->alg = psa_aead_get_base_algorithm(alg);
   5169         operation->is_encrypt = is_encrypt;
   5170     } else {
   5171         psa_aead_abort(operation);
   5172     }
   5173 
   5174     return status;
   5175 }
   5176 
   5177 /* Set the key for a multipart authenticated encryption operation. */
   5178 psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
   5179                                     mbedtls_svc_key_id_t key,
   5180                                     psa_algorithm_t alg)
   5181 {
   5182     return psa_aead_setup(operation, 1, key, alg);
   5183 }
   5184 
   5185 /* Set the key for a multipart authenticated decryption operation. */
   5186 psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
   5187                                     mbedtls_svc_key_id_t key,
   5188                                     psa_algorithm_t alg)
   5189 {
   5190     return psa_aead_setup(operation, 0, key, alg);
   5191 }
   5192 
   5193 static psa_status_t psa_aead_set_nonce_internal(psa_aead_operation_t *operation,
   5194                                                 const uint8_t *nonce,
   5195                                                 size_t nonce_length)
   5196 {
   5197     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5198 
   5199     if (operation->id == 0) {
   5200         status = PSA_ERROR_BAD_STATE;
   5201         goto exit;
   5202     }
   5203 
   5204     if (operation->nonce_set) {
   5205         status = PSA_ERROR_BAD_STATE;
   5206         goto exit;
   5207     }
   5208 
   5209     status = psa_aead_check_nonce_length(operation->alg, nonce_length);
   5210     if (status != PSA_SUCCESS) {
   5211         status = PSA_ERROR_INVALID_ARGUMENT;
   5212         goto exit;
   5213     }
   5214 
   5215     status = psa_driver_wrapper_aead_set_nonce(operation, nonce,
   5216                                                nonce_length);
   5217 
   5218 exit:
   5219     if (status == PSA_SUCCESS) {
   5220         operation->nonce_set = 1;
   5221     } else {
   5222         psa_aead_abort(operation);
   5223     }
   5224 
   5225     return status;
   5226 }
   5227 
   5228 /* Generate a random nonce / IV for multipart AEAD operation */
   5229 psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
   5230                                      uint8_t *nonce_external,
   5231                                      size_t nonce_size,
   5232                                      size_t *nonce_length)
   5233 {
   5234     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5235     uint8_t local_nonce[PSA_AEAD_NONCE_MAX_SIZE];
   5236     size_t required_nonce_size = 0;
   5237 
   5238     LOCAL_OUTPUT_DECLARE(nonce_external, nonce);
   5239     LOCAL_OUTPUT_ALLOC(nonce_external, nonce_size, nonce);
   5240 
   5241     *nonce_length = 0;
   5242 
   5243     if (operation->id == 0) {
   5244         status = PSA_ERROR_BAD_STATE;
   5245         goto exit;
   5246     }
   5247 
   5248     if (operation->nonce_set || !operation->is_encrypt) {
   5249         status = PSA_ERROR_BAD_STATE;
   5250         goto exit;
   5251     }
   5252 
   5253     /* For CCM, this size may not be correct according to the PSA
   5254      * specification. The PSA Crypto 1.0.1 specification states:
   5255      *
   5256      * CCM encodes the plaintext length pLen in L octets, with L the smallest
   5257      * integer >= 2 where pLen < 2^(8L). The nonce length is then 15 - L bytes.
   5258      *
   5259      * However this restriction that L has to be the smallest integer is not
   5260      * applied in practice, and it is not implementable here since the
   5261      * plaintext length may or may not be known at this time. */
   5262     required_nonce_size = PSA_AEAD_NONCE_LENGTH(operation->key_type,
   5263                                                 operation->alg);
   5264     if (nonce_size < required_nonce_size) {
   5265         status = PSA_ERROR_BUFFER_TOO_SMALL;
   5266         goto exit;
   5267     }
   5268 
   5269     status = psa_generate_random_internal(local_nonce, required_nonce_size);
   5270     if (status != PSA_SUCCESS) {
   5271         goto exit;
   5272     }
   5273 
   5274     status = psa_aead_set_nonce_internal(operation, local_nonce,
   5275                                          required_nonce_size);
   5276 
   5277 exit:
   5278     if (status == PSA_SUCCESS) {
   5279         memcpy(nonce, local_nonce, required_nonce_size);
   5280         *nonce_length = required_nonce_size;
   5281     } else {
   5282         psa_aead_abort(operation);
   5283     }
   5284 
   5285     LOCAL_OUTPUT_FREE(nonce_external, nonce);
   5286 
   5287     return status;
   5288 }
   5289 
   5290 /* Set the nonce for a multipart authenticated encryption or decryption
   5291    operation.*/
   5292 psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
   5293                                 const uint8_t *nonce_external,
   5294                                 size_t nonce_length)
   5295 {
   5296     psa_status_t status;
   5297 
   5298     LOCAL_INPUT_DECLARE(nonce_external, nonce);
   5299     LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce);
   5300 
   5301     status = psa_aead_set_nonce_internal(operation, nonce, nonce_length);
   5302 
   5303 /* Exit label is only needed for buffer copying, prevent unused warnings. */
   5304 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   5305 exit:
   5306 #endif
   5307 
   5308     LOCAL_INPUT_FREE(nonce_external, nonce);
   5309 
   5310     return status;
   5311 }
   5312 
   5313 /* Declare the lengths of the message and additional data for multipart AEAD. */
   5314 psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
   5315                                   size_t ad_length,
   5316                                   size_t plaintext_length)
   5317 {
   5318     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5319 
   5320     if (operation->id == 0) {
   5321         status = PSA_ERROR_BAD_STATE;
   5322         goto exit;
   5323     }
   5324 
   5325     if (operation->lengths_set || operation->ad_started ||
   5326         operation->body_started) {
   5327         status = PSA_ERROR_BAD_STATE;
   5328         goto exit;
   5329     }
   5330 
   5331     switch (operation->alg) {
   5332 #if defined(PSA_WANT_ALG_GCM)
   5333         case PSA_ALG_GCM:
   5334             /* Lengths can only be too large for GCM if size_t is bigger than 32
   5335              * bits. Without the guard this code will generate warnings on 32bit
   5336              * builds. */
   5337 #if SIZE_MAX > UINT32_MAX
   5338             if (((uint64_t) ad_length) >> 61 != 0 ||
   5339                 ((uint64_t) plaintext_length) > 0xFFFFFFFE0ull) {
   5340                 status = PSA_ERROR_INVALID_ARGUMENT;
   5341                 goto exit;
   5342             }
   5343 #endif
   5344             break;
   5345 #endif /* PSA_WANT_ALG_GCM */
   5346 #if defined(PSA_WANT_ALG_CCM)
   5347         case PSA_ALG_CCM:
   5348             if (ad_length > 0xFF00) {
   5349                 status = PSA_ERROR_INVALID_ARGUMENT;
   5350                 goto exit;
   5351             }
   5352             break;
   5353 #endif /* PSA_WANT_ALG_CCM */
   5354 #if defined(PSA_WANT_ALG_CHACHA20_POLY1305)
   5355         case PSA_ALG_CHACHA20_POLY1305:
   5356             /* No length restrictions for ChaChaPoly. */
   5357             break;
   5358 #endif /* PSA_WANT_ALG_CHACHA20_POLY1305 */
   5359         default:
   5360             break;
   5361     }
   5362 
   5363     status = psa_driver_wrapper_aead_set_lengths(operation, ad_length,
   5364                                                  plaintext_length);
   5365 
   5366 exit:
   5367     if (status == PSA_SUCCESS) {
   5368         operation->ad_remaining = ad_length;
   5369         operation->body_remaining = plaintext_length;
   5370         operation->lengths_set = 1;
   5371     } else {
   5372         psa_aead_abort(operation);
   5373     }
   5374 
   5375     return status;
   5376 }
   5377 
   5378 /* Pass additional data to an active multipart AEAD operation. */
   5379 psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
   5380                                 const uint8_t *input_external,
   5381                                 size_t input_length)
   5382 {
   5383     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5384 
   5385     LOCAL_INPUT_DECLARE(input_external, input);
   5386     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   5387 
   5388     if (operation->id == 0) {
   5389         status = PSA_ERROR_BAD_STATE;
   5390         goto exit;
   5391     }
   5392 
   5393     if (!operation->nonce_set || operation->body_started) {
   5394         status = PSA_ERROR_BAD_STATE;
   5395         goto exit;
   5396     }
   5397 
   5398     /* No input to add (zero length), nothing to do. */
   5399     if (input_length == 0) {
   5400         status = PSA_SUCCESS;
   5401         goto exit;
   5402     }
   5403 
   5404     if (operation->lengths_set) {
   5405         if (operation->ad_remaining < input_length) {
   5406             status = PSA_ERROR_INVALID_ARGUMENT;
   5407             goto exit;
   5408         }
   5409 
   5410         operation->ad_remaining -= input_length;
   5411     }
   5412 #if defined(PSA_WANT_ALG_CCM)
   5413     else if (operation->alg == PSA_ALG_CCM) {
   5414         status = PSA_ERROR_BAD_STATE;
   5415         goto exit;
   5416     }
   5417 #endif /* PSA_WANT_ALG_CCM */
   5418 
   5419     status = psa_driver_wrapper_aead_update_ad(operation, input,
   5420                                                input_length);
   5421 
   5422 exit:
   5423     if (status == PSA_SUCCESS) {
   5424         operation->ad_started = 1;
   5425     } else {
   5426         psa_aead_abort(operation);
   5427     }
   5428 
   5429     LOCAL_INPUT_FREE(input_external, input);
   5430 
   5431     return status;
   5432 }
   5433 
   5434 /* Encrypt or decrypt a message fragment in an active multipart AEAD
   5435    operation.*/
   5436 psa_status_t psa_aead_update(psa_aead_operation_t *operation,
   5437                              const uint8_t *input_external,
   5438                              size_t input_length,
   5439                              uint8_t *output_external,
   5440                              size_t output_size,
   5441                              size_t *output_length)
   5442 {
   5443     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5444 
   5445 
   5446     LOCAL_INPUT_DECLARE(input_external, input);
   5447     LOCAL_OUTPUT_DECLARE(output_external, output);
   5448 
   5449     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   5450     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   5451 
   5452     *output_length = 0;
   5453 
   5454     if (operation->id == 0) {
   5455         status = PSA_ERROR_BAD_STATE;
   5456         goto exit;
   5457     }
   5458 
   5459     if (!operation->nonce_set) {
   5460         status = PSA_ERROR_BAD_STATE;
   5461         goto exit;
   5462     }
   5463 
   5464     if (operation->lengths_set) {
   5465         /* Additional data length was supplied, but not all the additional
   5466            data was supplied.*/
   5467         if (operation->ad_remaining != 0) {
   5468             status = PSA_ERROR_INVALID_ARGUMENT;
   5469             goto exit;
   5470         }
   5471 
   5472         /* Too much data provided. */
   5473         if (operation->body_remaining < input_length) {
   5474             status = PSA_ERROR_INVALID_ARGUMENT;
   5475             goto exit;
   5476         }
   5477 
   5478         operation->body_remaining -= input_length;
   5479     }
   5480 #if defined(PSA_WANT_ALG_CCM)
   5481     else if (operation->alg == PSA_ALG_CCM) {
   5482         status = PSA_ERROR_BAD_STATE;
   5483         goto exit;
   5484     }
   5485 #endif /* PSA_WANT_ALG_CCM */
   5486 
   5487     status = psa_driver_wrapper_aead_update(operation, input, input_length,
   5488                                             output, output_size,
   5489                                             output_length);
   5490 
   5491 exit:
   5492     if (status == PSA_SUCCESS) {
   5493         operation->body_started = 1;
   5494     } else {
   5495         psa_aead_abort(operation);
   5496     }
   5497 
   5498     LOCAL_INPUT_FREE(input_external, input);
   5499     LOCAL_OUTPUT_FREE(output_external, output);
   5500 
   5501     return status;
   5502 }
   5503 
   5504 static psa_status_t psa_aead_final_checks(const psa_aead_operation_t *operation)
   5505 {
   5506     if (operation->id == 0 || !operation->nonce_set) {
   5507         return PSA_ERROR_BAD_STATE;
   5508     }
   5509 
   5510     if (operation->lengths_set && (operation->ad_remaining != 0 ||
   5511                                    operation->body_remaining != 0)) {
   5512         return PSA_ERROR_INVALID_ARGUMENT;
   5513     }
   5514 
   5515     return PSA_SUCCESS;
   5516 }
   5517 
   5518 /* Finish encrypting a message in a multipart AEAD operation. */
   5519 psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
   5520                              uint8_t *ciphertext_external,
   5521                              size_t ciphertext_size,
   5522                              size_t *ciphertext_length,
   5523                              uint8_t *tag_external,
   5524                              size_t tag_size,
   5525                              size_t *tag_length)
   5526 {
   5527     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5528 
   5529     LOCAL_OUTPUT_DECLARE(ciphertext_external, ciphertext);
   5530     LOCAL_OUTPUT_DECLARE(tag_external, tag);
   5531 
   5532     LOCAL_OUTPUT_ALLOC(ciphertext_external, ciphertext_size, ciphertext);
   5533     LOCAL_OUTPUT_ALLOC(tag_external, tag_size, tag);
   5534 
   5535     *ciphertext_length = 0;
   5536     *tag_length = tag_size;
   5537 
   5538     status = psa_aead_final_checks(operation);
   5539     if (status != PSA_SUCCESS) {
   5540         goto exit;
   5541     }
   5542 
   5543     if (!operation->is_encrypt) {
   5544         status = PSA_ERROR_BAD_STATE;
   5545         goto exit;
   5546     }
   5547 
   5548     status = psa_driver_wrapper_aead_finish(operation, ciphertext,
   5549                                             ciphertext_size,
   5550                                             ciphertext_length,
   5551                                             tag, tag_size, tag_length);
   5552 
   5553 exit:
   5554 
   5555 
   5556     /* In case the operation fails and the user fails to check for failure or
   5557      * the zero tag size, make sure the tag is set to something implausible.
   5558      * Even if the operation succeeds, make sure we clear the rest of the
   5559      * buffer to prevent potential leakage of anything previously placed in
   5560      * the same buffer.*/
   5561     psa_wipe_tag_output_buffer(tag, status, tag_size, *tag_length);
   5562 
   5563     psa_aead_abort(operation);
   5564 
   5565     LOCAL_OUTPUT_FREE(ciphertext_external, ciphertext);
   5566     LOCAL_OUTPUT_FREE(tag_external, tag);
   5567 
   5568     return status;
   5569 }
   5570 
   5571 /* Finish authenticating and decrypting a message in a multipart AEAD
   5572    operation.*/
   5573 psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
   5574                              uint8_t *plaintext_external,
   5575                              size_t plaintext_size,
   5576                              size_t *plaintext_length,
   5577                              const uint8_t *tag_external,
   5578                              size_t tag_length)
   5579 {
   5580     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5581 
   5582     LOCAL_OUTPUT_DECLARE(plaintext_external, plaintext);
   5583     LOCAL_INPUT_DECLARE(tag_external, tag);
   5584 
   5585     LOCAL_OUTPUT_ALLOC(plaintext_external, plaintext_size, plaintext);
   5586     LOCAL_INPUT_ALLOC(tag_external, tag_length, tag);
   5587 
   5588     *plaintext_length = 0;
   5589 
   5590     status = psa_aead_final_checks(operation);
   5591     if (status != PSA_SUCCESS) {
   5592         goto exit;
   5593     }
   5594 
   5595     if (operation->is_encrypt) {
   5596         status = PSA_ERROR_BAD_STATE;
   5597         goto exit;
   5598     }
   5599 
   5600     status = psa_driver_wrapper_aead_verify(operation, plaintext,
   5601                                             plaintext_size,
   5602                                             plaintext_length,
   5603                                             tag, tag_length);
   5604 
   5605 exit:
   5606     psa_aead_abort(operation);
   5607 
   5608     LOCAL_OUTPUT_FREE(plaintext_external, plaintext);
   5609     LOCAL_INPUT_FREE(tag_external, tag);
   5610 
   5611     return status;
   5612 }
   5613 
   5614 /* Abort an AEAD operation. */
   5615 psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
   5616 {
   5617     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5618 
   5619     if (operation->id == 0) {
   5620         /* The object has (apparently) been initialized but it is not (yet)
   5621          * in use. It's ok to call abort on such an object, and there's
   5622          * nothing to do. */
   5623         return PSA_SUCCESS;
   5624     }
   5625 
   5626     status = psa_driver_wrapper_aead_abort(operation);
   5627 
   5628     memset(operation, 0, sizeof(*operation));
   5629 
   5630     return status;
   5631 }
   5632 
   5633 /****************************************************************/
   5634 /* Key derivation: output generation */
   5635 /****************************************************************/
   5636 
   5637 #if defined(BUILTIN_ALG_ANY_HKDF) || \
   5638     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \
   5639     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) || \
   5640     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS) || \
   5641     defined(PSA_HAVE_SOFT_PBKDF2)
   5642 #define AT_LEAST_ONE_BUILTIN_KDF
   5643 #endif /* At least one builtin KDF */
   5644 
   5645 #if defined(BUILTIN_ALG_ANY_HKDF) || \
   5646     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \
   5647     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   5648 
   5649 /** Internal helper to set up an HMAC operation with a key passed directly.
   5650  *
   5651  * \param[in,out] operation     A MAC operation object. It does not need to
   5652  *                              be initialized.
   5653  * \param hash_alg              The hash algorithm used for HMAC.
   5654  * \param hmac_key              The HMAC key.
   5655  * \param hmac_key_length       Length of \p hmac_key in bytes.
   5656  *
   5657  * \return A PSA status code.
   5658  */
   5659 static psa_status_t psa_key_derivation_start_hmac(
   5660     psa_mac_operation_t *operation,
   5661     psa_algorithm_t hash_alg,
   5662     const uint8_t *hmac_key,
   5663     size_t hmac_key_length)
   5664 {
   5665     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   5666     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
   5667     psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
   5668     psa_set_key_bits(&attributes, PSA_BYTES_TO_BITS(hmac_key_length));
   5669     psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
   5670 
   5671     /* Make sure the whole the operation is zeroed.
   5672      * It isn't enough to require the caller to initialize operation to
   5673      * PSA_MAC_OPERATION_INIT, since one field is a union and initializing
   5674      * a union does not necessarily initialize all of its members.
   5675      * psa_mac_setup() would handle PSA_MAC_OPERATION_INIT, but here we
   5676      * bypass it and call lower-level functions directly. */
   5677     memset(operation, 0, sizeof(*operation));
   5678 
   5679     operation->is_sign = 1;
   5680     operation->mac_size = PSA_HASH_LENGTH(hash_alg);
   5681 
   5682     status = psa_driver_wrapper_mac_sign_setup(operation,
   5683                                                &attributes,
   5684                                                hmac_key, hmac_key_length,
   5685                                                PSA_ALG_HMAC(hash_alg));
   5686 
   5687     psa_reset_key_attributes(&attributes);
   5688     return status;
   5689 }
   5690 #endif /* KDF algorithms reliant on HMAC */
   5691 
   5692 #define HKDF_STATE_INIT 0 /* no input yet */
   5693 #define HKDF_STATE_STARTED 1 /* got salt */
   5694 #define HKDF_STATE_KEYED 2 /* got key */
   5695 #define HKDF_STATE_OUTPUT 3 /* output started */
   5696 
   5697 static psa_algorithm_t psa_key_derivation_get_kdf_alg(
   5698     const psa_key_derivation_operation_t *operation)
   5699 {
   5700     if (PSA_ALG_IS_KEY_AGREEMENT(operation->alg)) {
   5701         return PSA_ALG_KEY_AGREEMENT_GET_KDF(operation->alg);
   5702     } else {
   5703         return operation->alg;
   5704     }
   5705 }
   5706 
   5707 psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
   5708 {
   5709     psa_status_t status = PSA_SUCCESS;
   5710     psa_algorithm_t kdf_alg = psa_key_derivation_get_kdf_alg(operation);
   5711     if (kdf_alg == 0) {
   5712         /* The object has (apparently) been initialized but it is not
   5713          * in use. It's ok to call abort on such an object, and there's
   5714          * nothing to do. */
   5715     } else
   5716 #if defined(BUILTIN_ALG_ANY_HKDF)
   5717     if (PSA_ALG_IS_ANY_HKDF(kdf_alg)) {
   5718         mbedtls_free(operation->ctx.hkdf.info);
   5719         status = psa_mac_abort(&operation->ctx.hkdf.hmac);
   5720     } else
   5721 #endif /* BUILTIN_ALG_ANY_HKDF */
   5722 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \
   5723     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   5724     if (PSA_ALG_IS_TLS12_PRF(kdf_alg) ||
   5725         /* TLS-1.2 PSK-to-MS KDF uses the same core as TLS-1.2 PRF */
   5726         PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) {
   5727         if (operation->ctx.tls12_prf.secret != NULL) {
   5728             mbedtls_zeroize_and_free(operation->ctx.tls12_prf.secret,
   5729                                      operation->ctx.tls12_prf.secret_length);
   5730         }
   5731 
   5732         if (operation->ctx.tls12_prf.seed != NULL) {
   5733             mbedtls_zeroize_and_free(operation->ctx.tls12_prf.seed,
   5734                                      operation->ctx.tls12_prf.seed_length);
   5735         }
   5736 
   5737         if (operation->ctx.tls12_prf.label != NULL) {
   5738             mbedtls_zeroize_and_free(operation->ctx.tls12_prf.label,
   5739                                      operation->ctx.tls12_prf.label_length);
   5740         }
   5741 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   5742         if (operation->ctx.tls12_prf.other_secret != NULL) {
   5743             mbedtls_zeroize_and_free(operation->ctx.tls12_prf.other_secret,
   5744                                      operation->ctx.tls12_prf.other_secret_length);
   5745         }
   5746 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */
   5747         status = PSA_SUCCESS;
   5748 
   5749         /* We leave the fields Ai and output_block to be erased safely by the
   5750          * mbedtls_platform_zeroize() in the end of this function. */
   5751     } else
   5752 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) ||
   5753         * defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) */
   5754 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS)
   5755     if (kdf_alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
   5756         mbedtls_platform_zeroize(operation->ctx.tls12_ecjpake_to_pms.data,
   5757                                  sizeof(operation->ctx.tls12_ecjpake_to_pms.data));
   5758     } else
   5759 #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS) */
   5760 #if defined(PSA_HAVE_SOFT_PBKDF2)
   5761     if (PSA_ALG_IS_PBKDF2(kdf_alg)) {
   5762         if (operation->ctx.pbkdf2.salt != NULL) {
   5763             mbedtls_zeroize_and_free(operation->ctx.pbkdf2.salt,
   5764                                      operation->ctx.pbkdf2.salt_length);
   5765         }
   5766 
   5767         status = PSA_SUCCESS;
   5768     } else
   5769 #endif /* defined(PSA_HAVE_SOFT_PBKDF2) */
   5770     {
   5771         status = PSA_ERROR_BAD_STATE;
   5772     }
   5773     mbedtls_platform_zeroize(operation, sizeof(*operation));
   5774     return status;
   5775 }
   5776 
   5777 psa_status_t psa_key_derivation_get_capacity(const psa_key_derivation_operation_t *operation,
   5778                                              size_t *capacity)
   5779 {
   5780     if (operation->alg == 0) {
   5781         /* This is a blank key derivation operation. */
   5782         return PSA_ERROR_BAD_STATE;
   5783     }
   5784 
   5785     *capacity = operation->capacity;
   5786     return PSA_SUCCESS;
   5787 }
   5788 
   5789 psa_status_t psa_key_derivation_set_capacity(psa_key_derivation_operation_t *operation,
   5790                                              size_t capacity)
   5791 {
   5792     if (operation->alg == 0) {
   5793         return PSA_ERROR_BAD_STATE;
   5794     }
   5795     if (capacity > operation->capacity) {
   5796         return PSA_ERROR_INVALID_ARGUMENT;
   5797     }
   5798     operation->capacity = capacity;
   5799     return PSA_SUCCESS;
   5800 }
   5801 
   5802 #if defined(BUILTIN_ALG_ANY_HKDF)
   5803 /* Read some bytes from an HKDF-based operation. */
   5804 static psa_status_t psa_key_derivation_hkdf_read(psa_hkdf_key_derivation_t *hkdf,
   5805                                                  psa_algorithm_t kdf_alg,
   5806                                                  uint8_t *output,
   5807                                                  size_t output_length)
   5808 {
   5809     psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(kdf_alg);
   5810     uint8_t hash_length = PSA_HASH_LENGTH(hash_alg);
   5811     size_t hmac_output_length;
   5812     psa_status_t status;
   5813 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT)
   5814     const uint8_t last_block = PSA_ALG_IS_HKDF_EXTRACT(kdf_alg) ? 0 : 0xff;
   5815 #else
   5816     const uint8_t last_block = 0xff;
   5817 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT */
   5818 
   5819     if (hkdf->state < HKDF_STATE_KEYED ||
   5820         (!hkdf->info_set
   5821 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT)
   5822          && !PSA_ALG_IS_HKDF_EXTRACT(kdf_alg)
   5823 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT */
   5824         )) {
   5825         return PSA_ERROR_BAD_STATE;
   5826     }
   5827     hkdf->state = HKDF_STATE_OUTPUT;
   5828 
   5829     while (output_length != 0) {
   5830         /* Copy what remains of the current block */
   5831         uint8_t n = hash_length - hkdf->offset_in_block;
   5832         if (n > output_length) {
   5833             n = (uint8_t) output_length;
   5834         }
   5835         memcpy(output, hkdf->output_block + hkdf->offset_in_block, n);
   5836         output += n;
   5837         output_length -= n;
   5838         hkdf->offset_in_block += n;
   5839         if (output_length == 0) {
   5840             break;
   5841         }
   5842         /* We can't be wanting more output after the last block, otherwise
   5843          * the capacity check in psa_key_derivation_output_bytes() would have
   5844          * prevented this call. It could happen only if the operation
   5845          * object was corrupted or if this function is called directly
   5846          * inside the library. */
   5847         if (hkdf->block_number == last_block) {
   5848             return PSA_ERROR_BAD_STATE;
   5849         }
   5850 
   5851         /* We need a new block */
   5852         ++hkdf->block_number;
   5853         hkdf->offset_in_block = 0;
   5854 
   5855         status = psa_key_derivation_start_hmac(&hkdf->hmac,
   5856                                                hash_alg,
   5857                                                hkdf->prk,
   5858                                                hash_length);
   5859         if (status != PSA_SUCCESS) {
   5860             return status;
   5861         }
   5862 
   5863         if (hkdf->block_number != 1) {
   5864             status = psa_mac_update(&hkdf->hmac,
   5865                                     hkdf->output_block,
   5866                                     hash_length);
   5867             if (status != PSA_SUCCESS) {
   5868                 return status;
   5869             }
   5870         }
   5871         status = psa_mac_update(&hkdf->hmac,
   5872                                 hkdf->info,
   5873                                 hkdf->info_length);
   5874         if (status != PSA_SUCCESS) {
   5875             return status;
   5876         }
   5877         status = psa_mac_update(&hkdf->hmac,
   5878                                 &hkdf->block_number, 1);
   5879         if (status != PSA_SUCCESS) {
   5880             return status;
   5881         }
   5882         status = psa_mac_sign_finish(&hkdf->hmac,
   5883                                      hkdf->output_block,
   5884                                      sizeof(hkdf->output_block),
   5885                                      &hmac_output_length);
   5886         if (status != PSA_SUCCESS) {
   5887             return status;
   5888         }
   5889     }
   5890 
   5891     return PSA_SUCCESS;
   5892 }
   5893 #endif /* BUILTIN_ALG_ANY_HKDF */
   5894 
   5895 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \
   5896     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   5897 static psa_status_t psa_key_derivation_tls12_prf_generate_next_block(
   5898     psa_tls12_prf_key_derivation_t *tls12_prf,
   5899     psa_algorithm_t alg)
   5900 {
   5901     psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(alg);
   5902     uint8_t hash_length = PSA_HASH_LENGTH(hash_alg);
   5903     psa_mac_operation_t hmac;
   5904     size_t hmac_output_length;
   5905     psa_status_t status, cleanup_status;
   5906 
   5907     /* We can't be wanting more output after block 0xff, otherwise
   5908      * the capacity check in psa_key_derivation_output_bytes() would have
   5909      * prevented this call. It could happen only if the operation
   5910      * object was corrupted or if this function is called directly
   5911      * inside the library. */
   5912     if (tls12_prf->block_number == 0xff) {
   5913         return PSA_ERROR_CORRUPTION_DETECTED;
   5914     }
   5915 
   5916     /* We need a new block */
   5917     ++tls12_prf->block_number;
   5918     tls12_prf->left_in_block = hash_length;
   5919 
   5920     /* Recall the definition of the TLS-1.2-PRF from RFC 5246:
   5921      *
   5922      * PRF(secret, label, seed) = P_<hash>(secret, label + seed)
   5923      *
   5924      * P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
   5925      *                        HMAC_hash(secret, A(2) + seed) +
   5926      *                        HMAC_hash(secret, A(3) + seed) + ...
   5927      *
   5928      * A(0) = seed
   5929      * A(i) = HMAC_hash(secret, A(i-1))
   5930      *
   5931      * The `psa_tls12_prf_key_derivation` structure saves the block
   5932      * `HMAC_hash(secret, A(i) + seed)` from which the output
   5933      * is currently extracted as `output_block` and where i is
   5934      * `block_number`.
   5935      */
   5936 
   5937     status = psa_key_derivation_start_hmac(&hmac,
   5938                                            hash_alg,
   5939                                            tls12_prf->secret,
   5940                                            tls12_prf->secret_length);
   5941     if (status != PSA_SUCCESS) {
   5942         goto cleanup;
   5943     }
   5944 
   5945     /* Calculate A(i) where i = tls12_prf->block_number. */
   5946     if (tls12_prf->block_number == 1) {
   5947         /* A(1) = HMAC_hash(secret, A(0)), where A(0) = seed. (The RFC overloads
   5948          * the variable seed and in this instance means it in the context of the
   5949          * P_hash function, where seed = label + seed.) */
   5950         status = psa_mac_update(&hmac,
   5951                                 tls12_prf->label,
   5952                                 tls12_prf->label_length);
   5953         if (status != PSA_SUCCESS) {
   5954             goto cleanup;
   5955         }
   5956         status = psa_mac_update(&hmac,
   5957                                 tls12_prf->seed,
   5958                                 tls12_prf->seed_length);
   5959         if (status != PSA_SUCCESS) {
   5960             goto cleanup;
   5961         }
   5962     } else {
   5963         /* A(i) = HMAC_hash(secret, A(i-1)) */
   5964         status = psa_mac_update(&hmac, tls12_prf->Ai, hash_length);
   5965         if (status != PSA_SUCCESS) {
   5966             goto cleanup;
   5967         }
   5968     }
   5969 
   5970     status = psa_mac_sign_finish(&hmac,
   5971                                  tls12_prf->Ai, hash_length,
   5972                                  &hmac_output_length);
   5973     if (hmac_output_length != hash_length) {
   5974         status = PSA_ERROR_CORRUPTION_DETECTED;
   5975     }
   5976     if (status != PSA_SUCCESS) {
   5977         goto cleanup;
   5978     }
   5979 
   5980     /* Calculate HMAC_hash(secret, A(i) + label + seed). */
   5981     status = psa_key_derivation_start_hmac(&hmac,
   5982                                            hash_alg,
   5983                                            tls12_prf->secret,
   5984                                            tls12_prf->secret_length);
   5985     if (status != PSA_SUCCESS) {
   5986         goto cleanup;
   5987     }
   5988     status = psa_mac_update(&hmac, tls12_prf->Ai, hash_length);
   5989     if (status != PSA_SUCCESS) {
   5990         goto cleanup;
   5991     }
   5992     status = psa_mac_update(&hmac, tls12_prf->label, tls12_prf->label_length);
   5993     if (status != PSA_SUCCESS) {
   5994         goto cleanup;
   5995     }
   5996     status = psa_mac_update(&hmac, tls12_prf->seed, tls12_prf->seed_length);
   5997     if (status != PSA_SUCCESS) {
   5998         goto cleanup;
   5999     }
   6000     status = psa_mac_sign_finish(&hmac,
   6001                                  tls12_prf->output_block, hash_length,
   6002                                  &hmac_output_length);
   6003     if (status != PSA_SUCCESS) {
   6004         goto cleanup;
   6005     }
   6006 
   6007 
   6008 cleanup:
   6009     cleanup_status = psa_mac_abort(&hmac);
   6010     if (status == PSA_SUCCESS && cleanup_status != PSA_SUCCESS) {
   6011         status = cleanup_status;
   6012     }
   6013 
   6014     return status;
   6015 }
   6016 
   6017 static psa_status_t psa_key_derivation_tls12_prf_read(
   6018     psa_tls12_prf_key_derivation_t *tls12_prf,
   6019     psa_algorithm_t alg,
   6020     uint8_t *output,
   6021     size_t output_length)
   6022 {
   6023     psa_algorithm_t hash_alg = PSA_ALG_TLS12_PRF_GET_HASH(alg);
   6024     uint8_t hash_length = PSA_HASH_LENGTH(hash_alg);
   6025     psa_status_t status;
   6026     uint8_t offset, length;
   6027 
   6028     switch (tls12_prf->state) {
   6029         case PSA_TLS12_PRF_STATE_LABEL_SET:
   6030             tls12_prf->state = PSA_TLS12_PRF_STATE_OUTPUT;
   6031             break;
   6032         case PSA_TLS12_PRF_STATE_OUTPUT:
   6033             break;
   6034         default:
   6035             return PSA_ERROR_BAD_STATE;
   6036     }
   6037 
   6038     while (output_length != 0) {
   6039         /* Check if we have fully processed the current block. */
   6040         if (tls12_prf->left_in_block == 0) {
   6041             status = psa_key_derivation_tls12_prf_generate_next_block(tls12_prf,
   6042                                                                       alg);
   6043             if (status != PSA_SUCCESS) {
   6044                 return status;
   6045             }
   6046 
   6047             continue;
   6048         }
   6049 
   6050         if (tls12_prf->left_in_block > output_length) {
   6051             length = (uint8_t) output_length;
   6052         } else {
   6053             length = tls12_prf->left_in_block;
   6054         }
   6055 
   6056         offset = hash_length - tls12_prf->left_in_block;
   6057         memcpy(output, tls12_prf->output_block + offset, length);
   6058         output += length;
   6059         output_length -= length;
   6060         tls12_prf->left_in_block -= length;
   6061     }
   6062 
   6063     return PSA_SUCCESS;
   6064 }
   6065 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF ||
   6066         * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */
   6067 
   6068 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS)
   6069 static psa_status_t psa_key_derivation_tls12_ecjpake_to_pms_read(
   6070     psa_tls12_ecjpake_to_pms_t *ecjpake,
   6071     uint8_t *output,
   6072     size_t output_length)
   6073 {
   6074     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   6075     size_t output_size = 0;
   6076 
   6077     if (output_length != 32) {
   6078         return PSA_ERROR_INVALID_ARGUMENT;
   6079     }
   6080 
   6081     status = psa_hash_compute(PSA_ALG_SHA_256, ecjpake->data,
   6082                               PSA_TLS12_ECJPAKE_TO_PMS_DATA_SIZE, output, output_length,
   6083                               &output_size);
   6084     if (status != PSA_SUCCESS) {
   6085         return status;
   6086     }
   6087 
   6088     if (output_size != output_length) {
   6089         return PSA_ERROR_GENERIC_ERROR;
   6090     }
   6091 
   6092     return PSA_SUCCESS;
   6093 }
   6094 #endif
   6095 
   6096 #if defined(PSA_HAVE_SOFT_PBKDF2)
   6097 static psa_status_t psa_key_derivation_pbkdf2_generate_block(
   6098     psa_pbkdf2_key_derivation_t *pbkdf2,
   6099     psa_algorithm_t prf_alg,
   6100     uint8_t prf_output_length,
   6101     psa_key_attributes_t *attributes)
   6102 {
   6103     psa_status_t status;
   6104     psa_mac_operation_t mac_operation;
   6105     /* Make sure the whole the operation is zeroed.
   6106      * PSA_MAC_OPERATION_INIT does not necessarily do it fully,
   6107      * since one field is a union and initializing a union does not
   6108      * necessarily initialize all of its members.
   6109      * psa_mac_setup() would do it, but here we bypass it and call
   6110      * lower-level functions directly. */
   6111     memset(&mac_operation, 0, sizeof(mac_operation));
   6112     size_t mac_output_length;
   6113     uint8_t U_i[PSA_MAC_MAX_SIZE];
   6114     uint8_t *U_accumulator = pbkdf2->output_block;
   6115     uint64_t i;
   6116     uint8_t block_counter[4];
   6117 
   6118     mac_operation.is_sign = 1;
   6119     mac_operation.mac_size = prf_output_length;
   6120     MBEDTLS_PUT_UINT32_BE(pbkdf2->block_number, block_counter, 0);
   6121 
   6122     status = psa_driver_wrapper_mac_sign_setup(&mac_operation,
   6123                                                attributes,
   6124                                                pbkdf2->password,
   6125                                                pbkdf2->password_length,
   6126                                                prf_alg);
   6127     if (status != PSA_SUCCESS) {
   6128         goto cleanup;
   6129     }
   6130     status = psa_mac_update(&mac_operation, pbkdf2->salt, pbkdf2->salt_length);
   6131     if (status != PSA_SUCCESS) {
   6132         goto cleanup;
   6133     }
   6134     status = psa_mac_update(&mac_operation, block_counter, sizeof(block_counter));
   6135     if (status != PSA_SUCCESS) {
   6136         goto cleanup;
   6137     }
   6138     status = psa_mac_sign_finish(&mac_operation, U_i, sizeof(U_i),
   6139                                  &mac_output_length);
   6140     if (status != PSA_SUCCESS) {
   6141         goto cleanup;
   6142     }
   6143 
   6144     if (mac_output_length != prf_output_length) {
   6145         status = PSA_ERROR_CORRUPTION_DETECTED;
   6146         goto cleanup;
   6147     }
   6148 
   6149     memcpy(U_accumulator, U_i, prf_output_length);
   6150 
   6151     for (i = 1; i < pbkdf2->input_cost; i++) {
   6152         /* We are passing prf_output_length as mac_size because the driver
   6153          * function directly sets mac_output_length as mac_size upon success.
   6154          * See https://github.com/Mbed-TLS/mbedtls/issues/7801 */
   6155         status = psa_driver_wrapper_mac_compute(attributes,
   6156                                                 pbkdf2->password,
   6157                                                 pbkdf2->password_length,
   6158                                                 prf_alg, U_i, prf_output_length,
   6159                                                 U_i, prf_output_length,
   6160                                                 &mac_output_length);
   6161         if (status != PSA_SUCCESS) {
   6162             goto cleanup;
   6163         }
   6164 
   6165         mbedtls_xor(U_accumulator, U_accumulator, U_i, prf_output_length);
   6166     }
   6167 
   6168 cleanup:
   6169     /* Zeroise buffers to clear sensitive data from memory. */
   6170     mbedtls_platform_zeroize(U_i, PSA_MAC_MAX_SIZE);
   6171     return status;
   6172 }
   6173 
   6174 static psa_status_t psa_key_derivation_pbkdf2_read(
   6175     psa_pbkdf2_key_derivation_t *pbkdf2,
   6176     psa_algorithm_t kdf_alg,
   6177     uint8_t *output,
   6178     size_t output_length)
   6179 {
   6180     psa_status_t status;
   6181     psa_algorithm_t prf_alg;
   6182     uint8_t prf_output_length;
   6183     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
   6184     psa_set_key_bits(&attributes, PSA_BYTES_TO_BITS(pbkdf2->password_length));
   6185     psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
   6186 
   6187     if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
   6188         prf_alg = PSA_ALG_HMAC(PSA_ALG_PBKDF2_HMAC_GET_HASH(kdf_alg));
   6189         prf_output_length = PSA_HASH_LENGTH(prf_alg);
   6190         psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
   6191     } else if (kdf_alg == PSA_ALG_PBKDF2_AES_CMAC_PRF_128) {
   6192         prf_alg = PSA_ALG_CMAC;
   6193         prf_output_length = PSA_MAC_LENGTH(PSA_KEY_TYPE_AES, 128U, PSA_ALG_CMAC);
   6194         psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
   6195     } else {
   6196         return PSA_ERROR_INVALID_ARGUMENT;
   6197     }
   6198 
   6199     switch (pbkdf2->state) {
   6200         case PSA_PBKDF2_STATE_PASSWORD_SET:
   6201             /* Initially we need a new block so bytes_used is equal to block size*/
   6202             pbkdf2->bytes_used = prf_output_length;
   6203             pbkdf2->state = PSA_PBKDF2_STATE_OUTPUT;
   6204             break;
   6205         case PSA_PBKDF2_STATE_OUTPUT:
   6206             break;
   6207         default:
   6208             return PSA_ERROR_BAD_STATE;
   6209     }
   6210 
   6211     while (output_length != 0) {
   6212         uint8_t n = prf_output_length - pbkdf2->bytes_used;
   6213         if (n > output_length) {
   6214             n = (uint8_t) output_length;
   6215         }
   6216         memcpy(output, pbkdf2->output_block + pbkdf2->bytes_used, n);
   6217         output += n;
   6218         output_length -= n;
   6219         pbkdf2->bytes_used += n;
   6220 
   6221         if (output_length == 0) {
   6222             break;
   6223         }
   6224 
   6225         /* We need a new block */
   6226         pbkdf2->bytes_used = 0;
   6227         pbkdf2->block_number++;
   6228 
   6229         status = psa_key_derivation_pbkdf2_generate_block(pbkdf2, prf_alg,
   6230                                                           prf_output_length,
   6231                                                           &attributes);
   6232         if (status != PSA_SUCCESS) {
   6233             return status;
   6234         }
   6235     }
   6236 
   6237     return PSA_SUCCESS;
   6238 }
   6239 #endif /* PSA_HAVE_SOFT_PBKDF2 */
   6240 
   6241 psa_status_t psa_key_derivation_output_bytes(
   6242     psa_key_derivation_operation_t *operation,
   6243     uint8_t *output_external,
   6244     size_t output_length)
   6245 {
   6246     psa_status_t status;
   6247     LOCAL_OUTPUT_DECLARE(output_external, output);
   6248 
   6249     psa_algorithm_t kdf_alg = psa_key_derivation_get_kdf_alg(operation);
   6250 
   6251     if (operation->alg == 0) {
   6252         /* This is a blank operation. */
   6253         return PSA_ERROR_BAD_STATE;
   6254     }
   6255 
   6256     if (output_length == 0 && operation->capacity == 0) {
   6257         /* Edge case: this is a finished operation, and 0 bytes
   6258          * were requested. The right error in this case could
   6259          * be either INSUFFICIENT_CAPACITY or BAD_STATE. Return
   6260          * INSUFFICIENT_CAPACITY, which is right for a finished
   6261          * operation, for consistency with the case when
   6262          * output_length > 0. */
   6263         return PSA_ERROR_INSUFFICIENT_DATA;
   6264     }
   6265 
   6266     LOCAL_OUTPUT_ALLOC(output_external, output_length, output);
   6267     if (output_length > operation->capacity) {
   6268         operation->capacity = 0;
   6269         /* Go through the error path to wipe all confidential data now
   6270          * that the operation object is useless. */
   6271         status = PSA_ERROR_INSUFFICIENT_DATA;
   6272         goto exit;
   6273     }
   6274 
   6275     operation->capacity -= output_length;
   6276 
   6277 #if defined(BUILTIN_ALG_ANY_HKDF)
   6278     if (PSA_ALG_IS_ANY_HKDF(kdf_alg)) {
   6279         status = psa_key_derivation_hkdf_read(&operation->ctx.hkdf, kdf_alg,
   6280                                               output, output_length);
   6281     } else
   6282 #endif /* BUILTIN_ALG_ANY_HKDF */
   6283 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \
   6284     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   6285     if (PSA_ALG_IS_TLS12_PRF(kdf_alg) ||
   6286         PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) {
   6287         status = psa_key_derivation_tls12_prf_read(&operation->ctx.tls12_prf,
   6288                                                    kdf_alg, output,
   6289                                                    output_length);
   6290     } else
   6291 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF ||
   6292         * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */
   6293 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS)
   6294     if (kdf_alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
   6295         status = psa_key_derivation_tls12_ecjpake_to_pms_read(
   6296             &operation->ctx.tls12_ecjpake_to_pms, output, output_length);
   6297     } else
   6298 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS */
   6299 #if defined(PSA_HAVE_SOFT_PBKDF2)
   6300     if (PSA_ALG_IS_PBKDF2(kdf_alg)) {
   6301         status = psa_key_derivation_pbkdf2_read(&operation->ctx.pbkdf2, kdf_alg,
   6302                                                 output, output_length);
   6303     } else
   6304 #endif /* PSA_HAVE_SOFT_PBKDF2 */
   6305 
   6306     {
   6307         (void) kdf_alg;
   6308         status = PSA_ERROR_BAD_STATE;
   6309         LOCAL_OUTPUT_FREE(output_external, output);
   6310 
   6311         return status;
   6312     }
   6313 
   6314 exit:
   6315     if (status != PSA_SUCCESS) {
   6316         /* Preserve the algorithm upon errors, but clear all sensitive state.
   6317          * This allows us to differentiate between exhausted operations and
   6318          * blank operations, so we can return PSA_ERROR_BAD_STATE on blank
   6319          * operations. */
   6320         psa_algorithm_t alg = operation->alg;
   6321         psa_key_derivation_abort(operation);
   6322         operation->alg = alg;
   6323         if (output != NULL) {
   6324             memset(output, '!', output_length);
   6325         }
   6326     }
   6327 
   6328     LOCAL_OUTPUT_FREE(output_external, output);
   6329     return status;
   6330 }
   6331 
   6332 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES)
   6333 static void psa_des_set_key_parity(uint8_t *data, size_t data_size)
   6334 {
   6335     if (data_size >= 8) {
   6336         mbedtls_des_key_set_parity(data);
   6337     }
   6338     if (data_size >= 16) {
   6339         mbedtls_des_key_set_parity(data + 8);
   6340     }
   6341     if (data_size >= 24) {
   6342         mbedtls_des_key_set_parity(data + 16);
   6343     }
   6344 }
   6345 #endif /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES */
   6346 
   6347 /*
   6348  * ECC keys on a Weierstrass elliptic curve require the generation
   6349  * of a private key which is an integer
   6350  * in the range [1, N - 1], where N is the boundary of the private key domain:
   6351  * N is the prime p for Diffie-Hellman, or the order of the
   6352  * curve’s base point for ECC.
   6353  *
   6354  * Let m be the bit size of N, such that 2^m > N >= 2^(m-1).
   6355  * This function generates the private key using the following process:
   6356  *
   6357  * 1. Draw a byte string of length ceiling(m/8) bytes.
   6358  * 2. If m is not a multiple of 8, set the most significant
   6359  *    (8 * ceiling(m/8) - m) bits of the first byte in the string to zero.
   6360  * 3. Convert the string to integer k by decoding it as a big-endian byte string.
   6361  * 4. If k > N - 2, discard the result and return to step 1.
   6362  * 5. Output k + 1 as the private key.
   6363  *
   6364  * This method allows compliance to NIST standards, specifically the methods titled
   6365  * Key-Pair Generation by Testing Candidates in the following publications:
   6366  * - NIST Special Publication 800-56A: Recommendation for Pair-Wise Key-Establishment
   6367  *   Schemes Using Discrete Logarithm Cryptography [SP800-56A] §5.6.1.1.4 for
   6368  *   Diffie-Hellman keys.
   6369  *
   6370  * - [SP800-56A] §5.6.1.2.2 or FIPS Publication 186-4: Digital Signature
   6371  *   Standard (DSS) [FIPS186-4] §B.4.2 for elliptic curve keys.
   6372  *
   6373  * Note: Function allocates memory for *data buffer, so given *data should be
   6374  *       always NULL.
   6375  */
   6376 #if defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE)
   6377 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_DERIVE)
   6378 static psa_status_t psa_generate_derived_ecc_key_weierstrass_helper(
   6379     psa_key_slot_t *slot,
   6380     size_t bits,
   6381     psa_key_derivation_operation_t *operation,
   6382     uint8_t **data
   6383     )
   6384 {
   6385     unsigned key_out_of_range = 1;
   6386     mbedtls_mpi k;
   6387     mbedtls_mpi diff_N_2;
   6388     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   6389     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   6390     size_t m;
   6391     size_t m_bytes = 0;
   6392 
   6393     mbedtls_mpi_init(&k);
   6394     mbedtls_mpi_init(&diff_N_2);
   6395 
   6396     psa_ecc_family_t curve = PSA_KEY_TYPE_ECC_GET_FAMILY(
   6397         slot->attr.type);
   6398     mbedtls_ecp_group_id grp_id =
   6399         mbedtls_ecc_group_from_psa(curve, bits);
   6400 
   6401     if (grp_id == MBEDTLS_ECP_DP_NONE) {
   6402         ret = MBEDTLS_ERR_ASN1_INVALID_DATA;
   6403         goto cleanup;
   6404     }
   6405 
   6406     mbedtls_ecp_group ecp_group;
   6407     mbedtls_ecp_group_init(&ecp_group);
   6408 
   6409     MBEDTLS_MPI_CHK(mbedtls_ecp_group_load(&ecp_group, grp_id));
   6410 
   6411     /* N is the boundary of the private key domain (ecp_group.N). */
   6412     /* Let m be the bit size of N. */
   6413     m = ecp_group.nbits;
   6414 
   6415     m_bytes = PSA_BITS_TO_BYTES(m);
   6416 
   6417     /* Calculate N - 2 - it will be needed later. */
   6418     MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&diff_N_2, &ecp_group.N, 2));
   6419 
   6420     /* Note: This function is always called with *data == NULL and it
   6421      * allocates memory for the data buffer. */
   6422     *data = mbedtls_calloc(1, m_bytes);
   6423     if (*data == NULL) {
   6424         ret = MBEDTLS_ERR_ASN1_ALLOC_FAILED;
   6425         goto cleanup;
   6426     }
   6427 
   6428     while (key_out_of_range) {
   6429         /* 1. Draw a byte string of length ceiling(m/8) bytes. */
   6430         if ((status = psa_key_derivation_output_bytes(operation, *data, m_bytes)) != 0) {
   6431             goto cleanup;
   6432         }
   6433 
   6434         /* 2. If m is not a multiple of 8 */
   6435         if (m % 8 != 0) {
   6436             /* Set the most significant
   6437              * (8 * ceiling(m/8) - m) bits of the first byte in
   6438              * the string to zero.
   6439              */
   6440             uint8_t clear_bit_mask = (1 << (m % 8)) - 1;
   6441             (*data)[0] &= clear_bit_mask;
   6442         }
   6443 
   6444         /* 3. Convert the string to integer k by decoding it as a
   6445          *    big-endian byte string.
   6446          */
   6447         MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&k, *data, m_bytes));
   6448 
   6449         /* 4. If k > N - 2, discard the result and return to step 1.
   6450          *    Result of comparison is returned. When it indicates error
   6451          *    then this function is called again.
   6452          */
   6453         MBEDTLS_MPI_CHK(mbedtls_mpi_lt_mpi_ct(&diff_N_2, &k, &key_out_of_range));
   6454     }
   6455 
   6456     /* 5. Output k + 1 as the private key. */
   6457     MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&k, &k, 1));
   6458     MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&k, *data, m_bytes));
   6459 cleanup:
   6460     if (ret != 0) {
   6461         status = mbedtls_to_psa_error(ret);
   6462     }
   6463     if (status != PSA_SUCCESS) {
   6464         mbedtls_zeroize_and_free(*data, m_bytes);
   6465         *data = NULL;
   6466     }
   6467     mbedtls_mpi_free(&k);
   6468     mbedtls_mpi_free(&diff_N_2);
   6469     return status;
   6470 }
   6471 
   6472 /* ECC keys on a Montgomery elliptic curve draws a byte string whose length
   6473  * is determined by the curve, and sets the mandatory bits accordingly. That is:
   6474  *
   6475  * - Curve25519 (PSA_ECC_FAMILY_MONTGOMERY, 255 bits):
   6476  *   draw a 32-byte string and process it as specified in
   6477  *   Elliptic Curves for Security [RFC7748] §5.
   6478  *
   6479  * - Curve448 (PSA_ECC_FAMILY_MONTGOMERY, 448 bits):
   6480  *   draw a 56-byte string and process it as specified in [RFC7748] §5.
   6481  *
   6482  * Note: Function allocates memory for *data buffer, so given *data should be
   6483  *       always NULL.
   6484  */
   6485 
   6486 static psa_status_t psa_generate_derived_ecc_key_montgomery_helper(
   6487     size_t bits,
   6488     psa_key_derivation_operation_t *operation,
   6489     uint8_t **data
   6490     )
   6491 {
   6492     size_t output_length;
   6493     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   6494 
   6495     switch (bits) {
   6496         case 255:
   6497             output_length = 32;
   6498             break;
   6499         case 448:
   6500             output_length = 56;
   6501             break;
   6502         default:
   6503             return PSA_ERROR_INVALID_ARGUMENT;
   6504             break;
   6505     }
   6506 
   6507     *data = mbedtls_calloc(1, output_length);
   6508 
   6509     if (*data == NULL) {
   6510         return PSA_ERROR_INSUFFICIENT_MEMORY;
   6511     }
   6512 
   6513     status = psa_key_derivation_output_bytes(operation, *data, output_length);
   6514 
   6515     if (status != PSA_SUCCESS) {
   6516         return status;
   6517     }
   6518 
   6519     switch (bits) {
   6520         case 255:
   6521             (*data)[0] &= 248;
   6522             (*data)[31] &= 127;
   6523             (*data)[31] |= 64;
   6524             break;
   6525         case 448:
   6526             (*data)[0] &= 252;
   6527             (*data)[55] |= 128;
   6528             break;
   6529         default:
   6530             return PSA_ERROR_CORRUPTION_DETECTED;
   6531             break;
   6532     }
   6533 
   6534     return status;
   6535 }
   6536 #else /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_DERIVE */
   6537 static psa_status_t psa_generate_derived_ecc_key_weierstrass_helper(
   6538     psa_key_slot_t *slot, size_t bits,
   6539     psa_key_derivation_operation_t *operation, uint8_t **data)
   6540 {
   6541     (void) slot;
   6542     (void) bits;
   6543     (void) operation;
   6544     (void) data;
   6545     return PSA_ERROR_NOT_SUPPORTED;
   6546 }
   6547 
   6548 static psa_status_t psa_generate_derived_ecc_key_montgomery_helper(
   6549     size_t bits, psa_key_derivation_operation_t *operation, uint8_t **data)
   6550 {
   6551     (void) bits;
   6552     (void) operation;
   6553     (void) data;
   6554     return PSA_ERROR_NOT_SUPPORTED;
   6555 }
   6556 #endif /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_DERIVE */
   6557 #endif /* PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE */
   6558 
   6559 static psa_status_t psa_generate_derived_key_internal(
   6560     psa_key_slot_t *slot,
   6561     size_t bits,
   6562     psa_key_derivation_operation_t *operation)
   6563 {
   6564     uint8_t *data = NULL;
   6565     size_t bytes = PSA_BITS_TO_BYTES(bits);
   6566     size_t storage_size = bytes;
   6567     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   6568 
   6569     if (PSA_KEY_TYPE_IS_PUBLIC_KEY(slot->attr.type)) {
   6570         return PSA_ERROR_INVALID_ARGUMENT;
   6571     }
   6572 
   6573 #if defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE) || \
   6574     defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_DERIVE)
   6575     if (PSA_KEY_TYPE_IS_ECC(slot->attr.type)) {
   6576         psa_ecc_family_t curve = PSA_KEY_TYPE_ECC_GET_FAMILY(slot->attr.type);
   6577         if (PSA_ECC_FAMILY_IS_WEIERSTRASS(curve)) {
   6578             /* Weierstrass elliptic curve */
   6579             status = psa_generate_derived_ecc_key_weierstrass_helper(slot, bits, operation, &data);
   6580             if (status != PSA_SUCCESS) {
   6581                 goto exit;
   6582             }
   6583         } else {
   6584             /* Montgomery elliptic curve */
   6585             status = psa_generate_derived_ecc_key_montgomery_helper(bits, operation, &data);
   6586             if (status != PSA_SUCCESS) {
   6587                 goto exit;
   6588             }
   6589         }
   6590     } else
   6591 #endif /* defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE) ||
   6592           defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_DERIVE) */
   6593     if (key_type_is_raw_bytes(slot->attr.type)) {
   6594         if (bits % 8 != 0) {
   6595             return PSA_ERROR_INVALID_ARGUMENT;
   6596         }
   6597         data = mbedtls_calloc(1, bytes);
   6598         if (data == NULL) {
   6599             return PSA_ERROR_INSUFFICIENT_MEMORY;
   6600         }
   6601 
   6602         status = psa_key_derivation_output_bytes(operation, data, bytes);
   6603         if (status != PSA_SUCCESS) {
   6604             goto exit;
   6605         }
   6606 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES)
   6607         if (slot->attr.type == PSA_KEY_TYPE_DES) {
   6608             psa_des_set_key_parity(data, bytes);
   6609         }
   6610 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES) */
   6611     } else {
   6612         return PSA_ERROR_NOT_SUPPORTED;
   6613     }
   6614 
   6615     slot->attr.bits = (psa_key_bits_t) bits;
   6616 
   6617     if (psa_key_lifetime_is_external(slot->attr.lifetime)) {
   6618         status = psa_driver_wrapper_get_key_buffer_size(&slot->attr,
   6619                                                         &storage_size);
   6620         if (status != PSA_SUCCESS) {
   6621             goto exit;
   6622         }
   6623     }
   6624     status = psa_allocate_buffer_to_slot(slot, storage_size);
   6625     if (status != PSA_SUCCESS) {
   6626         goto exit;
   6627     }
   6628 
   6629     status = psa_driver_wrapper_import_key(&slot->attr,
   6630                                            data, bytes,
   6631                                            slot->key.data,
   6632                                            slot->key.bytes,
   6633                                            &slot->key.bytes, &bits);
   6634     if (bits != slot->attr.bits) {
   6635         status = PSA_ERROR_INVALID_ARGUMENT;
   6636     }
   6637 
   6638 exit:
   6639     mbedtls_zeroize_and_free(data, bytes);
   6640     return status;
   6641 }
   6642 
   6643 static const psa_custom_key_parameters_t default_custom_production =
   6644     PSA_CUSTOM_KEY_PARAMETERS_INIT;
   6645 
   6646 int psa_custom_key_parameters_are_default(
   6647     const psa_custom_key_parameters_t *custom,
   6648     size_t custom_data_length)
   6649 {
   6650     if (custom->flags != 0) {
   6651         return 0;
   6652     }
   6653     if (custom_data_length != 0) {
   6654         return 0;
   6655     }
   6656     return 1;
   6657 }
   6658 
   6659 psa_status_t psa_key_derivation_output_key_custom(
   6660     const psa_key_attributes_t *attributes,
   6661     psa_key_derivation_operation_t *operation,
   6662     const psa_custom_key_parameters_t *custom,
   6663     const uint8_t *custom_data,
   6664     size_t custom_data_length,
   6665     mbedtls_svc_key_id_t *key)
   6666 {
   6667     psa_status_t status;
   6668     psa_key_slot_t *slot = NULL;
   6669     psa_se_drv_table_entry_t *driver = NULL;
   6670 
   6671     *key = MBEDTLS_SVC_KEY_ID_INIT;
   6672 
   6673     /* Reject any attempt to create a zero-length key so that we don't
   6674      * risk tripping up later, e.g. on a malloc(0) that returns NULL. */
   6675     if (psa_get_key_bits(attributes) == 0) {
   6676         return PSA_ERROR_INVALID_ARGUMENT;
   6677     }
   6678 
   6679     (void) custom_data;         /* We only accept 0-length data */
   6680     if (!psa_custom_key_parameters_are_default(custom, custom_data_length)) {
   6681         return PSA_ERROR_INVALID_ARGUMENT;
   6682     }
   6683 
   6684     if (operation->alg == PSA_ALG_NONE) {
   6685         return PSA_ERROR_BAD_STATE;
   6686     }
   6687 
   6688     if (!operation->can_output_key) {
   6689         return PSA_ERROR_NOT_PERMITTED;
   6690     }
   6691 
   6692     status = psa_start_key_creation(PSA_KEY_CREATION_DERIVE, attributes,
   6693                                     &slot, &driver);
   6694 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
   6695     if (driver != NULL) {
   6696         /* Deriving a key in a secure element is not implemented yet. */
   6697         status = PSA_ERROR_NOT_SUPPORTED;
   6698     }
   6699 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
   6700     if (status == PSA_SUCCESS) {
   6701         status = psa_generate_derived_key_internal(slot,
   6702                                                    attributes->bits,
   6703                                                    operation);
   6704     }
   6705     if (status == PSA_SUCCESS) {
   6706         status = psa_finish_key_creation(slot, driver, key);
   6707     }
   6708     if (status != PSA_SUCCESS) {
   6709         psa_fail_key_creation(slot, driver);
   6710     }
   6711 
   6712     return status;
   6713 }
   6714 
   6715 psa_status_t psa_key_derivation_output_key_ext(
   6716     const psa_key_attributes_t *attributes,
   6717     psa_key_derivation_operation_t *operation,
   6718     const psa_key_production_parameters_t *params,
   6719     size_t params_data_length,
   6720     mbedtls_svc_key_id_t *key)
   6721 {
   6722     return psa_key_derivation_output_key_custom(
   6723         attributes, operation,
   6724         (const psa_custom_key_parameters_t *) params,
   6725         params->data, params_data_length,
   6726         key);
   6727 }
   6728 
   6729 psa_status_t psa_key_derivation_output_key(
   6730     const psa_key_attributes_t *attributes,
   6731     psa_key_derivation_operation_t *operation,
   6732     mbedtls_svc_key_id_t *key)
   6733 {
   6734     return psa_key_derivation_output_key_custom(attributes, operation,
   6735                                                 &default_custom_production,
   6736                                                 NULL, 0,
   6737                                                 key);
   6738 }
   6739 
   6740 
   6741 /****************************************************************/
   6742 /* Key derivation: operation management */
   6743 /****************************************************************/
   6744 
   6745 #if defined(AT_LEAST_ONE_BUILTIN_KDF)
   6746 static int is_kdf_alg_supported(psa_algorithm_t kdf_alg)
   6747 {
   6748 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF)
   6749     if (PSA_ALG_IS_HKDF(kdf_alg)) {
   6750         return 1;
   6751     }
   6752 #endif
   6753 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT)
   6754     if (PSA_ALG_IS_HKDF_EXTRACT(kdf_alg)) {
   6755         return 1;
   6756     }
   6757 #endif
   6758 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXPAND)
   6759     if (PSA_ALG_IS_HKDF_EXPAND(kdf_alg)) {
   6760         return 1;
   6761     }
   6762 #endif
   6763 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF)
   6764     if (PSA_ALG_IS_TLS12_PRF(kdf_alg)) {
   6765         return 1;
   6766     }
   6767 #endif
   6768 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   6769     if (PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) {
   6770         return 1;
   6771     }
   6772 #endif
   6773 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS)
   6774     if (kdf_alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
   6775         return 1;
   6776     }
   6777 #endif
   6778 #if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
   6779     if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
   6780         return 1;
   6781     }
   6782 #endif
   6783 #if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_AES_CMAC_PRF_128)
   6784     if (kdf_alg == PSA_ALG_PBKDF2_AES_CMAC_PRF_128) {
   6785         return 1;
   6786     }
   6787 #endif
   6788     return 0;
   6789 }
   6790 
   6791 static psa_status_t psa_hash_try_support(psa_algorithm_t alg)
   6792 {
   6793     psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
   6794     psa_status_t status = psa_hash_setup(&operation, alg);
   6795     psa_hash_abort(&operation);
   6796     return status;
   6797 }
   6798 
   6799 static psa_status_t psa_key_derivation_set_maximum_capacity(
   6800     psa_key_derivation_operation_t *operation,
   6801     psa_algorithm_t kdf_alg)
   6802 {
   6803 #if defined(PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS)
   6804     if (kdf_alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
   6805         operation->capacity = PSA_HASH_LENGTH(PSA_ALG_SHA_256);
   6806         return PSA_SUCCESS;
   6807     }
   6808 #endif
   6809 #if defined(PSA_WANT_ALG_PBKDF2_AES_CMAC_PRF_128)
   6810     if (kdf_alg == PSA_ALG_PBKDF2_AES_CMAC_PRF_128) {
   6811 #if (SIZE_MAX > UINT32_MAX)
   6812         operation->capacity = UINT32_MAX * (size_t) PSA_MAC_LENGTH(
   6813             PSA_KEY_TYPE_AES,
   6814             128U,
   6815             PSA_ALG_CMAC);
   6816 #else
   6817         operation->capacity = SIZE_MAX;
   6818 #endif
   6819         return PSA_SUCCESS;
   6820     }
   6821 #endif /* PSA_WANT_ALG_PBKDF2_AES_CMAC_PRF_128 */
   6822 
   6823     /* After this point, if kdf_alg is not valid then value of hash_alg may be
   6824      * invalid or meaningless but it does not affect this function */
   6825     psa_algorithm_t hash_alg = PSA_ALG_GET_HASH(kdf_alg);
   6826     size_t hash_size = PSA_HASH_LENGTH(hash_alg);
   6827     if (hash_size == 0) {
   6828         return PSA_ERROR_NOT_SUPPORTED;
   6829     }
   6830 
   6831     /* Make sure that hash_alg is a supported hash algorithm. Otherwise
   6832      * we might fail later, which is somewhat unfriendly and potentially
   6833      * risk-prone. */
   6834     psa_status_t status = psa_hash_try_support(hash_alg);
   6835     if (status != PSA_SUCCESS) {
   6836         return status;
   6837     }
   6838 
   6839 #if defined(PSA_WANT_ALG_HKDF)
   6840     if (PSA_ALG_IS_HKDF(kdf_alg)) {
   6841         operation->capacity = 255 * hash_size;
   6842     } else
   6843 #endif
   6844 #if defined(PSA_WANT_ALG_HKDF_EXTRACT)
   6845     if (PSA_ALG_IS_HKDF_EXTRACT(kdf_alg)) {
   6846         operation->capacity = hash_size;
   6847     } else
   6848 #endif
   6849 #if defined(PSA_WANT_ALG_HKDF_EXPAND)
   6850     if (PSA_ALG_IS_HKDF_EXPAND(kdf_alg)) {
   6851         operation->capacity = 255 * hash_size;
   6852     } else
   6853 #endif
   6854 #if defined(PSA_WANT_ALG_TLS12_PRF)
   6855     if (PSA_ALG_IS_TLS12_PRF(kdf_alg) &&
   6856         (hash_alg == PSA_ALG_SHA_256 || hash_alg == PSA_ALG_SHA_384)) {
   6857         operation->capacity = SIZE_MAX;
   6858     } else
   6859 #endif
   6860 #if defined(PSA_WANT_ALG_TLS12_PSK_TO_MS)
   6861     if (PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg) &&
   6862         (hash_alg == PSA_ALG_SHA_256 || hash_alg == PSA_ALG_SHA_384)) {
   6863         /* Master Secret is always 48 bytes
   6864          * https://datatracker.ietf.org/doc/html/rfc5246.html#section-8.1 */
   6865         operation->capacity = 48U;
   6866     } else
   6867 #endif
   6868 #if defined(PSA_WANT_ALG_PBKDF2_HMAC)
   6869     if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
   6870 #if (SIZE_MAX > UINT32_MAX)
   6871         operation->capacity = UINT32_MAX * hash_size;
   6872 #else
   6873         operation->capacity = SIZE_MAX;
   6874 #endif
   6875     } else
   6876 #endif /* PSA_WANT_ALG_PBKDF2_HMAC */
   6877     {
   6878         (void) hash_size;
   6879         status = PSA_ERROR_NOT_SUPPORTED;
   6880     }
   6881     return status;
   6882 }
   6883 
   6884 static psa_status_t psa_key_derivation_setup_kdf(
   6885     psa_key_derivation_operation_t *operation,
   6886     psa_algorithm_t kdf_alg)
   6887 {
   6888     /* Make sure that operation->ctx is properly zero-initialised. (Macro
   6889      * initialisers for this union leave some bytes unspecified.) */
   6890     memset(&operation->ctx, 0, sizeof(operation->ctx));
   6891 
   6892     /* Make sure that kdf_alg is a supported key derivation algorithm. */
   6893     if (!is_kdf_alg_supported(kdf_alg)) {
   6894         return PSA_ERROR_NOT_SUPPORTED;
   6895     }
   6896 
   6897     psa_status_t status = psa_key_derivation_set_maximum_capacity(operation,
   6898                                                                   kdf_alg);
   6899     return status;
   6900 }
   6901 
   6902 static psa_status_t psa_key_agreement_try_support(psa_algorithm_t alg)
   6903 {
   6904 #if defined(PSA_WANT_ALG_ECDH)
   6905     if (alg == PSA_ALG_ECDH) {
   6906         return PSA_SUCCESS;
   6907     }
   6908 #endif
   6909 #if defined(PSA_WANT_ALG_FFDH)
   6910     if (alg == PSA_ALG_FFDH) {
   6911         return PSA_SUCCESS;
   6912     }
   6913 #endif
   6914     (void) alg;
   6915     return PSA_ERROR_NOT_SUPPORTED;
   6916 }
   6917 
   6918 static int psa_key_derivation_allows_free_form_secret_input(
   6919     psa_algorithm_t kdf_alg)
   6920 {
   6921 #if defined(PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS)
   6922     if (kdf_alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
   6923         return 0;
   6924     }
   6925 #endif
   6926     (void) kdf_alg;
   6927     return 1;
   6928 }
   6929 #endif /* AT_LEAST_ONE_BUILTIN_KDF */
   6930 
   6931 psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
   6932                                       psa_algorithm_t alg)
   6933 {
   6934     psa_status_t status;
   6935 
   6936     if (operation->alg != 0) {
   6937         return PSA_ERROR_BAD_STATE;
   6938     }
   6939 
   6940     if (PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)) {
   6941         return PSA_ERROR_INVALID_ARGUMENT;
   6942     } else if (PSA_ALG_IS_KEY_AGREEMENT(alg)) {
   6943 #if defined(AT_LEAST_ONE_BUILTIN_KDF)
   6944         psa_algorithm_t kdf_alg = PSA_ALG_KEY_AGREEMENT_GET_KDF(alg);
   6945         psa_algorithm_t ka_alg = PSA_ALG_KEY_AGREEMENT_GET_BASE(alg);
   6946         status = psa_key_agreement_try_support(ka_alg);
   6947         if (status != PSA_SUCCESS) {
   6948             return status;
   6949         }
   6950         if (!psa_key_derivation_allows_free_form_secret_input(kdf_alg)) {
   6951             return PSA_ERROR_INVALID_ARGUMENT;
   6952         }
   6953         status = psa_key_derivation_setup_kdf(operation, kdf_alg);
   6954 #else
   6955         return PSA_ERROR_NOT_SUPPORTED;
   6956 #endif /* AT_LEAST_ONE_BUILTIN_KDF */
   6957     } else if (PSA_ALG_IS_KEY_DERIVATION(alg)) {
   6958 #if defined(AT_LEAST_ONE_BUILTIN_KDF)
   6959         status = psa_key_derivation_setup_kdf(operation, alg);
   6960 #else
   6961         return PSA_ERROR_NOT_SUPPORTED;
   6962 #endif /* AT_LEAST_ONE_BUILTIN_KDF */
   6963     } else {
   6964         return PSA_ERROR_INVALID_ARGUMENT;
   6965     }
   6966 
   6967     if (status == PSA_SUCCESS) {
   6968         operation->alg = alg;
   6969     }
   6970     return status;
   6971 }
   6972 
   6973 #if defined(BUILTIN_ALG_ANY_HKDF)
   6974 static psa_status_t psa_hkdf_input(psa_hkdf_key_derivation_t *hkdf,
   6975                                    psa_algorithm_t kdf_alg,
   6976                                    psa_key_derivation_step_t step,
   6977                                    const uint8_t *data,
   6978                                    size_t data_length)
   6979 {
   6980     psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(kdf_alg);
   6981     psa_status_t status;
   6982     switch (step) {
   6983         case PSA_KEY_DERIVATION_INPUT_SALT:
   6984 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXPAND)
   6985             if (PSA_ALG_IS_HKDF_EXPAND(kdf_alg)) {
   6986                 return PSA_ERROR_INVALID_ARGUMENT;
   6987             }
   6988 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXPAND */
   6989             if (hkdf->state != HKDF_STATE_INIT) {
   6990                 return PSA_ERROR_BAD_STATE;
   6991             } else {
   6992                 status = psa_key_derivation_start_hmac(&hkdf->hmac,
   6993                                                        hash_alg,
   6994                                                        data, data_length);
   6995                 if (status != PSA_SUCCESS) {
   6996                     return status;
   6997                 }
   6998                 hkdf->state = HKDF_STATE_STARTED;
   6999                 return PSA_SUCCESS;
   7000             }
   7001         case PSA_KEY_DERIVATION_INPUT_SECRET:
   7002 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXPAND)
   7003             if (PSA_ALG_IS_HKDF_EXPAND(kdf_alg)) {
   7004                 /* We shouldn't be in different state as HKDF_EXPAND only allows
   7005                  * two inputs: SECRET (this case) and INFO which does not modify
   7006                  * the state. It could happen only if the hkdf
   7007                  * object was corrupted. */
   7008                 if (hkdf->state != HKDF_STATE_INIT) {
   7009                     return PSA_ERROR_BAD_STATE;
   7010                 }
   7011 
   7012                 /* Allow only input that fits expected prk size */
   7013                 if (data_length != PSA_HASH_LENGTH(hash_alg)) {
   7014                     return PSA_ERROR_INVALID_ARGUMENT;
   7015                 }
   7016 
   7017                 memcpy(hkdf->prk, data, data_length);
   7018             } else
   7019 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXPAND */
   7020             {
   7021                 /* HKDF: If no salt was provided, use an empty salt.
   7022                  * HKDF-EXTRACT: salt is mandatory. */
   7023                 if (hkdf->state == HKDF_STATE_INIT) {
   7024 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT)
   7025                     if (PSA_ALG_IS_HKDF_EXTRACT(kdf_alg)) {
   7026                         return PSA_ERROR_BAD_STATE;
   7027                     }
   7028 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT */
   7029                     status = psa_key_derivation_start_hmac(&hkdf->hmac,
   7030                                                            hash_alg,
   7031                                                            NULL, 0);
   7032                     if (status != PSA_SUCCESS) {
   7033                         return status;
   7034                     }
   7035                     hkdf->state = HKDF_STATE_STARTED;
   7036                 }
   7037                 if (hkdf->state != HKDF_STATE_STARTED) {
   7038                     return PSA_ERROR_BAD_STATE;
   7039                 }
   7040                 status = psa_mac_update(&hkdf->hmac,
   7041                                         data, data_length);
   7042                 if (status != PSA_SUCCESS) {
   7043                     return status;
   7044                 }
   7045                 status = psa_mac_sign_finish(&hkdf->hmac,
   7046                                              hkdf->prk,
   7047                                              sizeof(hkdf->prk),
   7048                                              &data_length);
   7049                 if (status != PSA_SUCCESS) {
   7050                     return status;
   7051                 }
   7052             }
   7053 
   7054             hkdf->state = HKDF_STATE_KEYED;
   7055             hkdf->block_number = 0;
   7056 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT)
   7057             if (PSA_ALG_IS_HKDF_EXTRACT(kdf_alg)) {
   7058                 /* The only block of output is the PRK. */
   7059                 memcpy(hkdf->output_block, hkdf->prk, PSA_HASH_LENGTH(hash_alg));
   7060                 hkdf->offset_in_block = 0;
   7061             } else
   7062 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT */
   7063             {
   7064                 /* Block 0 is empty, and the next block will be
   7065                  * generated by psa_key_derivation_hkdf_read(). */
   7066                 hkdf->offset_in_block = PSA_HASH_LENGTH(hash_alg);
   7067             }
   7068 
   7069             return PSA_SUCCESS;
   7070         case PSA_KEY_DERIVATION_INPUT_INFO:
   7071 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT)
   7072             if (PSA_ALG_IS_HKDF_EXTRACT(kdf_alg)) {
   7073                 return PSA_ERROR_INVALID_ARGUMENT;
   7074             }
   7075 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT */
   7076 #if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXPAND)
   7077             if (PSA_ALG_IS_HKDF_EXPAND(kdf_alg) &&
   7078                 hkdf->state == HKDF_STATE_INIT) {
   7079                 return PSA_ERROR_BAD_STATE;
   7080             }
   7081 #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF_EXTRACT */
   7082             if (hkdf->state == HKDF_STATE_OUTPUT) {
   7083                 return PSA_ERROR_BAD_STATE;
   7084             }
   7085             if (hkdf->info_set) {
   7086                 return PSA_ERROR_BAD_STATE;
   7087             }
   7088             hkdf->info_length = data_length;
   7089             if (data_length != 0) {
   7090                 hkdf->info = mbedtls_calloc(1, data_length);
   7091                 if (hkdf->info == NULL) {
   7092                     return PSA_ERROR_INSUFFICIENT_MEMORY;
   7093                 }
   7094                 memcpy(hkdf->info, data, data_length);
   7095             }
   7096             hkdf->info_set = 1;
   7097             return PSA_SUCCESS;
   7098         default:
   7099             return PSA_ERROR_INVALID_ARGUMENT;
   7100     }
   7101 }
   7102 #endif /* BUILTIN_ALG_ANY_HKDF */
   7103 
   7104 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \
   7105     defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   7106 static psa_status_t psa_tls12_prf_set_seed(psa_tls12_prf_key_derivation_t *prf,
   7107                                            const uint8_t *data,
   7108                                            size_t data_length)
   7109 {
   7110     if (prf->state != PSA_TLS12_PRF_STATE_INIT) {
   7111         return PSA_ERROR_BAD_STATE;
   7112     }
   7113 
   7114     if (data_length != 0) {
   7115         prf->seed = mbedtls_calloc(1, data_length);
   7116         if (prf->seed == NULL) {
   7117             return PSA_ERROR_INSUFFICIENT_MEMORY;
   7118         }
   7119 
   7120         memcpy(prf->seed, data, data_length);
   7121         prf->seed_length = data_length;
   7122     }
   7123 
   7124     prf->state = PSA_TLS12_PRF_STATE_SEED_SET;
   7125 
   7126     return PSA_SUCCESS;
   7127 }
   7128 
   7129 static psa_status_t psa_tls12_prf_set_key(psa_tls12_prf_key_derivation_t *prf,
   7130                                           const uint8_t *data,
   7131                                           size_t data_length)
   7132 {
   7133     if (prf->state != PSA_TLS12_PRF_STATE_SEED_SET &&
   7134         prf->state != PSA_TLS12_PRF_STATE_OTHER_KEY_SET) {
   7135         return PSA_ERROR_BAD_STATE;
   7136     }
   7137 
   7138     if (data_length != 0) {
   7139         prf->secret = mbedtls_calloc(1, data_length);
   7140         if (prf->secret == NULL) {
   7141             return PSA_ERROR_INSUFFICIENT_MEMORY;
   7142         }
   7143 
   7144         memcpy(prf->secret, data, data_length);
   7145         prf->secret_length = data_length;
   7146     }
   7147 
   7148     prf->state = PSA_TLS12_PRF_STATE_KEY_SET;
   7149 
   7150     return PSA_SUCCESS;
   7151 }
   7152 
   7153 static psa_status_t psa_tls12_prf_set_label(psa_tls12_prf_key_derivation_t *prf,
   7154                                             const uint8_t *data,
   7155                                             size_t data_length)
   7156 {
   7157     if (prf->state != PSA_TLS12_PRF_STATE_KEY_SET) {
   7158         return PSA_ERROR_BAD_STATE;
   7159     }
   7160 
   7161     if (data_length != 0) {
   7162         prf->label = mbedtls_calloc(1, data_length);
   7163         if (prf->label == NULL) {
   7164             return PSA_ERROR_INSUFFICIENT_MEMORY;
   7165         }
   7166 
   7167         memcpy(prf->label, data, data_length);
   7168         prf->label_length = data_length;
   7169     }
   7170 
   7171     prf->state = PSA_TLS12_PRF_STATE_LABEL_SET;
   7172 
   7173     return PSA_SUCCESS;
   7174 }
   7175 
   7176 static psa_status_t psa_tls12_prf_input(psa_tls12_prf_key_derivation_t *prf,
   7177                                         psa_key_derivation_step_t step,
   7178                                         const uint8_t *data,
   7179                                         size_t data_length)
   7180 {
   7181     switch (step) {
   7182         case PSA_KEY_DERIVATION_INPUT_SEED:
   7183             return psa_tls12_prf_set_seed(prf, data, data_length);
   7184         case PSA_KEY_DERIVATION_INPUT_SECRET:
   7185             return psa_tls12_prf_set_key(prf, data, data_length);
   7186         case PSA_KEY_DERIVATION_INPUT_LABEL:
   7187             return psa_tls12_prf_set_label(prf, data, data_length);
   7188         default:
   7189             return PSA_ERROR_INVALID_ARGUMENT;
   7190     }
   7191 }
   7192 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) ||
   7193         * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */
   7194 
   7195 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   7196 static psa_status_t psa_tls12_prf_psk_to_ms_set_key(
   7197     psa_tls12_prf_key_derivation_t *prf,
   7198     const uint8_t *data,
   7199     size_t data_length)
   7200 {
   7201     psa_status_t status;
   7202     const size_t pms_len = (prf->state == PSA_TLS12_PRF_STATE_OTHER_KEY_SET ?
   7203                             4 + data_length + prf->other_secret_length :
   7204                             4 + 2 * data_length);
   7205 
   7206     if (data_length > PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE) {
   7207         return PSA_ERROR_INVALID_ARGUMENT;
   7208     }
   7209 
   7210     uint8_t *pms = mbedtls_calloc(1, pms_len);
   7211     if (pms == NULL) {
   7212         return PSA_ERROR_INSUFFICIENT_MEMORY;
   7213     }
   7214     uint8_t *cur = pms;
   7215 
   7216     /* pure-PSK:
   7217      * Quoting RFC 4279, Section 2:
   7218      *
   7219      * The premaster secret is formed as follows: if the PSK is N octets
   7220      * long, concatenate a uint16 with the value N, N zero octets, a second
   7221      * uint16 with the value N, and the PSK itself.
   7222      *
   7223      * mixed-PSK:
   7224      * In a DHE-PSK, RSA-PSK, ECDHE-PSK the premaster secret is formed as
   7225      * follows: concatenate a uint16 with the length of the other secret,
   7226      * the other secret itself, uint16 with the length of PSK, and the
   7227      * PSK itself.
   7228      * For details please check:
   7229      * - RFC 4279, Section 4 for the definition of RSA-PSK,
   7230      * - RFC 4279, Section 3 for the definition of DHE-PSK,
   7231      * - RFC 5489 for the definition of ECDHE-PSK.
   7232      */
   7233 
   7234     if (prf->state == PSA_TLS12_PRF_STATE_OTHER_KEY_SET) {
   7235         *cur++ = MBEDTLS_BYTE_1(prf->other_secret_length);
   7236         *cur++ = MBEDTLS_BYTE_0(prf->other_secret_length);
   7237         if (prf->other_secret_length != 0) {
   7238             memcpy(cur, prf->other_secret, prf->other_secret_length);
   7239             mbedtls_platform_zeroize(prf->other_secret, prf->other_secret_length);
   7240             cur += prf->other_secret_length;
   7241         }
   7242     } else {
   7243         *cur++ = MBEDTLS_BYTE_1(data_length);
   7244         *cur++ = MBEDTLS_BYTE_0(data_length);
   7245         memset(cur, 0, data_length);
   7246         cur += data_length;
   7247     }
   7248 
   7249     *cur++ = MBEDTLS_BYTE_1(data_length);
   7250     *cur++ = MBEDTLS_BYTE_0(data_length);
   7251     memcpy(cur, data, data_length);
   7252     cur += data_length;
   7253 
   7254     status = psa_tls12_prf_set_key(prf, pms, (size_t) (cur - pms));
   7255 
   7256     mbedtls_zeroize_and_free(pms, pms_len);
   7257     return status;
   7258 }
   7259 
   7260 static psa_status_t psa_tls12_prf_psk_to_ms_set_other_key(
   7261     psa_tls12_prf_key_derivation_t *prf,
   7262     const uint8_t *data,
   7263     size_t data_length)
   7264 {
   7265     if (prf->state != PSA_TLS12_PRF_STATE_SEED_SET) {
   7266         return PSA_ERROR_BAD_STATE;
   7267     }
   7268 
   7269     if (data_length != 0) {
   7270         prf->other_secret = mbedtls_calloc(1, data_length);
   7271         if (prf->other_secret == NULL) {
   7272             return PSA_ERROR_INSUFFICIENT_MEMORY;
   7273         }
   7274 
   7275         memcpy(prf->other_secret, data, data_length);
   7276         prf->other_secret_length = data_length;
   7277     } else {
   7278         prf->other_secret_length = 0;
   7279     }
   7280 
   7281     prf->state = PSA_TLS12_PRF_STATE_OTHER_KEY_SET;
   7282 
   7283     return PSA_SUCCESS;
   7284 }
   7285 
   7286 static psa_status_t psa_tls12_prf_psk_to_ms_input(
   7287     psa_tls12_prf_key_derivation_t *prf,
   7288     psa_key_derivation_step_t step,
   7289     const uint8_t *data,
   7290     size_t data_length)
   7291 {
   7292     switch (step) {
   7293         case PSA_KEY_DERIVATION_INPUT_SECRET:
   7294             return psa_tls12_prf_psk_to_ms_set_key(prf,
   7295                                                    data, data_length);
   7296             break;
   7297         case PSA_KEY_DERIVATION_INPUT_OTHER_SECRET:
   7298             return psa_tls12_prf_psk_to_ms_set_other_key(prf,
   7299                                                          data,
   7300                                                          data_length);
   7301             break;
   7302         default:
   7303             return psa_tls12_prf_input(prf, step, data, data_length);
   7304             break;
   7305 
   7306     }
   7307 }
   7308 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */
   7309 
   7310 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS)
   7311 static psa_status_t psa_tls12_ecjpake_to_pms_input(
   7312     psa_tls12_ecjpake_to_pms_t *ecjpake,
   7313     psa_key_derivation_step_t step,
   7314     const uint8_t *data,
   7315     size_t data_length)
   7316 {
   7317     if (data_length != PSA_TLS12_ECJPAKE_TO_PMS_INPUT_SIZE ||
   7318         step != PSA_KEY_DERIVATION_INPUT_SECRET) {
   7319         return PSA_ERROR_INVALID_ARGUMENT;
   7320     }
   7321 
   7322     /* Check if the passed point is in an uncompressed form */
   7323     if (data[0] != 0x04) {
   7324         return PSA_ERROR_INVALID_ARGUMENT;
   7325     }
   7326 
   7327     /* Only K.X has to be extracted - bytes 1 to 32 inclusive. */
   7328     memcpy(ecjpake->data, data + 1, PSA_TLS12_ECJPAKE_TO_PMS_DATA_SIZE);
   7329 
   7330     return PSA_SUCCESS;
   7331 }
   7332 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS */
   7333 
   7334 #if defined(PSA_HAVE_SOFT_PBKDF2)
   7335 static psa_status_t psa_pbkdf2_set_input_cost(
   7336     psa_pbkdf2_key_derivation_t *pbkdf2,
   7337     psa_key_derivation_step_t step,
   7338     uint64_t data)
   7339 {
   7340     if (step != PSA_KEY_DERIVATION_INPUT_COST) {
   7341         return PSA_ERROR_INVALID_ARGUMENT;
   7342     }
   7343 
   7344     if (pbkdf2->state != PSA_PBKDF2_STATE_INIT) {
   7345         return PSA_ERROR_BAD_STATE;
   7346     }
   7347 
   7348     if (data > PSA_VENDOR_PBKDF2_MAX_ITERATIONS) {
   7349         return PSA_ERROR_NOT_SUPPORTED;
   7350     }
   7351 
   7352     if (data == 0) {
   7353         return PSA_ERROR_INVALID_ARGUMENT;
   7354     }
   7355 
   7356     pbkdf2->input_cost = data;
   7357     pbkdf2->state = PSA_PBKDF2_STATE_INPUT_COST_SET;
   7358 
   7359     return PSA_SUCCESS;
   7360 }
   7361 
   7362 static psa_status_t psa_pbkdf2_set_salt(psa_pbkdf2_key_derivation_t *pbkdf2,
   7363                                         const uint8_t *data,
   7364                                         size_t data_length)
   7365 {
   7366     if (pbkdf2->state == PSA_PBKDF2_STATE_INPUT_COST_SET) {
   7367         pbkdf2->state = PSA_PBKDF2_STATE_SALT_SET;
   7368     } else if (pbkdf2->state == PSA_PBKDF2_STATE_SALT_SET) {
   7369         /* Appending to existing salt. No state change. */
   7370     } else {
   7371         return PSA_ERROR_BAD_STATE;
   7372     }
   7373 
   7374     if (data_length == 0) {
   7375         /* Appending an empty string, nothing to do. */
   7376     } else {
   7377         uint8_t *next_salt;
   7378 
   7379         next_salt = mbedtls_calloc(1, data_length + pbkdf2->salt_length);
   7380         if (next_salt == NULL) {
   7381             return PSA_ERROR_INSUFFICIENT_MEMORY;
   7382         }
   7383 
   7384         if (pbkdf2->salt_length != 0) {
   7385             memcpy(next_salt, pbkdf2->salt, pbkdf2->salt_length);
   7386         }
   7387         memcpy(next_salt + pbkdf2->salt_length, data, data_length);
   7388         pbkdf2->salt_length += data_length;
   7389         mbedtls_free(pbkdf2->salt);
   7390         pbkdf2->salt = next_salt;
   7391     }
   7392     return PSA_SUCCESS;
   7393 }
   7394 
   7395 #if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
   7396 static psa_status_t psa_pbkdf2_hmac_set_password(psa_algorithm_t hash_alg,
   7397                                                  const uint8_t *input,
   7398                                                  size_t input_len,
   7399                                                  uint8_t *output,
   7400                                                  size_t *output_len)
   7401 {
   7402     psa_status_t status = PSA_SUCCESS;
   7403     if (input_len > PSA_HASH_BLOCK_LENGTH(hash_alg)) {
   7404         return psa_hash_compute(hash_alg, input, input_len, output,
   7405                                 PSA_HMAC_MAX_HASH_BLOCK_SIZE, output_len);
   7406     } else if (input_len > 0) {
   7407         memcpy(output, input, input_len);
   7408     }
   7409     *output_len = PSA_HASH_BLOCK_LENGTH(hash_alg);
   7410     return status;
   7411 }
   7412 #endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
   7413 
   7414 #if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_AES_CMAC_PRF_128)
   7415 static psa_status_t psa_pbkdf2_cmac_set_password(const uint8_t *input,
   7416                                                  size_t input_len,
   7417                                                  uint8_t *output,
   7418                                                  size_t *output_len)
   7419 {
   7420     psa_status_t status = PSA_SUCCESS;
   7421     if (input_len != PSA_MAC_LENGTH(PSA_KEY_TYPE_AES, 128U, PSA_ALG_CMAC)) {
   7422         psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
   7423         uint8_t zeros[16] = { 0 };
   7424         psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
   7425         psa_set_key_bits(&attributes, PSA_BYTES_TO_BITS(sizeof(zeros)));
   7426         psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
   7427         /* Passing PSA_MAC_LENGTH(PSA_KEY_TYPE_AES, 128U, PSA_ALG_CMAC) as
   7428          * mac_size as the driver function sets mac_output_length = mac_size
   7429          * on success. See https://github.com/Mbed-TLS/mbedtls/issues/7801 */
   7430         status = psa_driver_wrapper_mac_compute(&attributes,
   7431                                                 zeros, sizeof(zeros),
   7432                                                 PSA_ALG_CMAC, input, input_len,
   7433                                                 output,
   7434                                                 PSA_MAC_LENGTH(PSA_KEY_TYPE_AES,
   7435                                                                128U,
   7436                                                                PSA_ALG_CMAC),
   7437                                                 output_len);
   7438     } else {
   7439         memcpy(output, input, input_len);
   7440         *output_len = PSA_MAC_LENGTH(PSA_KEY_TYPE_AES, 128U, PSA_ALG_CMAC);
   7441     }
   7442     return status;
   7443 }
   7444 #endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_AES_CMAC_PRF_128 */
   7445 
   7446 static psa_status_t psa_pbkdf2_set_password(psa_pbkdf2_key_derivation_t *pbkdf2,
   7447                                             psa_algorithm_t kdf_alg,
   7448                                             const uint8_t *data,
   7449                                             size_t data_length)
   7450 {
   7451     psa_status_t status = PSA_SUCCESS;
   7452     if (pbkdf2->state != PSA_PBKDF2_STATE_SALT_SET) {
   7453         return PSA_ERROR_BAD_STATE;
   7454     }
   7455 
   7456 #if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
   7457     if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
   7458         psa_algorithm_t hash_alg = PSA_ALG_PBKDF2_HMAC_GET_HASH(kdf_alg);
   7459         status = psa_pbkdf2_hmac_set_password(hash_alg, data, data_length,
   7460                                               pbkdf2->password,
   7461                                               &pbkdf2->password_length);
   7462     } else
   7463 #endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
   7464 #if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_AES_CMAC_PRF_128)
   7465     if (kdf_alg == PSA_ALG_PBKDF2_AES_CMAC_PRF_128) {
   7466         status = psa_pbkdf2_cmac_set_password(data, data_length,
   7467                                               pbkdf2->password,
   7468                                               &pbkdf2->password_length);
   7469     } else
   7470 #endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_AES_CMAC_PRF_128 */
   7471     {
   7472         return PSA_ERROR_INVALID_ARGUMENT;
   7473     }
   7474 
   7475     pbkdf2->state = PSA_PBKDF2_STATE_PASSWORD_SET;
   7476 
   7477     return status;
   7478 }
   7479 
   7480 static psa_status_t psa_pbkdf2_input(psa_pbkdf2_key_derivation_t *pbkdf2,
   7481                                      psa_algorithm_t kdf_alg,
   7482                                      psa_key_derivation_step_t step,
   7483                                      const uint8_t *data,
   7484                                      size_t data_length)
   7485 {
   7486     switch (step) {
   7487         case PSA_KEY_DERIVATION_INPUT_SALT:
   7488             return psa_pbkdf2_set_salt(pbkdf2, data, data_length);
   7489         case PSA_KEY_DERIVATION_INPUT_PASSWORD:
   7490             return psa_pbkdf2_set_password(pbkdf2, kdf_alg, data, data_length);
   7491         default:
   7492             return PSA_ERROR_INVALID_ARGUMENT;
   7493     }
   7494 }
   7495 #endif /* PSA_HAVE_SOFT_PBKDF2 */
   7496 
   7497 /** Check whether the given key type is acceptable for the given
   7498  * input step of a key derivation.
   7499  *
   7500  * Secret inputs must have the type #PSA_KEY_TYPE_DERIVE.
   7501  * Non-secret inputs must have the type #PSA_KEY_TYPE_RAW_DATA.
   7502  * Both secret and non-secret inputs can alternatively have the type
   7503  * #PSA_KEY_TYPE_NONE, which is never the type of a key object, meaning
   7504  * that the input was passed as a buffer rather than via a key object.
   7505  */
   7506 static int psa_key_derivation_check_input_type(
   7507     psa_key_derivation_step_t step,
   7508     psa_key_type_t key_type)
   7509 {
   7510     switch (step) {
   7511         case PSA_KEY_DERIVATION_INPUT_SECRET:
   7512             if (key_type == PSA_KEY_TYPE_DERIVE) {
   7513                 return PSA_SUCCESS;
   7514             }
   7515             if (key_type == PSA_KEY_TYPE_NONE) {
   7516                 return PSA_SUCCESS;
   7517             }
   7518             break;
   7519         case PSA_KEY_DERIVATION_INPUT_OTHER_SECRET:
   7520             if (key_type == PSA_KEY_TYPE_DERIVE) {
   7521                 return PSA_SUCCESS;
   7522             }
   7523             if (key_type == PSA_KEY_TYPE_NONE) {
   7524                 return PSA_SUCCESS;
   7525             }
   7526             break;
   7527         case PSA_KEY_DERIVATION_INPUT_LABEL:
   7528         case PSA_KEY_DERIVATION_INPUT_SALT:
   7529         case PSA_KEY_DERIVATION_INPUT_INFO:
   7530         case PSA_KEY_DERIVATION_INPUT_SEED:
   7531             if (key_type == PSA_KEY_TYPE_RAW_DATA) {
   7532                 return PSA_SUCCESS;
   7533             }
   7534             if (key_type == PSA_KEY_TYPE_NONE) {
   7535                 return PSA_SUCCESS;
   7536             }
   7537             break;
   7538         case PSA_KEY_DERIVATION_INPUT_PASSWORD:
   7539             if (key_type == PSA_KEY_TYPE_PASSWORD) {
   7540                 return PSA_SUCCESS;
   7541             }
   7542             if (key_type == PSA_KEY_TYPE_DERIVE) {
   7543                 return PSA_SUCCESS;
   7544             }
   7545             if (key_type == PSA_KEY_TYPE_NONE) {
   7546                 return PSA_SUCCESS;
   7547             }
   7548             break;
   7549     }
   7550     return PSA_ERROR_INVALID_ARGUMENT;
   7551 }
   7552 
   7553 static psa_status_t psa_key_derivation_input_internal(
   7554     psa_key_derivation_operation_t *operation,
   7555     psa_key_derivation_step_t step,
   7556     psa_key_type_t key_type,
   7557     const uint8_t *data,
   7558     size_t data_length)
   7559 {
   7560     psa_status_t status;
   7561     psa_algorithm_t kdf_alg = psa_key_derivation_get_kdf_alg(operation);
   7562 
   7563     if (kdf_alg == PSA_ALG_NONE) {
   7564         /* This is a blank or aborted operation. */
   7565         status = PSA_ERROR_BAD_STATE;
   7566         goto exit;
   7567     }
   7568 
   7569     status = psa_key_derivation_check_input_type(step, key_type);
   7570     if (status != PSA_SUCCESS) {
   7571         goto exit;
   7572     }
   7573 
   7574 #if defined(BUILTIN_ALG_ANY_HKDF)
   7575     if (PSA_ALG_IS_ANY_HKDF(kdf_alg)) {
   7576         status = psa_hkdf_input(&operation->ctx.hkdf, kdf_alg,
   7577                                 step, data, data_length);
   7578     } else
   7579 #endif /* BUILTIN_ALG_ANY_HKDF */
   7580 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF)
   7581     if (PSA_ALG_IS_TLS12_PRF(kdf_alg)) {
   7582         status = psa_tls12_prf_input(&operation->ctx.tls12_prf,
   7583                                      step, data, data_length);
   7584     } else
   7585 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF */
   7586 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)
   7587     if (PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) {
   7588         status = psa_tls12_prf_psk_to_ms_input(&operation->ctx.tls12_prf,
   7589                                                step, data, data_length);
   7590     } else
   7591 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */
   7592 #if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS)
   7593     if (kdf_alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
   7594         status = psa_tls12_ecjpake_to_pms_input(
   7595             &operation->ctx.tls12_ecjpake_to_pms, step, data, data_length);
   7596     } else
   7597 #endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS */
   7598 #if defined(PSA_HAVE_SOFT_PBKDF2)
   7599     if (PSA_ALG_IS_PBKDF2(kdf_alg)) {
   7600         status = psa_pbkdf2_input(&operation->ctx.pbkdf2, kdf_alg,
   7601                                   step, data, data_length);
   7602     } else
   7603 #endif /* PSA_HAVE_SOFT_PBKDF2 */
   7604     {
   7605         /* This can't happen unless the operation object was not initialized */
   7606         (void) data;
   7607         (void) data_length;
   7608         (void) kdf_alg;
   7609         return PSA_ERROR_BAD_STATE;
   7610     }
   7611 
   7612 exit:
   7613     if (status != PSA_SUCCESS) {
   7614         psa_key_derivation_abort(operation);
   7615     }
   7616     return status;
   7617 }
   7618 
   7619 static psa_status_t psa_key_derivation_input_integer_internal(
   7620     psa_key_derivation_operation_t *operation,
   7621     psa_key_derivation_step_t step,
   7622     uint64_t value)
   7623 {
   7624     psa_status_t status;
   7625     psa_algorithm_t kdf_alg = psa_key_derivation_get_kdf_alg(operation);
   7626 
   7627     if (kdf_alg == PSA_ALG_NONE) {
   7628         /* This is a blank or aborted operation. */
   7629         status = PSA_ERROR_BAD_STATE;
   7630         goto exit;
   7631     }
   7632 
   7633 #if defined(PSA_HAVE_SOFT_PBKDF2)
   7634     if (PSA_ALG_IS_PBKDF2(kdf_alg)) {
   7635         status = psa_pbkdf2_set_input_cost(
   7636             &operation->ctx.pbkdf2, step, value);
   7637     } else
   7638 #endif /* PSA_HAVE_SOFT_PBKDF2 */
   7639     {
   7640         (void) step;
   7641         (void) value;
   7642         (void) kdf_alg;
   7643         status = PSA_ERROR_INVALID_ARGUMENT;
   7644     }
   7645 
   7646 exit:
   7647     if (status != PSA_SUCCESS) {
   7648         psa_key_derivation_abort(operation);
   7649     }
   7650     return status;
   7651 }
   7652 
   7653 psa_status_t psa_key_derivation_input_bytes(
   7654     psa_key_derivation_operation_t *operation,
   7655     psa_key_derivation_step_t step,
   7656     const uint8_t *data_external,
   7657     size_t data_length)
   7658 {
   7659     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   7660     LOCAL_INPUT_DECLARE(data_external, data);
   7661 
   7662     LOCAL_INPUT_ALLOC(data_external, data_length, data);
   7663 
   7664     status = psa_key_derivation_input_internal(operation, step,
   7665                                                PSA_KEY_TYPE_NONE,
   7666                                                data, data_length);
   7667 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   7668 exit:
   7669 #endif
   7670     LOCAL_INPUT_FREE(data_external, data);
   7671     return status;
   7672 }
   7673 
   7674 psa_status_t psa_key_derivation_input_integer(
   7675     psa_key_derivation_operation_t *operation,
   7676     psa_key_derivation_step_t step,
   7677     uint64_t value)
   7678 {
   7679     return psa_key_derivation_input_integer_internal(operation, step, value);
   7680 }
   7681 
   7682 psa_status_t psa_key_derivation_input_key(
   7683     psa_key_derivation_operation_t *operation,
   7684     psa_key_derivation_step_t step,
   7685     mbedtls_svc_key_id_t key)
   7686 {
   7687     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   7688     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   7689     psa_key_slot_t *slot;
   7690 
   7691     status = psa_get_and_lock_transparent_key_slot_with_policy(
   7692         key, &slot, PSA_KEY_USAGE_DERIVE, operation->alg);
   7693     if (status != PSA_SUCCESS) {
   7694         psa_key_derivation_abort(operation);
   7695         return status;
   7696     }
   7697 
   7698     /* Passing a key object as a SECRET or PASSWORD input unlocks the
   7699      * permission to output to a key object. */
   7700     if (step == PSA_KEY_DERIVATION_INPUT_SECRET ||
   7701         step == PSA_KEY_DERIVATION_INPUT_PASSWORD) {
   7702         operation->can_output_key = 1;
   7703     }
   7704 
   7705     status = psa_key_derivation_input_internal(operation,
   7706                                                step, slot->attr.type,
   7707                                                slot->key.data,
   7708                                                slot->key.bytes);
   7709 
   7710     unlock_status = psa_unregister_read_under_mutex(slot);
   7711 
   7712     return (status == PSA_SUCCESS) ? unlock_status : status;
   7713 }
   7714 
   7715 
   7716 
   7717 /****************************************************************/
   7718 /* Key agreement */
   7719 /****************************************************************/
   7720 
   7721 psa_status_t psa_key_agreement_raw_builtin(const psa_key_attributes_t *attributes,
   7722                                            const uint8_t *key_buffer,
   7723                                            size_t key_buffer_size,
   7724                                            psa_algorithm_t alg,
   7725                                            const uint8_t *peer_key,
   7726                                            size_t peer_key_length,
   7727                                            uint8_t *shared_secret,
   7728                                            size_t shared_secret_size,
   7729                                            size_t *shared_secret_length)
   7730 {
   7731     switch (alg) {
   7732 #if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH)
   7733         case PSA_ALG_ECDH:
   7734             return mbedtls_psa_key_agreement_ecdh(attributes, key_buffer,
   7735                                                   key_buffer_size, alg,
   7736                                                   peer_key, peer_key_length,
   7737                                                   shared_secret,
   7738                                                   shared_secret_size,
   7739                                                   shared_secret_length);
   7740 #endif /* MBEDTLS_PSA_BUILTIN_ALG_ECDH */
   7741 
   7742 #if defined(MBEDTLS_PSA_BUILTIN_ALG_FFDH)
   7743         case PSA_ALG_FFDH:
   7744             return mbedtls_psa_ffdh_key_agreement(attributes,
   7745                                                   peer_key,
   7746                                                   peer_key_length,
   7747                                                   key_buffer,
   7748                                                   key_buffer_size,
   7749                                                   shared_secret,
   7750                                                   shared_secret_size,
   7751                                                   shared_secret_length);
   7752 #endif /* MBEDTLS_PSA_BUILTIN_ALG_FFDH */
   7753 
   7754         default:
   7755             (void) attributes;
   7756             (void) key_buffer;
   7757             (void) key_buffer_size;
   7758             (void) peer_key;
   7759             (void) peer_key_length;
   7760             (void) shared_secret;
   7761             (void) shared_secret_size;
   7762             (void) shared_secret_length;
   7763             return PSA_ERROR_NOT_SUPPORTED;
   7764     }
   7765 }
   7766 
   7767 /** Internal function for raw key agreement
   7768  *  Calls the driver wrapper which will hand off key agreement task
   7769  *  to the driver's implementation if a driver is present.
   7770  *  Fallback specified in the driver wrapper is built-in raw key agreement
   7771  *  (psa_key_agreement_raw_builtin).
   7772  */
   7773 static psa_status_t psa_key_agreement_raw_internal(psa_algorithm_t alg,
   7774                                                    psa_key_slot_t *private_key,
   7775                                                    const uint8_t *peer_key,
   7776                                                    size_t peer_key_length,
   7777                                                    uint8_t *shared_secret,
   7778                                                    size_t shared_secret_size,
   7779                                                    size_t *shared_secret_length)
   7780 {
   7781     if (!PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)) {
   7782         return PSA_ERROR_NOT_SUPPORTED;
   7783     }
   7784 
   7785     return psa_driver_wrapper_key_agreement(&private_key->attr,
   7786                                             private_key->key.data,
   7787                                             private_key->key.bytes, alg,
   7788                                             peer_key, peer_key_length,
   7789                                             shared_secret,
   7790                                             shared_secret_size,
   7791                                             shared_secret_length);
   7792 }
   7793 
   7794 /* Note that if this function fails, you must call psa_key_derivation_abort()
   7795  * to potentially free embedded data structures and wipe confidential data.
   7796  */
   7797 static psa_status_t psa_key_agreement_internal(psa_key_derivation_operation_t *operation,
   7798                                                psa_key_derivation_step_t step,
   7799                                                psa_key_slot_t *private_key,
   7800                                                const uint8_t *peer_key,
   7801                                                size_t peer_key_length)
   7802 {
   7803     psa_status_t status;
   7804     uint8_t shared_secret[PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE] = { 0 };
   7805     size_t shared_secret_length = 0;
   7806     psa_algorithm_t ka_alg = PSA_ALG_KEY_AGREEMENT_GET_BASE(operation->alg);
   7807 
   7808     /* Step 1: run the secret agreement algorithm to generate the shared
   7809      * secret. */
   7810     status = psa_key_agreement_raw_internal(ka_alg,
   7811                                             private_key,
   7812                                             peer_key, peer_key_length,
   7813                                             shared_secret,
   7814                                             sizeof(shared_secret),
   7815                                             &shared_secret_length);
   7816     if (status != PSA_SUCCESS) {
   7817         goto exit;
   7818     }
   7819 
   7820     /* Step 2: set up the key derivation to generate key material from
   7821      * the shared secret. A shared secret is permitted wherever a key
   7822      * of type DERIVE is permitted. */
   7823     status = psa_key_derivation_input_internal(operation, step,
   7824                                                PSA_KEY_TYPE_DERIVE,
   7825                                                shared_secret,
   7826                                                shared_secret_length);
   7827 exit:
   7828     mbedtls_platform_zeroize(shared_secret, shared_secret_length);
   7829     return status;
   7830 }
   7831 
   7832 psa_status_t psa_key_derivation_key_agreement(psa_key_derivation_operation_t *operation,
   7833                                               psa_key_derivation_step_t step,
   7834                                               mbedtls_svc_key_id_t private_key,
   7835                                               const uint8_t *peer_key_external,
   7836                                               size_t peer_key_length)
   7837 {
   7838     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   7839     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   7840     psa_key_slot_t *slot;
   7841     LOCAL_INPUT_DECLARE(peer_key_external, peer_key);
   7842 
   7843     if (!PSA_ALG_IS_KEY_AGREEMENT(operation->alg)) {
   7844         return PSA_ERROR_INVALID_ARGUMENT;
   7845     }
   7846     status = psa_get_and_lock_transparent_key_slot_with_policy(
   7847         private_key, &slot, PSA_KEY_USAGE_DERIVE, operation->alg);
   7848     if (status != PSA_SUCCESS) {
   7849         return status;
   7850     }
   7851 
   7852     LOCAL_INPUT_ALLOC(peer_key_external, peer_key_length, peer_key);
   7853     status = psa_key_agreement_internal(operation, step,
   7854                                         slot,
   7855                                         peer_key, peer_key_length);
   7856 
   7857 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   7858 exit:
   7859 #endif
   7860     if (status != PSA_SUCCESS) {
   7861         psa_key_derivation_abort(operation);
   7862     } else {
   7863         /* If a private key has been added as SECRET, we allow the derived
   7864          * key material to be used as a key in PSA Crypto. */
   7865         if (step == PSA_KEY_DERIVATION_INPUT_SECRET) {
   7866             operation->can_output_key = 1;
   7867         }
   7868     }
   7869 
   7870     unlock_status = psa_unregister_read_under_mutex(slot);
   7871     LOCAL_INPUT_FREE(peer_key_external, peer_key);
   7872 
   7873     return (status == PSA_SUCCESS) ? unlock_status : status;
   7874 }
   7875 
   7876 psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
   7877                                    mbedtls_svc_key_id_t private_key,
   7878                                    const uint8_t *peer_key_external,
   7879                                    size_t peer_key_length,
   7880                                    uint8_t *output_external,
   7881                                    size_t output_size,
   7882                                    size_t *output_length)
   7883 {
   7884     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   7885     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   7886     psa_key_slot_t *slot = NULL;
   7887     size_t expected_length;
   7888     LOCAL_INPUT_DECLARE(peer_key_external, peer_key);
   7889     LOCAL_OUTPUT_DECLARE(output_external, output);
   7890     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   7891 
   7892     if (!PSA_ALG_IS_KEY_AGREEMENT(alg)) {
   7893         status = PSA_ERROR_INVALID_ARGUMENT;
   7894         goto exit;
   7895     }
   7896     status = psa_get_and_lock_transparent_key_slot_with_policy(
   7897         private_key, &slot, PSA_KEY_USAGE_DERIVE, alg);
   7898     if (status != PSA_SUCCESS) {
   7899         goto exit;
   7900     }
   7901 
   7902     /* PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE() is in general an upper bound
   7903      * for the output size. The PSA specification only guarantees that this
   7904      * function works if output_size >= PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(...),
   7905      * but it might be nice to allow smaller buffers if the output fits.
   7906      * At the time of writing this comment, with only ECDH implemented,
   7907      * PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE() is exact so the point is moot.
   7908      * If FFDH is implemented, PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE() can easily
   7909      * be exact for it as well. */
   7910     expected_length =
   7911         PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(slot->attr.type, slot->attr.bits);
   7912     if (output_size < expected_length) {
   7913         status = PSA_ERROR_BUFFER_TOO_SMALL;
   7914         goto exit;
   7915     }
   7916 
   7917     LOCAL_INPUT_ALLOC(peer_key_external, peer_key_length, peer_key);
   7918     status = psa_key_agreement_raw_internal(alg, slot,
   7919                                             peer_key, peer_key_length,
   7920                                             output, output_size,
   7921                                             output_length);
   7922 
   7923 exit:
   7924     /* Check for successful allocation of output,
   7925      * with an unsuccessful status. */
   7926     if (output != NULL && status != PSA_SUCCESS) {
   7927         /* If an error happens and is not handled properly, the output
   7928          * may be used as a key to protect sensitive data. Arrange for such
   7929          * a key to be random, which is likely to result in decryption or
   7930          * verification errors. This is better than filling the buffer with
   7931          * some constant data such as zeros, which would result in the data
   7932          * being protected with a reproducible, easily knowable key.
   7933          */
   7934         psa_generate_random_internal(output, output_size);
   7935         *output_length = output_size;
   7936     }
   7937 
   7938     if (output == NULL) {
   7939         /* output allocation failed. */
   7940         *output_length = 0;
   7941     }
   7942 
   7943     unlock_status = psa_unregister_read_under_mutex(slot);
   7944 
   7945     LOCAL_INPUT_FREE(peer_key_external, peer_key);
   7946     LOCAL_OUTPUT_FREE(output_external, output);
   7947     return (status == PSA_SUCCESS) ? unlock_status : status;
   7948 }
   7949 
   7950 
   7951 /****************************************************************/
   7952 /* Random generation */
   7953 /****************************************************************/
   7954 
   7955 #if defined(MBEDTLS_PSA_INJECT_ENTROPY)
   7956 #include "entropy_poll.h"
   7957 #endif
   7958 
   7959 /** Initialize the PSA random generator.
   7960  *
   7961  *  Note: the mbedtls_threading_psa_rngdata_mutex should be held when calling
   7962  *  this function if mutexes are enabled.
   7963  */
   7964 static void mbedtls_psa_random_init(mbedtls_psa_random_context_t *rng)
   7965 {
   7966 #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
   7967     memset(rng, 0, sizeof(*rng));
   7968 #else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   7969 
   7970     /* Set default configuration if
   7971      * mbedtls_psa_crypto_configure_entropy_sources() hasn't been called. */
   7972     if (rng->entropy_init == NULL) {
   7973         rng->entropy_init = mbedtls_entropy_init;
   7974     }
   7975     if (rng->entropy_free == NULL) {
   7976         rng->entropy_free = mbedtls_entropy_free;
   7977     }
   7978 
   7979     rng->entropy_init(&rng->entropy);
   7980 #if defined(MBEDTLS_PSA_INJECT_ENTROPY) && \
   7981     defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES)
   7982     /* The PSA entropy injection feature depends on using NV seed as an entropy
   7983      * source. Add NV seed as an entropy source for PSA entropy injection. */
   7984     mbedtls_entropy_add_source(&rng->entropy,
   7985                                mbedtls_nv_seed_poll, NULL,
   7986                                MBEDTLS_ENTROPY_BLOCK_SIZE,
   7987                                MBEDTLS_ENTROPY_SOURCE_STRONG);
   7988 #endif
   7989 
   7990     mbedtls_psa_drbg_init(&rng->drbg);
   7991 #endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   7992 }
   7993 
   7994 /** Deinitialize the PSA random generator.
   7995  *
   7996  *  Note: the mbedtls_threading_psa_rngdata_mutex should be held when calling
   7997  *  this function if mutexes are enabled.
   7998  */
   7999 static void mbedtls_psa_random_free(mbedtls_psa_random_context_t *rng)
   8000 {
   8001 #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
   8002     memset(rng, 0, sizeof(*rng));
   8003 #else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   8004     mbedtls_psa_drbg_free(&rng->drbg);
   8005     rng->entropy_free(&rng->entropy);
   8006 #endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   8007 }
   8008 
   8009 /** Seed the PSA random generator.
   8010  */
   8011 static psa_status_t mbedtls_psa_random_seed(mbedtls_psa_random_context_t *rng)
   8012 {
   8013 #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
   8014     /* Do nothing: the external RNG seeds itself. */
   8015     (void) rng;
   8016     return PSA_SUCCESS;
   8017 #else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   8018     const unsigned char drbg_seed[] = "PSA";
   8019     int ret = mbedtls_psa_drbg_seed(&rng->drbg, &rng->entropy,
   8020                                     drbg_seed, sizeof(drbg_seed) - 1);
   8021     return mbedtls_to_psa_error(ret);
   8022 #endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
   8023 }
   8024 
   8025 psa_status_t psa_generate_random(uint8_t *output_external,
   8026                                  size_t output_size)
   8027 {
   8028     psa_status_t status;
   8029 
   8030     LOCAL_OUTPUT_DECLARE(output_external, output);
   8031     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   8032 
   8033     status = psa_generate_random_internal(output, output_size);
   8034 
   8035 #if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS)
   8036 exit:
   8037 #endif
   8038     LOCAL_OUTPUT_FREE(output_external, output);
   8039     return status;
   8040 }
   8041 
   8042 #if defined(MBEDTLS_PSA_INJECT_ENTROPY)
   8043 psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed,
   8044                                         size_t seed_size)
   8045 {
   8046     if (psa_get_initialized()) {
   8047         return PSA_ERROR_NOT_PERMITTED;
   8048     }
   8049 
   8050     if (((seed_size < MBEDTLS_ENTROPY_MIN_PLATFORM) ||
   8051          (seed_size < MBEDTLS_ENTROPY_BLOCK_SIZE)) ||
   8052         (seed_size > MBEDTLS_ENTROPY_MAX_SEED_SIZE)) {
   8053         return PSA_ERROR_INVALID_ARGUMENT;
   8054     }
   8055 
   8056     return mbedtls_psa_storage_inject_entropy(seed, seed_size);
   8057 }
   8058 #endif /* MBEDTLS_PSA_INJECT_ENTROPY */
   8059 
   8060 /** Validate the key type and size for key generation
   8061  *
   8062  * \param  type  The key type
   8063  * \param  bits  The number of bits of the key
   8064  *
   8065  * \retval #PSA_SUCCESS
   8066  *         The key type and size are valid.
   8067  * \retval #PSA_ERROR_INVALID_ARGUMENT
   8068  *         The size in bits of the key is not valid.
   8069  * \retval #PSA_ERROR_NOT_SUPPORTED
   8070  *         The type and/or the size in bits of the key or the combination of
   8071  *         the two is not supported.
   8072  */
   8073 static psa_status_t psa_validate_key_type_and_size_for_key_generation(
   8074     psa_key_type_t type, size_t bits)
   8075 {
   8076     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8077 
   8078     if (key_type_is_raw_bytes(type)) {
   8079         status = psa_validate_unstructured_key_bit_size(type, bits);
   8080         if (status != PSA_SUCCESS) {
   8081             return status;
   8082         }
   8083     } else
   8084 #if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_GENERATE)
   8085     if (PSA_KEY_TYPE_IS_RSA(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) {
   8086         if (bits > PSA_VENDOR_RSA_MAX_KEY_BITS) {
   8087             return PSA_ERROR_NOT_SUPPORTED;
   8088         }
   8089         if (bits < PSA_VENDOR_RSA_GENERATE_MIN_KEY_BITS) {
   8090             return PSA_ERROR_NOT_SUPPORTED;
   8091         }
   8092 
   8093         /* Accept only byte-aligned keys, for the same reasons as
   8094          * in psa_import_rsa_key(). */
   8095         if (bits % 8 != 0) {
   8096             return PSA_ERROR_NOT_SUPPORTED;
   8097         }
   8098     } else
   8099 #endif /* defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_GENERATE) */
   8100 
   8101 #if defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE)
   8102     if (PSA_KEY_TYPE_IS_ECC(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) {
   8103         /* To avoid empty block, return successfully here. */
   8104         return PSA_SUCCESS;
   8105     } else
   8106 #endif /* defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE) */
   8107 
   8108 #if defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_GENERATE)
   8109     if (PSA_KEY_TYPE_IS_DH(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) {
   8110         if (psa_is_dh_key_size_valid(bits) == 0) {
   8111             return PSA_ERROR_NOT_SUPPORTED;
   8112         }
   8113     } else
   8114 #endif /* defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_GENERATE) */
   8115     {
   8116         return PSA_ERROR_NOT_SUPPORTED;
   8117     }
   8118 
   8119     return PSA_SUCCESS;
   8120 }
   8121 
   8122 psa_status_t psa_generate_key_internal(
   8123     const psa_key_attributes_t *attributes,
   8124     const psa_custom_key_parameters_t *custom,
   8125     const uint8_t *custom_data,
   8126     size_t custom_data_length,
   8127     uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length)
   8128 {
   8129     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8130     psa_key_type_t type = attributes->type;
   8131 
   8132     /* Only used for RSA */
   8133     (void) custom;
   8134     (void) custom_data;
   8135     (void) custom_data_length;
   8136 
   8137     if (key_type_is_raw_bytes(type)) {
   8138         status = psa_generate_random_internal(key_buffer, key_buffer_size);
   8139         if (status != PSA_SUCCESS) {
   8140             return status;
   8141         }
   8142 
   8143 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES)
   8144         if (type == PSA_KEY_TYPE_DES) {
   8145             psa_des_set_key_parity(key_buffer, key_buffer_size);
   8146         }
   8147 #endif /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES */
   8148     } else
   8149 
   8150 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_GENERATE)
   8151     if (type == PSA_KEY_TYPE_RSA_KEY_PAIR) {
   8152         return mbedtls_psa_rsa_generate_key(attributes,
   8153                                             custom_data, custom_data_length,
   8154                                             key_buffer,
   8155                                             key_buffer_size,
   8156                                             key_buffer_length);
   8157     } else
   8158 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR_GENERATE) */
   8159 
   8160 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_GENERATE)
   8161     if (PSA_KEY_TYPE_IS_ECC(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) {
   8162         return mbedtls_psa_ecp_generate_key(attributes,
   8163                                             key_buffer,
   8164                                             key_buffer_size,
   8165                                             key_buffer_length);
   8166     } else
   8167 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR_GENERATE) */
   8168 
   8169 #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_GENERATE)
   8170     if (PSA_KEY_TYPE_IS_DH(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) {
   8171         return mbedtls_psa_ffdh_generate_key(attributes,
   8172                                              key_buffer,
   8173                                              key_buffer_size,
   8174                                              key_buffer_length);
   8175     } else
   8176 #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DH_KEY_PAIR_GENERATE) */
   8177     {
   8178         (void) key_buffer_length;
   8179         return PSA_ERROR_NOT_SUPPORTED;
   8180     }
   8181 
   8182     return PSA_SUCCESS;
   8183 }
   8184 
   8185 psa_status_t psa_generate_key_custom(const psa_key_attributes_t *attributes,
   8186                                      const psa_custom_key_parameters_t *custom,
   8187                                      const uint8_t *custom_data,
   8188                                      size_t custom_data_length,
   8189                                      mbedtls_svc_key_id_t *key)
   8190 {
   8191     psa_status_t status;
   8192     psa_key_slot_t *slot = NULL;
   8193     psa_se_drv_table_entry_t *driver = NULL;
   8194     size_t key_buffer_size;
   8195 
   8196     *key = MBEDTLS_SVC_KEY_ID_INIT;
   8197 
   8198     /* Reject any attempt to create a zero-length key so that we don't
   8199      * risk tripping up later, e.g. on a malloc(0) that returns NULL. */
   8200     if (psa_get_key_bits(attributes) == 0) {
   8201         return PSA_ERROR_INVALID_ARGUMENT;
   8202     }
   8203 
   8204     /* Reject any attempt to create a public key. */
   8205     if (PSA_KEY_TYPE_IS_PUBLIC_KEY(attributes->type)) {
   8206         return PSA_ERROR_INVALID_ARGUMENT;
   8207     }
   8208 
   8209 #if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_GENERATE)
   8210     if (attributes->type == PSA_KEY_TYPE_RSA_KEY_PAIR) {
   8211         if (custom->flags != 0) {
   8212             return PSA_ERROR_INVALID_ARGUMENT;
   8213         }
   8214     } else
   8215 #endif
   8216     if (!psa_custom_key_parameters_are_default(custom, custom_data_length)) {
   8217         return PSA_ERROR_INVALID_ARGUMENT;
   8218     }
   8219 
   8220     status = psa_start_key_creation(PSA_KEY_CREATION_GENERATE, attributes,
   8221                                     &slot, &driver);
   8222     if (status != PSA_SUCCESS) {
   8223         goto exit;
   8224     }
   8225 
   8226     /* In the case of a transparent key or an opaque key stored in local
   8227      * storage ( thus not in the case of generating a key in a secure element
   8228      * with storage ( MBEDTLS_PSA_CRYPTO_SE_C ) ),we have to allocate a
   8229      * buffer to hold the generated key material. */
   8230     if (slot->key.bytes == 0) {
   8231         if (PSA_KEY_LIFETIME_GET_LOCATION(attributes->lifetime) ==
   8232             PSA_KEY_LOCATION_LOCAL_STORAGE) {
   8233             status = psa_validate_key_type_and_size_for_key_generation(
   8234                 attributes->type, attributes->bits);
   8235             if (status != PSA_SUCCESS) {
   8236                 goto exit;
   8237             }
   8238 
   8239             key_buffer_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
   8240                 attributes->type,
   8241                 attributes->bits);
   8242         } else {
   8243             status = psa_driver_wrapper_get_key_buffer_size(
   8244                 attributes, &key_buffer_size);
   8245             if (status != PSA_SUCCESS) {
   8246                 goto exit;
   8247             }
   8248         }
   8249 
   8250         status = psa_allocate_buffer_to_slot(slot, key_buffer_size);
   8251         if (status != PSA_SUCCESS) {
   8252             goto exit;
   8253         }
   8254     }
   8255 
   8256     status = psa_driver_wrapper_generate_key(attributes,
   8257                                              custom,
   8258                                              custom_data, custom_data_length,
   8259                                              slot->key.data, slot->key.bytes,
   8260                                              &slot->key.bytes);
   8261     if (status != PSA_SUCCESS) {
   8262         psa_remove_key_data_from_memory(slot);
   8263     }
   8264 
   8265 exit:
   8266     if (status == PSA_SUCCESS) {
   8267         status = psa_finish_key_creation(slot, driver, key);
   8268     }
   8269     if (status != PSA_SUCCESS) {
   8270         psa_fail_key_creation(slot, driver);
   8271     }
   8272 
   8273     return status;
   8274 }
   8275 
   8276 psa_status_t psa_generate_key_ext(const psa_key_attributes_t *attributes,
   8277                                   const psa_key_production_parameters_t *params,
   8278                                   size_t params_data_length,
   8279                                   mbedtls_svc_key_id_t *key)
   8280 {
   8281     return psa_generate_key_custom(
   8282         attributes,
   8283         (const psa_custom_key_parameters_t *) params,
   8284         params->data, params_data_length,
   8285         key);
   8286 }
   8287 
   8288 psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
   8289                               mbedtls_svc_key_id_t *key)
   8290 {
   8291     return psa_generate_key_custom(attributes,
   8292                                    &default_custom_production,
   8293                                    NULL, 0,
   8294                                    key);
   8295 }
   8296 
   8297 
   8298 
   8299 /****************************************************************/
   8300 /* Module setup */
   8301 /****************************************************************/
   8302 
   8303 #if !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
   8304 psa_status_t mbedtls_psa_crypto_configure_entropy_sources(
   8305     void (* entropy_init)(mbedtls_entropy_context *ctx),
   8306     void (* entropy_free)(mbedtls_entropy_context *ctx))
   8307 {
   8308     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8309 
   8310 #if defined(MBEDTLS_THREADING_C)
   8311     mbedtls_mutex_lock(&mbedtls_threading_psa_rngdata_mutex);
   8312 #endif /* defined(MBEDTLS_THREADING_C) */
   8313 
   8314     if (global_data.rng_state != RNG_NOT_INITIALIZED) {
   8315         status = PSA_ERROR_BAD_STATE;
   8316     } else {
   8317         global_data.rng.entropy_init = entropy_init;
   8318         global_data.rng.entropy_free = entropy_free;
   8319         status = PSA_SUCCESS;
   8320     }
   8321 
   8322 #if defined(MBEDTLS_THREADING_C)
   8323     mbedtls_mutex_unlock(&mbedtls_threading_psa_rngdata_mutex);
   8324 #endif /* defined(MBEDTLS_THREADING_C) */
   8325 
   8326     return status;
   8327 }
   8328 #endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */
   8329 
   8330 void mbedtls_psa_crypto_free(void)
   8331 {
   8332 
   8333 #if defined(MBEDTLS_THREADING_C)
   8334     mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex);
   8335 #endif /* defined(MBEDTLS_THREADING_C) */
   8336 
   8337     /* Nothing to do to free transaction. */
   8338     if (global_data.initialized & PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED) {
   8339         global_data.initialized &= ~PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED;
   8340     }
   8341 
   8342     if (global_data.initialized & PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS_INITIALIZED) {
   8343         psa_wipe_all_key_slots();
   8344         global_data.initialized &= ~PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS_INITIALIZED;
   8345     }
   8346 
   8347 #if defined(MBEDTLS_THREADING_C)
   8348     mbedtls_mutex_unlock(&mbedtls_threading_psa_globaldata_mutex);
   8349 #endif /* defined(MBEDTLS_THREADING_C) */
   8350 
   8351 #if defined(MBEDTLS_THREADING_C)
   8352     mbedtls_mutex_lock(&mbedtls_threading_psa_rngdata_mutex);
   8353 #endif /* defined(MBEDTLS_THREADING_C) */
   8354 
   8355     if (global_data.rng_state != RNG_NOT_INITIALIZED) {
   8356         mbedtls_psa_random_free(&global_data.rng);
   8357     }
   8358     global_data.rng_state = RNG_NOT_INITIALIZED;
   8359     mbedtls_platform_zeroize(&global_data.rng, sizeof(global_data.rng));
   8360 
   8361 #if defined(MBEDTLS_THREADING_C)
   8362     mbedtls_mutex_unlock(&mbedtls_threading_psa_rngdata_mutex);
   8363 #endif /* defined(MBEDTLS_THREADING_C) */
   8364 
   8365 #if defined(MBEDTLS_THREADING_C)
   8366     mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex);
   8367 #endif /* defined(MBEDTLS_THREADING_C) */
   8368 
   8369     /* Terminate drivers */
   8370     if (global_data.initialized & PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED) {
   8371         psa_driver_wrapper_free();
   8372         global_data.initialized &= ~PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED;
   8373     }
   8374 
   8375 #if defined(MBEDTLS_THREADING_C)
   8376     mbedtls_mutex_unlock(&mbedtls_threading_psa_globaldata_mutex);
   8377 #endif /* defined(MBEDTLS_THREADING_C) */
   8378 
   8379 }
   8380 
   8381 #if defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS)
   8382 /** Recover a transaction that was interrupted by a power failure.
   8383  *
   8384  * This function is called during initialization, before psa_crypto_init()
   8385  * returns. If this function returns a failure status, the initialization
   8386  * fails.
   8387  */
   8388 static psa_status_t psa_crypto_recover_transaction(
   8389     const psa_crypto_transaction_t *transaction)
   8390 {
   8391     switch (transaction->unknown.type) {
   8392         case PSA_CRYPTO_TRANSACTION_CREATE_KEY:
   8393         case PSA_CRYPTO_TRANSACTION_DESTROY_KEY:
   8394         /* TODO - fall through to the failure case until this
   8395          * is implemented.
   8396          * https://github.com/ARMmbed/mbed-crypto/issues/218
   8397          */
   8398         default:
   8399             /* We found an unsupported transaction in the storage.
   8400              * We don't know what state the storage is in. Give up. */
   8401             return PSA_ERROR_DATA_INVALID;
   8402     }
   8403 }
   8404 #endif /* PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS */
   8405 
   8406 static psa_status_t mbedtls_psa_crypto_init_subsystem(mbedtls_psa_crypto_subsystem subsystem)
   8407 {
   8408     psa_status_t status = PSA_SUCCESS;
   8409     uint8_t driver_wrappers_initialized = 0;
   8410 
   8411     switch (subsystem) {
   8412         case PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS:
   8413 
   8414 #if defined(MBEDTLS_THREADING_C)
   8415             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex));
   8416 #endif /* defined(MBEDTLS_THREADING_C) */
   8417 
   8418             if (!(global_data.initialized & PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED)) {
   8419                 /* Init drivers */
   8420                 status = psa_driver_wrapper_init();
   8421 
   8422                 /* Drivers need shutdown regardless of startup errors. */
   8423                 global_data.initialized |= PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED;
   8424 
   8425 
   8426             }
   8427 #if defined(MBEDTLS_THREADING_C)
   8428             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_unlock(
   8429                                             &mbedtls_threading_psa_globaldata_mutex));
   8430 #endif /* defined(MBEDTLS_THREADING_C) */
   8431 
   8432             break;
   8433 
   8434         case PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS:
   8435 
   8436 #if defined(MBEDTLS_THREADING_C)
   8437             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex));
   8438 #endif /* defined(MBEDTLS_THREADING_C) */
   8439 
   8440             if (!(global_data.initialized & PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS_INITIALIZED)) {
   8441                 status = psa_initialize_key_slots();
   8442 
   8443                 /* Need to wipe keys even if initialization fails. */
   8444                 global_data.initialized |= PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS_INITIALIZED;
   8445 
   8446             }
   8447 #if defined(MBEDTLS_THREADING_C)
   8448             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_unlock(
   8449                                             &mbedtls_threading_psa_globaldata_mutex));
   8450 #endif /* defined(MBEDTLS_THREADING_C) */
   8451 
   8452             break;
   8453 
   8454         case PSA_CRYPTO_SUBSYSTEM_RNG:
   8455 
   8456 #if defined(MBEDTLS_THREADING_C)
   8457             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex));
   8458 #endif /* defined(MBEDTLS_THREADING_C) */
   8459 
   8460             driver_wrappers_initialized =
   8461                 (global_data.initialized & PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS_INITIALIZED);
   8462 
   8463 #if defined(MBEDTLS_THREADING_C)
   8464             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_unlock(
   8465                                             &mbedtls_threading_psa_globaldata_mutex));
   8466 #endif /* defined(MBEDTLS_THREADING_C) */
   8467 
   8468             /* Need to use separate mutex here, as initialisation can require
   8469              * testing of init flags, which requires locking the global data
   8470              * mutex. */
   8471 #if defined(MBEDTLS_THREADING_C)
   8472             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_lock(&mbedtls_threading_psa_rngdata_mutex));
   8473 #endif /* defined(MBEDTLS_THREADING_C) */
   8474 
   8475             /* Initialize and seed the random generator. */
   8476             if (global_data.rng_state == RNG_NOT_INITIALIZED && driver_wrappers_initialized) {
   8477                 mbedtls_psa_random_init(&global_data.rng);
   8478                 global_data.rng_state = RNG_INITIALIZED;
   8479 
   8480                 status = mbedtls_psa_random_seed(&global_data.rng);
   8481                 if (status == PSA_SUCCESS) {
   8482                     global_data.rng_state = RNG_SEEDED;
   8483                 }
   8484             }
   8485 
   8486 #if defined(MBEDTLS_THREADING_C)
   8487             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_unlock(
   8488                                             &mbedtls_threading_psa_rngdata_mutex));
   8489 #endif /* defined(MBEDTLS_THREADING_C) */
   8490 
   8491             break;
   8492 
   8493         case PSA_CRYPTO_SUBSYSTEM_TRANSACTION:
   8494 
   8495 #if defined(MBEDTLS_THREADING_C)
   8496             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_lock(&mbedtls_threading_psa_globaldata_mutex));
   8497 #endif /* defined(MBEDTLS_THREADING_C) */
   8498 
   8499             if (!(global_data.initialized & PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED)) {
   8500 #if defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS)
   8501                 status = psa_crypto_load_transaction();
   8502                 if (status == PSA_SUCCESS) {
   8503                     status = psa_crypto_recover_transaction(&psa_crypto_transaction);
   8504                     if (status == PSA_SUCCESS) {
   8505                         global_data.initialized |= PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED;
   8506                     }
   8507                     status = psa_crypto_stop_transaction();
   8508                 } else if (status == PSA_ERROR_DOES_NOT_EXIST) {
   8509                     /* There's no transaction to complete. It's all good. */
   8510                     global_data.initialized |= PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED;
   8511                     status = PSA_SUCCESS;
   8512                 }
   8513 #else /* defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS) */
   8514                 global_data.initialized |= PSA_CRYPTO_SUBSYSTEM_TRANSACTION_INITIALIZED;
   8515                 status = PSA_SUCCESS;
   8516 #endif /* defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS) */
   8517             }
   8518 
   8519 #if defined(MBEDTLS_THREADING_C)
   8520             PSA_THREADING_CHK_GOTO_EXIT(mbedtls_mutex_unlock(
   8521                                             &mbedtls_threading_psa_globaldata_mutex));
   8522 #endif /* defined(MBEDTLS_THREADING_C) */
   8523 
   8524             break;
   8525 
   8526         default:
   8527             status = PSA_ERROR_CORRUPTION_DETECTED;
   8528     }
   8529 
   8530     /* Exit label only required when using threading macros. */
   8531 #if defined(MBEDTLS_THREADING_C)
   8532 exit:
   8533 #endif /* defined(MBEDTLS_THREADING_C) */
   8534 
   8535     return status;
   8536 }
   8537 
   8538 psa_status_t psa_crypto_init(void)
   8539 {
   8540     psa_status_t status;
   8541 
   8542     /* Double initialization is explicitly allowed. Early out if everything is
   8543      * done. */
   8544     if (psa_get_initialized()) {
   8545         return PSA_SUCCESS;
   8546     }
   8547 
   8548     status = mbedtls_psa_crypto_init_subsystem(PSA_CRYPTO_SUBSYSTEM_DRIVER_WRAPPERS);
   8549     if (status != PSA_SUCCESS) {
   8550         goto exit;
   8551     }
   8552 
   8553     status = mbedtls_psa_crypto_init_subsystem(PSA_CRYPTO_SUBSYSTEM_KEY_SLOTS);
   8554     if (status != PSA_SUCCESS) {
   8555         goto exit;
   8556     }
   8557 
   8558     status = mbedtls_psa_crypto_init_subsystem(PSA_CRYPTO_SUBSYSTEM_RNG);
   8559     if (status != PSA_SUCCESS) {
   8560         goto exit;
   8561     }
   8562 
   8563     status = mbedtls_psa_crypto_init_subsystem(PSA_CRYPTO_SUBSYSTEM_TRANSACTION);
   8564 
   8565 exit:
   8566 
   8567     if (status != PSA_SUCCESS) {
   8568         mbedtls_psa_crypto_free();
   8569     }
   8570 
   8571     return status;
   8572 }
   8573 
   8574 
   8575 
   8576 /****************************************************************/
   8577 /* PAKE */
   8578 /****************************************************************/
   8579 
   8580 #if defined(PSA_WANT_ALG_SOME_PAKE)
   8581 psa_status_t psa_crypto_driver_pake_get_password_len(
   8582     const psa_crypto_driver_pake_inputs_t *inputs,
   8583     size_t *password_len)
   8584 {
   8585     if (inputs->password_len == 0) {
   8586         return PSA_ERROR_BAD_STATE;
   8587     }
   8588 
   8589     *password_len = inputs->password_len;
   8590 
   8591     return PSA_SUCCESS;
   8592 }
   8593 
   8594 psa_status_t psa_crypto_driver_pake_get_password(
   8595     const psa_crypto_driver_pake_inputs_t *inputs,
   8596     uint8_t *buffer, size_t buffer_size, size_t *buffer_length)
   8597 {
   8598     if (inputs->password_len == 0) {
   8599         return PSA_ERROR_BAD_STATE;
   8600     }
   8601 
   8602     if (buffer_size < inputs->password_len) {
   8603         return PSA_ERROR_BUFFER_TOO_SMALL;
   8604     }
   8605 
   8606     memcpy(buffer, inputs->password, inputs->password_len);
   8607     *buffer_length = inputs->password_len;
   8608 
   8609     return PSA_SUCCESS;
   8610 }
   8611 
   8612 psa_status_t psa_crypto_driver_pake_get_user_len(
   8613     const psa_crypto_driver_pake_inputs_t *inputs,
   8614     size_t *user_len)
   8615 {
   8616     if (inputs->user_len == 0) {
   8617         return PSA_ERROR_BAD_STATE;
   8618     }
   8619 
   8620     *user_len = inputs->user_len;
   8621 
   8622     return PSA_SUCCESS;
   8623 }
   8624 
   8625 psa_status_t psa_crypto_driver_pake_get_user(
   8626     const psa_crypto_driver_pake_inputs_t *inputs,
   8627     uint8_t *user_id, size_t user_id_size, size_t *user_id_len)
   8628 {
   8629     if (inputs->user_len == 0) {
   8630         return PSA_ERROR_BAD_STATE;
   8631     }
   8632 
   8633     if (user_id_size < inputs->user_len) {
   8634         return PSA_ERROR_BUFFER_TOO_SMALL;
   8635     }
   8636 
   8637     memcpy(user_id, inputs->user, inputs->user_len);
   8638     *user_id_len = inputs->user_len;
   8639 
   8640     return PSA_SUCCESS;
   8641 }
   8642 
   8643 psa_status_t psa_crypto_driver_pake_get_peer_len(
   8644     const psa_crypto_driver_pake_inputs_t *inputs,
   8645     size_t *peer_len)
   8646 {
   8647     if (inputs->peer_len == 0) {
   8648         return PSA_ERROR_BAD_STATE;
   8649     }
   8650 
   8651     *peer_len = inputs->peer_len;
   8652 
   8653     return PSA_SUCCESS;
   8654 }
   8655 
   8656 psa_status_t psa_crypto_driver_pake_get_peer(
   8657     const psa_crypto_driver_pake_inputs_t *inputs,
   8658     uint8_t *peer_id, size_t peer_id_size, size_t *peer_id_length)
   8659 {
   8660     if (inputs->peer_len == 0) {
   8661         return PSA_ERROR_BAD_STATE;
   8662     }
   8663 
   8664     if (peer_id_size < inputs->peer_len) {
   8665         return PSA_ERROR_BUFFER_TOO_SMALL;
   8666     }
   8667 
   8668     memcpy(peer_id, inputs->peer, inputs->peer_len);
   8669     *peer_id_length = inputs->peer_len;
   8670 
   8671     return PSA_SUCCESS;
   8672 }
   8673 
   8674 psa_status_t psa_crypto_driver_pake_get_cipher_suite(
   8675     const psa_crypto_driver_pake_inputs_t *inputs,
   8676     psa_pake_cipher_suite_t *cipher_suite)
   8677 {
   8678     if (inputs->cipher_suite.algorithm == PSA_ALG_NONE) {
   8679         return PSA_ERROR_BAD_STATE;
   8680     }
   8681 
   8682     *cipher_suite = inputs->cipher_suite;
   8683 
   8684     return PSA_SUCCESS;
   8685 }
   8686 
   8687 psa_status_t psa_pake_setup(
   8688     psa_pake_operation_t *operation,
   8689     const psa_pake_cipher_suite_t *cipher_suite)
   8690 {
   8691     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8692 
   8693     if (operation->stage != PSA_PAKE_OPERATION_STAGE_SETUP) {
   8694         status = PSA_ERROR_BAD_STATE;
   8695         goto exit;
   8696     }
   8697 
   8698     if (PSA_ALG_IS_PAKE(cipher_suite->algorithm) == 0 ||
   8699         PSA_ALG_IS_HASH(cipher_suite->hash) == 0) {
   8700         status = PSA_ERROR_INVALID_ARGUMENT;
   8701         goto exit;
   8702     }
   8703 
   8704     /* Make sure the variable-purpose part of the operation is zeroed.
   8705      * Initializing the operation does not necessarily take care of it,
   8706      * since the context is a union and initializing a union does not
   8707      * necessarily initialize all of its members. */
   8708     memset(&operation->data, 0, sizeof(operation->data));
   8709 
   8710     operation->alg = cipher_suite->algorithm;
   8711     operation->primitive = PSA_PAKE_PRIMITIVE(cipher_suite->type,
   8712                                               cipher_suite->family, cipher_suite->bits);
   8713     operation->data.inputs.cipher_suite = *cipher_suite;
   8714 
   8715 #if defined(PSA_WANT_ALG_JPAKE)
   8716     if (operation->alg == PSA_ALG_JPAKE) {
   8717         psa_jpake_computation_stage_t *computation_stage =
   8718             &operation->computation_stage.jpake;
   8719 
   8720         memset(computation_stage, 0, sizeof(*computation_stage));
   8721         computation_stage->step = PSA_PAKE_STEP_KEY_SHARE;
   8722     } else
   8723 #endif /* PSA_WANT_ALG_JPAKE */
   8724     {
   8725         status = PSA_ERROR_NOT_SUPPORTED;
   8726         goto exit;
   8727     }
   8728 
   8729     operation->stage = PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS;
   8730 
   8731     return PSA_SUCCESS;
   8732 exit:
   8733     psa_pake_abort(operation);
   8734     return status;
   8735 }
   8736 
   8737 psa_status_t psa_pake_set_password_key(
   8738     psa_pake_operation_t *operation,
   8739     mbedtls_svc_key_id_t password)
   8740 {
   8741     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8742     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
   8743     psa_key_slot_t *slot = NULL;
   8744     psa_key_type_t type;
   8745 
   8746     if (operation->stage != PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS) {
   8747         status = PSA_ERROR_BAD_STATE;
   8748         goto exit;
   8749     }
   8750 
   8751     status = psa_get_and_lock_key_slot_with_policy(password, &slot,
   8752                                                    PSA_KEY_USAGE_DERIVE,
   8753                                                    operation->alg);
   8754     if (status != PSA_SUCCESS) {
   8755         goto exit;
   8756     }
   8757 
   8758     type = psa_get_key_type(&slot->attr);
   8759 
   8760     if (type != PSA_KEY_TYPE_PASSWORD &&
   8761         type != PSA_KEY_TYPE_PASSWORD_HASH) {
   8762         status = PSA_ERROR_INVALID_ARGUMENT;
   8763         goto exit;
   8764     }
   8765 
   8766     operation->data.inputs.password = mbedtls_calloc(1, slot->key.bytes);
   8767     if (operation->data.inputs.password == NULL) {
   8768         status = PSA_ERROR_INSUFFICIENT_MEMORY;
   8769         goto exit;
   8770     }
   8771 
   8772     memcpy(operation->data.inputs.password, slot->key.data, slot->key.bytes);
   8773     operation->data.inputs.password_len = slot->key.bytes;
   8774     operation->data.inputs.attributes = slot->attr;
   8775 
   8776 exit:
   8777     if (status != PSA_SUCCESS) {
   8778         psa_pake_abort(operation);
   8779     }
   8780     unlock_status = psa_unregister_read_under_mutex(slot);
   8781     return (status == PSA_SUCCESS) ? unlock_status : status;
   8782 }
   8783 
   8784 psa_status_t psa_pake_set_user(
   8785     psa_pake_operation_t *operation,
   8786     const uint8_t *user_id_external,
   8787     size_t user_id_len)
   8788 {
   8789     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8790     LOCAL_INPUT_DECLARE(user_id_external, user_id);
   8791 
   8792     if (operation->stage != PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS) {
   8793         status = PSA_ERROR_BAD_STATE;
   8794         goto exit;
   8795     }
   8796 
   8797     if (user_id_len == 0) {
   8798         status = PSA_ERROR_INVALID_ARGUMENT;
   8799         goto exit;
   8800     }
   8801 
   8802     if (operation->data.inputs.user_len != 0) {
   8803         status = PSA_ERROR_BAD_STATE;
   8804         goto exit;
   8805     }
   8806 
   8807     operation->data.inputs.user = mbedtls_calloc(1, user_id_len);
   8808     if (operation->data.inputs.user == NULL) {
   8809         status = PSA_ERROR_INSUFFICIENT_MEMORY;
   8810         goto exit;
   8811     }
   8812 
   8813     LOCAL_INPUT_ALLOC(user_id_external, user_id_len, user_id);
   8814 
   8815     memcpy(operation->data.inputs.user, user_id, user_id_len);
   8816     operation->data.inputs.user_len = user_id_len;
   8817 
   8818     status = PSA_SUCCESS;
   8819 
   8820 exit:
   8821     LOCAL_INPUT_FREE(user_id_external, user_id);
   8822     if (status != PSA_SUCCESS) {
   8823         psa_pake_abort(operation);
   8824     }
   8825     return status;
   8826 }
   8827 
   8828 psa_status_t psa_pake_set_peer(
   8829     psa_pake_operation_t *operation,
   8830     const uint8_t *peer_id_external,
   8831     size_t peer_id_len)
   8832 {
   8833     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8834     LOCAL_INPUT_DECLARE(peer_id_external, peer_id);
   8835 
   8836     if (operation->stage != PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS) {
   8837         status = PSA_ERROR_BAD_STATE;
   8838         goto exit;
   8839     }
   8840 
   8841     if (peer_id_len == 0) {
   8842         status = PSA_ERROR_INVALID_ARGUMENT;
   8843         goto exit;
   8844     }
   8845 
   8846     if (operation->data.inputs.peer_len != 0) {
   8847         status = PSA_ERROR_BAD_STATE;
   8848         goto exit;
   8849     }
   8850 
   8851     operation->data.inputs.peer = mbedtls_calloc(1, peer_id_len);
   8852     if (operation->data.inputs.peer == NULL) {
   8853         status = PSA_ERROR_INSUFFICIENT_MEMORY;
   8854         goto exit;
   8855     }
   8856 
   8857     LOCAL_INPUT_ALLOC(peer_id_external, peer_id_len, peer_id);
   8858 
   8859     memcpy(operation->data.inputs.peer, peer_id, peer_id_len);
   8860     operation->data.inputs.peer_len = peer_id_len;
   8861 
   8862     status = PSA_SUCCESS;
   8863 
   8864 exit:
   8865     LOCAL_INPUT_FREE(peer_id_external, peer_id);
   8866     if (status != PSA_SUCCESS) {
   8867         psa_pake_abort(operation);
   8868     }
   8869     return status;
   8870 }
   8871 
   8872 psa_status_t psa_pake_set_role(
   8873     psa_pake_operation_t *operation,
   8874     psa_pake_role_t role)
   8875 {
   8876     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8877 
   8878     if (operation->stage != PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS) {
   8879         status = PSA_ERROR_BAD_STATE;
   8880         goto exit;
   8881     }
   8882 
   8883     switch (operation->alg) {
   8884 #if defined(PSA_WANT_ALG_JPAKE)
   8885         case PSA_ALG_JPAKE:
   8886             if (role == PSA_PAKE_ROLE_NONE) {
   8887                 return PSA_SUCCESS;
   8888             }
   8889             status = PSA_ERROR_INVALID_ARGUMENT;
   8890             break;
   8891 #endif
   8892         default:
   8893             (void) role;
   8894             status = PSA_ERROR_NOT_SUPPORTED;
   8895             goto exit;
   8896     }
   8897 exit:
   8898     psa_pake_abort(operation);
   8899     return status;
   8900 }
   8901 
   8902 /* Auxiliary function to convert core computation stage to single driver step. */
   8903 #if defined(PSA_WANT_ALG_JPAKE)
   8904 static psa_crypto_driver_pake_step_t convert_jpake_computation_stage_to_driver_step(
   8905     psa_jpake_computation_stage_t *stage)
   8906 {
   8907     psa_crypto_driver_pake_step_t key_share_step;
   8908     if (stage->round == PSA_JPAKE_FIRST) {
   8909         int is_x1;
   8910 
   8911         if (stage->io_mode == PSA_JPAKE_OUTPUT) {
   8912             is_x1 = (stage->outputs < 1);
   8913         } else {
   8914             is_x1 = (stage->inputs < 1);
   8915         }
   8916 
   8917         key_share_step = is_x1 ?
   8918                          PSA_JPAKE_X1_STEP_KEY_SHARE :
   8919                          PSA_JPAKE_X2_STEP_KEY_SHARE;
   8920     } else if (stage->round == PSA_JPAKE_SECOND) {
   8921         key_share_step = (stage->io_mode == PSA_JPAKE_OUTPUT) ?
   8922                          PSA_JPAKE_X2S_STEP_KEY_SHARE :
   8923                          PSA_JPAKE_X4S_STEP_KEY_SHARE;
   8924     } else {
   8925         return PSA_JPAKE_STEP_INVALID;
   8926     }
   8927     return (psa_crypto_driver_pake_step_t) (key_share_step + stage->step - PSA_PAKE_STEP_KEY_SHARE);
   8928 }
   8929 #endif /* PSA_WANT_ALG_JPAKE */
   8930 
   8931 static psa_status_t psa_pake_complete_inputs(
   8932     psa_pake_operation_t *operation)
   8933 {
   8934     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   8935     /* Create copy of the inputs on stack as inputs share memory
   8936        with the driver context which will be setup by the driver. */
   8937     psa_crypto_driver_pake_inputs_t inputs = operation->data.inputs;
   8938 
   8939     if (inputs.password_len == 0) {
   8940         return PSA_ERROR_BAD_STATE;
   8941     }
   8942 
   8943     if (operation->alg == PSA_ALG_JPAKE) {
   8944         if (inputs.user_len == 0 || inputs.peer_len == 0) {
   8945             return PSA_ERROR_BAD_STATE;
   8946         }
   8947     }
   8948 
   8949     /* Clear driver context */
   8950     mbedtls_platform_zeroize(&operation->data, sizeof(operation->data));
   8951 
   8952     status = psa_driver_wrapper_pake_setup(operation, &inputs);
   8953 
   8954     /* Driver is responsible for creating its own copy of the password. */
   8955     mbedtls_zeroize_and_free(inputs.password, inputs.password_len);
   8956 
   8957     /* User and peer are translated to role. */
   8958     mbedtls_free(inputs.user);
   8959     mbedtls_free(inputs.peer);
   8960 
   8961     if (status == PSA_SUCCESS) {
   8962 #if defined(PSA_WANT_ALG_JPAKE)
   8963         if (operation->alg == PSA_ALG_JPAKE) {
   8964             operation->stage = PSA_PAKE_OPERATION_STAGE_COMPUTATION;
   8965         } else
   8966 #endif /* PSA_WANT_ALG_JPAKE */
   8967         {
   8968             status = PSA_ERROR_NOT_SUPPORTED;
   8969         }
   8970     }
   8971     return status;
   8972 }
   8973 
   8974 #if defined(PSA_WANT_ALG_JPAKE)
   8975 static psa_status_t psa_jpake_prologue(
   8976     psa_pake_operation_t *operation,
   8977     psa_pake_step_t step,
   8978     psa_jpake_io_mode_t io_mode)
   8979 {
   8980     if (step != PSA_PAKE_STEP_KEY_SHARE &&
   8981         step != PSA_PAKE_STEP_ZK_PUBLIC &&
   8982         step != PSA_PAKE_STEP_ZK_PROOF) {
   8983         return PSA_ERROR_INVALID_ARGUMENT;
   8984     }
   8985 
   8986     psa_jpake_computation_stage_t *computation_stage =
   8987         &operation->computation_stage.jpake;
   8988 
   8989     if (computation_stage->round != PSA_JPAKE_FIRST &&
   8990         computation_stage->round != PSA_JPAKE_SECOND) {
   8991         return PSA_ERROR_BAD_STATE;
   8992     }
   8993 
   8994     /* Check that the step we are given is the one we were expecting */
   8995     if (step != computation_stage->step) {
   8996         return PSA_ERROR_BAD_STATE;
   8997     }
   8998 
   8999     if (step == PSA_PAKE_STEP_KEY_SHARE &&
   9000         computation_stage->inputs == 0 &&
   9001         computation_stage->outputs == 0) {
   9002         /* Start of the round, so function decides whether we are inputting
   9003          * or outputting */
   9004         computation_stage->io_mode = io_mode;
   9005     } else if (computation_stage->io_mode != io_mode) {
   9006         /* Middle of the round so the mode we are in must match the function
   9007          * called by the user */
   9008         return PSA_ERROR_BAD_STATE;
   9009     }
   9010 
   9011     return PSA_SUCCESS;
   9012 }
   9013 
   9014 static psa_status_t psa_jpake_epilogue(
   9015     psa_pake_operation_t *operation,
   9016     psa_jpake_io_mode_t io_mode)
   9017 {
   9018     psa_jpake_computation_stage_t *stage =
   9019         &operation->computation_stage.jpake;
   9020 
   9021     if (stage->step == PSA_PAKE_STEP_ZK_PROOF) {
   9022         /* End of an input/output */
   9023         if (io_mode == PSA_JPAKE_INPUT) {
   9024             stage->inputs++;
   9025             if (stage->inputs == PSA_JPAKE_EXPECTED_INPUTS(stage->round)) {
   9026                 stage->io_mode = PSA_JPAKE_OUTPUT;
   9027             }
   9028         }
   9029         if (io_mode == PSA_JPAKE_OUTPUT) {
   9030             stage->outputs++;
   9031             if (stage->outputs == PSA_JPAKE_EXPECTED_OUTPUTS(stage->round)) {
   9032                 stage->io_mode = PSA_JPAKE_INPUT;
   9033             }
   9034         }
   9035         if (stage->inputs == PSA_JPAKE_EXPECTED_INPUTS(stage->round) &&
   9036             stage->outputs == PSA_JPAKE_EXPECTED_OUTPUTS(stage->round)) {
   9037             /* End of a round, move to the next round */
   9038             stage->inputs = 0;
   9039             stage->outputs = 0;
   9040             stage->round++;
   9041         }
   9042         stage->step = PSA_PAKE_STEP_KEY_SHARE;
   9043     } else {
   9044         stage->step++;
   9045     }
   9046     return PSA_SUCCESS;
   9047 }
   9048 
   9049 #endif /* PSA_WANT_ALG_JPAKE */
   9050 
   9051 psa_status_t psa_pake_output(
   9052     psa_pake_operation_t *operation,
   9053     psa_pake_step_t step,
   9054     uint8_t *output_external,
   9055     size_t output_size,
   9056     size_t *output_length)
   9057 {
   9058     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   9059     psa_crypto_driver_pake_step_t driver_step = PSA_JPAKE_STEP_INVALID;
   9060     LOCAL_OUTPUT_DECLARE(output_external, output);
   9061     *output_length = 0;
   9062 
   9063     if (operation->stage == PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS) {
   9064         status = psa_pake_complete_inputs(operation);
   9065         if (status != PSA_SUCCESS) {
   9066             goto exit;
   9067         }
   9068     }
   9069 
   9070     if (operation->stage != PSA_PAKE_OPERATION_STAGE_COMPUTATION) {
   9071         status = PSA_ERROR_BAD_STATE;
   9072         goto exit;
   9073     }
   9074 
   9075     if (output_size == 0) {
   9076         status = PSA_ERROR_INVALID_ARGUMENT;
   9077         goto exit;
   9078     }
   9079 
   9080     switch (operation->alg) {
   9081 #if defined(PSA_WANT_ALG_JPAKE)
   9082         case PSA_ALG_JPAKE:
   9083             status = psa_jpake_prologue(operation, step, PSA_JPAKE_OUTPUT);
   9084             if (status != PSA_SUCCESS) {
   9085                 goto exit;
   9086             }
   9087             driver_step = convert_jpake_computation_stage_to_driver_step(
   9088                 &operation->computation_stage.jpake);
   9089             break;
   9090 #endif /* PSA_WANT_ALG_JPAKE */
   9091         default:
   9092             (void) step;
   9093             status = PSA_ERROR_NOT_SUPPORTED;
   9094             goto exit;
   9095     }
   9096 
   9097     LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
   9098 
   9099     status = psa_driver_wrapper_pake_output(operation, driver_step,
   9100                                             output, output_size, output_length);
   9101 
   9102     if (status != PSA_SUCCESS) {
   9103         goto exit;
   9104     }
   9105 
   9106     switch (operation->alg) {
   9107 #if defined(PSA_WANT_ALG_JPAKE)
   9108         case PSA_ALG_JPAKE:
   9109             status = psa_jpake_epilogue(operation, PSA_JPAKE_OUTPUT);
   9110             if (status != PSA_SUCCESS) {
   9111                 goto exit;
   9112             }
   9113             break;
   9114 #endif /* PSA_WANT_ALG_JPAKE */
   9115         default:
   9116             status = PSA_ERROR_NOT_SUPPORTED;
   9117             goto exit;
   9118     }
   9119 
   9120 exit:
   9121     LOCAL_OUTPUT_FREE(output_external, output);
   9122     if (status != PSA_SUCCESS) {
   9123         psa_pake_abort(operation);
   9124     }
   9125     return status;
   9126 }
   9127 
   9128 psa_status_t psa_pake_input(
   9129     psa_pake_operation_t *operation,
   9130     psa_pake_step_t step,
   9131     const uint8_t *input_external,
   9132     size_t input_length)
   9133 {
   9134     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   9135     psa_crypto_driver_pake_step_t driver_step = PSA_JPAKE_STEP_INVALID;
   9136     const size_t max_input_length = (size_t) PSA_PAKE_INPUT_SIZE(operation->alg,
   9137                                                                  operation->primitive,
   9138                                                                  step);
   9139     LOCAL_INPUT_DECLARE(input_external, input);
   9140 
   9141     if (operation->stage == PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS) {
   9142         status = psa_pake_complete_inputs(operation);
   9143         if (status != PSA_SUCCESS) {
   9144             goto exit;
   9145         }
   9146     }
   9147 
   9148     if (operation->stage != PSA_PAKE_OPERATION_STAGE_COMPUTATION) {
   9149         status =  PSA_ERROR_BAD_STATE;
   9150         goto exit;
   9151     }
   9152 
   9153     if (input_length == 0 || input_length > max_input_length) {
   9154         status = PSA_ERROR_INVALID_ARGUMENT;
   9155         goto exit;
   9156     }
   9157 
   9158     switch (operation->alg) {
   9159 #if defined(PSA_WANT_ALG_JPAKE)
   9160         case PSA_ALG_JPAKE:
   9161             status = psa_jpake_prologue(operation, step, PSA_JPAKE_INPUT);
   9162             if (status != PSA_SUCCESS) {
   9163                 goto exit;
   9164             }
   9165             driver_step = convert_jpake_computation_stage_to_driver_step(
   9166                 &operation->computation_stage.jpake);
   9167             break;
   9168 #endif /* PSA_WANT_ALG_JPAKE */
   9169         default:
   9170             (void) step;
   9171             status = PSA_ERROR_NOT_SUPPORTED;
   9172             goto exit;
   9173     }
   9174 
   9175     LOCAL_INPUT_ALLOC(input_external, input_length, input);
   9176     status = psa_driver_wrapper_pake_input(operation, driver_step,
   9177                                            input, input_length);
   9178 
   9179     if (status != PSA_SUCCESS) {
   9180         goto exit;
   9181     }
   9182 
   9183     switch (operation->alg) {
   9184 #if defined(PSA_WANT_ALG_JPAKE)
   9185         case PSA_ALG_JPAKE:
   9186             status = psa_jpake_epilogue(operation, PSA_JPAKE_INPUT);
   9187             if (status != PSA_SUCCESS) {
   9188                 goto exit;
   9189             }
   9190             break;
   9191 #endif /* PSA_WANT_ALG_JPAKE */
   9192         default:
   9193             status = PSA_ERROR_NOT_SUPPORTED;
   9194             goto exit;
   9195     }
   9196 
   9197 exit:
   9198     LOCAL_INPUT_FREE(input_external, input);
   9199     if (status != PSA_SUCCESS) {
   9200         psa_pake_abort(operation);
   9201     }
   9202     return status;
   9203 }
   9204 
   9205 psa_status_t psa_pake_get_implicit_key(
   9206     psa_pake_operation_t *operation,
   9207     psa_key_derivation_operation_t *output)
   9208 {
   9209     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
   9210     psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
   9211     uint8_t shared_key[MBEDTLS_PSA_JPAKE_BUFFER_SIZE];
   9212     size_t shared_key_len = 0;
   9213 
   9214     if (operation->stage != PSA_PAKE_OPERATION_STAGE_COMPUTATION) {
   9215         status = PSA_ERROR_BAD_STATE;
   9216         goto exit;
   9217     }
   9218 
   9219 #if defined(PSA_WANT_ALG_JPAKE)
   9220     if (operation->alg == PSA_ALG_JPAKE) {
   9221         psa_jpake_computation_stage_t *computation_stage =
   9222             &operation->computation_stage.jpake;
   9223         if (computation_stage->round != PSA_JPAKE_FINISHED) {
   9224             status = PSA_ERROR_BAD_STATE;
   9225             goto exit;
   9226         }
   9227     } else
   9228 #endif /* PSA_WANT_ALG_JPAKE */
   9229     {
   9230         status = PSA_ERROR_NOT_SUPPORTED;
   9231         goto exit;
   9232     }
   9233 
   9234     status = psa_driver_wrapper_pake_get_implicit_key(operation,
   9235                                                       shared_key,
   9236                                                       sizeof(shared_key),
   9237                                                       &shared_key_len);
   9238 
   9239     if (status != PSA_SUCCESS) {
   9240         goto exit;
   9241     }
   9242 
   9243     status = psa_key_derivation_input_bytes(output,
   9244                                             PSA_KEY_DERIVATION_INPUT_SECRET,
   9245                                             shared_key,
   9246                                             shared_key_len);
   9247 
   9248     mbedtls_platform_zeroize(shared_key, sizeof(shared_key));
   9249 exit:
   9250     abort_status = psa_pake_abort(operation);
   9251     return status == PSA_SUCCESS ? abort_status : status;
   9252 }
   9253 
   9254 psa_status_t psa_pake_abort(
   9255     psa_pake_operation_t *operation)
   9256 {
   9257     psa_status_t status = PSA_SUCCESS;
   9258 
   9259     if (operation->stage == PSA_PAKE_OPERATION_STAGE_COMPUTATION) {
   9260         status = psa_driver_wrapper_pake_abort(operation);
   9261     }
   9262 
   9263     if (operation->stage == PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS) {
   9264         if (operation->data.inputs.password != NULL) {
   9265             mbedtls_zeroize_and_free(operation->data.inputs.password,
   9266                                      operation->data.inputs.password_len);
   9267         }
   9268         if (operation->data.inputs.user != NULL) {
   9269             mbedtls_free(operation->data.inputs.user);
   9270         }
   9271         if (operation->data.inputs.peer != NULL) {
   9272             mbedtls_free(operation->data.inputs.peer);
   9273         }
   9274     }
   9275     memset(operation, 0, sizeof(psa_pake_operation_t));
   9276 
   9277     return status;
   9278 }
   9279 #endif /* PSA_WANT_ALG_SOME_PAKE */
   9280 
   9281 /* Memory copying test hooks. These are called before input copy, after input
   9282  * copy, before output copy and after output copy, respectively.
   9283  * They are used by memory-poisoning tests to temporarily unpoison buffers
   9284  * while they are copied. */
   9285 #if defined(MBEDTLS_TEST_HOOKS)
   9286 void (*psa_input_pre_copy_hook)(const uint8_t *input, size_t input_len) = NULL;
   9287 void (*psa_input_post_copy_hook)(const uint8_t *input, size_t input_len) = NULL;
   9288 void (*psa_output_pre_copy_hook)(const uint8_t *output, size_t output_len) = NULL;
   9289 void (*psa_output_post_copy_hook)(const uint8_t *output, size_t output_len) = NULL;
   9290 #endif
   9291 
   9292 /** Copy from an input buffer to a local copy.
   9293  *
   9294  * \param[in] input             Pointer to input buffer.
   9295  * \param[in] input_len         Length of the input buffer.
   9296  * \param[out] input_copy       Pointer to a local copy in which to store the input data.
   9297  * \param[out] input_copy_len   Length of the local copy buffer.
   9298  * \return                      #PSA_SUCCESS, if the buffer was successfully
   9299  *                              copied.
   9300  * \return                      #PSA_ERROR_CORRUPTION_DETECTED, if the local
   9301  *                              copy is too small to hold contents of the
   9302  *                              input buffer.
   9303  */
   9304 MBEDTLS_STATIC_TESTABLE
   9305 psa_status_t psa_crypto_copy_input(const uint8_t *input, size_t input_len,
   9306                                    uint8_t *input_copy, size_t input_copy_len)
   9307 {
   9308     if (input_len > input_copy_len) {
   9309         return PSA_ERROR_CORRUPTION_DETECTED;
   9310     }
   9311 
   9312 #if defined(MBEDTLS_TEST_HOOKS)
   9313     if (psa_input_pre_copy_hook != NULL) {
   9314         psa_input_pre_copy_hook(input, input_len);
   9315     }
   9316 #endif
   9317 
   9318     if (input_len > 0) {
   9319         memcpy(input_copy, input, input_len);
   9320     }
   9321 
   9322 #if defined(MBEDTLS_TEST_HOOKS)
   9323     if (psa_input_post_copy_hook != NULL) {
   9324         psa_input_post_copy_hook(input, input_len);
   9325     }
   9326 #endif
   9327 
   9328     return PSA_SUCCESS;
   9329 }
   9330 
   9331 /** Copy from a local output buffer into a user-supplied one.
   9332  *
   9333  * \param[in] output_copy       Pointer to a local buffer containing the output.
   9334  * \param[in] output_copy_len   Length of the local buffer.
   9335  * \param[out] output           Pointer to user-supplied output buffer.
   9336  * \param[out] output_len       Length of the user-supplied output buffer.
   9337  * \return                      #PSA_SUCCESS, if the buffer was successfully
   9338  *                              copied.
   9339  * \return                      #PSA_ERROR_BUFFER_TOO_SMALL, if the
   9340  *                              user-supplied output buffer is too small to
   9341  *                              hold the contents of the local buffer.
   9342  */
   9343 MBEDTLS_STATIC_TESTABLE
   9344 psa_status_t psa_crypto_copy_output(const uint8_t *output_copy, size_t output_copy_len,
   9345                                     uint8_t *output, size_t output_len)
   9346 {
   9347     if (output_len < output_copy_len) {
   9348         return PSA_ERROR_BUFFER_TOO_SMALL;
   9349     }
   9350 
   9351 #if defined(MBEDTLS_TEST_HOOKS)
   9352     if (psa_output_pre_copy_hook != NULL) {
   9353         psa_output_pre_copy_hook(output, output_len);
   9354     }
   9355 #endif
   9356 
   9357     if (output_copy_len > 0) {
   9358         memcpy(output, output_copy, output_copy_len);
   9359     }
   9360 
   9361 #if defined(MBEDTLS_TEST_HOOKS)
   9362     if (psa_output_post_copy_hook != NULL) {
   9363         psa_output_post_copy_hook(output, output_len);
   9364     }
   9365 #endif
   9366 
   9367     return PSA_SUCCESS;
   9368 }
   9369 
   9370 psa_status_t psa_crypto_local_input_alloc(const uint8_t *input, size_t input_len,
   9371                                           psa_crypto_local_input_t *local_input)
   9372 {
   9373     psa_status_t status;
   9374 
   9375     *local_input = PSA_CRYPTO_LOCAL_INPUT_INIT;
   9376 
   9377     if (input_len == 0) {
   9378         return PSA_SUCCESS;
   9379     }
   9380 
   9381     local_input->buffer = mbedtls_calloc(input_len, 1);
   9382     if (local_input->buffer == NULL) {
   9383         /* Since we dealt with the zero-length case above, we know that
   9384          * a NULL return value means a failure of allocation. */
   9385         return PSA_ERROR_INSUFFICIENT_MEMORY;
   9386     }
   9387     /* From now on, we must free local_input->buffer on error. */
   9388 
   9389     local_input->length = input_len;
   9390 
   9391     status = psa_crypto_copy_input(input, input_len,
   9392                                    local_input->buffer, local_input->length);
   9393     if (status != PSA_SUCCESS) {
   9394         goto error;
   9395     }
   9396 
   9397     return PSA_SUCCESS;
   9398 
   9399 error:
   9400     mbedtls_zeroize_and_free(local_input->buffer, local_input->length);
   9401     local_input->buffer = NULL;
   9402     local_input->length = 0;
   9403     return status;
   9404 }
   9405 
   9406 void psa_crypto_local_input_free(psa_crypto_local_input_t *local_input)
   9407 {
   9408     mbedtls_zeroize_and_free(local_input->buffer, local_input->length);
   9409     local_input->buffer = NULL;
   9410     local_input->length = 0;
   9411 }
   9412 
   9413 psa_status_t psa_crypto_local_output_alloc(uint8_t *output, size_t output_len,
   9414                                            psa_crypto_local_output_t *local_output)
   9415 {
   9416     *local_output = PSA_CRYPTO_LOCAL_OUTPUT_INIT;
   9417 
   9418     if (output_len == 0) {
   9419         return PSA_SUCCESS;
   9420     }
   9421     local_output->buffer = mbedtls_calloc(output_len, 1);
   9422     if (local_output->buffer == NULL) {
   9423         /* Since we dealt with the zero-length case above, we know that
   9424          * a NULL return value means a failure of allocation. */
   9425         return PSA_ERROR_INSUFFICIENT_MEMORY;
   9426     }
   9427     local_output->length = output_len;
   9428     local_output->original = output;
   9429 
   9430     return PSA_SUCCESS;
   9431 }
   9432 
   9433 psa_status_t psa_crypto_local_output_free(psa_crypto_local_output_t *local_output)
   9434 {
   9435     psa_status_t status;
   9436 
   9437     if (local_output->buffer == NULL) {
   9438         local_output->length = 0;
   9439         return PSA_SUCCESS;
   9440     }
   9441     if (local_output->original == NULL) {
   9442         /* We have an internal copy but nothing to copy back to. */
   9443         return PSA_ERROR_CORRUPTION_DETECTED;
   9444     }
   9445 
   9446     status = psa_crypto_copy_output(local_output->buffer, local_output->length,
   9447                                     local_output->original, local_output->length);
   9448     if (status != PSA_SUCCESS) {
   9449         return status;
   9450     }
   9451 
   9452     mbedtls_zeroize_and_free(local_output->buffer, local_output->length);
   9453     local_output->buffer = NULL;
   9454     local_output->length = 0;
   9455 
   9456     return PSA_SUCCESS;
   9457 }
   9458 
   9459 #endif /* MBEDTLS_PSA_CRYPTO_C */