LCOV - code coverage report
Current view: top level - externals/mbedtls/library - psa_crypto_core.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 100.0 % 2 2
Test Date: 2026-03-12 12:01:18 Functions: 100.0 % 1 1
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /*
       2                 :             :  *  PSA crypto core internal interfaces
       3                 :             :  */
       4                 :             : /*
       5                 :             :  *  Copyright The Mbed TLS Contributors
       6                 :             :  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
       7                 :             :  */
       8                 :             : 
       9                 :             : #ifndef PSA_CRYPTO_CORE_H
      10                 :             : #define PSA_CRYPTO_CORE_H
      11                 :             : 
      12                 :             : /*
      13                 :             :  * Include the build-time configuration information header. Here, we do not
      14                 :             :  * include `"mbedtls/build_info.h"` directly but `"psa/build_info.h"`, which
      15                 :             :  * is basically just an alias to it. This is to ease the maintenance of the
      16                 :             :  * TF-PSA-Crypto repository which has a different build system and
      17                 :             :  * configuration.
      18                 :             :  */
      19                 :             : #include "psa/build_info.h"
      20                 :             : 
      21                 :             : #include "psa/crypto.h"
      22                 :             : #include "psa/crypto_se_driver.h"
      23                 :             : #if defined(MBEDTLS_THREADING_C)
      24                 :             : #include "mbedtls/threading.h"
      25                 :             : #endif
      26                 :             : 
      27                 :             : typedef enum {
      28                 :             :     PSA_SLOT_EMPTY = 0,
      29                 :             :     PSA_SLOT_FILLING,
      30                 :             :     PSA_SLOT_FULL,
      31                 :             :     PSA_SLOT_PENDING_DELETION,
      32                 :             : } psa_key_slot_state_t;
      33                 :             : 
      34                 :             : /** The data structure representing a key slot, containing key material
      35                 :             :  * and metadata for one key.
      36                 :             :  */
      37                 :             : typedef struct {
      38                 :             :     /* This field is accessed in a lot of places. Putting it first
      39                 :             :      * reduces the code size. */
      40                 :             :     psa_key_attributes_t attr;
      41                 :             : 
      42                 :             :     /*
      43                 :             :      * The current state of the key slot, as described in
      44                 :             :      * docs/architecture/psa-thread-safety/psa-thread-safety.md.
      45                 :             :      *
      46                 :             :      * Library functions can modify the state of a key slot by calling
      47                 :             :      * psa_key_slot_state_transition.
      48                 :             :      *
      49                 :             :      * The state variable is used to help determine whether library functions
      50                 :             :      * which operate on the slot succeed. For example, psa_finish_key_creation,
      51                 :             :      * which transfers the state of a slot from PSA_SLOT_FILLING to
      52                 :             :      * PSA_SLOT_FULL, must fail with error code PSA_ERROR_CORRUPTION_DETECTED
      53                 :             :      * if the state of the slot is not PSA_SLOT_FILLING.
      54                 :             :      *
      55                 :             :      * Library functions which traverse the array of key slots only consider
      56                 :             :      * slots that are in a suitable state for the function.
      57                 :             :      * For example, psa_get_and_lock_key_slot_in_memory, which finds a slot
      58                 :             :      * containing a given key ID, will only check slots whose state variable is
      59                 :             :      * PSA_SLOT_FULL.
      60                 :             :      */
      61                 :             :     psa_key_slot_state_t state;
      62                 :             : 
      63                 :             : #if defined(MBEDTLS_PSA_KEY_STORE_DYNAMIC)
      64                 :             :     /* The index of the slice containing this slot.
      65                 :             :      * This field must be filled if the slot contains a key
      66                 :             :      * (including keys being created or destroyed), and can be either
      67                 :             :      * filled or 0 when the slot is free.
      68                 :             :      *
      69                 :             :      * In most cases, the slice index can be deduced from the key identifer.
      70                 :             :      * We keep it in a separate field for robustness (it reduces the chance
      71                 :             :      * that a coding mistake in the key store will result in accessing the
      72                 :             :      * wrong slice), and also so that it's available even on code paths
      73                 :             :      * during creation or destruction where the key identifier might not be
      74                 :             :      * filled in.
      75                 :             :      * */
      76                 :             :     uint8_t slice_index;
      77                 :             : #endif /* MBEDTLS_PSA_KEY_STORE_DYNAMIC */
      78                 :             : 
      79                 :             :     union {
      80                 :             :         struct {
      81                 :             :             /* The index of the next slot in the free list for this
      82                 :             :              * slice, relative * to the next array element.
      83                 :             :              *
      84                 :             :              * That is, 0 means the next slot, 1 means the next slot
      85                 :             :              * but one, etc. -1 would mean the slot itself. -2 means
      86                 :             :              * the previous slot, etc.
      87                 :             :              *
      88                 :             :              * If this is beyond the array length, the free list ends with the
      89                 :             :              * current element.
      90                 :             :              *
      91                 :             :              * The reason for this strange encoding is that 0 means the next
      92                 :             :              * element. This way, when we allocate a slice and initialize it
      93                 :             :              * to all-zero, the slice is ready for use, with a free list that
      94                 :             :              * consists of all the slots in order.
      95                 :             :              */
      96                 :             :             int32_t next_free_relative_to_next;
      97                 :             :         } free;
      98                 :             : 
      99                 :             :         struct {
     100                 :             :             /*
     101                 :             :              * Number of functions registered as reading the material in the key slot.
     102                 :             :              *
     103                 :             :              * Library functions must not write directly to registered_readers
     104                 :             :              *
     105                 :             :              * A function must call psa_register_read(slot) before reading
     106                 :             :              * the current contents of the slot for an operation.
     107                 :             :              * They then must call psa_unregister_read(slot) once they have
     108                 :             :              * finished reading the current contents of the slot. If the key
     109                 :             :              * slot mutex is not held (when mutexes are enabled), this call
     110                 :             :              * must be done via a call to
     111                 :             :              * psa_unregister_read_under_mutex(slot).
     112                 :             :              * A function must call psa_key_slot_has_readers(slot) to check if
     113                 :             :              * the slot is in use for reading.
     114                 :             :              *
     115                 :             :              * This counter is used to prevent resetting the key slot while
     116                 :             :              * the library may access it. For example, such control is needed
     117                 :             :              * in the following scenarios:
     118                 :             :              * . In case of key slot starvation, all key slots contain the
     119                 :             :              *   description of a key, and the library asks for the
     120                 :             :              *   description of a persistent key not present in the
     121                 :             :              *   key slots, the key slots currently accessed by the
     122                 :             :              *   library cannot be reclaimed to free a key slot to load
     123                 :             :              *   the persistent key.
     124                 :             :              * . In case of a multi-threaded application where one thread
     125                 :             :              *   asks to close or purge or destroy a key while it is in use
     126                 :             :              *   by the library through another thread. */
     127                 :             :             size_t registered_readers;
     128                 :             :         } occupied;
     129                 :             :     } var;
     130                 :             : 
     131                 :             :     /* Dynamically allocated key data buffer.
     132                 :             :      * Format as specified in psa_export_key(). */
     133                 :             :     struct key_data {
     134                 :             : #if defined(MBEDTLS_PSA_STATIC_KEY_SLOTS)
     135                 :             :         uint8_t data[MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE];
     136                 :             : #else
     137                 :             :         uint8_t *data;
     138                 :             : #endif
     139                 :             :         size_t bytes;
     140                 :             :     } key;
     141                 :             : } psa_key_slot_t;
     142                 :             : 
     143                 :             : #if defined(MBEDTLS_THREADING_C)
     144                 :             : 
     145                 :             : /** Perform a mutex operation and return immediately upon failure.
     146                 :             :  *
     147                 :             :  * Returns PSA_ERROR_SERVICE_FAILURE if the operation fails
     148                 :             :  * and status was PSA_SUCCESS.
     149                 :             :  *
     150                 :             :  * Assumptions:
     151                 :             :  *  psa_status_t status exists.
     152                 :             :  *  f is a mutex operation which returns 0 upon success.
     153                 :             :  */
     154                 :             : #define PSA_THREADING_CHK_RET(f)                       \
     155                 :             :     do                                                 \
     156                 :             :     {                                                  \
     157                 :             :         if ((f) != 0) {                                \
     158                 :             :             if (status == PSA_SUCCESS) {               \
     159                 :             :                 return PSA_ERROR_SERVICE_FAILURE;      \
     160                 :             :             }                                          \
     161                 :             :             return status;                             \
     162                 :             :         }                                              \
     163                 :             :     } while (0);
     164                 :             : 
     165                 :             : /** Perform a mutex operation and goto exit on failure.
     166                 :             :  *
     167                 :             :  * Sets status to PSA_ERROR_SERVICE_FAILURE if status was PSA_SUCCESS.
     168                 :             :  *
     169                 :             :  * Assumptions:
     170                 :             :  *  psa_status_t status exists.
     171                 :             :  *  Label exit: exists.
     172                 :             :  *  f is a mutex operation which returns 0 upon success.
     173                 :             :  */
     174                 :             : #define PSA_THREADING_CHK_GOTO_EXIT(f)                 \
     175                 :             :     do                                                 \
     176                 :             :     {                                                  \
     177                 :             :         if ((f) != 0) {                                \
     178                 :             :             if (status == PSA_SUCCESS) {               \
     179                 :             :                 status = PSA_ERROR_SERVICE_FAILURE;    \
     180                 :             :             }                                          \
     181                 :             :             goto exit;                                 \
     182                 :             :         }                                              \
     183                 :             :     } while (0);
     184                 :             : #endif
     185                 :             : 
     186                 :             : /** Test whether a key slot has any registered readers.
     187                 :             :  * If multi-threading is enabled, the caller must hold the
     188                 :             :  * global key slot mutex.
     189                 :             :  *
     190                 :             :  * \param[in] slot      The key slot to test.
     191                 :             :  *
     192                 :             :  * \return 1 if the slot has any registered readers, 0 otherwise.
     193                 :             :  */
     194                 :         202 : static inline int psa_key_slot_has_readers(const psa_key_slot_t *slot)
     195                 :             : {
     196                 :         202 :     return slot->var.occupied.registered_readers > 0;
     197                 :             : }
     198                 :             : 
     199                 :             : #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
     200                 :             : /** Get the SE slot number of a key from the key slot storing its description.
     201                 :             :  *
     202                 :             :  * \param[in]  slot  The key slot to query. This must be a key slot storing
     203                 :             :  *                   the description of a key of a dynamically registered
     204                 :             :  *                   secure element, otherwise the behaviour is undefined.
     205                 :             :  */
     206                 :             : static inline psa_key_slot_number_t psa_key_slot_get_slot_number(
     207                 :             :     const psa_key_slot_t *slot)
     208                 :             : {
     209                 :             :     return *((psa_key_slot_number_t *) (slot->key.data));
     210                 :             : }
     211                 :             : #endif
     212                 :             : 
     213                 :             : /** Completely wipe a slot in memory, including its policy.
     214                 :             :  *
     215                 :             :  * Persistent storage is not affected.
     216                 :             :  * Sets the slot's state to PSA_SLOT_EMPTY.
     217                 :             :  * If multi-threading is enabled, the caller must hold the
     218                 :             :  * global key slot mutex.
     219                 :             :  *
     220                 :             :  * \param[in,out] slot  The key slot to wipe.
     221                 :             :  *
     222                 :             :  * \retval #PSA_SUCCESS
     223                 :             :  *         The slot has been successfully wiped.
     224                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED
     225                 :             :  *         The slot's state was PSA_SLOT_FULL or PSA_SLOT_PENDING_DELETION, and
     226                 :             :  *         the amount of registered readers was not equal to 1. Or,
     227                 :             :  *         the slot's state was PSA_SLOT_EMPTY. Or,
     228                 :             :  *         the slot's state was PSA_SLOT_FILLING, and the amount
     229                 :             :  *         of registered readers was not equal to 0.
     230                 :             :  */
     231                 :             : psa_status_t psa_wipe_key_slot(psa_key_slot_t *slot);
     232                 :             : 
     233                 :             : /** Try to allocate a buffer to an empty key slot.
     234                 :             :  *
     235                 :             :  * \param[in,out] slot          Key slot to attach buffer to.
     236                 :             :  * \param[in] buffer_length     Requested size of the buffer.
     237                 :             :  *
     238                 :             :  * \retval #PSA_SUCCESS
     239                 :             :  *         The buffer has been successfully allocated.
     240                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     241                 :             :  *         Not enough memory was available for allocation.
     242                 :             :  * \retval #PSA_ERROR_ALREADY_EXISTS
     243                 :             :  *         Trying to allocate a buffer to a non-empty key slot.
     244                 :             :  */
     245                 :             : psa_status_t psa_allocate_buffer_to_slot(psa_key_slot_t *slot,
     246                 :             :                                          size_t buffer_length);
     247                 :             : 
     248                 :             : /** Wipe key data from a slot. Preserves metadata such as the policy. */
     249                 :             : psa_status_t psa_remove_key_data_from_memory(psa_key_slot_t *slot);
     250                 :             : 
     251                 :             : /** Copy key data (in export format) into an empty key slot.
     252                 :             :  *
     253                 :             :  * This function assumes that the slot does not contain
     254                 :             :  * any key material yet. On failure, the slot content is unchanged.
     255                 :             :  *
     256                 :             :  * \param[in,out] slot          Key slot to copy the key into.
     257                 :             :  * \param[in] data              Buffer containing the key material.
     258                 :             :  * \param data_length           Size of the key buffer.
     259                 :             :  *
     260                 :             :  * \retval #PSA_SUCCESS
     261                 :             :  *         The key has been copied successfully.
     262                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     263                 :             :  *         Not enough memory was available for allocation of the
     264                 :             :  *         copy buffer.
     265                 :             :  * \retval #PSA_ERROR_ALREADY_EXISTS
     266                 :             :  *         There was other key material already present in the slot.
     267                 :             :  */
     268                 :             : psa_status_t psa_copy_key_material_into_slot(psa_key_slot_t *slot,
     269                 :             :                                              const uint8_t *data,
     270                 :             :                                              size_t data_length);
     271                 :             : 
     272                 :             : /** Convert an Mbed TLS error code to a PSA error code
     273                 :             :  *
     274                 :             :  * \note This function is provided solely for the convenience of
     275                 :             :  *       Mbed TLS and may be removed at any time without notice.
     276                 :             :  *
     277                 :             :  * \param ret           An Mbed TLS-thrown error code
     278                 :             :  *
     279                 :             :  * \return              The corresponding PSA error code
     280                 :             :  */
     281                 :             : psa_status_t mbedtls_to_psa_error(int ret);
     282                 :             : 
     283                 :             : /** Import a key in binary format.
     284                 :             :  *
     285                 :             :  * \note The signature of this function is that of a PSA driver
     286                 :             :  *       import_key entry point. This function behaves as an import_key
     287                 :             :  *       entry point as defined in the PSA driver interface specification for
     288                 :             :  *       transparent drivers.
     289                 :             :  *
     290                 :             :  * \param[in]  attributes       The attributes for the key to import.
     291                 :             :  * \param[in]  data             The buffer containing the key data in import
     292                 :             :  *                              format.
     293                 :             :  * \param[in]  data_length      Size of the \p data buffer in bytes.
     294                 :             :  * \param[out] key_buffer       The buffer to contain the key data in output
     295                 :             :  *                              format upon successful return.
     296                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes. This
     297                 :             :  *                              size is greater or equal to \p data_length.
     298                 :             :  * \param[out] key_buffer_length  The length of the data written in \p
     299                 :             :  *                                key_buffer in bytes.
     300                 :             :  * \param[out] bits             The key size in number of bits.
     301                 :             :  *
     302                 :             :  * \retval #PSA_SUCCESS  The key was imported successfully.
     303                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     304                 :             :  *         The key data is not correctly formatted.
     305                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     306                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     307                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
     308                 :             :  */
     309                 :             : psa_status_t psa_import_key_into_slot(
     310                 :             :     const psa_key_attributes_t *attributes,
     311                 :             :     const uint8_t *data, size_t data_length,
     312                 :             :     uint8_t *key_buffer, size_t key_buffer_size,
     313                 :             :     size_t *key_buffer_length, size_t *bits);
     314                 :             : 
     315                 :             : /** Export a key in binary format
     316                 :             :  *
     317                 :             :  * \note The signature of this function is that of a PSA driver export_key
     318                 :             :  *       entry point. This function behaves as an export_key entry point as
     319                 :             :  *       defined in the PSA driver interface specification.
     320                 :             :  *
     321                 :             :  * \param[in]  attributes       The attributes for the key to export.
     322                 :             :  * \param[in]  key_buffer       Material or context of the key to export.
     323                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     324                 :             :  * \param[out] data             Buffer where the key data is to be written.
     325                 :             :  * \param[in]  data_size        Size of the \p data buffer in bytes.
     326                 :             :  * \param[out] data_length      On success, the number of bytes written in
     327                 :             :  *                              \p data
     328                 :             :  *
     329                 :             :  * \retval #PSA_SUCCESS  The key was exported successfully.
     330                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     331                 :             :  * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription
     332                 :             :  * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription
     333                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
     334                 :             :  * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription
     335                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     336                 :             :  */
     337                 :             : psa_status_t psa_export_key_internal(
     338                 :             :     const psa_key_attributes_t *attributes,
     339                 :             :     const uint8_t *key_buffer, size_t key_buffer_size,
     340                 :             :     uint8_t *data, size_t data_size, size_t *data_length);
     341                 :             : 
     342                 :             : /** Export a public key or the public part of a key pair in binary format.
     343                 :             :  *
     344                 :             :  * \note The signature of this function is that of a PSA driver
     345                 :             :  *       export_public_key entry point. This function behaves as an
     346                 :             :  *       export_public_key entry point as defined in the PSA driver interface
     347                 :             :  *       specification.
     348                 :             :  *
     349                 :             :  * \param[in]  attributes       The attributes for the key to export.
     350                 :             :  * \param[in]  key_buffer       Material or context of the key to export.
     351                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     352                 :             :  * \param[out] data             Buffer where the key data is to be written.
     353                 :             :  * \param[in]  data_size        Size of the \p data buffer in bytes.
     354                 :             :  * \param[out] data_length      On success, the number of bytes written in
     355                 :             :  *                              \p data
     356                 :             :  *
     357                 :             :  * \retval #PSA_SUCCESS  The public key was exported successfully.
     358                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     359                 :             :  * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription
     360                 :             :  * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription
     361                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
     362                 :             :  * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription
     363                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     364                 :             :  */
     365                 :             : psa_status_t psa_export_public_key_internal(
     366                 :             :     const psa_key_attributes_t *attributes,
     367                 :             :     const uint8_t *key_buffer, size_t key_buffer_size,
     368                 :             :     uint8_t *data, size_t data_size, size_t *data_length);
     369                 :             : 
     370                 :             : /** Whether a key custom production parameters structure is the default.
     371                 :             :  *
     372                 :             :  * Calls to a key generation driver with non-default custom production parameters
     373                 :             :  * require a driver supporting custom production parameters.
     374                 :             :  *
     375                 :             :  * \param[in] custom            The key custom production parameters to check.
     376                 :             :  * \param custom_data_length    Size of the associated variable-length data
     377                 :             :  *                              in bytes.
     378                 :             :  */
     379                 :             : int psa_custom_key_parameters_are_default(
     380                 :             :     const psa_custom_key_parameters_t *custom,
     381                 :             :     size_t custom_data_length);
     382                 :             : 
     383                 :             : /**
     384                 :             :  * \brief Generate a key.
     385                 :             :  *
     386                 :             :  * \note The signature of the function is that of a PSA driver generate_key
     387                 :             :  *       entry point.
     388                 :             :  *
     389                 :             :  * \param[in]  attributes         The attributes for the key to generate.
     390                 :             :  * \param[in] custom              Custom parameters for the key generation.
     391                 :             :  * \param[in] custom_data         Variable-length data associated with \c custom.
     392                 :             :  * \param custom_data_length      Length of `custom_data` in bytes.
     393                 :             :  * \param[out] key_buffer         Buffer where the key data is to be written.
     394                 :             :  * \param[in]  key_buffer_size    Size of \p key_buffer in bytes.
     395                 :             :  * \param[out] key_buffer_length  On success, the number of bytes written in
     396                 :             :  *                                \p key_buffer.
     397                 :             :  *
     398                 :             :  * \retval #PSA_SUCCESS
     399                 :             :  *         The key was generated successfully.
     400                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
     401                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED
     402                 :             :  *         Key size in bits or type not supported.
     403                 :             :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     404                 :             :  *         The size of \p key_buffer is too small.
     405                 :             :  */
     406                 :             : psa_status_t psa_generate_key_internal(const psa_key_attributes_t *attributes,
     407                 :             :                                        const psa_custom_key_parameters_t *custom,
     408                 :             :                                        const uint8_t *custom_data,
     409                 :             :                                        size_t custom_data_length,
     410                 :             :                                        uint8_t *key_buffer,
     411                 :             :                                        size_t key_buffer_size,
     412                 :             :                                        size_t *key_buffer_length);
     413                 :             : 
     414                 :             : /** Sign a message with a private key. For hash-and-sign algorithms,
     415                 :             :  *  this includes the hashing step.
     416                 :             :  *
     417                 :             :  * \note The signature of this function is that of a PSA driver
     418                 :             :  *       sign_message entry point. This function behaves as a sign_message
     419                 :             :  *       entry point as defined in the PSA driver interface specification for
     420                 :             :  *       transparent drivers.
     421                 :             :  *
     422                 :             :  * \note This function will call the driver for psa_sign_hash
     423                 :             :  *       and go through driver dispatch again.
     424                 :             :  *
     425                 :             :  * \param[in]  attributes       The attributes of the key to use for the
     426                 :             :  *                              operation.
     427                 :             :  * \param[in]  key_buffer       The buffer containing the key context.
     428                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     429                 :             :  * \param[in]  alg              A signature algorithm that is compatible with
     430                 :             :  *                              the type of the key.
     431                 :             :  * \param[in]  input            The input message to sign.
     432                 :             :  * \param[in]  input_length     Size of the \p input buffer in bytes.
     433                 :             :  * \param[out] signature        Buffer where the signature is to be written.
     434                 :             :  * \param[in]  signature_size   Size of the \p signature buffer in bytes.
     435                 :             :  * \param[out] signature_length On success, the number of bytes
     436                 :             :  *                              that make up the returned signature value.
     437                 :             :  *
     438                 :             :  * \retval #PSA_SUCCESS \emptydescription
     439                 :             :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     440                 :             :  *         The size of the \p signature buffer is too small. You can
     441                 :             :  *         determine a sufficient buffer size by calling
     442                 :             :  *         #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg)
     443                 :             :  *         where \c key_type and \c key_bits are the type and bit-size
     444                 :             :  *         respectively of the key.
     445                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     446                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
     447                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     448                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
     449                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription
     450                 :             :  */
     451                 :             : psa_status_t psa_sign_message_builtin(
     452                 :             :     const psa_key_attributes_t *attributes,
     453                 :             :     const uint8_t *key_buffer, size_t key_buffer_size,
     454                 :             :     psa_algorithm_t alg, const uint8_t *input, size_t input_length,
     455                 :             :     uint8_t *signature, size_t signature_size, size_t *signature_length);
     456                 :             : 
     457                 :             : /** Verify the signature of a message with a public key, using
     458                 :             :  *  a hash-and-sign verification algorithm.
     459                 :             :  *
     460                 :             :  * \note The signature of this function is that of a PSA driver
     461                 :             :  *       verify_message entry point. This function behaves as a verify_message
     462                 :             :  *       entry point as defined in the PSA driver interface specification for
     463                 :             :  *       transparent drivers.
     464                 :             :  *
     465                 :             :  * \note This function will call the driver for psa_verify_hash
     466                 :             :  *       and go through driver dispatch again.
     467                 :             :  *
     468                 :             :  * \param[in]  attributes       The attributes of the key to use for the
     469                 :             :  *                              operation.
     470                 :             :  * \param[in]  key_buffer       The buffer containing the key context.
     471                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     472                 :             :  * \param[in]  alg              A signature algorithm that is compatible with
     473                 :             :  *                              the type of the key.
     474                 :             :  * \param[in]  input            The message whose signature is to be verified.
     475                 :             :  * \param[in]  input_length     Size of the \p input buffer in bytes.
     476                 :             :  * \param[in]  signature        Buffer containing the signature to verify.
     477                 :             :  * \param[in]  signature_length Size of the \p signature buffer in bytes.
     478                 :             :  *
     479                 :             :  * \retval #PSA_SUCCESS
     480                 :             :  *         The signature is valid.
     481                 :             :  * \retval #PSA_ERROR_INVALID_SIGNATURE
     482                 :             :  *         The calculation was performed successfully, but the passed
     483                 :             :  *         signature is not a valid signature.
     484                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     485                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
     486                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     487                 :             :  */
     488                 :             : psa_status_t psa_verify_message_builtin(
     489                 :             :     const psa_key_attributes_t *attributes,
     490                 :             :     const uint8_t *key_buffer, size_t key_buffer_size,
     491                 :             :     psa_algorithm_t alg, const uint8_t *input, size_t input_length,
     492                 :             :     const uint8_t *signature, size_t signature_length);
     493                 :             : 
     494                 :             : /** Sign an already-calculated hash with a private key.
     495                 :             :  *
     496                 :             :  * \note The signature of this function is that of a PSA driver
     497                 :             :  *       sign_hash entry point. This function behaves as a sign_hash
     498                 :             :  *       entry point as defined in the PSA driver interface specification for
     499                 :             :  *       transparent drivers.
     500                 :             :  *
     501                 :             :  * \param[in]  attributes       The attributes of the key to use for the
     502                 :             :  *                              operation.
     503                 :             :  * \param[in]  key_buffer       The buffer containing the key context.
     504                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     505                 :             :  * \param[in]  alg              A signature algorithm that is compatible with
     506                 :             :  *                              the type of the key.
     507                 :             :  * \param[in]  hash             The hash or message to sign.
     508                 :             :  * \param[in]  hash_length      Size of the \p hash buffer in bytes.
     509                 :             :  * \param[out] signature        Buffer where the signature is to be written.
     510                 :             :  * \param[in]  signature_size   Size of the \p signature buffer in bytes.
     511                 :             :  * \param[out] signature_length On success, the number of bytes
     512                 :             :  *                              that make up the returned signature value.
     513                 :             :  *
     514                 :             :  * \retval #PSA_SUCCESS \emptydescription
     515                 :             :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     516                 :             :  *         The size of the \p signature buffer is too small. You can
     517                 :             :  *         determine a sufficient buffer size by calling
     518                 :             :  *         #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg)
     519                 :             :  *         where \c key_type and \c key_bits are the type and bit-size
     520                 :             :  *         respectively of the key.
     521                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     522                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
     523                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     524                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
     525                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription
     526                 :             :  */
     527                 :             : psa_status_t psa_sign_hash_builtin(
     528                 :             :     const psa_key_attributes_t *attributes,
     529                 :             :     const uint8_t *key_buffer, size_t key_buffer_size,
     530                 :             :     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
     531                 :             :     uint8_t *signature, size_t signature_size, size_t *signature_length);
     532                 :             : 
     533                 :             : /**
     534                 :             :  * \brief Verify the signature a hash or short message using a public key.
     535                 :             :  *
     536                 :             :  * \note The signature of this function is that of a PSA driver
     537                 :             :  *       verify_hash entry point. This function behaves as a verify_hash
     538                 :             :  *       entry point as defined in the PSA driver interface specification for
     539                 :             :  *       transparent drivers.
     540                 :             :  *
     541                 :             :  * \param[in]  attributes       The attributes of the key to use for the
     542                 :             :  *                              operation.
     543                 :             :  * \param[in]  key_buffer       The buffer containing the key context.
     544                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     545                 :             :  * \param[in]  alg              A signature algorithm that is compatible with
     546                 :             :  *                              the type of the key.
     547                 :             :  * \param[in]  hash             The hash or message whose signature is to be
     548                 :             :  *                              verified.
     549                 :             :  * \param[in]  hash_length      Size of the \p hash buffer in bytes.
     550                 :             :  * \param[in]  signature        Buffer containing the signature to verify.
     551                 :             :  * \param[in]  signature_length Size of the \p signature buffer in bytes.
     552                 :             :  *
     553                 :             :  * \retval #PSA_SUCCESS
     554                 :             :  *         The signature is valid.
     555                 :             :  * \retval #PSA_ERROR_INVALID_SIGNATURE
     556                 :             :  *         The calculation was performed successfully, but the passed
     557                 :             :  *         signature is not a valid signature.
     558                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     559                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
     560                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     561                 :             :  */
     562                 :             : psa_status_t psa_verify_hash_builtin(
     563                 :             :     const psa_key_attributes_t *attributes,
     564                 :             :     const uint8_t *key_buffer, size_t key_buffer_size,
     565                 :             :     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
     566                 :             :     const uint8_t *signature, size_t signature_length);
     567                 :             : 
     568                 :             : /**
     569                 :             :  * \brief Validate the key bit size for unstructured keys.
     570                 :             :  *
     571                 :             :  * \note  Check that the bit size is acceptable for a given key type for
     572                 :             :  *        unstructured keys.
     573                 :             :  *
     574                 :             :  * \param[in]  type  The key type
     575                 :             :  * \param[in]  bits  The number of bits of the key
     576                 :             :  *
     577                 :             :  * \retval #PSA_SUCCESS
     578                 :             :  *         The key type and size are valid.
     579                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     580                 :             :  *         The size in bits of the key is not valid.
     581                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED
     582                 :             :  *         The type and/or the size in bits of the key or the combination of
     583                 :             :  *         the two is not supported.
     584                 :             :  */
     585                 :             : psa_status_t psa_validate_unstructured_key_bit_size(psa_key_type_t type,
     586                 :             :                                                     size_t bits);
     587                 :             : 
     588                 :             : /** Perform a key agreement and return the raw shared secret, using
     589                 :             :     built-in raw key agreement functions.
     590                 :             :  *
     591                 :             :  * \note The signature of this function is that of a PSA driver
     592                 :             :  *       key_agreement entry point. This function behaves as a key_agreement
     593                 :             :  *       entry point as defined in the PSA driver interface specification for
     594                 :             :  *       transparent drivers.
     595                 :             :  *
     596                 :             :  * \param[in]  attributes           The attributes of the key to use for the
     597                 :             :  *                                  operation.
     598                 :             :  * \param[in]  key_buffer           The buffer containing the private key
     599                 :             :  *                                  context.
     600                 :             :  * \param[in]  key_buffer_size      Size of the \p key_buffer buffer in
     601                 :             :  *                                  bytes.
     602                 :             :  * \param[in]  alg                  A key agreement algorithm that is
     603                 :             :  *                                  compatible with the type of the key.
     604                 :             :  * \param[in]  peer_key             The buffer containing the key context
     605                 :             :  *                                  of the peer's public key.
     606                 :             :  * \param[in]  peer_key_length      Size of the \p peer_key buffer in
     607                 :             :  *                                  bytes.
     608                 :             :  * \param[out] shared_secret        The buffer to which the shared secret
     609                 :             :  *                                  is to be written.
     610                 :             :  * \param[in]  shared_secret_size   Size of the \p shared_secret buffer in
     611                 :             :  *                                  bytes.
     612                 :             :  * \param[out] shared_secret_length On success, the number of bytes that make
     613                 :             :  *                                  up the returned shared secret.
     614                 :             :  * \retval #PSA_SUCCESS
     615                 :             :  *         Success. Shared secret successfully calculated.
     616                 :             :  * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription
     617                 :             :  * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription
     618                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     619                 :             :  *         \p alg is not a key agreement algorithm, or
     620                 :             :  *         \p private_key is not compatible with \p alg,
     621                 :             :  *         or \p peer_key is not valid for \p alg or not compatible with
     622                 :             :  *         \p private_key.
     623                 :             :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     624                 :             :  *         \p shared_secret_size is too small
     625                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED
     626                 :             :  *         \p alg is not a supported key agreement algorithm.
     627                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     628                 :             :  * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription
     629                 :             :  * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription
     630                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
     631                 :             :  * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription
     632                 :             :  * \retval #PSA_ERROR_BAD_STATE \emptydescription
     633                 :             :  */
     634                 :             : psa_status_t psa_key_agreement_raw_builtin(
     635                 :             :     const psa_key_attributes_t *attributes,
     636                 :             :     const uint8_t *key_buffer,
     637                 :             :     size_t key_buffer_size,
     638                 :             :     psa_algorithm_t alg,
     639                 :             :     const uint8_t *peer_key,
     640                 :             :     size_t peer_key_length,
     641                 :             :     uint8_t *shared_secret,
     642                 :             :     size_t shared_secret_size,
     643                 :             :     size_t *shared_secret_length);
     644                 :             : 
     645                 :             : /**
     646                 :             :  * \brief Set the maximum number of ops allowed to be executed by an
     647                 :             :  *        interruptible function in a single call.
     648                 :             :  *
     649                 :             :  * \note The signature of this function is that of a PSA driver
     650                 :             :  *       interruptible_set_max_ops entry point. This function behaves as an
     651                 :             :  *       interruptible_set_max_ops entry point as defined in the PSA driver
     652                 :             :  *       interface specification for transparent drivers.
     653                 :             :  *
     654                 :             :  * \param[in]  max_ops          The maximum number of ops to be executed in a
     655                 :             :  *                              single call, this can be a number from 0 to
     656                 :             :  *                              #PSA_INTERRUPTIBLE_MAX_OPS_UNLIMITED, where 0
     657                 :             :  *                              is obviously the least amount of work done per
     658                 :             :  *                              call.
     659                 :             :  */
     660                 :             : void mbedtls_psa_interruptible_set_max_ops(uint32_t max_ops);
     661                 :             : 
     662                 :             : /**
     663                 :             :  * \brief Get the maximum number of ops allowed to be executed by an
     664                 :             :  *        interruptible function in a single call.
     665                 :             :  *
     666                 :             :  * \note The signature of this function is that of a PSA driver
     667                 :             :  *       interruptible_get_max_ops entry point. This function behaves as an
     668                 :             :  *       interruptible_get_max_ops entry point as defined in the PSA driver
     669                 :             :  *       interface specification for transparent drivers.
     670                 :             :  *
     671                 :             :  * \return                      Maximum number of ops allowed to be executed
     672                 :             :  *                              by an interruptible function in a single call.
     673                 :             :  */
     674                 :             : uint32_t mbedtls_psa_interruptible_get_max_ops(void);
     675                 :             : 
     676                 :             : /**
     677                 :             :  * \brief Get the number of ops that a hash signing operation has taken for the
     678                 :             :  *        previous call. If no call or work has taken place, this will return
     679                 :             :  *        zero.
     680                 :             :  *
     681                 :             :  * \note The signature of this function is that of a PSA driver
     682                 :             :  *       sign_hash_get_num_ops entry point. This function behaves as an
     683                 :             :  *       sign_hash_get_num_ops entry point as defined in the PSA driver
     684                 :             :  *       interface specification for transparent drivers.
     685                 :             :  *
     686                 :             :  * \param   operation           The \c
     687                 :             :  *                              mbedtls_psa_sign_hash_interruptible_operation_t
     688                 :             :  *                              to use. This must be initialized first.
     689                 :             :  *
     690                 :             :  * \return                      Number of ops that were completed
     691                 :             :  *                              in the last call to \c
     692                 :             :  *                              mbedtls_psa_sign_hash_complete().
     693                 :             :  */
     694                 :             : uint32_t mbedtls_psa_sign_hash_get_num_ops(
     695                 :             :     const mbedtls_psa_sign_hash_interruptible_operation_t *operation);
     696                 :             : 
     697                 :             : /**
     698                 :             :  * \brief Get the number of ops that a hash verification operation has taken for
     699                 :             :  *        the previous call. If no call or work has taken place, this will
     700                 :             :  *        return zero.
     701                 :             :  *
     702                 :             :  * \note The signature of this function is that of a PSA driver
     703                 :             :  *       verify_hash_get_num_ops entry point. This function behaves as an
     704                 :             :  *       verify_hash_get_num_ops entry point as defined in the PSA driver
     705                 :             :  *       interface specification for transparent drivers.
     706                 :             :  *
     707                 :             :  * \param   operation           The \c
     708                 :             :  *                              mbedtls_psa_verify_hash_interruptible_operation_t
     709                 :             :  *                              to use. This must be initialized first.
     710                 :             :  *
     711                 :             :  * \return                      Number of ops that were completed
     712                 :             :  *                              in the last call to \c
     713                 :             :  *                              mbedtls_psa_verify_hash_complete().
     714                 :             :  */
     715                 :             : uint32_t mbedtls_psa_verify_hash_get_num_ops(
     716                 :             :     const mbedtls_psa_verify_hash_interruptible_operation_t *operation);
     717                 :             : 
     718                 :             : /**
     719                 :             :  * \brief  Start signing a hash or short message with a private key, in an
     720                 :             :  *         interruptible manner.
     721                 :             :  *
     722                 :             :  * \note The signature of this function is that of a PSA driver
     723                 :             :  *       sign_hash_start entry point. This function behaves as a
     724                 :             :  *       sign_hash_start entry point as defined in the PSA driver interface
     725                 :             :  *       specification for transparent drivers.
     726                 :             :  *
     727                 :             :  * \param[in]  operation        The \c
     728                 :             :  *                              mbedtls_psa_sign_hash_interruptible_operation_t
     729                 :             :  *                              to use. This must be initialized first.
     730                 :             :  * \param[in]  attributes       The attributes of the key to use for the
     731                 :             :  *                              operation.
     732                 :             :  * \param[in]  key_buffer       The buffer containing the key context.
     733                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     734                 :             :  * \param[in]  alg              A signature algorithm that is compatible with
     735                 :             :  *                              the type of the key.
     736                 :             :  * \param[in] hash              The hash or message to sign.
     737                 :             :  * \param hash_length           Size of the \p hash buffer in bytes.
     738                 :             :  *
     739                 :             :  * \retval #PSA_SUCCESS
     740                 :             :  *         The operation started successfully - call \c psa_sign_hash_complete()
     741                 :             :  *         with the same context to complete the operation
     742                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     743                 :             :  *         An unsupported, incorrectly formatted or incorrect type of key was
     744                 :             :  *         used.
     745                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED Either no internal interruptible operations
     746                 :             :  *         are currently supported, or the key type is currently unsupported.
     747                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     748                 :             :  *         There was insufficient memory to load the key representation.
     749                 :             :  */
     750                 :             : psa_status_t mbedtls_psa_sign_hash_start(
     751                 :             :     mbedtls_psa_sign_hash_interruptible_operation_t *operation,
     752                 :             :     const psa_key_attributes_t *attributes, const uint8_t *key_buffer,
     753                 :             :     size_t key_buffer_size, psa_algorithm_t alg,
     754                 :             :     const uint8_t *hash, size_t hash_length);
     755                 :             : 
     756                 :             : /**
     757                 :             :  * \brief Continue and eventually complete the action of signing a hash or
     758                 :             :  *        short message with a private key, in an interruptible manner.
     759                 :             :  *
     760                 :             :  * \note The signature of this function is that of a PSA driver
     761                 :             :  *       sign_hash_complete entry point. This function behaves as a
     762                 :             :  *       sign_hash_complete entry point as defined in the PSA driver interface
     763                 :             :  *       specification for transparent drivers.
     764                 :             :  *
     765                 :             :  * \param[in]  operation        The \c
     766                 :             :  *                              mbedtls_psa_sign_hash_interruptible_operation_t
     767                 :             :  *                              to use. This must be initialized first.
     768                 :             :  *
     769                 :             :  * \param[out] signature        Buffer where the signature is to be written.
     770                 :             :  * \param signature_size        Size of the \p signature buffer in bytes. This
     771                 :             :  *                              must be appropriate for the selected
     772                 :             :  *                              algorithm and key.
     773                 :             :  * \param[out] signature_length On success, the number of bytes that make up
     774                 :             :  *                              the returned signature value.
     775                 :             :  *
     776                 :             :  * \retval #PSA_SUCCESS
     777                 :             :  *         Operation completed successfully
     778                 :             :  *
     779                 :             :  * \retval #PSA_OPERATION_INCOMPLETE
     780                 :             :  *         Operation was interrupted due to the setting of \c
     781                 :             :  *         psa_interruptible_set_max_ops(), there is still work to be done,
     782                 :             :  *         please call this function again with the same operation object.
     783                 :             :  *
     784                 :             :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     785                 :             :  *         The size of the \p signature buffer is too small. You can
     786                 :             :  *         determine a sufficient buffer size by calling
     787                 :             :  *         #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg)
     788                 :             :  *         where \c key_type and \c key_bits are the type and bit-size
     789                 :             :  *         respectively of \p key.
     790                 :             :  *
     791                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     792                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
     793                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     794                 :             :  * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
     795                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription
     796                 :             :  */
     797                 :             : psa_status_t mbedtls_psa_sign_hash_complete(
     798                 :             :     mbedtls_psa_sign_hash_interruptible_operation_t *operation,
     799                 :             :     uint8_t *signature, size_t signature_size,
     800                 :             :     size_t *signature_length);
     801                 :             : 
     802                 :             : /**
     803                 :             :  * \brief Abort a sign hash operation.
     804                 :             :  *
     805                 :             :  * \note The signature of this function is that of a PSA driver sign_hash_abort
     806                 :             :  *       entry point. This function behaves as a sign_hash_abort entry point as
     807                 :             :  *       defined in the PSA driver interface specification for transparent
     808                 :             :  *       drivers.
     809                 :             :  *
     810                 :             :  * \param[in]  operation        The \c
     811                 :             :  *                              mbedtls_psa_sign_hash_interruptible_operation_t
     812                 :             :  *                              to abort.
     813                 :             :  *
     814                 :             :  * \retval #PSA_SUCCESS
     815                 :             :  *         The operation was aborted successfully.
     816                 :             :  */
     817                 :             : psa_status_t mbedtls_psa_sign_hash_abort(
     818                 :             :     mbedtls_psa_sign_hash_interruptible_operation_t *operation);
     819                 :             : 
     820                 :             : /**
     821                 :             :  * \brief  Start reading and verifying a hash or short message, in an
     822                 :             :  *         interruptible manner.
     823                 :             :  *
     824                 :             :  * \note The signature of this function is that of a PSA driver
     825                 :             :  *       verify_hash_start entry point. This function behaves as a
     826                 :             :  *       verify_hash_start entry point as defined in the PSA driver interface
     827                 :             :  *       specification for transparent drivers.
     828                 :             :  *
     829                 :             :  * \param[in]  operation        The \c
     830                 :             :  *                              mbedtls_psa_verify_hash_interruptible_operation_t
     831                 :             :  *                              to use. This must be initialized first.
     832                 :             :  * \param[in]  attributes       The attributes of the key to use for the
     833                 :             :  *                              operation.
     834                 :             :  * \param[in]  key_buffer       The buffer containing the key context.
     835                 :             :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     836                 :             :  * \param[in]  alg              A signature algorithm that is compatible with
     837                 :             :  *                              the type of the key.
     838                 :             :  * \param[in] hash              The hash whose signature is to be verified.
     839                 :             :  * \param hash_length           Size of the \p hash buffer in bytes.
     840                 :             :  * \param[in] signature         Buffer containing the signature to verify.
     841                 :             :  * \param signature_length      Size of the \p signature buffer in bytes.
     842                 :             :  *
     843                 :             :  * \retval #PSA_SUCCESS
     844                 :             :  *         The operation started successfully - call \c psa_sign_hash_complete()
     845                 :             :  *         with the same context to complete the operation
     846                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     847                 :             :  *         An unsupported or incorrect type of key was used.
     848                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED
     849                 :             :  *        Either no internal interruptible operations are currently supported,
     850                 :             :  *         or the key type is currently unsupported.
     851                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     852                 :             :  *        There was insufficient memory either to load the key representation,
     853                 :             :  *        or to prepare the operation.
     854                 :             :  */
     855                 :             : psa_status_t mbedtls_psa_verify_hash_start(
     856                 :             :     mbedtls_psa_verify_hash_interruptible_operation_t *operation,
     857                 :             :     const psa_key_attributes_t *attributes,
     858                 :             :     const uint8_t *key_buffer, size_t key_buffer_size,
     859                 :             :     psa_algorithm_t alg,
     860                 :             :     const uint8_t *hash, size_t hash_length,
     861                 :             :     const uint8_t *signature, size_t signature_length);
     862                 :             : 
     863                 :             : /**
     864                 :             :  * \brief Continue and eventually complete the action of signing a hash or
     865                 :             :  *        short message with a private key, in an interruptible manner.
     866                 :             :  *
     867                 :             :  * \note The signature of this function is that of a PSA driver
     868                 :             :  *       sign_hash_complete entry point. This function behaves as a
     869                 :             :  *       sign_hash_complete entry point as defined in the PSA driver interface
     870                 :             :  *       specification for transparent drivers.
     871                 :             :  *
     872                 :             :  * \param[in]  operation        The \c
     873                 :             :  *                              mbedtls_psa_sign_hash_interruptible_operation_t
     874                 :             :  *                              to use. This must be initialized first.
     875                 :             :  *
     876                 :             :  * \retval #PSA_SUCCESS
     877                 :             :  *         Operation completed successfully, and the passed signature is valid.
     878                 :             :  *
     879                 :             :  * \retval #PSA_OPERATION_INCOMPLETE
     880                 :             :  *         Operation was interrupted due to the setting of \c
     881                 :             :  *         psa_interruptible_set_max_ops(), there is still work to be done,
     882                 :             :  *         please call this function again with the same operation object.
     883                 :             :  *
     884                 :             :  * \retval #PSA_ERROR_INVALID_SIGNATURE
     885                 :             :  *         The calculation was performed successfully, but the passed
     886                 :             :  *         signature is not a valid signature.
     887                 :             :  *
     888                 :             :  * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
     889                 :             :  * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription
     890                 :             :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription
     891                 :             :  */
     892                 :             : psa_status_t mbedtls_psa_verify_hash_complete(
     893                 :             :     mbedtls_psa_verify_hash_interruptible_operation_t *operation);
     894                 :             : 
     895                 :             : /**
     896                 :             :  * \brief Abort a verify signed hash operation.
     897                 :             :  *
     898                 :             :  * \note The signature of this function is that of a PSA driver
     899                 :             :  *       verify_hash_abort entry point. This function behaves as a
     900                 :             :  *       verify_hash_abort entry point as defined in the PSA driver interface
     901                 :             :  *       specification for transparent drivers.
     902                 :             :  *
     903                 :             :  * \param[in]  operation        The \c
     904                 :             :  *                              mbedtls_psa_verify_hash_interruptible_operation_t
     905                 :             :  *                              to abort.
     906                 :             :  *
     907                 :             :  * \retval #PSA_SUCCESS
     908                 :             :  *         The operation was aborted successfully.
     909                 :             :  */
     910                 :             : psa_status_t mbedtls_psa_verify_hash_abort(
     911                 :             :     mbedtls_psa_verify_hash_interruptible_operation_t *operation);
     912                 :             : 
     913                 :             : typedef struct psa_crypto_local_input_s {
     914                 :             :     uint8_t *buffer;
     915                 :             :     size_t length;
     916                 :             : } psa_crypto_local_input_t;
     917                 :             : 
     918                 :             : #define PSA_CRYPTO_LOCAL_INPUT_INIT ((psa_crypto_local_input_t) { NULL, 0 })
     919                 :             : 
     920                 :             : /** Allocate a local copy of an input buffer and copy the contents into it.
     921                 :             :  *
     922                 :             :  * \param[in] input             Pointer to input buffer.
     923                 :             :  * \param[in] input_len         Length of the input buffer.
     924                 :             :  * \param[out] local_input      Pointer to a psa_crypto_local_input_t struct
     925                 :             :  *                              containing a local input copy.
     926                 :             :  * \return                      #PSA_SUCCESS, if the buffer was successfully
     927                 :             :  *                              copied.
     928                 :             :  * \return                      #PSA_ERROR_INSUFFICIENT_MEMORY, if a copy of
     929                 :             :  *                              the buffer cannot be allocated.
     930                 :             :  */
     931                 :             : psa_status_t psa_crypto_local_input_alloc(const uint8_t *input, size_t input_len,
     932                 :             :                                           psa_crypto_local_input_t *local_input);
     933                 :             : 
     934                 :             : /** Free a local copy of an input buffer.
     935                 :             :  *
     936                 :             :  * \param[in] local_input       Pointer to a psa_crypto_local_input_t struct
     937                 :             :  *                              populated by a previous call to
     938                 :             :  *                              psa_crypto_local_input_alloc().
     939                 :             :  */
     940                 :             : void psa_crypto_local_input_free(psa_crypto_local_input_t *local_input);
     941                 :             : 
     942                 :             : typedef struct psa_crypto_local_output_s {
     943                 :             :     uint8_t *original;
     944                 :             :     uint8_t *buffer;
     945                 :             :     size_t length;
     946                 :             : } psa_crypto_local_output_t;
     947                 :             : 
     948                 :             : #define PSA_CRYPTO_LOCAL_OUTPUT_INIT ((psa_crypto_local_output_t) { NULL, NULL, 0 })
     949                 :             : 
     950                 :             : /** Allocate a local copy of an output buffer.
     951                 :             :  *
     952                 :             :  * \note                        This does not copy any data from the original
     953                 :             :  *                              output buffer but only allocates a buffer
     954                 :             :  *                              whose contents will be copied back to the
     955                 :             :  *                              original in a future call to
     956                 :             :  *                              psa_crypto_local_output_free().
     957                 :             :  *
     958                 :             :  * \param[in] output            Pointer to output buffer.
     959                 :             :  * \param[in] output_len        Length of the output buffer.
     960                 :             :  * \param[out] local_output     Pointer to a psa_crypto_local_output_t struct to
     961                 :             :  *                              populate with the local output copy.
     962                 :             :  * \return                      #PSA_SUCCESS, if the buffer was successfully
     963                 :             :  *                              copied.
     964                 :             :  * \return                      #PSA_ERROR_INSUFFICIENT_MEMORY, if a copy of
     965                 :             :  *                              the buffer cannot be allocated.
     966                 :             :  */
     967                 :             : psa_status_t psa_crypto_local_output_alloc(uint8_t *output, size_t output_len,
     968                 :             :                                            psa_crypto_local_output_t *local_output);
     969                 :             : 
     970                 :             : /** Copy from a local copy of an output buffer back to the original, then
     971                 :             :  *  free the local copy.
     972                 :             :  *
     973                 :             :  * \param[in] local_output      Pointer to a psa_crypto_local_output_t struct
     974                 :             :  *                              populated by a previous call to
     975                 :             :  *                              psa_crypto_local_output_alloc().
     976                 :             :  * \return                      #PSA_SUCCESS, if the local output was
     977                 :             :  *                              successfully copied back to the original.
     978                 :             :  * \return                      #PSA_ERROR_CORRUPTION_DETECTED, if the output
     979                 :             :  *                              could not be copied back to the original.
     980                 :             :  */
     981                 :             : psa_status_t psa_crypto_local_output_free(psa_crypto_local_output_t *local_output);
     982                 :             : 
     983                 :             : #endif /* PSA_CRYPTO_CORE_H */
        

Generated by: LCOV version 2.0-1