LCOV - code coverage report
Current view: top level - library/spdm_common_lib - libspdm_com_support.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 53.1 % 194 103
Test Date: 2025-10-12 08:10:56 Functions: 62.1 % 29 18

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "internal/libspdm_common_lib.h"
       8              : 
       9              : #if LIBSPDM_DEBUG_PRINT_ENABLE
      10              : typedef struct {
      11              :     uint8_t code;
      12              :     const char *code_str;
      13              : } libspdm_code_str_struct_t;
      14              : 
      15       136371 : const char *libspdm_get_code_str(uint8_t request_code)
      16              : {
      17              :     size_t index;
      18              : 
      19              :     static const libspdm_code_str_struct_t code_str_struct[] = {
      20              :         /* SPDM response code (1.0) */
      21              :         { SPDM_DIGESTS, "SPDM_DIGESTS" },
      22              :         { SPDM_CERTIFICATE, "SPDM_CERTIFICATE" },
      23              :         { SPDM_CHALLENGE_AUTH, "SPDM_CHALLENGE_AUTH" },
      24              :         { SPDM_VERSION, "SPDM_VERSION" },
      25              :         { SPDM_MEASUREMENTS, "SPDM_MEASUREMENTS" },
      26              :         { SPDM_CAPABILITIES, "SPDM_CAPABILITIES" },
      27              :         { SPDM_ALGORITHMS, "SPDM_ALGORITHMS" },
      28              :         { SPDM_VENDOR_DEFINED_RESPONSE, "SPDM_VENDOR_DEFINED_RESPONSE" },
      29              :         { SPDM_ERROR, "SPDM_ERROR" },
      30              :         /* SPDM response code (1.1) */
      31              :         { SPDM_KEY_EXCHANGE_RSP, "SPDM_KEY_EXCHANGE_RSP" },
      32              :         { SPDM_FINISH_RSP, "SPDM_FINISH_RSP" },
      33              :         { SPDM_PSK_EXCHANGE_RSP, "SPDM_PSK_EXCHANGE_RSP" },
      34              :         { SPDM_PSK_FINISH_RSP, "SPDM_PSK_FINISH_RSP" },
      35              :         { SPDM_HEARTBEAT_ACK, "SPDM_HEARTBEAT_ACK" },
      36              :         { SPDM_KEY_UPDATE_ACK, "SPDM_KEY_UPDATE_ACK" },
      37              :         { SPDM_ENCAPSULATED_REQUEST, "SPDM_ENCAPSULATED_REQUEST" },
      38              :         { SPDM_ENCAPSULATED_RESPONSE_ACK, "SPDM_ENCAPSULATED_RESPONSE_ACK" },
      39              :         { SPDM_END_SESSION_ACK, "SPDM_END_SESSION_ACK" },
      40              :         /* SPDM response code (1.2) */
      41              :         { SPDM_CSR, "SPDM_CSR" },
      42              :         { SPDM_SET_CERTIFICATE_RSP, "SPDM_SET_CERTIFICATE_RSP" },
      43              :         { SPDM_CHUNK_SEND_ACK, "SPDM_CHUNK_SEND_ACK" },
      44              :         { SPDM_CHUNK_RESPONSE, "SPDM_CHUNK_RESPONSE" },
      45              :         /* SPDM response code (1.3 )*/
      46              :         { SPDM_SUPPORTED_EVENT_TYPES, "SPDM_SUPPORTED_EVENT_TYPES" },
      47              :         { SPDM_SUBSCRIBE_EVENT_TYPES_ACK, "SPDM_SUBSCRIBE_EVENT_TYPES_ACK" },
      48              :         { SPDM_EVENT_ACK, "SPDM_EVENT_ACK" },
      49              :         { SPDM_MEASUREMENT_EXTENSION_LOG, "SPDM_MEASUREMENT_EXTENSION_LOG" },
      50              :         { SPDM_KEY_PAIR_INFO, "SPDM_KEY_PAIR_INFO" },
      51              :         { SPDM_SET_KEY_PAIR_INFO_ACK, "SPDM_SET_KEY_PAIR_INFO_ACK" },
      52              :         { SPDM_ENDPOINT_INFO, "SPDM_ENDPOINT_INFO" },
      53              :         /* SPDM request code (1.0) */
      54              :         { SPDM_GET_DIGESTS, "SPDM_GET_DIGESTS" },
      55              :         { SPDM_GET_CERTIFICATE, "SPDM_GET_CERTIFICATE" },
      56              :         { SPDM_CHALLENGE, "SPDM_CHALLENGE" },
      57              :         { SPDM_GET_VERSION, "SPDM_GET_VERSION" },
      58              :         { SPDM_GET_MEASUREMENTS, "SPDM_GET_MEASUREMENTS" },
      59              :         { SPDM_GET_CAPABILITIES, "SPDM_GET_CAPABILITIES" },
      60              :         { SPDM_NEGOTIATE_ALGORITHMS, "SPDM_NEGOTIATE_ALGORITHMS" },
      61              :         { SPDM_VENDOR_DEFINED_REQUEST, "SPDM_VENDOR_DEFINED_REQUEST" },
      62              :         { SPDM_RESPOND_IF_READY, "SPDM_RESPOND_IF_READY" },
      63              :         /* SPDM request code (1.1) */
      64              :         { SPDM_KEY_EXCHANGE, "SPDM_KEY_EXCHANGE" },
      65              :         { SPDM_FINISH, "SPDM_FINISH" },
      66              :         { SPDM_PSK_EXCHANGE, "SPDM_PSK_EXCHANGE" },
      67              :         { SPDM_PSK_FINISH, "SPDM_PSK_FINISH" },
      68              :         { SPDM_HEARTBEAT, "SPDM_HEARTBEAT" },
      69              :         { SPDM_KEY_UPDATE, "SPDM_KEY_UPDATE" },
      70              :         { SPDM_GET_ENCAPSULATED_REQUEST, "SPDM_GET_ENCAPSULATED_REQUEST" },
      71              :         { SPDM_DELIVER_ENCAPSULATED_RESPONSE, "SPDM_DELIVER_ENCAPSULATED_RESPONSE" },
      72              :         { SPDM_END_SESSION, "SPDM_END_SESSION" },
      73              :         /* SPDM request code (1.2) */
      74              :         { SPDM_GET_CSR, "SPDM_GET_CSR" },
      75              :         { SPDM_SET_CERTIFICATE, "SPDM_SET_CERTIFICATE" },
      76              :         { SPDM_CHUNK_SEND, "SPDM_CHUNK_SEND" },
      77              :         { SPDM_CHUNK_GET, "SPDM_CHUNK_GET" },
      78              :         /* SPDM request code (1.3) */
      79              :         { SPDM_GET_SUPPORTED_EVENT_TYPES, "SPDM_GET_SUPPORTED_EVENT_TYPES" },
      80              :         { SPDM_SUBSCRIBE_EVENT_TYPES, "SPDM_SUBSCRIBE_EVENT_TYPES" },
      81              :         { SPDM_SEND_EVENT, "SPDM_SEND_EVENT" },
      82              :         { SPDM_GET_MEASUREMENT_EXTENSION_LOG, "SPDM_GET_MEASUREMENT_EXTENSION_LOG" },
      83              :         { SPDM_GET_KEY_PAIR_INFO, "SPDM_GET_KEY_PAIR_INFO" },
      84              :         { SPDM_SET_KEY_PAIR_INFO, "SPDM_SET_KEY_PAIR_INFO" },
      85              :         { SPDM_GET_ENDPOINT_INFO, "SPDM_GET_ENDPOINT_INFO" },
      86              :     };
      87              : 
      88      4892275 :     for (index = 0; index < LIBSPDM_ARRAY_SIZE(code_str_struct); index++) {
      89      4892273 :         if (request_code == code_str_struct[index].code) {
      90       136369 :             return code_str_struct[index].code_str;
      91              :         }
      92              :     }
      93              : 
      94            2 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "RequestResponseCode 0x%x not found.\n", request_code));
      95              : 
      96            2 :     return "<unknown>";
      97              : }
      98              : 
      99           31 : void libspdm_internal_dump_hex_str(const uint8_t *data, size_t size)
     100              : {
     101              :     size_t index;
     102         1023 :     for (index = 0; index < size; index++) {
     103          992 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "%02x", data[index]));
     104              :     }
     105           31 : }
     106              : 
     107       213703 : void libspdm_internal_dump_data(const uint8_t *data, size_t size)
     108              : {
     109              :     size_t index;
     110      3854626 :     for (index = 0; index < size; index++) {
     111      3640923 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "%02x ", data[index]));
     112              :     }
     113       213703 : }
     114              : 
     115       139137 : void libspdm_internal_dump_hex(const uint8_t *data, size_t size)
     116              : {
     117              :     size_t index;
     118              :     size_t count;
     119              :     size_t left;
     120              : 
     121              :     #define COLUMN_SIZE (16 * 2)
     122              : 
     123       139137 :     count = size / COLUMN_SIZE;
     124       139137 :     left = size % COLUMN_SIZE;
     125       211671 :     for (index = 0; index < count; index++) {
     126        72534 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "%04zx: ", index * COLUMN_SIZE));
     127        72534 :         LIBSPDM_INTERNAL_DUMP_DATA(data + index * COLUMN_SIZE, COLUMN_SIZE);
     128        72534 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     129              :     }
     130              : 
     131       139137 :     if (left != 0) {
     132       138802 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "%04zx: ", index * COLUMN_SIZE));
     133       138802 :         LIBSPDM_INTERNAL_DUMP_DATA(data + index * COLUMN_SIZE, left);
     134       138802 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     135              :     }
     136       139137 : }
     137              : #endif /* LIBSPDM_DEBUG_PRINT_ENABLE */
     138              : 
     139              : /**
     140              :  * Reads a 24-bit value from memory that may be unaligned.
     141              :  *
     142              :  * @param  buffer  The pointer to a 24-bit value that may be unaligned.
     143              :  *
     144              :  * @return The 24-bit value read from buffer.
     145              :  **/
     146          254 : uint32_t libspdm_read_uint24(const uint8_t *buffer)
     147              : {
     148          254 :     return (uint32_t)(buffer[0] | buffer[1] << 8 | buffer[2] << 16);
     149              : }
     150              : 
     151              : /**
     152              :  * Writes a 24-bit value to memory that may be unaligned.
     153              :  *
     154              :  * @param  buffer  The pointer to a 24-bit value that may be unaligned.
     155              :  * @param  value   24-bit value to write to buffer.
     156              :  **/
     157         2323 : void libspdm_write_uint24(uint8_t *buffer, uint32_t value)
     158              : {
     159         2323 :     buffer[0] = (uint8_t)(value & 0xFF);
     160         2323 :     buffer[1] = (uint8_t)((value >> 8) & 0xFF);
     161         2323 :     buffer[2] = (uint8_t)((value >> 16) & 0xFF);
     162         2323 : }
     163              : 
     164              : /**
     165              :  * Reads a 16-bit value from memory that may be unaligned.
     166              :  *
     167              :  * @param  buffer  The pointer to a 16-bit value that may be unaligned.
     168              :  *
     169              :  * @return The 16-bit value read from buffer.
     170              :  **/
     171          562 : uint16_t libspdm_read_uint16(const uint8_t *buffer)
     172              : {
     173          562 :     return (uint16_t)(buffer[0] | buffer[1] << 8);
     174              : }
     175              : 
     176              : /**
     177              :  * Writes a 16-bit value to memory that may be unaligned.
     178              :  *
     179              :  * @param  buffer  The pointer to a 16-bit value that may be unaligned.
     180              :  * @param  value   16-bit value to write to buffer.
     181              :  **/
     182          258 : void libspdm_write_uint16(uint8_t *buffer, uint16_t value)
     183              : {
     184          258 :     buffer[0] = (uint8_t)(value & 0xFF);
     185          258 :     buffer[1] = (uint8_t)((value >> 8) & 0xFF);
     186          258 : }
     187              : 
     188              : /**
     189              :  * Reads a 32-bit value from memory that may be unaligned.
     190              :  *
     191              :  * @param  buffer  The pointer to a 32-bit value that may be unaligned.
     192              :  *
     193              :  * @return The 32-bit value read from buffer.
     194              :  **/
     195          555 : uint32_t libspdm_read_uint32(const uint8_t *buffer)
     196              : {
     197          555 :     return (uint32_t)(buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24);
     198              : }
     199              : 
     200              : /**
     201              :  * Writes a 32-bit value to memory that may be unaligned.
     202              :  *
     203              :  * @param  buffer  The pointer to a 32-bit value that may be unaligned.
     204              :  * @param  value   32-bit value to write to buffer.
     205              :  **/
     206           22 : void libspdm_write_uint32(uint8_t *buffer, uint32_t value)
     207              : {
     208           22 :     buffer[0] = (uint8_t)(value & 0xFF);
     209           22 :     buffer[1] = (uint8_t)((value >> 8) & 0xFF);
     210           22 :     buffer[2] = (uint8_t)((value >> 16) & 0xFF);
     211           22 :     buffer[3] = (uint8_t)((value >> 24) & 0xFF);
     212           22 : }
     213              : 
     214              : /**
     215              :  * Reads a 64-bit value from memory that may be unaligned.
     216              :  *
     217              :  * @param  buffer  The pointer to a 64-bit value that may be unaligned.
     218              :  *
     219              :  * @return The 64-bit value read from buffer.
     220              :  **/
     221            0 : uint64_t libspdm_read_uint64(const uint8_t *buffer)
     222              : {
     223            0 :     return (uint64_t)(buffer[0]) |
     224            0 :            ((uint64_t)(buffer[1]) << 8) |
     225            0 :            ((uint64_t)(buffer[2]) << 16) |
     226            0 :            ((uint64_t)(buffer[3]) << 24) |
     227            0 :            ((uint64_t)(buffer[4]) << 32) |
     228            0 :            ((uint64_t)(buffer[5]) << 40) |
     229            0 :            ((uint64_t)(buffer[6]) << 48) |
     230            0 :            ((uint64_t)(buffer[7]) << 56);
     231              : }
     232              : 
     233              : /**
     234              :  * Writes a 64-bit value to memory that may be unaligned.
     235              :  *
     236              :  * @param  buffer  The pointer to a 64-bit value that may be unaligned.
     237              :  * @param  value   64-bit value to write to buffer.
     238              :  **/
     239            0 : void libspdm_write_uint64(uint8_t *buffer, uint64_t value)
     240              : {
     241            0 :     buffer[0] = (uint8_t)(value & 0xFF);
     242            0 :     buffer[1] = (uint8_t)((value >> 8) & 0xFF);
     243            0 :     buffer[2] = (uint8_t)((value >> 16) & 0xFF);
     244            0 :     buffer[3] = (uint8_t)((value >> 24) & 0xFF);
     245            0 :     buffer[4] = (uint8_t)((value >> 32) & 0xFF);
     246            0 :     buffer[5] = (uint8_t)((value >> 40) & 0xFF);
     247            0 :     buffer[6] = (uint8_t)((value >> 48) & 0xFF);
     248            0 :     buffer[7] = (uint8_t)((value >> 56) & 0xFF);
     249            0 : }
     250              : 
     251          451 : libspdm_return_t libspdm_append_managed_buffer(void *m_buffer, const void *buffer,
     252              :                                                size_t buffer_size)
     253              : {
     254              :     libspdm_managed_buffer_t *managed_buffer;
     255              : 
     256          451 :     LIBSPDM_ASSERT(buffer != NULL);
     257              : 
     258          451 :     if (buffer_size == 0) {
     259            0 :         return LIBSPDM_STATUS_SUCCESS;
     260              :     }
     261              : 
     262          451 :     managed_buffer = m_buffer;
     263              : 
     264          451 :     LIBSPDM_ASSERT(buffer_size != 0);
     265          451 :     LIBSPDM_ASSERT(managed_buffer->max_buffer_size >= managed_buffer->buffer_size);
     266              : 
     267          451 :     if (buffer_size > managed_buffer->max_buffer_size - managed_buffer->buffer_size) {
     268              :         /* Do not LIBSPDM_ASSERT here, because command processor will append message from external.*/
     269            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR,
     270              :                        "libspdm_append_managed_buffer 0x%x fail, rest 0x%x only\n",
     271              :                        (uint32_t)buffer_size,
     272              :                        (uint32_t)(managed_buffer->max_buffer_size - managed_buffer->buffer_size)));
     273            1 :         return LIBSPDM_STATUS_BUFFER_FULL;
     274              :     }
     275          450 :     LIBSPDM_ASSERT(buffer_size <= managed_buffer->max_buffer_size - managed_buffer->buffer_size);
     276              : 
     277          450 :     libspdm_copy_mem((uint8_t *)(managed_buffer + 1) + managed_buffer->buffer_size,
     278              :                      buffer_size, buffer, buffer_size);
     279          450 :     managed_buffer->buffer_size += buffer_size;
     280              : 
     281          450 :     return LIBSPDM_STATUS_SUCCESS;
     282              : }
     283              : 
     284          847 : void libspdm_reset_managed_buffer(void *m_buffer)
     285              : {
     286              :     libspdm_managed_buffer_t *managed_buffer;
     287              : 
     288          847 :     managed_buffer = m_buffer;
     289          847 :     managed_buffer->buffer_size = 0;
     290              : 
     291          847 :     libspdm_zero_mem(managed_buffer + 1, managed_buffer->max_buffer_size);
     292          847 : }
     293              : 
     294          679 : size_t libspdm_get_managed_buffer_size(void *m_buffer)
     295              : {
     296              :     libspdm_managed_buffer_t *managed_buffer;
     297              : 
     298          679 :     managed_buffer = m_buffer;
     299              : 
     300          679 :     return managed_buffer->buffer_size;
     301              : }
     302              : 
     303          668 : void *libspdm_get_managed_buffer(void *m_buffer)
     304              : {
     305              :     libspdm_managed_buffer_t *managed_buffer;
     306              : 
     307          668 :     managed_buffer = m_buffer;
     308              : 
     309          668 :     return (managed_buffer + 1);
     310              : }
     311              : 
     312          113 : void libspdm_init_managed_buffer(void *m_buffer, size_t max_buffer_size)
     313              : {
     314              :     libspdm_managed_buffer_t *managed_buffer;
     315              : 
     316          113 :     managed_buffer = m_buffer;
     317          113 :     managed_buffer->max_buffer_size = max_buffer_size;
     318              : 
     319          113 :     libspdm_reset_managed_buffer(m_buffer);
     320          113 : }
     321              : 
     322              : /**
     323              :  * byte3 - libspdm major version
     324              :  * byte2 - libspdm minor version
     325              :  * byte1 - libspdm patch version
     326              :  * byte0 - libspdm alpha
     327              :  *         (office release with tag: 0, release candidate with tag: 1, non official release: 0xFF)
     328              :  **/
     329            0 : uint32_t libspdm_module_version(void)
     330              : {
     331            0 :     return (LIBSPDM_MAJOR_VERSION << 24) |
     332              :            (LIBSPDM_MINOR_VERSION << 16) |
     333              :            (LIBSPDM_PATCH_VERSION << 8) |
     334              :            (LIBSPDM_ALPHA);
     335              : }
     336              : 
     337              : /*true: FIPS enabled, false: FIPS disabled*/
     338            0 : bool libspdm_get_fips_mode(void)
     339              : {
     340              : #if LIBSPDM_FIPS_MODE
     341            0 :     return true;
     342              : #else
     343              :     return false;
     344              : #endif
     345              : }
     346              : 
     347           75 : uint32_t libspdm_mask_capability_flags(libspdm_context_t *spdm_context,
     348              :                                        bool is_request_flags, uint32_t flags)
     349              : {
     350           75 :     switch (libspdm_get_connection_version(spdm_context)) {
     351            9 :     case SPDM_MESSAGE_VERSION_10:
     352            9 :         if (is_request_flags) {
     353              :             /* A 1.0 Requester does not have any capability flags. */
     354            2 :             return 0;
     355              :         } else {
     356            7 :             return (flags & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_10_MASK);
     357              :         }
     358           45 :     case SPDM_MESSAGE_VERSION_11:
     359           45 :         if (is_request_flags) {
     360           39 :             return (flags & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_11_MASK);
     361              :         } else {
     362            6 :             return (flags & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_11_MASK);
     363              :         }
     364           12 :     case SPDM_MESSAGE_VERSION_12:
     365           12 :         if (is_request_flags) {
     366           10 :             return (flags & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_12_MASK);
     367              :         } else {
     368            2 :             return (flags & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_12_MASK);
     369              :         }
     370            9 :     case SPDM_MESSAGE_VERSION_13:
     371            9 :         if (is_request_flags) {
     372            5 :             return (flags & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_13_MASK);
     373              :         } else {
     374            4 :             return (flags & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_13_MASK);
     375              :         }
     376            0 :     case SPDM_MESSAGE_VERSION_14:
     377            0 :         if (is_request_flags) {
     378            0 :             return (flags & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_14_MASK);
     379              :         } else {
     380            0 :             return (flags & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_14_MASK);
     381              :         }
     382            0 :     default:
     383            0 :         LIBSPDM_ASSERT(false);
     384            0 :         return 0;
     385              :     }
     386              : }
     387              : 
     388            0 : uint16_t libspdm_mask_capability_ext_flags(libspdm_context_t *spdm_context,
     389              :                                            bool is_request_flags, uint16_t ext_flags)
     390              : {
     391            0 :     switch (libspdm_get_connection_version(spdm_context)) {
     392            0 :     case SPDM_MESSAGE_VERSION_10:
     393              :     case SPDM_MESSAGE_VERSION_11:
     394              :     case SPDM_MESSAGE_VERSION_12:
     395              :     case SPDM_MESSAGE_VERSION_13:
     396              :         /* No extended capability flags are defined for SPDM 1.0 - 1.3. */
     397            0 :         return 0;
     398            0 :     case SPDM_MESSAGE_VERSION_14:
     399            0 :         if (is_request_flags) {
     400              :             /* No extended request flags are defined for SPDM 1.4. */
     401            0 :             return 0;
     402              :         } else {
     403            0 :             return (ext_flags & SPDM_GET_CAPABILITIES_EXTENDED_RESPONSE_FLAGS_14_MASK);
     404              :         }
     405            0 :     default:
     406            0 :         LIBSPDM_ASSERT(false);
     407            0 :         return 0;
     408              :     }
     409              : }
     410              : 
     411            0 : uint32_t libspdm_mask_base_hash_algo(libspdm_context_t *spdm_context, uint32_t base_hash_algo)
     412              : {
     413            0 :     const uint8_t spdm_version = libspdm_get_connection_version(spdm_context);
     414              : 
     415            0 :     if (spdm_version >= SPDM_MESSAGE_VERSION_12) {
     416            0 :         return (base_hash_algo & SPDM_ALGORITHMS_BASE_HASH_ALGO_12_MASK);
     417              :     } else {
     418            0 :         return (base_hash_algo & SPDM_ALGORITHMS_BASE_HASH_ALGO_10_MASK);
     419              :     }
     420              : }
     421              : 
     422            0 : uint32_t libspdm_mask_measurement_hash_algo(libspdm_context_t *spdm_context,
     423              :                                             uint32_t measurement_hash_algo)
     424              : {
     425            0 :     const uint8_t spdm_version = libspdm_get_connection_version(spdm_context);
     426              : 
     427            0 :     if (spdm_version >= SPDM_MESSAGE_VERSION_12) {
     428            0 :         return (measurement_hash_algo & SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_12_MASK);
     429              :     } else {
     430            0 :         return (measurement_hash_algo & SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_10_MASK);
     431              :     }
     432              : }
     433              : 
     434            0 : uint8_t libspdm_mask_measurement_specification(libspdm_context_t *spdm_context,
     435              :                                                uint8_t measurement_specification)
     436              : {
     437            0 :     return (measurement_specification & SPDM_MEASUREMENT_SPECIFICATION_10_MASK);
     438              : }
     439              : 
     440            0 : uint8_t libspdm_mask_mel_specification(libspdm_context_t *spdm_context, uint8_t mel_specification)
     441              : {
     442            0 :     LIBSPDM_ASSERT(libspdm_get_connection_version(spdm_context) >= SPDM_MESSAGE_VERSION_13);
     443              : 
     444            0 :     return (mel_specification & SPDM_MEL_SPECIFICATION_13_MASK);
     445              : }
     446              : 
     447            0 : uint32_t libspdm_mask_base_asym_algo(libspdm_context_t *spdm_context, uint32_t base_asym_algo)
     448              : {
     449            0 :     const uint8_t spdm_version = libspdm_get_connection_version(spdm_context);
     450              : 
     451            0 :     if (spdm_version >= SPDM_MESSAGE_VERSION_12) {
     452            0 :         return (base_asym_algo & SPDM_ALGORITHMS_BASE_ASYM_ALGO_12_MASK);
     453              :     } else {
     454            0 :         return (base_asym_algo & SPDM_ALGORITHMS_BASE_ASYM_ALGO_10_MASK);
     455              :     }
     456              : }
     457              : 
     458            0 : uint16_t libspdm_mask_alg_supported(libspdm_context_t *spdm_context, uint8_t alg_type,
     459              :                                     uint16_t alg_supported)
     460              : {
     461            0 :     const uint8_t spdm_version = libspdm_get_connection_version(spdm_context);
     462              : 
     463            0 :     LIBSPDM_ASSERT(spdm_version >= SPDM_MESSAGE_VERSION_11);
     464              : 
     465            0 :     switch (alg_type) {
     466            0 :     case SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_DHE:
     467            0 :         if (spdm_version >= SPDM_MESSAGE_VERSION_12) {
     468            0 :             return (alg_supported & SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_DHE_12_MASK);
     469              :         } else {
     470            0 :             return (alg_supported & SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_DHE_11_MASK);
     471              :         }
     472            0 :     case SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_AEAD:
     473            0 :         if (spdm_version >= SPDM_MESSAGE_VERSION_12) {
     474            0 :             return (alg_supported & SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_AEAD_12_MASK);
     475              :         } else {
     476            0 :             return (alg_supported & SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_AEAD_11_MASK);
     477              :         }
     478            0 :     case SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_REQ_BASE_ASYM_ALG:
     479            0 :         if (spdm_version >= SPDM_MESSAGE_VERSION_12) {
     480            0 :             return (alg_supported &
     481              :                     SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_REQ_BASE_ASYM_ALG_12_MASK);
     482              :         } else {
     483            0 :             return (alg_supported &
     484              :                     SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_REQ_BASE_ASYM_ALG_11_MASK);
     485              :         }
     486            0 :     case SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_KEY_SCHEDULE:
     487            0 :         return (alg_supported & SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_KEY_SCHEDULE_11_MASK);
     488            0 :     default:
     489            0 :         LIBSPDM_ASSERT(false);
     490            0 :         return 0;
     491              :     }
     492              : }
     493              : 
     494           35 : bool libspdm_validate_svh_vendor_id_len(uint16_t id, uint8_t vendor_id_len)
     495              : {
     496           35 :     switch (id) {
     497           28 :     case SPDM_REGISTRY_ID_DMTF:
     498              :     case SPDM_REGISTRY_ID_VESA:
     499           28 :         return (vendor_id_len == 0);
     500            7 :     case SPDM_REGISTRY_ID_TCG:
     501              :     case SPDM_REGISTRY_ID_USB:
     502              :     case SPDM_REGISTRY_ID_PCISIG:
     503              :     case SPDM_REGISTRY_ID_MIPI:
     504              :     case SPDM_REGISTRY_ID_CXL:
     505              :     case SPDM_REGISTRY_ID_JEDEC:
     506            7 :         return ((vendor_id_len == 0) || (vendor_id_len == 2));
     507            0 :     case SPDM_REGISTRY_ID_IANA:
     508              :     case SPDM_REGISTRY_ID_HDBASET:
     509            0 :         return ((vendor_id_len == 0) || (vendor_id_len == 4));
     510            0 :     case SPDM_REGISTRY_ID_IANA_CBOR:
     511            0 :         return true;
     512            0 :     case SPDM_REGISTRY_ID_DMTF_DSP:
     513            0 :         return (vendor_id_len == 2);
     514            0 :     default:
     515            0 :         return false;
     516              :     }
     517              : }
     518              : 
     519          100 : bool libspdm_check_for_space(const uint8_t *ptr, const uint8_t *end_ptr, size_t increment)
     520              : {
     521          100 :     LIBSPDM_ASSERT(ptr <= end_ptr);
     522              : 
     523          100 :     return ((uintptr_t)(end_ptr - ptr) >= increment);
     524              : }
        

Generated by: LCOV version 2.0-1