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: 56.3 % 174 98
Test Date: 2025-06-29 08:09:00 Functions: 63.0 % 27 17

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

Generated by: LCOV version 2.0-1