LCOV - code coverage report
Current view: top level - externals/mbedtls/library - psa_crypto_core.h (source / functions) Hit Total Coverage
Test: lcov.info Lines: 2 10 20.0 %
Date: 2024-09-16 20:15:30 Functions: 1 3 33.3 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 2 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
       7                 :            :  *
       8                 :            :  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
       9                 :            :  *  not use this file except in compliance with the License.
      10                 :            :  *  You may obtain a copy of the License at
      11                 :            :  *
      12                 :            :  *  http://www.apache.org/licenses/LICENSE-2.0
      13                 :            :  *
      14                 :            :  *  Unless required by applicable law or agreed to in writing, software
      15                 :            :  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
      16                 :            :  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      17                 :            :  *  See the License for the specific language governing permissions and
      18                 :            :  *  limitations under the License.
      19                 :            :  */
      20                 :            : 
      21                 :            : #ifndef PSA_CRYPTO_CORE_H
      22                 :            : #define PSA_CRYPTO_CORE_H
      23                 :            : 
      24                 :            : #include "mbedtls/build_info.h"
      25                 :            : 
      26                 :            : #include "psa/crypto.h"
      27                 :            : #include "psa/crypto_se_driver.h"
      28                 :            : 
      29                 :            : /** Constant-time buffer comparison
      30                 :            :  *
      31                 :            :  * \param[in]  a    Left-hand buffer for comparison.
      32                 :            :  * \param[in]  b    Right-hand buffer for comparison.
      33                 :            :  * \param n         Amount of bytes to compare.
      34                 :            :  *
      35                 :            :  * \return 0 if the buffer contents are equal, non-zero otherwise
      36                 :            :  */
      37                 :          0 : static inline int mbedtls_psa_safer_memcmp(
      38                 :            :     const uint8_t *a, const uint8_t *b, size_t n )
      39                 :            : {
      40                 :          0 :     size_t i;
      41                 :          0 :     unsigned char diff = 0;
      42                 :            : 
      43         [ #  # ]:          0 :     for( i = 0; i < n; i++ )
      44                 :          0 :         diff |= a[i] ^ b[i];
      45                 :            : 
      46                 :          0 :     return( diff );
      47                 :            : }
      48                 :            : 
      49                 :            : /** The data structure representing a key slot, containing key material
      50                 :            :  * and metadata for one key.
      51                 :            :  */
      52                 :            : typedef struct
      53                 :            : {
      54                 :            :     psa_core_key_attributes_t attr;
      55                 :            : 
      56                 :            :     /*
      57                 :            :      * Number of locks on the key slot held by the library.
      58                 :            :      *
      59                 :            :      * This counter is incremented by one each time a library function
      60                 :            :      * retrieves through one of the dedicated internal API a pointer to the
      61                 :            :      * key slot.
      62                 :            :      *
      63                 :            :      * This counter is decremented by one each time a library function stops
      64                 :            :      * accessing the key slot and states it by calling the
      65                 :            :      * psa_unlock_key_slot() API.
      66                 :            :      *
      67                 :            :      * This counter is used to prevent resetting the key slot while the library
      68                 :            :      * may access it. For example, such control is needed in the following
      69                 :            :      * scenarios:
      70                 :            :      * . In case of key slot starvation, all key slots contain the description
      71                 :            :      *   of a key, and the library asks for the description of a persistent
      72                 :            :      *   key not present in the key slots, the key slots currently accessed by
      73                 :            :      *   the library cannot be reclaimed to free a key slot to load the
      74                 :            :      *   persistent key.
      75                 :            :      * . In case of a multi-threaded application where one thread asks to close
      76                 :            :      *   or purge or destroy a key while it is in used by the library through
      77                 :            :      *   another thread.
      78                 :            :      */
      79                 :            :     size_t lock_count;
      80                 :            : 
      81                 :            :     /* Dynamically allocated key data buffer.
      82                 :            :      * Format as specified in psa_export_key(). */
      83                 :            :     struct key_data
      84                 :            :     {
      85                 :            :         uint8_t *data;
      86                 :            :         size_t bytes;
      87                 :            :     } key;
      88                 :            : } psa_key_slot_t;
      89                 :            : 
      90                 :            : /* A mask of key attribute flags used only internally.
      91                 :            :  * Currently there aren't any. */
      92                 :            : #define PSA_KA_MASK_INTERNAL_ONLY (     \
      93                 :            :         0 )
      94                 :            : 
      95                 :            : /** Test whether a key slot is occupied.
      96                 :            :  *
      97                 :            :  * A key slot is occupied iff the key type is nonzero. This works because
      98                 :            :  * no valid key can have 0 as its key type.
      99                 :            :  *
     100                 :            :  * \param[in] slot      The key slot to test.
     101                 :            :  *
     102                 :            :  * \return 1 if the slot is occupied, 0 otherwise.
     103                 :            :  */
     104                 :        172 : static inline int psa_is_key_slot_occupied( const psa_key_slot_t *slot )
     105                 :            : {
     106                 :        172 :     return( slot->attr.type != 0 );
     107                 :            : }
     108                 :            : 
     109                 :            : /** Test whether a key slot is locked.
     110                 :            :  *
     111                 :            :  * A key slot is locked iff its lock counter is strictly greater than 0.
     112                 :            :  *
     113                 :            :  * \param[in] slot  The key slot to test.
     114                 :            :  *
     115                 :            :  * \return 1 if the slot is locked, 0 otherwise.
     116                 :            :  */
     117                 :          0 : static inline int psa_is_key_slot_locked( const psa_key_slot_t *slot )
     118                 :            : {
     119                 :          0 :     return( slot->lock_count > 0 );
     120                 :            : }
     121                 :            : 
     122                 :            : /** Retrieve flags from psa_key_slot_t::attr::core::flags.
     123                 :            :  *
     124                 :            :  * \param[in] slot      The key slot to query.
     125                 :            :  * \param mask          The mask of bits to extract.
     126                 :            :  *
     127                 :            :  * \return The key attribute flags in the given slot,
     128                 :            :  *         bitwise-anded with \p mask.
     129                 :            :  */
     130                 :            : static inline uint16_t psa_key_slot_get_flags( const psa_key_slot_t *slot,
     131                 :            :                                                uint16_t mask )
     132                 :            : {
     133                 :            :     return( slot->attr.flags & mask );
     134                 :            : }
     135                 :            : 
     136                 :            : /** Set flags in psa_key_slot_t::attr::core::flags.
     137                 :            :  *
     138                 :            :  * \param[in,out] slot  The key slot to modify.
     139                 :            :  * \param mask          The mask of bits to modify.
     140                 :            :  * \param value         The new value of the selected bits.
     141                 :            :  */
     142                 :            : static inline void psa_key_slot_set_flags( psa_key_slot_t *slot,
     143                 :            :                                            uint16_t mask,
     144                 :            :                                            uint16_t value )
     145                 :            : {
     146                 :            :     slot->attr.flags = ( ( ~mask & slot->attr.flags ) |
     147                 :            :                               ( mask & value ) );
     148                 :            : }
     149                 :            : 
     150                 :            : /** Turn on flags in psa_key_slot_t::attr::core::flags.
     151                 :            :  *
     152                 :            :  * \param[in,out] slot  The key slot to modify.
     153                 :            :  * \param mask          The mask of bits to set.
     154                 :            :  */
     155                 :            : static inline void psa_key_slot_set_bits_in_flags( psa_key_slot_t *slot,
     156                 :            :                                                    uint16_t mask )
     157                 :            : {
     158                 :            :     slot->attr.flags |= mask;
     159                 :            : }
     160                 :            : 
     161                 :            : /** Turn off flags in psa_key_slot_t::attr::core::flags.
     162                 :            :  *
     163                 :            :  * \param[in,out] slot  The key slot to modify.
     164                 :            :  * \param mask          The mask of bits to clear.
     165                 :            :  */
     166                 :            : static inline void psa_key_slot_clear_bits( psa_key_slot_t *slot,
     167                 :            :                                             uint16_t mask )
     168                 :            : {
     169                 :            :     slot->attr.flags &= ~mask;
     170                 :            : }
     171                 :            : 
     172                 :            : #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
     173                 :            : /** Get the SE slot number of a key from the key slot storing its description.
     174                 :            :  *
     175                 :            :  * \param[in]  slot  The key slot to query. This must be a key slot storing
     176                 :            :  *                   the description of a key of a dynamically registered
     177                 :            :  *                   secure element, otherwise the behaviour is undefined.
     178                 :            :  */
     179                 :            : static inline psa_key_slot_number_t psa_key_slot_get_slot_number(
     180                 :            :     const psa_key_slot_t *slot )
     181                 :            : {
     182                 :            :     return( *( (psa_key_slot_number_t *)( slot->key.data ) ) );
     183                 :            : }
     184                 :            : #endif
     185                 :            : 
     186                 :            : /** Completely wipe a slot in memory, including its policy.
     187                 :            :  *
     188                 :            :  * Persistent storage is not affected.
     189                 :            :  *
     190                 :            :  * \param[in,out] slot  The key slot to wipe.
     191                 :            :  *
     192                 :            :  * \retval #PSA_SUCCESS
     193                 :            :  *         Success. This includes the case of a key slot that was
     194                 :            :  *         already fully wiped.
     195                 :            :  * \retval #PSA_ERROR_CORRUPTION_DETECTED
     196                 :            :  */
     197                 :            : psa_status_t psa_wipe_key_slot( psa_key_slot_t *slot );
     198                 :            : 
     199                 :            : /** Try to allocate a buffer to an empty key slot.
     200                 :            :  *
     201                 :            :  * \param[in,out] slot          Key slot to attach buffer to.
     202                 :            :  * \param[in] buffer_length     Requested size of the buffer.
     203                 :            :  *
     204                 :            :  * \retval #PSA_SUCCESS
     205                 :            :  *         The buffer has been successfully allocated.
     206                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     207                 :            :  *         Not enough memory was available for allocation.
     208                 :            :  * \retval #PSA_ERROR_ALREADY_EXISTS
     209                 :            :  *         Trying to allocate a buffer to a non-empty key slot.
     210                 :            :  */
     211                 :            : psa_status_t psa_allocate_buffer_to_slot( psa_key_slot_t *slot,
     212                 :            :                                           size_t buffer_length );
     213                 :            : 
     214                 :            : /** Wipe key data from a slot. Preserves metadata such as the policy. */
     215                 :            : psa_status_t psa_remove_key_data_from_memory( psa_key_slot_t *slot );
     216                 :            : 
     217                 :            : /** Copy key data (in export format) into an empty key slot.
     218                 :            :  *
     219                 :            :  * This function assumes that the slot does not contain
     220                 :            :  * any key material yet. On failure, the slot content is unchanged.
     221                 :            :  *
     222                 :            :  * \param[in,out] slot          Key slot to copy the key into.
     223                 :            :  * \param[in] data              Buffer containing the key material.
     224                 :            :  * \param data_length           Size of the key buffer.
     225                 :            :  *
     226                 :            :  * \retval #PSA_SUCCESS
     227                 :            :  *         The key has been copied successfully.
     228                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     229                 :            :  *         Not enough memory was available for allocation of the
     230                 :            :  *         copy buffer.
     231                 :            :  * \retval #PSA_ERROR_ALREADY_EXISTS
     232                 :            :  *         There was other key material already present in the slot.
     233                 :            :  */
     234                 :            : psa_status_t psa_copy_key_material_into_slot( psa_key_slot_t *slot,
     235                 :            :                                               const uint8_t *data,
     236                 :            :                                               size_t data_length );
     237                 :            : 
     238                 :            : /** Convert an mbed TLS error code to a PSA error code
     239                 :            :  *
     240                 :            :  * \note This function is provided solely for the convenience of
     241                 :            :  *       Mbed TLS and may be removed at any time without notice.
     242                 :            :  *
     243                 :            :  * \param ret           An mbed TLS-thrown error code
     244                 :            :  *
     245                 :            :  * \return              The corresponding PSA error code
     246                 :            :  */
     247                 :            : psa_status_t mbedtls_to_psa_error( int ret );
     248                 :            : 
     249                 :            : /** Get Mbed TLS cipher information given the cipher algorithm PSA identifier
     250                 :            :  *  as well as the PSA type and size of the key to be used with the cipher
     251                 :            :  *  algorithm.
     252                 :            :  *
     253                 :            :  * \param       alg        PSA cipher algorithm identifier
     254                 :            :  * \param       key_type   PSA key type
     255                 :            :  * \param       key_bits   Size of the key in bits
     256                 :            :  * \param[out]  cipher_id  Mbed TLS cipher algorithm identifier
     257                 :            :  *
     258                 :            :  * \return  The Mbed TLS cipher information of the cipher algorithm.
     259                 :            :  *          \c NULL if the PSA cipher algorithm is not supported.
     260                 :            :  */
     261                 :            : const mbedtls_cipher_info_t *mbedtls_cipher_info_from_psa(
     262                 :            :     psa_algorithm_t alg, psa_key_type_t key_type, size_t key_bits,
     263                 :            :     mbedtls_cipher_id_t *cipher_id );
     264                 :            : 
     265                 :            : /** Import a key in binary format.
     266                 :            :  *
     267                 :            :  * \note The signature of this function is that of a PSA driver
     268                 :            :  *       import_key entry point. This function behaves as an import_key
     269                 :            :  *       entry point as defined in the PSA driver interface specification for
     270                 :            :  *       transparent drivers.
     271                 :            :  *
     272                 :            :  * \param[in]  attributes       The attributes for the key to import.
     273                 :            :  * \param[in]  data             The buffer containing the key data in import
     274                 :            :  *                              format.
     275                 :            :  * \param[in]  data_length      Size of the \p data buffer in bytes.
     276                 :            :  * \param[out] key_buffer       The buffer to contain the key data in output
     277                 :            :  *                              format upon successful return.
     278                 :            :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes. This
     279                 :            :  *                              size is greater or equal to \p data_length.
     280                 :            :  * \param[out] key_buffer_length  The length of the data written in \p
     281                 :            :  *                                key_buffer in bytes.
     282                 :            :  * \param[out] bits             The key size in number of bits.
     283                 :            :  *
     284                 :            :  * \retval #PSA_SUCCESS  The key was imported successfully.
     285                 :            :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     286                 :            :  *         The key data is not correctly formatted.
     287                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     288                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     289                 :            :  * \retval #PSA_ERROR_CORRUPTION_DETECTED
     290                 :            :  */
     291                 :            : psa_status_t psa_import_key_into_slot(
     292                 :            :     const psa_key_attributes_t *attributes,
     293                 :            :     const uint8_t *data, size_t data_length,
     294                 :            :     uint8_t *key_buffer, size_t key_buffer_size,
     295                 :            :     size_t *key_buffer_length, size_t *bits );
     296                 :            : 
     297                 :            : /** Export a key in binary format
     298                 :            :  *
     299                 :            :  * \note The signature of this function is that of a PSA driver export_key
     300                 :            :  *       entry point. This function behaves as an export_key entry point as
     301                 :            :  *       defined in the PSA driver interface specification.
     302                 :            :  *
     303                 :            :  * \param[in]  attributes       The attributes for the key to export.
     304                 :            :  * \param[in]  key_buffer       Material or context of the key to export.
     305                 :            :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     306                 :            :  * \param[out] data             Buffer where the key data is to be written.
     307                 :            :  * \param[in]  data_size        Size of the \p data buffer in bytes.
     308                 :            :  * \param[out] data_length      On success, the number of bytes written in
     309                 :            :  *                              \p data
     310                 :            :  *
     311                 :            :  * \retval #PSA_SUCCESS  The key was exported successfully.
     312                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     313                 :            :  * \retval #PSA_ERROR_COMMUNICATION_FAILURE
     314                 :            :  * \retval #PSA_ERROR_HARDWARE_FAILURE
     315                 :            :  * \retval #PSA_ERROR_CORRUPTION_DETECTED
     316                 :            :  * \retval #PSA_ERROR_STORAGE_FAILURE
     317                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     318                 :            :  */
     319                 :            : psa_status_t psa_export_key_internal(
     320                 :            :     const psa_key_attributes_t *attributes,
     321                 :            :     const uint8_t *key_buffer, size_t key_buffer_size,
     322                 :            :     uint8_t *data, size_t data_size, size_t *data_length );
     323                 :            : 
     324                 :            : /** Export a public key or the public part of a key pair in binary format.
     325                 :            :  *
     326                 :            :  * \note The signature of this function is that of a PSA driver
     327                 :            :  *       export_public_key entry point. This function behaves as an
     328                 :            :  *       export_public_key entry point as defined in the PSA driver interface
     329                 :            :  *       specification.
     330                 :            :  *
     331                 :            :  * \param[in]  attributes       The attributes for the key to export.
     332                 :            :  * \param[in]  key_buffer       Material or context of the key to export.
     333                 :            :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     334                 :            :  * \param[out] data             Buffer where the key data is to be written.
     335                 :            :  * \param[in]  data_size        Size of the \p data buffer in bytes.
     336                 :            :  * \param[out] data_length      On success, the number of bytes written in
     337                 :            :  *                              \p data
     338                 :            :  *
     339                 :            :  * \retval #PSA_SUCCESS  The public key was exported successfully.
     340                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     341                 :            :  * \retval #PSA_ERROR_COMMUNICATION_FAILURE
     342                 :            :  * \retval #PSA_ERROR_HARDWARE_FAILURE
     343                 :            :  * \retval #PSA_ERROR_CORRUPTION_DETECTED
     344                 :            :  * \retval #PSA_ERROR_STORAGE_FAILURE
     345                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     346                 :            :  */
     347                 :            : psa_status_t psa_export_public_key_internal(
     348                 :            :     const psa_key_attributes_t *attributes,
     349                 :            :     const uint8_t *key_buffer, size_t key_buffer_size,
     350                 :            :     uint8_t *data, size_t data_size, size_t *data_length );
     351                 :            : 
     352                 :            : /**
     353                 :            :  * \brief Generate a key.
     354                 :            :  *
     355                 :            :  * \note The signature of the function is that of a PSA driver generate_key
     356                 :            :  *       entry point.
     357                 :            :  *
     358                 :            :  * \param[in]  attributes         The attributes for the key to generate.
     359                 :            :  * \param[out] key_buffer         Buffer where the key data is to be written.
     360                 :            :  * \param[in]  key_buffer_size    Size of \p key_buffer in bytes.
     361                 :            :  * \param[out] key_buffer_length  On success, the number of bytes written in
     362                 :            :  *                                \p key_buffer.
     363                 :            :  *
     364                 :            :  * \retval #PSA_SUCCESS
     365                 :            :  *         The key was generated successfully.
     366                 :            :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     367                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     368                 :            :  *         Key size in bits or type not supported.
     369                 :            :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     370                 :            :  *         The size of \p key_buffer is too small.
     371                 :            :  */
     372                 :            : psa_status_t psa_generate_key_internal( const psa_key_attributes_t *attributes,
     373                 :            :                                         uint8_t *key_buffer,
     374                 :            :                                         size_t key_buffer_size,
     375                 :            :                                         size_t *key_buffer_length );
     376                 :            : 
     377                 :            : /** Sign a message with a private key. For hash-and-sign algorithms,
     378                 :            :  *  this includes the hashing step.
     379                 :            :  *
     380                 :            :  * \note The signature of this function is that of a PSA driver
     381                 :            :  *       sign_message entry point. This function behaves as a sign_message
     382                 :            :  *       entry point as defined in the PSA driver interface specification for
     383                 :            :  *       transparent drivers.
     384                 :            :  *
     385                 :            :  * \note This function will call the driver for psa_sign_hash
     386                 :            :  *       and go through driver dispatch again.
     387                 :            :  *
     388                 :            :  * \param[in]  attributes       The attributes of the key to use for the
     389                 :            :  *                              operation.
     390                 :            :  * \param[in]  key_buffer       The buffer containing the key context.
     391                 :            :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     392                 :            :  * \param[in]  alg              A signature algorithm that is compatible with
     393                 :            :  *                              the type of the key.
     394                 :            :  * \param[in]  input            The input message to sign.
     395                 :            :  * \param[in]  input_length     Size of the \p input buffer in bytes.
     396                 :            :  * \param[out] signature        Buffer where the signature is to be written.
     397                 :            :  * \param[in]  signature_size   Size of the \p signature buffer in bytes.
     398                 :            :  * \param[out] signature_length On success, the number of bytes
     399                 :            :  *                              that make up the returned signature value.
     400                 :            :  *
     401                 :            :  * \retval #PSA_SUCCESS
     402                 :            :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     403                 :            :  *         The size of the \p signature buffer is too small. You can
     404                 :            :  *         determine a sufficient buffer size by calling
     405                 :            :  *         #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg)
     406                 :            :  *         where \c key_type and \c key_bits are the type and bit-size
     407                 :            :  *         respectively of the key.
     408                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     409                 :            :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     410                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     411                 :            :  * \retval #PSA_ERROR_CORRUPTION_DETECTED
     412                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY
     413                 :            :  */
     414                 :            : psa_status_t psa_sign_message_builtin(
     415                 :            :     const psa_key_attributes_t *attributes,
     416                 :            :     const uint8_t *key_buffer, size_t key_buffer_size,
     417                 :            :     psa_algorithm_t alg, const uint8_t *input, size_t input_length,
     418                 :            :     uint8_t *signature, size_t signature_size, size_t *signature_length );
     419                 :            : 
     420                 :            : /** Verify the signature of a message with a public key, using
     421                 :            :  *  a hash-and-sign verification algorithm.
     422                 :            :  *
     423                 :            :  * \note The signature of this function is that of a PSA driver
     424                 :            :  *       verify_message entry point. This function behaves as a verify_message
     425                 :            :  *       entry point as defined in the PSA driver interface specification for
     426                 :            :  *       transparent drivers.
     427                 :            :  *
     428                 :            :  * \note This function will call the driver for psa_verify_hash
     429                 :            :  *       and go through driver dispatch again.
     430                 :            :  *
     431                 :            :  * \param[in]  attributes       The attributes of the key to use for the
     432                 :            :  *                              operation.
     433                 :            :  * \param[in]  key_buffer       The buffer containing the key context.
     434                 :            :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     435                 :            :  * \param[in]  alg              A signature algorithm that is compatible with
     436                 :            :  *                              the type of the key.
     437                 :            :  * \param[in]  input            The message whose signature is to be verified.
     438                 :            :  * \param[in]  input_length     Size of the \p input buffer in bytes.
     439                 :            :  * \param[in]  signature        Buffer containing the signature to verify.
     440                 :            :  * \param[in]  signature_length Size of the \p signature buffer in bytes.
     441                 :            :  *
     442                 :            :  * \retval #PSA_SUCCESS
     443                 :            :  *         The signature is valid.
     444                 :            :  * \retval #PSA_ERROR_INVALID_SIGNATURE
     445                 :            :  *         The calculation was performed successfully, but the passed
     446                 :            :  *         signature is not a valid signature.
     447                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     448                 :            :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     449                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     450                 :            :  */
     451                 :            : psa_status_t psa_verify_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                 :            :     const uint8_t *signature, size_t signature_length );
     456                 :            : 
     457                 :            : /** Sign an already-calculated hash with a private key.
     458                 :            :  *
     459                 :            :  * \note The signature of this function is that of a PSA driver
     460                 :            :  *       sign_hash entry point. This function behaves as a sign_hash
     461                 :            :  *       entry point as defined in the PSA driver interface specification for
     462                 :            :  *       transparent drivers.
     463                 :            :  *
     464                 :            :  * \param[in]  attributes       The attributes of the key to use for the
     465                 :            :  *                              operation.
     466                 :            :  * \param[in]  key_buffer       The buffer containing the key context.
     467                 :            :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     468                 :            :  * \param[in]  alg              A signature algorithm that is compatible with
     469                 :            :  *                              the type of the key.
     470                 :            :  * \param[in]  hash             The hash or message to sign.
     471                 :            :  * \param[in]  hash_length      Size of the \p hash buffer in bytes.
     472                 :            :  * \param[out] signature        Buffer where the signature is to be written.
     473                 :            :  * \param[in]  signature_size   Size of the \p signature buffer in bytes.
     474                 :            :  * \param[out] signature_length On success, the number of bytes
     475                 :            :  *                              that make up the returned signature value.
     476                 :            :  *
     477                 :            :  * \retval #PSA_SUCCESS
     478                 :            :  * \retval #PSA_ERROR_BUFFER_TOO_SMALL
     479                 :            :  *         The size of the \p signature buffer is too small. You can
     480                 :            :  *         determine a sufficient buffer size by calling
     481                 :            :  *         #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg)
     482                 :            :  *         where \c key_type and \c key_bits are the type and bit-size
     483                 :            :  *         respectively of the key.
     484                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     485                 :            :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     486                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     487                 :            :  * \retval #PSA_ERROR_CORRUPTION_DETECTED
     488                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY
     489                 :            :  */
     490                 :            : psa_status_t psa_sign_hash_builtin(
     491                 :            :     const psa_key_attributes_t *attributes,
     492                 :            :     const uint8_t *key_buffer, size_t key_buffer_size,
     493                 :            :     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
     494                 :            :     uint8_t *signature, size_t signature_size, size_t *signature_length );
     495                 :            : 
     496                 :            : /**
     497                 :            :  * \brief Verify the signature a hash or short message using a public key.
     498                 :            :  *
     499                 :            :  * \note The signature of this function is that of a PSA driver
     500                 :            :  *       verify_hash entry point. This function behaves as a verify_hash
     501                 :            :  *       entry point as defined in the PSA driver interface specification for
     502                 :            :  *       transparent drivers.
     503                 :            :  *
     504                 :            :  * \param[in]  attributes       The attributes of the key to use for the
     505                 :            :  *                              operation.
     506                 :            :  * \param[in]  key_buffer       The buffer containing the key context.
     507                 :            :  * \param[in]  key_buffer_size  Size of the \p key_buffer buffer in bytes.
     508                 :            :  * \param[in]  alg              A signature algorithm that is compatible with
     509                 :            :  *                              the type of the key.
     510                 :            :  * \param[in]  hash             The hash or message whose signature is to be
     511                 :            :  *                              verified.
     512                 :            :  * \param[in]  hash_length      Size of the \p hash buffer in bytes.
     513                 :            :  * \param[in]  signature        Buffer containing the signature to verify.
     514                 :            :  * \param[in]  signature_length Size of the \p signature buffer in bytes.
     515                 :            :  *
     516                 :            :  * \retval #PSA_SUCCESS
     517                 :            :  *         The signature is valid.
     518                 :            :  * \retval #PSA_ERROR_INVALID_SIGNATURE
     519                 :            :  *         The calculation was performed successfully, but the passed
     520                 :            :  *         signature is not a valid signature.
     521                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     522                 :            :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     523                 :            :  * \retval #PSA_ERROR_INSUFFICIENT_MEMORY
     524                 :            :  */
     525                 :            : psa_status_t psa_verify_hash_builtin(
     526                 :            :     const psa_key_attributes_t *attributes,
     527                 :            :     const uint8_t *key_buffer, size_t key_buffer_size,
     528                 :            :     psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
     529                 :            :     const uint8_t *signature, size_t signature_length );
     530                 :            : 
     531                 :            : /**
     532                 :            :  * \brief Validate the key bit size for unstructured keys.
     533                 :            :  *
     534                 :            :  * \note  Check that the bit size is acceptable for a given key type for
     535                 :            :  *        unstructured keys.
     536                 :            :  *
     537                 :            :  * \param[in]  type  The key type
     538                 :            :  * \param[in]  bits  The number of bits of the key
     539                 :            :  *
     540                 :            :  * \retval #PSA_SUCCESS
     541                 :            :  *         The key type and size are valid.
     542                 :            :  * \retval #PSA_ERROR_INVALID_ARGUMENT
     543                 :            :  *         The size in bits of the key is not valid.
     544                 :            :  * \retval #PSA_ERROR_NOT_SUPPORTED
     545                 :            :  *         The type and/or the size in bits of the key or the combination of
     546                 :            :  *         the two is not supported.
     547                 :            :  */
     548                 :            : psa_status_t psa_validate_unstructured_key_bit_size( psa_key_type_t type,
     549                 :            :                                                      size_t bits );
     550                 :            : #endif /* PSA_CRYPTO_CORE_H */

Generated by: LCOV version 1.14