LCOV - code coverage report
Current view: top level - spdm_transport_mctp_lib - libspdm_mctp_mctp.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 38.9 % 54 21
Test Date: 2026-10-01 20:56:25 Functions: 60.0 % 5 3
Branches: 14.8 % 27 4

             Branch data     Line data    Source code
       1                 :             : /**
       2                 :             :  *  Copyright Notice:
       3                 :             :  *  Copyright 2021-2026 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 "library/spdm_transport_mctp_lib.h"
       8                 :             : #include "industry_standard/mctp.h"
       9                 :             : #include "internal/libspdm_common_lib.h"
      10                 :             : #include "hal/library/debuglib.h"
      11                 :             : #include "hal/library/memlib.h"
      12                 :             : 
      13                 :           2 : uint8_t libspdm_mctp_get_sequence_number(uint64_t sequence_number,
      14                 :             :                                          uint8_t *sequence_number_buffer)
      15                 :             : {
      16                 :           2 :     libspdm_copy_mem(sequence_number_buffer, LIBSPDM_MCTP_SEQUENCE_NUMBER_COUNT,
      17                 :             :                      &sequence_number, LIBSPDM_MCTP_SEQUENCE_NUMBER_COUNT);
      18                 :           2 :     return LIBSPDM_MCTP_SEQUENCE_NUMBER_COUNT;
      19                 :             : }
      20                 :             : 
      21                 :           0 : uint32_t libspdm_mctp_get_max_random_number_count(void)
      22                 :             : {
      23                 :           0 :     return LIBSPDM_MCTP_MAX_RANDOM_NUMBER_COUNT;
      24                 :             : }
      25                 :             : 
      26                 :           2 : spdm_version_number_t libspdm_mctp_get_secured_spdm_version(
      27                 :             :     spdm_version_number_t secured_message_version)
      28                 :             : {
      29                 :             :     /* DSP0276 uses the same version number as DSP0277 */
      30                 :           2 :     return secured_message_version;
      31                 :             : }
      32                 :             : 
      33                 :             : /**
      34                 :             :  * Encode a normal message or secured message to a transport message.
      35                 :             :  *
      36                 :             :  * @param  session_id                    Indicates if it is a secured message protected via SPDM session.
      37                 :             :  *                                     If session_id is NULL, it is a normal message.
      38                 :             :  *                                     If session_id is NOT NULL, it is a secured message.
      39                 :             :  * @param  message_size                  size in bytes of the message data buffer.
      40                 :             :  * @param  message                      A pointer to a source buffer to store the message.
      41                 :             :  * @param  transport_message_size         size in bytes of the transport message data buffer.
      42                 :             :  * @param  transport_message             A pointer to a destination buffer to store the transport message.
      43                 :             :  **/
      44                 :           1 : libspdm_return_t libspdm_mctp_encode_message(const uint32_t *session_id,
      45                 :             :                                              bool need_alignment,
      46                 :             :                                              size_t message_size,
      47                 :             :                                              void *message,
      48                 :             :                                              size_t *transport_message_size,
      49                 :             :                                              void **transport_message)
      50                 :             : {
      51                 :             :     size_t aligned_message_size;
      52                 :             :     size_t alignment;
      53                 :             :     uint32_t data32;
      54                 :             :     mctp_message_header_t *mctp_message_header;
      55                 :             : 
      56         [ +  - ]:           1 :     if (need_alignment) {
      57                 :           1 :         alignment = LIBSPDM_MCTP_ALIGNMENT;
      58                 :             :     } else {
      59                 :           0 :         alignment = 1;
      60                 :             :     }
      61                 :           1 :     aligned_message_size =
      62                 :           1 :         (message_size + (alignment - 1)) & ~(alignment - 1);
      63                 :             : 
      64         [ -  + ]:           1 :     LIBSPDM_ASSERT(*transport_message_size >=
      65                 :             :                    aligned_message_size + sizeof(mctp_message_header_t));
      66                 :           1 :     if (*transport_message_size <
      67         [ -  + ]:           1 :         aligned_message_size + sizeof(mctp_message_header_t)) {
      68                 :           0 :         *transport_message_size = aligned_message_size +
      69                 :             :                                   sizeof(mctp_message_header_t);
      70                 :           0 :         return LIBSPDM_STATUS_BUFFER_TOO_SMALL;
      71                 :             :     }
      72                 :             : 
      73                 :           1 :     *transport_message_size =
      74                 :           1 :         aligned_message_size + sizeof(mctp_message_header_t);
      75                 :           1 :     *transport_message = (uint8_t *)message - sizeof(mctp_message_header_t);
      76                 :           1 :     mctp_message_header = *transport_message;
      77         [ -  + ]:           1 :     if (session_id != NULL) {
      78                 :           0 :         mctp_message_header->message_type =
      79                 :             :             MCTP_MESSAGE_TYPE_SECURED_MCTP;
      80                 :           0 :         data32 = libspdm_read_uint32((const uint8_t *)message);
      81         [ #  # ]:           0 :         LIBSPDM_ASSERT(*session_id == data32);
      82         [ #  # ]:           0 :         if (*session_id != data32) {
      83                 :           0 :             return LIBSPDM_STATUS_INVALID_MSG_FIELD;
      84                 :             :         }
      85                 :             :     } else {
      86                 :           1 :         mctp_message_header->message_type = MCTP_MESSAGE_TYPE_SPDM;
      87                 :             :     }
      88                 :           1 :     libspdm_zero_mem((uint8_t *)message + message_size,
      89                 :             :                      aligned_message_size - message_size);
      90                 :           1 :     return LIBSPDM_STATUS_SUCCESS;
      91                 :             : }
      92                 :             : 
      93                 :             : /**
      94                 :             :  * Decode a transport message to a normal message or secured message.
      95                 :             :  *
      96                 :             :  * @param  session_id                    Indicates if it is a secured message protected via SPDM session.
      97                 :             :  *                                     If *session_id is NULL, it is a normal message.
      98                 :             :  *                                     If *session_id is NOT NULL, it is a secured message.
      99                 :             :  * @param  transport_message_size         size in bytes of the transport message data buffer.
     100                 :             :  * @param  transport_message             A pointer to a source buffer to store the transport message.
     101                 :             :  * @param  message_size                  size in bytes of the message data buffer.
     102                 :             :  * @param  message                      A pointer to a destination buffer to store the message.
     103                 :             :  **/
     104                 :           0 : libspdm_return_t libspdm_mctp_decode_message(uint32_t **session_id,
     105                 :             :                                              bool need_alignment,
     106                 :             :                                              size_t transport_message_size,
     107                 :             :                                              void *transport_message,
     108                 :             :                                              size_t *message_size, void **message)
     109                 :             : {
     110                 :             :     const mctp_message_header_t *mctp_message_header;
     111                 :             : 
     112         [ #  # ]:           0 :     LIBSPDM_ASSERT(transport_message_size > sizeof(mctp_message_header_t));
     113         [ #  # ]:           0 :     if (transport_message_size <= sizeof(mctp_message_header_t)) {
     114                 :           0 :         return LIBSPDM_STATUS_INVALID_MSG_SIZE;
     115                 :             :     }
     116                 :             : 
     117                 :           0 :     mctp_message_header = transport_message;
     118                 :             : 
     119      [ #  #  # ]:           0 :     switch (mctp_message_header->message_type) {
     120                 :           0 :     case MCTP_MESSAGE_TYPE_SECURED_MCTP:
     121         [ #  # ]:           0 :         LIBSPDM_ASSERT(session_id != NULL);
     122         [ #  # ]:           0 :         if (session_id == NULL) {
     123                 :           0 :             return LIBSPDM_STATUS_INVALID_MSG_FIELD;
     124                 :             :         }
     125         [ #  # ]:           0 :         if (transport_message_size <=
     126                 :             :             sizeof(mctp_message_header_t) + sizeof(uint32_t)) {
     127                 :           0 :             return LIBSPDM_STATUS_INVALID_MSG_SIZE;
     128                 :             :         }
     129                 :           0 :         *session_id = (void *)((uint8_t *)transport_message +
     130                 :             :                                sizeof(mctp_message_header_t));
     131                 :           0 :         break;
     132                 :           0 :     case MCTP_MESSAGE_TYPE_SPDM:
     133         [ #  # ]:           0 :         if (session_id != NULL) {
     134                 :           0 :             *session_id = NULL;
     135                 :             :         }
     136                 :           0 :         break;
     137                 :           0 :     default:
     138                 :           0 :         return LIBSPDM_STATUS_UNSUPPORTED_CAP;
     139                 :             :     }
     140                 :             : 
     141                 :             :     if (need_alignment) {
     142                 :             :         LIBSPDM_ASSERT(((transport_message_size - sizeof(mctp_message_header_t)) &
     143                 :             :                         (LIBSPDM_MCTP_ALIGNMENT - 1)) == 0);
     144                 :             :     }
     145                 :             : 
     146                 :           0 :     *message_size = transport_message_size - sizeof(mctp_message_header_t);
     147                 :           0 :     *message = (uint8_t *)transport_message + sizeof(mctp_message_header_t);
     148                 :           0 :     return LIBSPDM_STATUS_SUCCESS;
     149                 :             : }
        

Generated by: LCOV version 2.0-1