1 /** 2 * Copyright Notice: 3 * Copyright 2021-2022 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 #ifndef SPDM_LIB_CONFIG_H 8 #define SPDM_LIB_CONFIG_H 9 10 /* Enables assertions and debug printing. When `LIBSPDM_DEBUG_ENABLE` is defined it overrides or 11 * sets the values of `LIBSPDM_DEBUG_PRINT_ENABLE`, `LIBSPDM_DEBUG_ASSERT_ENABLE`, and 12 * `LIBSPDM_BLOCK_ENABLE` to the value of `LIBSPDM_DEBUG_ENABLE`. 13 * 14 * Note that if this file is used with CMake and `DTARGET=Release` is defined, then all debugging 15 * is disabled. 16 */ 17 #ifndef LIBSPDM_DEBUG_ENABLE 18 #define LIBSPDM_DEBUG_ENABLE 1 19 #endif 20 21 /* The SPDM specification allows a Responder to return up to 256 version entries in the `VERSION` 22 * response to the Requester, including duplicate entries. For a Requester this value specifies the 23 * maximum number of entries that libspdm will tolerate in a `VERSION` response before returning an 24 * error. A similiar macro, `SPDM_MAX_VERSION_COUNT`, exists for the Responder. However this macro 25 * is not meant to be configured by the Integrator. 26 */ 27 #ifndef LIBSPDM_MAX_VERSION_COUNT 28 #define LIBSPDM_MAX_VERSION_COUNT 5 29 #endif 30 31 /* This value specifies the maximum size, in bytes, of the `PSK_EXCHANGE.RequesterContext` and, 32 * if supported by the Responder, `PSK_EXCHANGE_RSP.ResponderContext` fields. The fields are 33 * typically random or monotonically increasing numbers. 34 */ 35 #ifndef LIBSPDM_PSK_CONTEXT_LENGTH 36 #define LIBSPDM_PSK_CONTEXT_LENGTH LIBSPDM_MAX_HASH_SIZE 37 #endif 38 /* This value specifies the maximum size, in bytes, of the `PSK_EXCHANGE.PSKHint` field.*/ 39 #ifndef LIBSPDM_PSK_MAX_HINT_LENGTH 40 #define LIBSPDM_PSK_MAX_HINT_LENGTH 16 41 #endif 42 43 /* libspdm allows an Integrator to specify multiple root certificates as trust anchors when 44 * verifying certificate chains from an endpoint. This value specifies the maximum number of root 45 * certificates that libspdm can support. 46 */ 47 #ifndef LIBSPDM_MAX_ROOT_CERT_SUPPORT 48 #define LIBSPDM_MAX_ROOT_CERT_SUPPORT 10 49 #endif 50 51 /* If the Responder supports it a Requester is allowed to establish multiple secure sessions with 52 * the Responder. This value specifies the maximum number of sessions libspdm can support. 53 */ 54 #ifndef LIBSPDM_MAX_SESSION_COUNT 55 #define LIBSPDM_MAX_SESSION_COUNT 4 56 #endif 57 /* This value specifies the maximum size, in bytes, of a certificate chain that can be stored in a 58 * libspdm context. 59 */ 60 #ifndef LIBSPDM_MAX_CERT_CHAIN_SIZE 61 #define LIBSPDM_MAX_CERT_CHAIN_SIZE 0x1000 62 #endif 63 #ifndef LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE 64 #define LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE 0x1000 65 #endif 66 /* Partial certificates can be retrieved from a Requester or Responder and through multiple messages 67 * the complete certificate chain can be constructed. This value specifies the maximum size, 68 * in bytes, of a partial certificate that can be sent or received. 69 */ 70 #ifndef LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN 71 #define LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN 1024 72 #endif 73 74 #ifndef LIBSPDM_MAX_MESSAGE_BUFFER_SIZE 75 #define LIBSPDM_MAX_MESSAGE_BUFFER_SIZE 0x1200 76 #endif 77 #ifndef LIBSPDM_MAX_MESSAGE_SMALL_BUFFER_SIZE 78 #define LIBSPDM_MAX_MESSAGE_SMALL_BUFFER_SIZE 0x100 /* to hold message_a before negotiate*/ 79 #endif 80 #ifndef LIBSPDM_MAX_MESSAGE_MEDIUM_BUFFER_SIZE 81 #define LIBSPDM_MAX_MESSAGE_MEDIUM_BUFFER_SIZE 0x300 /* to hold message_k before finished_key is ready*/ 82 #endif 83 84 /* If the Responder replies with a Busy `ERROR` response to a request then the Requester is free to 85 * retry sending the request. This value specifies the maximum number of times libspdm will retry 86 * sending the request before returning an error. If its value is 0 then libspdm will not send any 87 * retry requests. 88 */ 89 #ifndef LIBSPDM_MAX_REQUEST_RETRY_TIMES 90 #define LIBSPDM_MAX_REQUEST_RETRY_TIMES 3 91 #endif 92 #ifndef LIBSPDM_MAX_SESSION_STATE_CALLBACK_NUM 93 #define LIBSPDM_MAX_SESSION_STATE_CALLBACK_NUM 4 94 #endif 95 #ifndef LIBSPDM_MAX_CONNECTION_STATE_CALLBACK_NUM 96 #define LIBSPDM_MAX_CONNECTION_STATE_CALLBACK_NUM 4 97 #endif 98 #ifndef LIBSPDM_MAX_KEY_UPDATE_CALLBACK_NUM 99 #define LIBSPDM_MAX_KEY_UPDATE_CALLBACK_NUM 4 100 #endif 101 102 #ifndef LIBSPDM_MAX_CSR_SIZE 103 #define LIBSPDM_MAX_CSR_SIZE 0x1000 104 #endif 105 106 /* To ensure integrity in communication between the Requester and the Responder libspdm calculates 107 * cryptographic digests and signatures over multiple requests and responses. This value specifies 108 * whether libspdm will use a running calculation over the transcript, where requests and responses 109 * are discarded as they are cryptographically consumed, or whether libspdm will buffer the entire 110 * transcript before calculating the digest or signature. 111 */ 112 #ifndef LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT 113 #define LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT 0 114 #endif 115 116 117 /* Cryptography Configuration 118 * In each category, at least one should be selected. 119 * NOTE: Not all combination can be supported. E.g. Don't mix NIST algo with SMx.*/ 120 121 #ifndef LIBSPDM_RSA_SSA_SUPPORT 122 #define LIBSPDM_RSA_SSA_SUPPORT 1 123 #endif 124 #ifndef LIBSPDM_RSA_PSS_SUPPORT 125 #define LIBSPDM_RSA_PSS_SUPPORT 1 126 #endif 127 #ifndef LIBSPDM_ECDSA_SUPPORT 128 #define LIBSPDM_ECDSA_SUPPORT 1 129 #endif 130 #ifndef LIBSPDM_SM2_DSA_SUPPORT 131 #define LIBSPDM_SM2_DSA_SUPPORT 1 132 #endif 133 #ifndef LIBSPDM_EDDSA_ED25519_SUPPORT 134 #define LIBSPDM_EDDSA_ED25519_SUPPORT 1 135 #endif 136 #ifndef LIBSPDM_EDDSA_ED448_SUPPORT 137 #define LIBSPDM_EDDSA_ED448_SUPPORT 1 138 #endif 139 140 #ifndef LIBSPDM_FFDHE_SUPPORT 141 #define LIBSPDM_FFDHE_SUPPORT 1 142 #endif 143 #ifndef LIBSPDM_ECDHE_SUPPORT 144 #define LIBSPDM_ECDHE_SUPPORT 1 145 #endif 146 #ifndef LIBSPDM_SM2_KEY_EXCHANGE_SUPPORT 147 #define LIBSPDM_SM2_KEY_EXCHANGE_SUPPORT 1 148 #endif 149 150 #ifndef LIBSPDM_AEAD_GCM_SUPPORT 151 #define LIBSPDM_AEAD_GCM_SUPPORT 1 152 #endif 153 #ifndef LIBSPDM_AEAD_CHACHA20_POLY1305_SUPPORT 154 #define LIBSPDM_AEAD_CHACHA20_POLY1305_SUPPORT 1 155 #endif 156 #ifndef LIBSPDM_AEAD_SM4_SUPPORT 157 #define LIBSPDM_AEAD_SM4_SUPPORT 1 158 #endif 159 160 #ifndef LIBSPDM_SHA256_SUPPORT 161 #define LIBSPDM_SHA256_SUPPORT 1 162 #endif 163 #ifndef LIBSPDM_SHA384_SUPPORT 164 #define LIBSPDM_SHA384_SUPPORT 1 165 #endif 166 #ifndef LIBSPDM_SHA512_SUPPORT 167 #define LIBSPDM_SHA512_SUPPORT 1 168 #endif 169 #ifndef LIBSPDM_SHA3_256_SUPPORT 170 #define LIBSPDM_SHA3_256_SUPPORT 1 171 #endif 172 #ifndef LIBSPDM_SHA3_384_SUPPORT 173 #define LIBSPDM_SHA3_384_SUPPORT 1 174 #endif 175 #ifndef LIBSPDM_SHA3_512_SUPPORT 176 #define LIBSPDM_SHA3_512_SUPPORT 1 177 #endif 178 #ifndef LIBSPDM_SM3_256_SUPPORT 179 #define LIBSPDM_SM3_256_SUPPORT 1 180 #endif 181 182 /* Code space optimization for Optional request/response messages.*/ 183 184 /* Consumers of libspdm may wish to not fully implement all of the optional 185 * SPDM request/response messages. Therefore we have provided these 186 * SPDM_ENABLE_CAPABILITY_***_CAP compile time switches as an optimization 187 * disable the code (#if 0) related to said optional capability, thereby 188 * reducing the code space used in the image.*/ 189 190 /* A single switch may enable/disable a single capability or group of related 191 * capabilities.*/ 192 193 /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP - Enable/Disable single CERT capability. 194 * LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP - Enable/Disable single CHAL capability. 195 * LIBSPDM_ENABLE_CAPABILTIY_MEAS_CAP - Enable/Disables multiple MEAS capabilities: 196 * (MEAS_CAP_NO_SIG, MEAS_CAP_SIG, MEAS_FRESH_CAP)*/ 197 198 /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP - Enable/Disable single Key Exchange capability. 199 * LIBSPDM_ENABLE_CAPABILITY_PSK_EX_CAP - Enable/Disable PSK_EX and PSK_FINISH.*/ 200 201 /* LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP - Enable/Disable mutual authentication. 202 * LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP - Enable/Disable encapsulated message.*/ 203 204 /* LIBSPDM_ENABLE_CAPABILITY_GET_CSR_CAP - Enable/Disable get csr capability. 205 * LIBSPDM_ENABLE_CAPABILITY_SET_CERTIFICATE_CAP - Enable/Disable set certificate capability. */ 206 207 #ifndef LIBSPDM_ENABLE_CAPABILITY_CERT_CAP 208 #define LIBSPDM_ENABLE_CAPABILITY_CERT_CAP 1 209 #endif 210 211 #ifndef LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP 212 #define LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP 1 213 #endif 214 215 #ifndef LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP 216 #define LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP 1 217 #endif 218 219 #ifndef LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP 220 #define LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP 1 221 #endif 222 223 #ifndef LIBSPDM_ENABLE_CAPABILITY_PSK_EX_CAP 224 #define LIBSPDM_ENABLE_CAPABILITY_PSK_EX_CAP 1 225 #endif 226 227 #ifndef LIBSPDM_ENABLE_CAPABILITY_HBEAT_CAP 228 #define LIBSPDM_ENABLE_CAPABILITY_HBEAT_CAP 1 229 #endif 230 231 #ifndef LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP 232 #define LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP 1 233 #endif 234 235 #ifndef LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP 236 #define LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP 1 237 #endif 238 239 #ifndef LIBSPDM_ENABLE_CAPABILITY_GET_CSR_CAP 240 #define LIBSPDM_ENABLE_CAPABILITY_GET_CSR_CAP 1 241 #endif 242 243 #ifndef LIBSPDM_ENABLE_CAPABILITY_SET_CERTIFICATE_CAP 244 #define LIBSPDM_ENABLE_CAPABILITY_SET_CERTIFICATE_CAP 1 245 #endif 246 247 #ifndef LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP 248 #define LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP 1 249 #endif 250 251 /* 252 * MinDataTransferSize = 42 253 * 254 * H = HashLen = HmacLen = [32, 64] 255 * S = SigLen = [64, 512] 256 * D = ExchangeDataLen = [64, 512] 257 * R = RequesterContextLen >= 32 258 * R = ResponderContextLen >= 0 259 * O = OpaqueDataLen <= 1024 260 * 261 * Max Chunk No = 1, if (message size <= 42) 262 * Max Chunk No = [(message size + 4) / 30] roundup, if (message size > 42) 263 * 264 * +==========================+==========================================+=========+ 265 * | Command | Size |MaxChunk | 266 * +==========================+==========================================+=========+ 267 * | GET_VERSION | 4 | 1 | 268 * | VERSION {1.0, 1.1, 1.2} | 6 + 2 * 3 = 12 | 1 | 269 * +--------------------------+------------------------------------------+---------+ 270 * | GET_CAPABILITIES 1.2 | 20 | 1 | 271 * | CAPABILITIES 1.2 | 20 | 1 | 272 * +--------------------------+------------------------------------------+---------+ 273 * | ERROR | 4 | 1 | 274 * | ERROR(ResponseTooLarge) | 4 + 4 = 8 | 1 | 275 * | ERROR(LargeResponse) | 4 + 1 = 5 | 1 | 276 * | ERROR(ResponseNotReady) | 4 + 4 = 8 | 1 | 277 * +--------------------------+------------------------------------------+---------+ 278 * | CHUNK_SEND header | 12 + L0 (0 or 4) | 1 | 279 * | CHUNK_RESPONSE header | 12 + L0 (0 or 4) | 1 | 280 * +==========================+==========================================+=========+ 281 * | NEGOTIATE_ALGORITHMS 1.2 | 32 + 4 * 4 = 48 | 2 | 282 * | ALGORITHMS 1.2 | 36 + 4 * 4 = 52 | 2 | 283 * +--------------------------+------------------------------------------+---------+ 284 * | GET_DIGESTS 1.2 | 4 | 1 | 285 * | DIGESTS 1.2 | 4 + H * SlotNum = [36, 516] | [1, 18] | 286 * +--------------------------+------------------------------------------+---------+ 287 * | GET_CERTIFICATE 1.2 | 8 | 1 | 288 * | CERTIFICATE 1.2 | 8 + PortionLen | [1, ] | 289 * +--------------------------+------------------------------------------+---------+ 290 * | CHALLENGE 1.2 | 40 | 1 | 291 * | CHALLENGE_AUTH 1.2 | 38 + H * 2 + S [+ O] = [166, 678] | [6, 23] | 292 * +--------------------------+------------------------------------------+---------+ 293 * | GET_MEASUREMENTS 1.2 | 5 + Nounce (0 or 32) | 1 | 294 * | MEASUREMENTS 1.2 | 42 + MeasRecLen (+ S) [+ O] = [106, 554] | [4, 19] | 295 * +--------------------------+------------------------------------------+---------+ 296 * | KEY_EXCHANGE 1.2 | 42 + D [+ O] = [106, 554] | [4, 19] | 297 * | KEY_EXCHANGE_RSP 1.2 | 42 + D + H + S (+ H) [+ O] = [234, 1194] | [8, 40] | 298 * +--------------------------+------------------------------------------+---------+ 299 * | FINISH 1.2 | 4 (+ S) + H = [100, 580] | [4, 20] | 300 * | FINISH_RSP 1.2 | 4 (+ H) = [36, 69] | [1, 3] | 301 * +--------------------------+------------------------------------------+---------+ 302 * | PSK_EXCHANGE 1.2 | 12 [+ PSKHint] + R [+ O] = 44 | 2 | 303 * | PSK_EXCHANGE_RSP 1.2 | 12 + R + H (+ H) [+ O] = [108, 172] | [4, 6] | 304 * +--------------------------+------------------------------------------+---------+ 305 * | PSK_FINISH 1.2 | 4 + H = [36, 68] | [1, 3] | 306 * | PSK_FINISH_RSP 1.2 | 4 | 1 | 307 * +--------------------------+------------------------------------------+---------+ 308 * | GET_CSR 1.2 | 8 + RequesterInfoLen [+ O] | [1, ] | 309 * | CSR 1.2 | 8 + CSRLength | [1, ] | 310 * +--------------------------+------------------------------------------+---------+ 311 * | SET_CERTIFICATE 1.2 | 4 + CertChainLen | [1, ] | 312 * | SET_CERTIFICATE_RSP 1.2 | 4 | 1 | 313 * +==========================+==========================================+=========+ 314 */ 315 316 /* Maximum size of a large SPDM message. 317 * If chunk is unsupported, it must be same as LIBSPDM_DATA_TRANSFER_SIZE. 318 * If chunk is supported, it must be larger than LIBSPDM_DATA_TRANSFER_SIZE. 319 * It matches MaxSPDMmsgSize in SPDM specification. */ 320 #ifndef LIBSPDM_MAX_SPDM_MSG_SIZE 321 #define LIBSPDM_MAX_SPDM_MSG_SIZE LIBSPDM_MAX_MESSAGE_BUFFER_SIZE 322 #endif 323 324 /* Maximum size of a single SPDM message. 325 * It matches DataTransferSize in SPDM specification. */ 326 #ifndef LIBSPDM_DATA_TRANSFER_SIZE 327 #define LIBSPDM_DATA_TRANSFER_SIZE LIBSPDM_MAX_MESSAGE_BUFFER_SIZE 328 #endif 329 330 /* Required sender/receive buffer in device io. 331 * NOTE: This is transport specific. Below configuration is just an example. 332 * +-------+--------+---------------------------+------+--+------+---+--------+-----+ 333 * | TYPE |TransHdr| EncryptionHeader |AppHdr| |Random|MAC|AlignPad|FINAL| 334 * | | |SessionId|SeqNum|Len|AppLen| | | | | | | 335 * +-------+--------+---------------------------+------+ +------+---+--------+-----+ 336 * | MCTP | 1 | 4 | 2 | 2 | 2 | 1 | | 32 | 12| 0 | 56 | 337 * |PCI_DOE| 8 | 4 | 0 | 2 | 2 | 0 | | 0 | 12| 3 | 31 | 338 * +-------+--------+---------------------------+------+--+------+---+--------+-----+ 339 */ 340 #ifndef LIBSPDM_TRANSPORT_ADDITIONAL_SIZE 341 #define LIBSPDM_TRANSPORT_ADDITIONAL_SIZE 64 342 #endif 343 #ifndef LIBSPDM_SENDER_RECEIVE_BUFFER_SIZE 344 #define LIBSPDM_SENDER_RECEIVE_BUFFER_SIZE (LIBSPDM_DATA_TRANSFER_SIZE + \ 345 LIBSPDM_TRANSPORT_ADDITIONAL_SIZE) 346 #endif 347 348 349 /* Required scratch buffer size for libspdm internal usage. 350 * It may be used to hold the encrypted/decrypted message and/or last sent/received message. 351 * It may be used to hold the large request/response and intermediate send/receive buffer 352 * in case of chunking. 353 * 354 * If chunking is not supported, it may be just LIBSPDM_SENDER_RECEIVE_BUFFER_SIZE. 355 * If chunking is supported, it should be at least below. 356 * 357 * +---------------+--------------+--------------------------+------------------------------+ 358 * |SECURE_MESSAGE |LARGE_MESSAGE | SENDER_RECEIVER | LARGE_SENDER_RECEIVER | 359 * +---------------+--------------+--------------------------+------------------------------+ 360 * |<-Secure msg ->|<-Large msg ->|<-Snd/Rcv buf for chunk ->|<-Snd/Rcv buf for large msg ->| 361 * 362 * The value is NOT configurable. 363 * The value MAY be changed in different libspdm version. 364 * It is exposed here, just in case the libspdm consumer wants to configure the setting at build time. 365 */ 366 #if LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP 367 368 /* first section */ 369 #define LIBSPDM_SCRATCH_BUFFER_SECURE_MESSAGE_OFFSET 0 370 371 #define LIBSPDM_SCRATCH_BUFFER_SECURE_MESSAGE_CAPACITY (LIBSPDM_MAX_SPDM_MSG_SIZE) 372 373 /* second section */ 374 #define LIBSPDM_SCRATCH_BUFFER_LARGE_MESSAGE_OFFSET (LIBSPDM_SCRATCH_BUFFER_SECURE_MESSAGE_CAPACITY) 375 376 #define LIBSPDM_SCRATCH_BUFFER_LARGE_MESSAGE_CAPACITY (LIBSPDM_MAX_SPDM_MSG_SIZE) 377 378 /* third section */ 379 #define LIBSPDM_SCRATCH_BUFFER_SENDER_RECEIVER_OFFSET \ 380 (LIBSPDM_SCRATCH_BUFFER_SECURE_MESSAGE_CAPACITY + \ 381 LIBSPDM_SCRATCH_BUFFER_LARGE_MESSAGE_CAPACITY) 382 383 #define LIBSPDM_SCRATCH_BUFFER_SENDER_RECEIVER_CAPACITY (LIBSPDM_MAX_SPDM_MSG_SIZE) 384 385 /* fourth section */ 386 #define LIBSPDM_SCRATCH_BUFFER_LARGE_SENDER_RECEIVER_OFFSET \ 387 (LIBSPDM_SCRATCH_BUFFER_SECURE_MESSAGE_CAPACITY + \ 388 LIBSPDM_SCRATCH_BUFFER_LARGE_MESSAGE_CAPACITY + \ 389 LIBSPDM_SCRATCH_BUFFER_SENDER_RECEIVER_CAPACITY) 390 391 #define LIBSPDM_SCRATCH_BUFFER_LARGE_SENDER_RECEIVER_CAPACITY (LIBSPDM_MAX_SPDM_MSG_SIZE) 392 393 #define LIBSPDM_SCRATCH_BUFFER_SIZE (LIBSPDM_SCRATCH_BUFFER_SECURE_MESSAGE_CAPACITY + \ 394 LIBSPDM_SCRATCH_BUFFER_LARGE_MESSAGE_CAPACITY + \ 395 LIBSPDM_SCRATCH_BUFFER_SENDER_RECEIVER_CAPACITY + \ 396 LIBSPDM_SCRATCH_BUFFER_LARGE_SENDER_RECEIVER_CAPACITY \ 397 ) 398 399 #else 400 #define LIBSPDM_SCRATCH_BUFFER_SIZE (LIBSPDM_SENDER_RECEIVE_BUFFER_SIZE) 401 #endif 402 403 /* Enable message logging. 404 * See https://github.com/DMTF/libspdm/blob/main/doc/user_guide.md#message-logging 405 * for more information */ 406 #ifndef LIBSPDM_ENABLE_MSG_LOG 407 #define LIBSPDM_ENABLE_MSG_LOG 1 408 #endif 409 410 /* Enable macro checking during compilation. */ 411 #ifndef LIBSPDM_CHECK_MACRO 412 #define LIBSPDM_CHECK_MACRO 0 413 #endif 414 415 #endif /* SPDM_LIB_CONFIG_H */ 416