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 : : }
|