LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - csr.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 97.2 % 870 846
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 25 25

            Line data    Source code
       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              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : 
      10              : #if LIBSPDM_ENABLE_CAPABILITY_CSR_CAP
      11              : 
      12              : #define LIBSPDM_MAX_CSR_SIZE 0x1000
      13              : 
      14              : /*refer to https://github.com/Mbed-TLS/mbedtls/blob/3048c8c90654eb116a6b17c0d2d27c3ccbe6782c/programs/x509/cert_req.c#L119-L129*/
      15              : #define LIBSPDM_MAX_REQ_INFO_BUFFER_SIZE 4096
      16              : 
      17              : uint8_t m_csr_opaque_data[8] = "libspdm";
      18              : 
      19              : /*ECC 256 req_info(include right req_info attribute)*/
      20              : uint8_t req_info_sequence[] = {0x30, 0x81, 0xBF,};
      21              : uint8_t req_info_version[] = {0x02, 0x01, 0x00,};
      22              : uint8_t req_info_subject[] = {
      23              :     0x30, 0x45, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41, 0x55, 0x31,
      24              :     0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x53, 0x6F, 0x6D, 0x65, 0x2D, 0x53,
      25              :     0x74, 0x61, 0x74, 0x65, 0x31, 0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x18, 0x49,
      26              :     0x6E, 0x74, 0x65, 0x72, 0x6E, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67, 0x69, 0x74, 0x73, 0x20,
      27              :     0x50, 0x74, 0x79, 0x20, 0x4C, 0x74, 0x64,
      28              : };
      29              : uint8_t req_info_right_attributes[] = {
      30              :     /*[0]: attributes*/
      31              :     0xA0, 0x18, 0x30, 0x16,
      32              :     /*OID*/
      33              :     0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x07,
      34              :     /*attributes*/
      35              :     0x31, 0x09, 0x0C, 0x07, 0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33
      36              : };
      37              : 
      38              : /*the unique attribute from right_req_info*/
      39              : uint8_t right_req_info_string[] = {0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33};
      40              : /*the default subject without req_info*/
      41              : uint8_t default_subject1[] = {
      42              :     0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4E, 0x4C,
      43              : };
      44              : 
      45              : uint8_t default_subject2[] = {
      46              :     0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x50, 0x6F, 0x6C, 0x61, 0x72, 0x53, 0x53, 0x4C,
      47              : };
      48              : uint8_t default_subject3[] = {
      49              :     0x0C, 0x11, 0x50, 0x6F, 0x6C, 0x61, 0x72, 0x53, 0x53, 0x4C, 0x20, 0x53, 0x65, 0x72, 0x76,
      50              :     0x65, 0x72, 0x20, 0x31
      51              : };
      52              : 
      53              : static uint8_t right_req_info[LIBSPDM_MAX_REQ_INFO_BUFFER_SIZE];
      54              : static uint8_t wrong_req_info[LIBSPDM_MAX_REQ_INFO_BUFFER_SIZE];
      55              : static uint16_t req_info_len;
      56              : 
      57              : /*gen right_req_info and wrong_req_info*/
      58            1 : void libspdm_gen_req_info()
      59              : {
      60              :     uint8_t *req_info_p;
      61              :     void *req_info_pkinfo;
      62              :     size_t req_info_pkinfo_len;
      63              : 
      64            1 :     libspdm_zero_mem(right_req_info, sizeof(right_req_info));
      65            1 :     libspdm_zero_mem(wrong_req_info, sizeof(wrong_req_info));
      66              : 
      67            1 :     req_info_p = right_req_info;
      68            1 :     req_info_len = sizeof(right_req_info);
      69              : 
      70            1 :     libspdm_read_responder_public_key(m_libspdm_use_asym_algo,
      71              :                                       &req_info_pkinfo, &req_info_pkinfo_len);
      72              : 
      73              :     /*concat right_req_info*/
      74            1 :     libspdm_copy_mem(req_info_p, req_info_len, req_info_sequence, sizeof(req_info_sequence));
      75            1 :     req_info_p += sizeof(req_info_sequence);
      76            1 :     req_info_len -= sizeof(req_info_sequence);
      77              : 
      78            1 :     libspdm_copy_mem(req_info_p, req_info_len, req_info_version, sizeof(req_info_version));
      79            1 :     req_info_p += sizeof(req_info_version);
      80            1 :     req_info_len -= sizeof(req_info_version);
      81              : 
      82            1 :     libspdm_copy_mem(req_info_p, req_info_len, req_info_subject, sizeof(req_info_subject));
      83            1 :     req_info_p += sizeof(req_info_subject);
      84            1 :     req_info_len -= sizeof(req_info_subject);
      85              : 
      86            1 :     libspdm_copy_mem(req_info_p, req_info_len, req_info_pkinfo, req_info_pkinfo_len);
      87            1 :     req_info_p += req_info_pkinfo_len;
      88            1 :     req_info_len = (uint16_t)(req_info_len - req_info_pkinfo_len);
      89              : 
      90            1 :     libspdm_copy_mem(req_info_p, req_info_len,
      91              :                      req_info_right_attributes, sizeof(req_info_right_attributes));
      92            1 :     req_info_p += sizeof(req_info_right_attributes);
      93            1 :     req_info_len -= sizeof(req_info_right_attributes);
      94              : 
      95            1 :     req_info_len = sizeof(right_req_info) - req_info_len;
      96              : 
      97              :     /*concat wrong_req_info*/
      98            1 :     libspdm_copy_mem(wrong_req_info, sizeof(wrong_req_info), right_req_info, req_info_len);
      99              :     /*make the wrong_req_info is wrong*/
     100            1 :     *wrong_req_info = '1';
     101              : 
     102            1 :     free(req_info_pkinfo);
     103            1 : }
     104              : 
     105              : /*find destination buffer from source buffer*/
     106            7 : bool libspdm_find_buffer(uint8_t *src, size_t src_len, uint8_t *dst, size_t dst_len)
     107              : {
     108              :     size_t index;
     109              : 
     110            7 :     if ((src == NULL) || (dst == NULL)) {
     111            0 :         return false;
     112              :     }
     113              : 
     114            7 :     if (src_len < dst_len) {
     115            0 :         return false;
     116              :     }
     117              : 
     118          552 :     for (index = 0; index < src_len - dst_len; index++) {
     119          580 :         if ((*(src + index) == *dst) &&
     120           28 :             libspdm_consttime_is_mem_equal(src + index, dst, dst_len)) {
     121            7 :             return true;
     122              :         }
     123              :     }
     124              : 
     125            0 :     return false;
     126              : }
     127              : 
     128              : /*get the cached csr*/
     129            6 : bool libspdm_test_read_cached_csr(uint8_t **csr_pointer, size_t *csr_len)
     130              : {
     131              :     bool res;
     132              :     char *file;
     133              : 
     134            6 :     file = "test_csr/cached.csr";
     135              : 
     136            6 :     res = libspdm_read_input_file(file, (void **)csr_pointer, csr_len);
     137            6 :     return res;
     138              : }
     139              : 
     140              : /*
     141              :  * If device need reset to set csr, the function simulates the CSR state before device reset.
     142              :  * The returned status indicates whether the setting was successful or unsuccessful.
     143              :  **/
     144            5 : bool libspdm_set_csr_before_reset()
     145              : {
     146            5 :     char *file_name = "test_csr/cached.csr";
     147            5 :     char *new_name = "test_csr/cached.staging";
     148              : 
     149            5 :     if (rename(file_name, new_name) != 0) {
     150            0 :         return false;
     151              :     }
     152              : 
     153            5 :     return true;
     154              : }
     155              : 
     156              : /*
     157              :  * If device need reset to set csr, the function simulates the CSR state after device reset.
     158              :  * The returned status indicates whether the setting was successful or unsuccessful.
     159              :  **/
     160            5 : bool libspdm_set_csr_after_reset()
     161              : {
     162            5 :     char *file_name = "test_csr/cached.csr";
     163            5 :     char *new_name = "test_csr/cached.staging";
     164              : 
     165            5 :     if (rename(new_name, file_name) != 0) {
     166            0 :         return false;
     167              :     }
     168              : 
     169            5 :     return true;
     170              : }
     171              : 
     172              : /*ensure that cached.csr exists in test_csr at the beginning*/
     173            1 : void libspdm_clear_cached_csr()
     174              : {
     175            1 :     char *new_name = "test_csr/cached.csr";
     176            1 :     char *file_name = "test_csr/cached.staging";
     177              : 
     178            1 :     rename(file_name, new_name);
     179            1 : }
     180              : 
     181              : /*clean the cached last SPDM csr request*/
     182            6 : void libspdm_test_clear_cached_last_request()
     183              : {
     184              :     uint8_t index;
     185              : 
     186            6 :     char file[] = "cached_last_csr_x_request";
     187              : 
     188           48 :     for (index = 1; index <= SPDM_MAX_CSR_TRACKING_TAG; index++) {
     189           42 :         file[16] = (char)(index + '0');
     190           42 :         libspdm_write_output_file(file, NULL, 0);
     191              :     }
     192            6 : }
     193              : 
     194              : /*check the csr is consistent with the is_device_cert_model*/
     195            2 : bool libspdm_check_csr_basic_constraints(uint8_t *csr, uint16_t csr_len, bool is_device_cert_model)
     196              : {
     197              :     bool result;
     198              :     uint8_t *ptr;
     199              :     uint16_t length;
     200              :     size_t obj_len;
     201              :     uint8_t *end;
     202              : 
     203              :     /*basic_constraints: CA: false */
     204              :     #define BASIC_CONSTRAINTS_STRING_FALSE {0x30, 0x00}
     205            2 :     uint8_t basic_constraints_false[] = BASIC_CONSTRAINTS_STRING_FALSE;
     206              : 
     207              :     /*basic_constraints: CA: true */
     208              :     #define BASIC_CONSTRAINTS_STRING_TRUE {0x30, 0x03, 0x01, 0x01, 0xFF}
     209            2 :     uint8_t basic_constraints_true[] = BASIC_CONSTRAINTS_STRING_TRUE;
     210              : 
     211            2 :     length = csr_len;
     212            2 :     ptr = (uint8_t*)csr;
     213            2 :     obj_len = 0;
     214            2 :     end = ptr + length;
     215              : 
     216            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     217              :                                   LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     218            2 :     if (!result) {
     219            0 :         return false;
     220              :     }
     221              : 
     222            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     223              :                                   LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     224            2 :     if (!result) {
     225            0 :         return false;
     226              :     }
     227              : 
     228            2 :     end = ptr + obj_len;
     229              : 
     230              :     /*version*/
     231            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len, LIBSPDM_CRYPTO_ASN1_INTEGER);
     232            2 :     if (!result) {
     233            0 :         return false;
     234              :     }
     235            2 :     ptr += obj_len;
     236              : 
     237              :     /*subject*/
     238            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     239              :                                   LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     240            2 :     if (!result) {
     241            0 :         return false;
     242              :     }
     243            2 :     ptr += obj_len;
     244              : 
     245              :     /*PKinfo*/
     246            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     247              :                                   LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     248            2 :     if (!result) {
     249            0 :         return false;
     250              :     }
     251            2 :     ptr += obj_len;
     252              : 
     253              :     /*attribute*/
     254            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     255              :                                   LIBSPDM_CRYPTO_ASN1_CONTEXT_SPECIFIC |
     256              :                                   LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     257            2 :     if (!result) {
     258            0 :         return false;
     259              :     }
     260              : 
     261            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     262              :                                   LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     263            2 :     if (!result) {
     264            0 :         return false;
     265              :     }
     266            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len, LIBSPDM_CRYPTO_ASN1_OID);
     267            2 :     if (!result) {
     268            0 :         return false;
     269              :     }
     270            2 :     ptr += obj_len;
     271              : 
     272            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     273              :                                   LIBSPDM_CRYPTO_ASN1_SET | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     274            2 :     if (!result) {
     275            0 :         return false;
     276              :     }
     277            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     278              :                                   LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     279            2 :     if (!result) {
     280            0 :         return false;
     281              :     }
     282            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len,
     283              :                                   LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
     284            2 :     if (!result) {
     285            0 :         return false;
     286              :     }
     287              :     /*basic constraints oid*/
     288            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len, LIBSPDM_CRYPTO_ASN1_OID);
     289            2 :     if (!result) {
     290            0 :         return false;
     291              :     }
     292            2 :     ptr += obj_len;
     293              : 
     294              :     /*basic constraints*/
     295            2 :     result = libspdm_asn1_get_tag(&ptr, end, &obj_len, LIBSPDM_CRYPTO_ASN1_OCTET_STRING);
     296            2 :     if (!result) {
     297            0 :         return false;
     298              :     }
     299              : 
     300            2 :     if (is_device_cert_model) {
     301            1 :         result = libspdm_consttime_is_mem_equal(
     302              :             ptr, basic_constraints_false, sizeof(basic_constraints_false));
     303              :     } else {
     304            1 :         result = libspdm_consttime_is_mem_equal(
     305              :             ptr, basic_constraints_true, sizeof(basic_constraints_true));
     306              :     }
     307              : 
     308            2 :     return result;
     309              : }
     310              : 
     311              : /**
     312              :  * Test 1: receives a valid GET_CSR request message from Requester
     313              :  * Expected Behavior: produces a valid CSR response message with device_cert mode
     314              :  **/
     315            1 : void libspdm_test_responder_csr_case1(void **state)
     316              : {
     317              :     libspdm_return_t status;
     318              :     libspdm_test_context_t *spdm_test_context;
     319              :     libspdm_context_t *spdm_context;
     320              :     size_t response_size;
     321              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     322              :     spdm_csr_response_t *spdm_response;
     323              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
     324              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
     325              :     bool result;
     326              :     bool is_device_cert_model;
     327              : 
     328            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
     329              : 
     330            1 :     spdm_test_context = *state;
     331            1 :     spdm_context = spdm_test_context->spdm_context;
     332            1 :     spdm_test_context->case_id = 0x1;
     333            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     334              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     335              : 
     336            1 :     spdm_context->connection_info.connection_state =
     337              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     338            1 :     spdm_context->local_context.capability.flags |=
     339              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     340            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     341              :         m_libspdm_use_hash_algo;
     342            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     343              :         m_libspdm_use_asym_algo;
     344              : 
     345            1 :     is_device_cert_model = true;
     346            1 :     spdm_context->local_context.capability.flags &=
     347              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ALIAS_CERT_CAP;
     348              : 
     349            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t));
     350              : 
     351            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     352            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     353            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     354            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     355              : 
     356            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
     357            1 :     m_libspdm_get_csr_request->requester_info_length = 0;
     358              : 
     359            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t);
     360              : 
     361              :     /*init req_info*/
     362            1 :     libspdm_gen_req_info();
     363              : 
     364            1 :     response_size = sizeof(response);
     365            1 :     status = libspdm_get_response_csr(spdm_context,
     366              :                                       m_libspdm_get_csr_request_size,
     367              :                                       m_libspdm_get_csr_request,
     368              :                                       &response_size, response);
     369            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     370              : 
     371            1 :     spdm_response = (void *)response;
     372            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
     373            1 :     assert_int_equal(spdm_response->header.request_response_code,
     374              :                      SPDM_CSR);
     375              : 
     376              :     /*check returned CSR not zero */
     377            1 :     assert_memory_not_equal(spdm_response + 1, wrong_csr, spdm_response->csr_length);
     378              : 
     379              :     /*check the resulting CSR shall be for a Device Certificate*/
     380            1 :     result = libspdm_check_csr_basic_constraints((uint8_t *)(spdm_response + 1),
     381            1 :                                                  spdm_response->csr_length, is_device_cert_model);
     382            1 :     assert_true(result);
     383              : 
     384              :     /*check that returned CSR contains default subject*/
     385            1 :     assert_true(libspdm_find_buffer((uint8_t *)(spdm_response + 1), spdm_response->csr_length,
     386              :                                     default_subject1, sizeof(default_subject1)));
     387            1 :     assert_true(libspdm_find_buffer((uint8_t *)(spdm_response + 1), spdm_response->csr_length,
     388              :                                     default_subject2, sizeof(default_subject2)));
     389            1 :     assert_true(libspdm_find_buffer((uint8_t *)(spdm_response + 1), spdm_response->csr_length,
     390              :                                     default_subject3, sizeof(default_subject3)));
     391            1 :     free(m_libspdm_get_csr_request);
     392            1 : }
     393              : 
     394              : /**
     395              :  * Test 2: Wrong GET_CSR message size (larger than expected)
     396              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_INVALID_REQUEST
     397              :  **/
     398            1 : void libspdm_test_responder_csr_case2(void **state)
     399              : {
     400              :     libspdm_return_t status;
     401              :     libspdm_test_context_t *spdm_test_context;
     402              :     libspdm_context_t *spdm_context;
     403              :     size_t response_size;
     404              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     405              :     spdm_csr_response_t *spdm_response;
     406              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
     407              : 
     408            1 :     spdm_test_context = *state;
     409            1 :     spdm_context = spdm_test_context->spdm_context;
     410            1 :     spdm_test_context->case_id = 0x2;
     411            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     412              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     413              : 
     414            1 :     spdm_context->connection_info.connection_state =
     415              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     416            1 :     spdm_context->local_context.capability.flags |=
     417              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     418            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     419              :         m_libspdm_use_hash_algo;
     420            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     421              :         m_libspdm_use_asym_algo;
     422              : 
     423              : 
     424            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t));
     425              : 
     426            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     427            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     428            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     429            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     430              : 
     431            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
     432            1 :     m_libspdm_get_csr_request->requester_info_length = 0;
     433              : 
     434              :     /* Bad request size*/
     435            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) - 1;
     436              : 
     437            1 :     response_size = sizeof(response);
     438            1 :     status = libspdm_get_response_csr(spdm_context,
     439              :                                       m_libspdm_get_csr_request_size,
     440              :                                       m_libspdm_get_csr_request,
     441              :                                       &response_size, response);
     442            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     443              : 
     444            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     445            1 :     spdm_response = (void *)response;
     446            1 :     assert_int_equal(spdm_response->header.request_response_code,
     447              :                      SPDM_ERROR);
     448            1 :     assert_int_equal(spdm_response->header.param1,
     449              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     450            1 :     assert_int_equal(spdm_response->header.param2, 0);
     451              : 
     452            1 :     free(m_libspdm_get_csr_request);
     453            1 : }
     454              : 
     455              : /**
     456              :  * Test 3: receives a valid GET_CSR request message from Requester with non-null right req_info
     457              :  * Expected Behavior: produces a valid CSR response message
     458              :  **/
     459            1 : void libspdm_test_responder_csr_case3(void **state)
     460              : {
     461              :     libspdm_return_t status;
     462              :     libspdm_test_context_t *spdm_test_context;
     463              :     libspdm_context_t *spdm_context;
     464              :     size_t response_size;
     465              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     466              :     spdm_csr_response_t *spdm_response;
     467              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
     468              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
     469            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
     470              :     uint8_t *csr;
     471              : 
     472            1 :     spdm_test_context = *state;
     473            1 :     spdm_context = spdm_test_context->spdm_context;
     474            1 :     spdm_test_context->case_id = 0x3;
     475            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     476              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     477              : 
     478            1 :     spdm_context->connection_info.connection_state =
     479              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     480            1 :     spdm_context->local_context.capability.flags |=
     481              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     482            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     483              :         m_libspdm_use_hash_algo;
     484            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     485              :         m_libspdm_use_asym_algo;
     486              : 
     487            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
     488              :                                        req_info_len);
     489              : 
     490            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     491            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     492            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     493            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     494              : 
     495            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
     496            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
     497              : 
     498            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
     499              :                      right_req_info, req_info_len);
     500              : 
     501            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
     502              :                                             req_info_len;
     503              : 
     504            1 :     response_size = sizeof(response);
     505            1 :     status = libspdm_get_response_csr(spdm_context,
     506              :                                       m_libspdm_get_csr_request_size,
     507              :                                       m_libspdm_get_csr_request,
     508              :                                       &response_size, response);
     509            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     510              : 
     511            1 :     spdm_response = (void *)response;
     512            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
     513            1 :     assert_int_equal(spdm_response->header.request_response_code,
     514              :                      SPDM_CSR);
     515              : 
     516              :     /*check returned CSR not zero */
     517            1 :     assert_memory_not_equal(spdm_response + 1, wrong_csr, spdm_response->csr_length);
     518              : 
     519            1 :     csr = (uint8_t *)(spdm_response + 1);
     520              :     /*check that returned CSR contains req_info attribute*/
     521            1 :     assert_true(libspdm_find_buffer(csr, spdm_response->csr_length,
     522              :                                     right_req_info_string, sizeof(right_req_info_string)));
     523              : 
     524              :     /*check that returned CSR contains req_info subject*/
     525            1 :     assert_true(libspdm_find_buffer(csr, spdm_response->csr_length,
     526              :                                     req_info_subject, sizeof(req_info_subject)));
     527              : 
     528            1 :     free(m_libspdm_get_csr_request);
     529            1 : }
     530              : 
     531              : /**
     532              :  * Test 4: receives a valid GET_CSR request message from Requester with non-null opaque_data
     533              :  * Expected Behavior: produces a valid CSR response message
     534              :  **/
     535            1 : void libspdm_test_responder_csr_case4(void **state)
     536              : {
     537              :     libspdm_return_t status;
     538              :     libspdm_test_context_t *spdm_test_context;
     539              :     libspdm_context_t *spdm_context;
     540              :     size_t response_size;
     541              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     542              :     spdm_csr_response_t *spdm_response;
     543              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
     544              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
     545            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
     546              : 
     547            1 :     spdm_test_context = *state;
     548            1 :     spdm_context = spdm_test_context->spdm_context;
     549            1 :     spdm_test_context->case_id = 0x4;
     550            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     551              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     552              : 
     553            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     554            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     555            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     556            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     557            1 :     spdm_context->connection_info.algorithm.other_params_support =
     558              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_0;
     559              : 
     560            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
     561              :                                        sizeof(m_csr_opaque_data));
     562              : 
     563            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     564            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     565            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     566            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     567              : 
     568            1 :     m_libspdm_get_csr_request->opaque_data_length = sizeof(m_csr_opaque_data);
     569            1 :     m_libspdm_get_csr_request->requester_info_length = 0;
     570              : 
     571            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, sizeof(m_csr_opaque_data),
     572              :                      m_csr_opaque_data, sizeof(m_csr_opaque_data));
     573              : 
     574            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
     575              :                                             sizeof(m_csr_opaque_data);
     576              : 
     577            1 :     response_size = sizeof(response);
     578            1 :     status = libspdm_get_response_csr(spdm_context,
     579              :                                       m_libspdm_get_csr_request_size,
     580              :                                       m_libspdm_get_csr_request,
     581              :                                       &response_size, response);
     582            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     583              : 
     584            1 :     spdm_response = (void *)response;
     585            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
     586            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_CSR);
     587              : 
     588              :     /*check returned CSR not zero */
     589            1 :     assert_memory_not_equal(spdm_response + 1, wrong_csr, spdm_response->csr_length);
     590              : 
     591            1 :     free(m_libspdm_get_csr_request);
     592            1 : }
     593              : 
     594              : /**
     595              :  * Test 5: receives a valid GET_CSR request message from Requester with non-null wrong req_info
     596              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_INVALID_REQUEST
     597              :  **/
     598            1 : void libspdm_test_responder_csr_case5(void **state)
     599              : {
     600              :     libspdm_return_t status;
     601              :     libspdm_test_context_t *spdm_test_context;
     602              :     libspdm_context_t *spdm_context;
     603              :     size_t response_size;
     604              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     605              :     spdm_csr_response_t *spdm_response;
     606              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
     607              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
     608            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
     609              : 
     610            1 :     spdm_test_context = *state;
     611            1 :     spdm_context = spdm_test_context->spdm_context;
     612            1 :     spdm_test_context->case_id = 0x5;
     613            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     614              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     615              : 
     616            1 :     spdm_context->connection_info.connection_state =
     617              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     618            1 :     spdm_context->local_context.capability.flags |=
     619              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     620            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     621              :         m_libspdm_use_hash_algo;
     622            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     623              :         m_libspdm_use_asym_algo;
     624              : 
     625            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
     626              :                                        req_info_len);
     627              : 
     628            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     629            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     630            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     631            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     632              : 
     633            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
     634            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
     635              : 
     636            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
     637              :                      wrong_req_info, req_info_len);
     638              : 
     639            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
     640              :                                             req_info_len;
     641              : 
     642            1 :     response_size = sizeof(response);
     643            1 :     status = libspdm_get_response_csr(spdm_context,
     644              :                                       m_libspdm_get_csr_request_size,
     645              :                                       m_libspdm_get_csr_request,
     646              :                                       &response_size, response);
     647            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     648              : 
     649            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     650            1 :     spdm_response = (void *)response;
     651            1 :     assert_int_equal(spdm_response->header.request_response_code,
     652              :                      SPDM_ERROR);
     653            1 :     assert_int_equal(spdm_response->header.param1,
     654              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     655            1 :     assert_int_equal(spdm_response->header.param2, 0);
     656              : 
     657            1 :     free(m_libspdm_get_csr_request);
     658            1 : }
     659              : 
     660              : /**
     661              :  * Test 6: receives a valid GET_CSR request message from Requester with need_reset
     662              :  * Expected Behavior: the first get_csr: responder return need reset;
     663              :  *                    the second get_csr after device reset: get the cached valid csr;
     664              :  **/
     665            1 : void libspdm_test_responder_csr_case6(void **state)
     666              : {
     667              :     libspdm_return_t status;
     668              :     libspdm_test_context_t *spdm_test_context;
     669              :     libspdm_context_t *spdm_context;
     670              :     size_t response_size;
     671              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     672              :     spdm_csr_response_t *spdm_response;
     673              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
     674              :     uint8_t cached_csr[LIBSPDM_MAX_CSR_SIZE];
     675            1 :     libspdm_zero_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE);
     676              : 
     677              :     uint8_t *csr_pointer;
     678              :     size_t csr_len;
     679              : 
     680            1 :     if (!libspdm_test_read_cached_csr(&csr_pointer, &csr_len)) {
     681            0 :         assert_false(true);
     682              :     }
     683              : 
     684            1 :     libspdm_copy_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE, csr_pointer, csr_len);
     685            1 :     free(csr_pointer);
     686              : 
     687            1 :     spdm_test_context = *state;
     688            1 :     spdm_context = spdm_test_context->spdm_context;
     689            1 :     spdm_test_context->case_id = 0x6;
     690            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     691              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     692              : 
     693            1 :     spdm_context->connection_info.connection_state =
     694              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     695            1 :     spdm_context->local_context.capability.flags |=
     696              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     697              : 
     698              :     /*set responder need reset*/
     699            1 :     spdm_context->local_context.capability.flags |=
     700              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
     701              : 
     702            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     703              :         m_libspdm_use_hash_algo;
     704            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     705              :         m_libspdm_use_asym_algo;
     706              : 
     707              :     /*set csr before reset*/
     708            1 :     assert_true(libspdm_set_csr_before_reset());
     709              : 
     710            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
     711              :                                        req_info_len);
     712              : 
     713            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     714            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     715            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     716            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     717              : 
     718            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
     719            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
     720              : 
     721            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
     722              :                      right_req_info, req_info_len);
     723              : 
     724            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
     725              :                                             req_info_len;
     726              : 
     727            1 :     response_size = sizeof(response);
     728              : 
     729            1 :     status = libspdm_get_response_csr(spdm_context,
     730              :                                       m_libspdm_get_csr_request_size,
     731              :                                       m_libspdm_get_csr_request,
     732              :                                       &response_size, response);
     733              :     /*first get_csr: the responder need reset*/
     734            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     735            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     736            1 :     spdm_response = (void *)response;
     737            1 :     assert_int_equal(spdm_response->header.request_response_code,
     738              :                      SPDM_ERROR);
     739            1 :     assert_int_equal(spdm_response->header.param1,
     740              :                      SPDM_ERROR_CODE_RESET_REQUIRED);
     741            1 :     assert_int_equal(spdm_response->header.param2, 0);
     742              : 
     743              :     /*set csr after reset*/
     744            1 :     assert_true(libspdm_set_csr_after_reset());
     745              : 
     746            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     747            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     748            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     749            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     750              : 
     751            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
     752            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
     753            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
     754              :                      right_req_info, req_info_len);
     755              : 
     756            1 :     response_size = sizeof(response);
     757            1 :     status = libspdm_get_response_csr(spdm_context,
     758              :                                       m_libspdm_get_csr_request_size,
     759              :                                       m_libspdm_get_csr_request,
     760              :                                       &response_size, response);
     761              :     /*second get_csr after device reset: get the responder cached csr*/
     762            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     763              : 
     764            1 :     spdm_response = (void *)response;
     765            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
     766            1 :     assert_int_equal(spdm_response->header.request_response_code,
     767              :                      SPDM_CSR);
     768              : 
     769              :     /*check returned CSR is equal the cached CSR */
     770            1 :     assert_memory_equal(spdm_response + 1, cached_csr, spdm_response->csr_length);
     771              : 
     772              :     /*clear cached req_info*/
     773            1 :     libspdm_test_clear_cached_last_request();
     774            1 :     free(m_libspdm_get_csr_request);
     775            1 : }
     776              : 
     777              : /**
     778              :  * Test 7: receives a valid GET_CSR request message from Requester with non-null right req_info and opaque_data
     779              :  * Expected Behavior: produces a valid CSR response message
     780              :  **/
     781            1 : void libspdm_test_responder_csr_case7(void **state)
     782              : {
     783              :     libspdm_return_t status;
     784              :     libspdm_test_context_t *spdm_test_context;
     785              :     libspdm_context_t *spdm_context;
     786              :     size_t response_size;
     787              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     788              :     spdm_csr_response_t *spdm_response;
     789              :     spdm_get_csr_request_t *libspdm_get_csr_request;
     790              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
     791            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
     792              :     uint8_t *csr;
     793              : 
     794            1 :     spdm_test_context = *state;
     795            1 :     spdm_context = spdm_test_context->spdm_context;
     796            1 :     spdm_test_context->case_id = 0x7;
     797            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     798              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     799              : 
     800            1 :     spdm_context->connection_info.connection_state =
     801              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     802            1 :     spdm_context->local_context.capability.flags = 0;
     803            1 :     spdm_context->local_context.capability.flags |=
     804              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     805            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     806              :         m_libspdm_use_hash_algo;
     807            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     808              :         m_libspdm_use_asym_algo;
     809              : 
     810            1 :     libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
     811              :                                      sizeof(m_csr_opaque_data) +
     812              :                                      req_info_len);
     813              : 
     814            1 :     libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     815            1 :     libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     816            1 :     libspdm_get_csr_request->header.param1 = 0;
     817            1 :     libspdm_get_csr_request->header.param2 = 0;
     818            1 :     libspdm_get_csr_request->opaque_data_length = sizeof(m_csr_opaque_data);
     819            1 :     libspdm_get_csr_request->requester_info_length = req_info_len;
     820              : 
     821            1 :     libspdm_copy_mem(libspdm_get_csr_request + 1, req_info_len,
     822              :                      right_req_info, req_info_len);
     823              : 
     824            1 :     libspdm_copy_mem((uint8_t *)(libspdm_get_csr_request + 1) + req_info_len,
     825              :                      sizeof(m_csr_opaque_data),
     826              :                      m_csr_opaque_data, sizeof(m_csr_opaque_data));
     827              : 
     828            1 :     size_t libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
     829            1 :                                           sizeof(m_csr_opaque_data) +
     830              :                                           req_info_len;
     831              : 
     832            1 :     response_size = sizeof(response);
     833            1 :     status = libspdm_get_response_csr(spdm_context,
     834              :                                       libspdm_get_csr_request_size,
     835              :                                       libspdm_get_csr_request,
     836              :                                       &response_size, response);
     837            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     838              : 
     839            1 :     spdm_response = (void *)response;
     840            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
     841            1 :     assert_int_equal(spdm_response->header.request_response_code,
     842              :                      SPDM_CSR);
     843              : 
     844              :     /*check returned CSR not zero */
     845            1 :     assert_memory_not_equal(spdm_response + 1, wrong_csr, spdm_response->csr_length);
     846              : 
     847            1 :     csr = (uint8_t *)(spdm_response + 1);
     848            1 :     assert_true(libspdm_find_buffer(csr, spdm_response->csr_length,
     849              :                                     right_req_info_string, sizeof(right_req_info_string)));
     850              :     /*check that returned CSR contains req_info subject*/
     851            1 :     assert_true(libspdm_find_buffer(csr, spdm_response->csr_length,
     852              :                                     req_info_subject, sizeof(req_info_subject)));
     853              : 
     854            1 :     free(libspdm_get_csr_request);
     855            1 : }
     856              : 
     857              : /**
     858              :  * Test 8: receives a invalid GET_CSR request message from Requester With chaotic req_info and opaque_data
     859              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_INVALID_REQUEST
     860              :  **/
     861            1 : void libspdm_test_responder_csr_case8(void **state)
     862              : {
     863              :     libspdm_return_t status;
     864              :     libspdm_test_context_t *spdm_test_context;
     865              :     libspdm_context_t *spdm_context;
     866              :     size_t response_size;
     867              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     868              :     spdm_csr_response_t *spdm_response;
     869              :     spdm_get_csr_request_t *libspdm_get_csr_request;
     870              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
     871            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
     872              : 
     873            1 :     spdm_test_context = *state;
     874            1 :     spdm_context = spdm_test_context->spdm_context;
     875            1 :     spdm_test_context->case_id = 0x8;
     876            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     877              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     878              : 
     879            1 :     spdm_context->connection_info.connection_state =
     880              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     881            1 :     spdm_context->local_context.capability.flags = 0;
     882            1 :     spdm_context->local_context.capability.flags |=
     883              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     884            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     885              :         m_libspdm_use_hash_algo;
     886            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     887              :         m_libspdm_use_asym_algo;
     888              : 
     889            1 :     libspdm_get_csr_request = malloc(LIBSPDM_RECEIVER_BUFFER_SIZE);
     890            1 :     libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     891            1 :     libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     892            1 :     libspdm_get_csr_request->header.param1 = 0;
     893            1 :     libspdm_get_csr_request->header.param2 = 0;
     894              : 
     895              :     /* Swap right_req_info and m_csr_opaque_data */
     896            1 :     libspdm_get_csr_request->opaque_data_length = req_info_len;
     897            1 :     libspdm_get_csr_request->requester_info_length = sizeof(m_csr_opaque_data);
     898            1 :     libspdm_copy_mem(libspdm_get_csr_request + 1, sizeof(m_csr_opaque_data),
     899              :                      m_csr_opaque_data, sizeof(m_csr_opaque_data));
     900            1 :     libspdm_copy_mem((uint8_t *)(libspdm_get_csr_request + 1) + req_info_len,
     901              :                      req_info_len,
     902              :                      right_req_info, req_info_len);
     903              : 
     904            1 :     size_t libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
     905            1 :                                           sizeof(m_csr_opaque_data) +
     906              :                                           req_info_len;
     907              : 
     908            1 :     response_size = sizeof(response);
     909            1 :     status = libspdm_get_response_csr(spdm_context,
     910              :                                       libspdm_get_csr_request_size,
     911              :                                       libspdm_get_csr_request,
     912              :                                       &response_size, response);
     913            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     914            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     915            1 :     spdm_response = (void *)response;
     916            1 :     assert_int_equal(spdm_response->header.request_response_code,
     917              :                      SPDM_ERROR);
     918            1 :     assert_int_equal(spdm_response->header.param1,
     919              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     920            1 :     assert_int_equal(spdm_response->header.param2, 0);
     921            1 :     free(libspdm_get_csr_request);
     922            1 : }
     923              : 
     924              : /**
     925              :  * Test 9: receives a valid GET_CSR request message from Requester with non-null opaque_data
     926              :  * the OpaqueDataFmt1 bit is selected in OtherParamsSelection of ALGORITHMS ,
     927              :  * Expected Behavior: produces a valid CSR response message
     928              :  **/
     929            1 : void libspdm_test_responder_csr_case9(void **state)
     930              : {
     931              :     libspdm_return_t status;
     932              :     libspdm_test_context_t *spdm_test_context;
     933              :     libspdm_context_t *spdm_context;
     934              :     size_t response_size;
     935              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     936              :     spdm_csr_response_t *spdm_response;
     937              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
     938              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
     939            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
     940              :     spdm_general_opaque_data_table_header_t
     941              :     *spdm_general_opaque_data_table_header;
     942              :     opaque_element_table_header_t
     943              :     *opaque_element_table_header;
     944              :     uint8_t *ptr;
     945              :     size_t opaque_data_size;
     946              :     uint8_t element_num;
     947              :     uint8_t element_index;
     948              :     size_t current_element_len;
     949              :     uint16_t opaque_element_data_len;
     950              : 
     951            1 :     spdm_test_context = *state;
     952            1 :     spdm_context = spdm_test_context->spdm_context;
     953            1 :     spdm_test_context->case_id = 0x9;
     954            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     955              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     956              : 
     957            1 :     spdm_context->connection_info.connection_state =
     958              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     959            1 :     spdm_context->local_context.capability.flags |=
     960              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
     961            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     962              :         m_libspdm_use_hash_algo;
     963            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     964              :         m_libspdm_use_asym_algo;
     965            1 :     spdm_context->connection_info.algorithm.other_params_support =
     966              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
     967              : 
     968            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) + SPDM_MAX_OPAQUE_DATA_SIZE);
     969              : 
     970            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     971            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
     972            1 :     m_libspdm_get_csr_request->header.param1 = 0;
     973            1 :     m_libspdm_get_csr_request->header.param2 = 0;
     974              : 
     975            1 :     spdm_general_opaque_data_table_header = (void *)(m_libspdm_get_csr_request + 1);
     976            1 :     spdm_general_opaque_data_table_header->total_elements = 1;
     977            1 :     opaque_element_table_header = (void *)(spdm_general_opaque_data_table_header + 1);
     978              : 
     979            1 :     element_num = spdm_general_opaque_data_table_header->total_elements;
     980            1 :     opaque_data_size = sizeof(spdm_general_opaque_data_table_header_t);
     981              : 
     982            2 :     for (element_index = 0; element_index < element_num; element_index++) {
     983            1 :         opaque_element_table_header->id = SPDM_REGISTRY_ID_MAX;
     984            1 :         opaque_element_table_header->vendor_len = 0;
     985            1 :         opaque_element_data_len = 8;
     986              : 
     987            1 :         ptr = (void *)(opaque_element_table_header + 1);
     988            1 :         ptr += opaque_element_table_header->vendor_len;
     989              : 
     990            1 :         libspdm_copy_mem((uint16_t *)ptr,
     991              :                          sizeof(opaque_element_data_len),
     992              :                          &opaque_element_data_len,
     993              :                          sizeof(opaque_element_data_len));
     994              : 
     995            1 :         libspdm_copy_mem(ptr + sizeof(opaque_element_data_len),
     996              :                          SPDM_MAX_OPAQUE_DATA_SIZE -
     997              :                          sizeof(opaque_element_table_header_t), "libspdm",
     998              :                          strlen("libspdm"));
     999              : 
    1000            1 :         current_element_len = sizeof(opaque_element_table_header_t) +
    1001            1 :                               opaque_element_table_header->vendor_len +
    1002            1 :                               sizeof(opaque_element_data_len) +
    1003              :                               opaque_element_data_len;
    1004              : 
    1005            1 :         current_element_len = (current_element_len + 3) & ~3;
    1006              : 
    1007              :         /*move to next element*/
    1008            1 :         opaque_element_table_header =
    1009              :             (opaque_element_table_header_t *)
    1010              :             ((uint8_t *)opaque_element_table_header +
    1011              :              current_element_len);
    1012              : 
    1013            1 :         opaque_data_size += current_element_len;
    1014              :     }
    1015              : 
    1016            1 :     m_libspdm_get_csr_request->opaque_data_length = (uint16_t)opaque_data_size;
    1017            1 :     m_libspdm_get_csr_request->requester_info_length = 0;
    1018              : 
    1019            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) + opaque_data_size;
    1020              : 
    1021            1 :     response_size = sizeof(response);
    1022            1 :     status = libspdm_get_response_csr(spdm_context,
    1023              :                                       m_libspdm_get_csr_request_size,
    1024              :                                       m_libspdm_get_csr_request,
    1025              :                                       &response_size, response);
    1026            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1027              : 
    1028            1 :     spdm_response = (void *)response;
    1029            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
    1030            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1031              :                      SPDM_CSR);
    1032              : 
    1033              :     /*check returned CSR not zero */
    1034            1 :     assert_memory_not_equal(spdm_response + 1, wrong_csr, spdm_response->csr_length);
    1035              : 
    1036            1 :     free(m_libspdm_get_csr_request);
    1037            1 : }
    1038              : 
    1039              : /**
    1040              :  * Test 10: receives a invalid GET_CSR request message from Requester with non-null alignPadding in opaque_data is not zero
    1041              :  * the OpaqueDataFmt1 bit is selected in OtherParamsSelection of ALGORITHMS
    1042              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_INVALID_REQUEST
    1043              :  **/
    1044            1 : void libspdm_test_responder_csr_case10(void **state)
    1045              : {
    1046              :     libspdm_return_t status;
    1047              :     libspdm_test_context_t *spdm_test_context;
    1048              :     libspdm_context_t *spdm_context;
    1049              :     size_t response_size;
    1050              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1051              :     spdm_csr_response_t *spdm_response;
    1052              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
    1053              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
    1054            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
    1055              :     spdm_general_opaque_data_table_header_t
    1056              :     *spdm_general_opaque_data_table_header;
    1057              :     opaque_element_table_header_t
    1058              :     *opaque_element_table_header;
    1059              :     uint8_t *ptr;
    1060              :     size_t opaque_data_size;
    1061              :     uint8_t element_num;
    1062              :     uint8_t element_index;
    1063              :     size_t current_element_len;
    1064              :     uint16_t opaque_element_data_len;
    1065              : 
    1066            1 :     spdm_test_context = *state;
    1067            1 :     spdm_context = spdm_test_context->spdm_context;
    1068            1 :     spdm_test_context->case_id = 0xA;
    1069            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1070              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1071              : 
    1072            1 :     spdm_context->connection_info.connection_state =
    1073              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1074            1 :     spdm_context->local_context.capability.flags |=
    1075              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
    1076            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1077              :         m_libspdm_use_hash_algo;
    1078            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1079              :         m_libspdm_use_asym_algo;
    1080            1 :     spdm_context->connection_info.algorithm.other_params_support =
    1081              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
    1082              : 
    1083            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) + SPDM_MAX_OPAQUE_DATA_SIZE);
    1084              : 
    1085            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1086            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1087            1 :     m_libspdm_get_csr_request->header.param1 = 0;
    1088            1 :     m_libspdm_get_csr_request->header.param2 = 0;
    1089              : 
    1090            1 :     spdm_general_opaque_data_table_header = (void *)(m_libspdm_get_csr_request + 1);
    1091            1 :     spdm_general_opaque_data_table_header->total_elements = 1;
    1092            1 :     opaque_element_table_header = (void *)(spdm_general_opaque_data_table_header + 1);
    1093              : 
    1094            1 :     element_num = spdm_general_opaque_data_table_header->total_elements;
    1095            1 :     opaque_data_size = sizeof(spdm_general_opaque_data_table_header_t);
    1096              : 
    1097            2 :     for (element_index = 0; element_index < element_num; element_index++) {
    1098            1 :         opaque_element_table_header->id = SPDM_REGISTRY_ID_MAX;
    1099            1 :         opaque_element_table_header->vendor_len = 0;
    1100            1 :         opaque_element_data_len = (uint16_t)strlen("libspdm");
    1101              : 
    1102            1 :         ptr = (void *)(opaque_element_table_header + 1);
    1103            1 :         ptr += opaque_element_table_header->vendor_len;
    1104              : 
    1105            1 :         libspdm_copy_mem((uint16_t *)ptr,
    1106              :                          sizeof(opaque_element_data_len),
    1107              :                          &opaque_element_data_len,
    1108              :                          sizeof(opaque_element_data_len));
    1109              : 
    1110            1 :         libspdm_copy_mem(ptr + sizeof(opaque_element_data_len),
    1111              :                          SPDM_MAX_OPAQUE_DATA_SIZE -
    1112              :                          sizeof(opaque_element_table_header_t), "libspdm",
    1113              :                          strlen("libspdm"));
    1114              : 
    1115            1 :         current_element_len = sizeof(opaque_element_table_header_t) +
    1116            1 :                               opaque_element_table_header->vendor_len +
    1117            1 :                               sizeof(opaque_element_data_len) +
    1118              :                               opaque_element_data_len;
    1119              : 
    1120            1 :         *(uint8_t *)((size_t)(opaque_element_table_header) + current_element_len) = 0xFF;
    1121              : 
    1122            1 :         current_element_len += 1;
    1123            1 :         current_element_len = (current_element_len + 3) & ~3;
    1124              : 
    1125              :         /*move to next element*/
    1126            1 :         opaque_element_table_header =
    1127              :             (opaque_element_table_header_t *)
    1128              :             ((uint8_t *)opaque_element_table_header +
    1129              :              current_element_len);
    1130              : 
    1131            1 :         opaque_data_size += current_element_len;
    1132              :     }
    1133              : 
    1134            1 :     m_libspdm_get_csr_request->opaque_data_length = (uint16_t)opaque_data_size;
    1135            1 :     m_libspdm_get_csr_request->requester_info_length = 0;
    1136              : 
    1137            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) + opaque_data_size;
    1138              : 
    1139            1 :     response_size = sizeof(response);
    1140            1 :     status = libspdm_get_response_csr(spdm_context,
    1141              :                                       m_libspdm_get_csr_request_size,
    1142              :                                       m_libspdm_get_csr_request,
    1143              :                                       &response_size, response);
    1144              : 
    1145            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1146            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1147            1 :     spdm_response = (void *)response;
    1148            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1149              :                      SPDM_ERROR);
    1150            1 :     assert_int_equal(spdm_response->header.param1,
    1151              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1152            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1153              : 
    1154            1 :     free(m_libspdm_get_csr_request);
    1155            1 : }
    1156              : 
    1157              : /**
    1158              :  * Test 11: receives a valid GET_CSR request message from Requester
    1159              :  * Expected Behavior: produces a valid CSR response message with alias_cert mode
    1160              :  **/
    1161            1 : void libspdm_test_responder_csr_case11(void **state)
    1162              : {
    1163              :     libspdm_return_t status;
    1164              :     libspdm_test_context_t *spdm_test_context;
    1165              :     libspdm_context_t *spdm_context;
    1166              :     size_t response_size;
    1167              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1168              :     spdm_csr_response_t *spdm_response;
    1169              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
    1170              :     uint8_t wrong_csr[LIBSPDM_MAX_CSR_SIZE];
    1171              :     bool result;
    1172              :     bool is_device_cert_model;
    1173              : 
    1174            1 :     libspdm_zero_mem(wrong_csr, LIBSPDM_MAX_CSR_SIZE);
    1175              : 
    1176            1 :     spdm_test_context = *state;
    1177            1 :     spdm_context = spdm_test_context->spdm_context;
    1178            1 :     spdm_test_context->case_id = 0xB;
    1179            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1180              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1181              : 
    1182            1 :     spdm_context->connection_info.connection_state =
    1183              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1184            1 :     spdm_context->local_context.capability.flags |=
    1185              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
    1186            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1187              :         m_libspdm_use_hash_algo;
    1188            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1189              :         m_libspdm_use_asym_algo;
    1190              : 
    1191              :     /*set alias cert mode*/
    1192            1 :     spdm_context->local_context.capability.flags |=
    1193              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ALIAS_CERT_CAP;
    1194            1 :     is_device_cert_model = false;
    1195              : 
    1196            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t));
    1197              : 
    1198            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1199            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1200            1 :     m_libspdm_get_csr_request->header.param1 = 0;
    1201            1 :     m_libspdm_get_csr_request->header.param2 = 0;
    1202              : 
    1203            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1204            1 :     m_libspdm_get_csr_request->requester_info_length = 0;
    1205              : 
    1206            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t);
    1207              : 
    1208            1 :     response_size = sizeof(response);
    1209            1 :     status = libspdm_get_response_csr(spdm_context,
    1210              :                                       m_libspdm_get_csr_request_size,
    1211              :                                       m_libspdm_get_csr_request,
    1212              :                                       &response_size, response);
    1213            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1214              : 
    1215            1 :     spdm_response = (void *)response;
    1216            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
    1217            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1218              :                      SPDM_CSR);
    1219              : 
    1220              :     /*check returned CSR not zero */
    1221            1 :     assert_memory_not_equal(spdm_response + 1, wrong_csr, spdm_response->csr_length);
    1222              : 
    1223              :     /*check the resulting CSR shall be for a Device Certificate CA.*/
    1224            1 :     result = libspdm_check_csr_basic_constraints((uint8_t *)(spdm_response + 1),
    1225            1 :                                                  spdm_response->csr_length, is_device_cert_model);
    1226            1 :     assert_true(result);
    1227              : 
    1228            1 :     free(m_libspdm_get_csr_request);
    1229            1 : }
    1230              : 
    1231              : /**
    1232              :  * Test 12: receives a valid GET_CSR request message from Requester with need_reset
    1233              :  * Expected Behavior: the first get_csr: responder return need reset;
    1234              :  *                    the second get_csr without device reset: responder return need reset;
    1235              :  **/
    1236            1 : void libspdm_test_responder_csr_case12(void **state)
    1237              : {
    1238              :     libspdm_return_t status;
    1239              :     libspdm_test_context_t *spdm_test_context;
    1240              :     libspdm_context_t *spdm_context;
    1241              :     size_t response_size;
    1242              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1243              :     spdm_csr_response_t *spdm_response;
    1244              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
    1245              :     uint8_t cached_csr[LIBSPDM_MAX_CSR_SIZE];
    1246            1 :     libspdm_zero_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE);
    1247              : 
    1248              :     uint8_t *csr_pointer;
    1249              :     size_t csr_len;
    1250              : 
    1251            1 :     if (!libspdm_test_read_cached_csr(&csr_pointer, &csr_len)) {
    1252            0 :         assert_false(true);
    1253              :     }
    1254              : 
    1255            1 :     libspdm_copy_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE, csr_pointer, csr_len);
    1256            1 :     free(csr_pointer);
    1257              : 
    1258            1 :     spdm_test_context = *state;
    1259            1 :     spdm_context = spdm_test_context->spdm_context;
    1260            1 :     spdm_test_context->case_id = 0xC;
    1261            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1262              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1263              : 
    1264            1 :     spdm_context->connection_info.connection_state =
    1265              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1266            1 :     spdm_context->local_context.capability.flags |=
    1267              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
    1268              : 
    1269              :     /*set responder need reset*/
    1270            1 :     spdm_context->local_context.capability.flags |=
    1271              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
    1272              : 
    1273            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1274              :         m_libspdm_use_hash_algo;
    1275            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1276              :         m_libspdm_use_asym_algo;
    1277              : 
    1278              :     /*set csr before reset*/
    1279            1 :     assert_true(libspdm_set_csr_before_reset());
    1280              : 
    1281            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
    1282              :                                        req_info_len);
    1283              : 
    1284            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1285            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1286            1 :     m_libspdm_get_csr_request->header.param1 = 0;
    1287            1 :     m_libspdm_get_csr_request->header.param2 = 0;
    1288              : 
    1289            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1290            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1291              : 
    1292            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1293              :                      right_req_info, req_info_len);
    1294              : 
    1295            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
    1296              :                                             req_info_len;
    1297              : 
    1298            1 :     response_size = sizeof(response);
    1299              : 
    1300            1 :     status = libspdm_get_response_csr(spdm_context,
    1301              :                                       m_libspdm_get_csr_request_size,
    1302              :                                       m_libspdm_get_csr_request,
    1303              :                                       &response_size, response);
    1304              :     /*first get_csr: the responder need reset*/
    1305            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1306            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1307            1 :     spdm_response = (void *)response;
    1308            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1309              :                      SPDM_ERROR);
    1310            1 :     assert_int_equal(spdm_response->header.param1,
    1311              :                      SPDM_ERROR_CODE_RESET_REQUIRED);
    1312            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1313              : 
    1314            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1315            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1316            1 :     m_libspdm_get_csr_request->header.param1 = 0;
    1317            1 :     m_libspdm_get_csr_request->header.param2 = 0;
    1318              : 
    1319            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1320            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1321            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1322              :                      right_req_info, req_info_len);
    1323              : 
    1324            1 :     response_size = sizeof(response);
    1325              : 
    1326            1 :     status = libspdm_get_response_csr(spdm_context,
    1327              :                                       m_libspdm_get_csr_request_size,
    1328              :                                       m_libspdm_get_csr_request,
    1329              :                                       &response_size, response);
    1330              :     /*second get_csr without device reset: get the responder cached csr*/
    1331            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1332            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1333            1 :     spdm_response = (void *)response;
    1334            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1335              :                      SPDM_ERROR);
    1336            1 :     assert_int_equal(spdm_response->header.param1,
    1337              :                      SPDM_ERROR_CODE_RESET_REQUIRED);
    1338            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1339              : 
    1340              :     /*clear cached req_info*/
    1341            1 :     libspdm_test_clear_cached_last_request();
    1342            1 :     free(m_libspdm_get_csr_request);
    1343              : 
    1344              :     /*set csr to the origin state*/
    1345            1 :     assert_true(libspdm_set_csr_after_reset());
    1346            1 : }
    1347              : 
    1348              : /**
    1349              :  * Test 13: receives a valid GET_CSR request message from Requester with need_reset for SPDM 1.3
    1350              :  * Expected Behavior: the first get_csr with csr_tracking_tag 0: responder return need reset and available csr_tracking_tag;
    1351              :  *                    After reset, the second get_csr with returned available csr_tracking_tag: after device reset: get the cached valid csr;
    1352              :  **/
    1353            1 : void libspdm_test_responder_csr_case13(void **state)
    1354              : {
    1355              :     libspdm_return_t status;
    1356              :     libspdm_test_context_t *spdm_test_context;
    1357              :     libspdm_context_t *spdm_context;
    1358              :     size_t response_size;
    1359              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1360              :     spdm_csr_response_t *spdm_response;
    1361              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
    1362              :     uint8_t cached_csr[LIBSPDM_MAX_CSR_SIZE];
    1363            1 :     libspdm_zero_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE);
    1364              : 
    1365              :     uint8_t *csr_pointer;
    1366              :     size_t csr_len;
    1367              :     uint8_t csr_tracking_tag;
    1368              : 
    1369            1 :     csr_tracking_tag = 0;
    1370              : 
    1371            1 :     if (!libspdm_test_read_cached_csr(&csr_pointer, &csr_len)) {
    1372            0 :         assert_false(true);
    1373              :     }
    1374              : 
    1375            1 :     libspdm_copy_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE, csr_pointer, csr_len);
    1376            1 :     free(csr_pointer);
    1377              : 
    1378            1 :     spdm_test_context = *state;
    1379            1 :     spdm_context = spdm_test_context->spdm_context;
    1380            1 :     spdm_test_context->case_id = 0xD;
    1381            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1382              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1383              : 
    1384            1 :     spdm_context->connection_info.connection_state =
    1385              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1386            1 :     spdm_context->local_context.capability.flags |=
    1387              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
    1388              : 
    1389            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
    1390              :     /*set responder need reset*/
    1391            1 :     spdm_context->local_context.capability.flags |=
    1392              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
    1393              : 
    1394            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1395              :         m_libspdm_use_hash_algo;
    1396            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1397              :         m_libspdm_use_asym_algo;
    1398              : 
    1399              :     /*set csr before reset*/
    1400            1 :     assert_true(libspdm_set_csr_before_reset());
    1401              : 
    1402            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
    1403              :                                        req_info_len);
    1404              : 
    1405            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1406            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1407            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1408            1 :     m_libspdm_get_csr_request->header.param2 =
    1409            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1410              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1411              : 
    1412            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1413            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1414              : 
    1415            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1416              :                      right_req_info, req_info_len);
    1417              : 
    1418            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
    1419              :                                             req_info_len;
    1420              : 
    1421            1 :     response_size = sizeof(response);
    1422            1 :     status = libspdm_get_response_csr(spdm_context,
    1423              :                                       m_libspdm_get_csr_request_size,
    1424              :                                       m_libspdm_get_csr_request,
    1425              :                                       &response_size, response);
    1426              : 
    1427              :     /*set csr after reset*/
    1428            1 :     assert_true(libspdm_set_csr_after_reset());
    1429              : #if LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX
    1430              :     /*first get_csr: the responder need reset*/
    1431            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1432            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1433            1 :     spdm_response = (void *)response;
    1434            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1435              :                      SPDM_ERROR);
    1436            1 :     assert_int_equal(spdm_response->header.param1,
    1437              :                      SPDM_ERROR_CODE_RESET_REQUIRED);
    1438            1 :     assert_int_equal(spdm_response->header.param2, 1);
    1439              : 
    1440            1 :     csr_tracking_tag = spdm_response->header.param2;
    1441            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1442            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1443            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1444            1 :     m_libspdm_get_csr_request->header.param2 =
    1445            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1446              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1447              : 
    1448            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1449            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1450            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1451              :                      right_req_info, req_info_len);
    1452              : 
    1453            1 :     response_size = sizeof(response);
    1454            1 :     status = libspdm_get_response_csr(spdm_context,
    1455              :                                       m_libspdm_get_csr_request_size,
    1456              :                                       m_libspdm_get_csr_request,
    1457              :                                       &response_size, response);
    1458              :     /*second get_csr after device reset: get the responder cached csr*/
    1459            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1460              : 
    1461            1 :     spdm_response = (void *)response;
    1462            1 :     assert_int_equal(response_size, sizeof(spdm_csr_response_t) + spdm_response->csr_length);
    1463            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1464              :                      SPDM_CSR);
    1465              : 
    1466              :     /*check returned CSR is equal the cached CSR */
    1467            1 :     assert_memory_equal(spdm_response + 1, cached_csr, spdm_response->csr_length);
    1468              : #else
    1469              :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1470              :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1471              :     spdm_response = (void *)response;
    1472              :     assert_int_equal(spdm_response->header.request_response_code,
    1473              :                      SPDM_ERROR);
    1474              :     assert_int_equal(spdm_response->header.param1,
    1475              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
    1476              :     assert_int_equal(spdm_response->header.param2, 0);
    1477              : #endif /*LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX*/
    1478              :     /*clear cached req_info*/
    1479            1 :     libspdm_test_clear_cached_last_request();
    1480            1 :     free(m_libspdm_get_csr_request);
    1481            1 : }
    1482              : 
    1483              : /**
    1484              :  * Test 14: receives a valid GET_CSR request message from Requester with need_reset for SPDM 1.3
    1485              :  * Expected Behavior: the first get_csr with csr_tracking_tag 0: responder return need reset and available csr_tracking_tag;
    1486              :  *                    After reset, then send get_csr with csr_tracking_tag 0 six times: responder return need reset and available csr_tracking_tag;
    1487              :  *                    Then send get_csr with csr_tracking_tag 0: responder return busy error;
    1488              :  **/
    1489            1 : void libspdm_test_responder_csr_case14(void **state)
    1490              : {
    1491              :     libspdm_return_t status;
    1492              :     libspdm_test_context_t *spdm_test_context;
    1493              :     libspdm_context_t *spdm_context;
    1494              :     size_t response_size;
    1495              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1496              :     spdm_csr_response_t *spdm_response;
    1497              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
    1498              :     uint8_t cached_csr[LIBSPDM_MAX_CSR_SIZE];
    1499              : #if LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX
    1500              :     uint8_t index;
    1501              : #endif /*LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX*/
    1502            1 :     libspdm_zero_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE);
    1503              : 
    1504              :     uint8_t *csr_pointer;
    1505              :     size_t csr_len;
    1506              :     uint8_t csr_tracking_tag;
    1507              : 
    1508            1 :     csr_tracking_tag = 0;
    1509              : 
    1510            1 :     if (!libspdm_test_read_cached_csr(&csr_pointer, &csr_len)) {
    1511            0 :         assert_false(true);
    1512              :     }
    1513              : 
    1514            1 :     libspdm_copy_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE, csr_pointer, csr_len);
    1515            1 :     free(csr_pointer);
    1516              : 
    1517            1 :     spdm_test_context = *state;
    1518            1 :     spdm_context = spdm_test_context->spdm_context;
    1519            1 :     spdm_test_context->case_id = 0xE;
    1520            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1521              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1522              : 
    1523            1 :     spdm_context->connection_info.connection_state =
    1524              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1525            1 :     spdm_context->local_context.capability.flags |=
    1526              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
    1527              : 
    1528            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
    1529              :     /*set responder need reset*/
    1530            1 :     spdm_context->local_context.capability.flags |=
    1531              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
    1532              : 
    1533            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1534              :         m_libspdm_use_hash_algo;
    1535            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1536              :         m_libspdm_use_asym_algo;
    1537              : 
    1538              :     /*set csr before reset*/
    1539            1 :     assert_true(libspdm_set_csr_before_reset());
    1540              : 
    1541            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
    1542              :                                        req_info_len);
    1543              : 
    1544            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1545            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1546            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1547            1 :     m_libspdm_get_csr_request->header.param2 =
    1548            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1549              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1550              : 
    1551            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1552            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1553              : 
    1554            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1555              :                      right_req_info, req_info_len);
    1556              : 
    1557            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
    1558              :                                             req_info_len;
    1559              : 
    1560            1 :     response_size = sizeof(response);
    1561            1 :     status = libspdm_get_response_csr(spdm_context,
    1562              :                                       m_libspdm_get_csr_request_size,
    1563              :                                       m_libspdm_get_csr_request,
    1564              :                                       &response_size, response);
    1565              : 
    1566              :     /*set csr after reset*/
    1567            1 :     assert_true(libspdm_set_csr_after_reset());
    1568              : #if LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX
    1569              :     /*first get_csr: the responder need reset*/
    1570            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1571            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1572            1 :     spdm_response = (void *)response;
    1573            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1574              :                      SPDM_ERROR);
    1575            1 :     assert_int_equal(spdm_response->header.param1,
    1576              :                      SPDM_ERROR_CODE_RESET_REQUIRED);
    1577            1 :     assert_int_equal(spdm_response->header.param2, 1);
    1578              : 
    1579            7 :     for (index = 1; index < SPDM_MAX_CSR_TRACKING_TAG; index++) {
    1580            6 :         csr_tracking_tag = 0;
    1581            6 :         m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1582            6 :         m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1583            6 :         m_libspdm_get_csr_request->header.param1 = 1;
    1584            6 :         m_libspdm_get_csr_request->header.param2 =
    1585            6 :             SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1586              :             (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1587              : 
    1588            6 :         m_libspdm_get_csr_request->opaque_data_length = 0;
    1589            6 :         m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1590            6 :         libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1591              :                          right_req_info, req_info_len);
    1592              : 
    1593            6 :         response_size = sizeof(response);
    1594            6 :         status = libspdm_get_response_csr(spdm_context,
    1595              :                                           m_libspdm_get_csr_request_size,
    1596              :                                           m_libspdm_get_csr_request,
    1597              :                                           &response_size, response);
    1598              :         /*second get_csr after device reset: get the responder cached csr*/
    1599            6 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1600            6 :         assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1601            6 :         spdm_response = (void *)response;
    1602            6 :         assert_int_equal(spdm_response->header.request_response_code,
    1603              :                          SPDM_ERROR);
    1604            6 :         assert_int_equal(spdm_response->header.param1,
    1605              :                          SPDM_ERROR_CODE_RESET_REQUIRED);
    1606            6 :         assert_int_equal(spdm_response->header.param2, index + 1);
    1607              :     }
    1608              : 
    1609            1 :     csr_tracking_tag = 0;
    1610            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1611            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1612            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1613            1 :     m_libspdm_get_csr_request->header.param2 =
    1614            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1615              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1616              : 
    1617            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1618            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1619            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1620              :                      right_req_info, req_info_len);
    1621              : 
    1622            1 :     response_size = sizeof(response);
    1623            1 :     status = libspdm_get_response_csr(spdm_context,
    1624              :                                       m_libspdm_get_csr_request_size,
    1625              :                                       m_libspdm_get_csr_request,
    1626              :                                       &response_size, response);
    1627              :     /*second get_csr after device reset: get the responder cached csr*/
    1628            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1629            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1630            1 :     spdm_response = (void *)response;
    1631            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
    1632              :     (LIBSPDM_SET_CERT_CSR_PARAMS) ?
    1633            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY) :
    1634            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1635            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1636              : #else
    1637              :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1638              :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1639              :     spdm_response = (void *)response;
    1640              :     assert_int_equal(spdm_response->header.request_response_code,
    1641              :                      SPDM_ERROR);
    1642              :     assert_int_equal(spdm_response->header.param1,
    1643              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
    1644              :     assert_int_equal(spdm_response->header.param2, 0);
    1645              : #endif /*LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX*/
    1646              :     /*clear cached req_info*/
    1647            1 :     libspdm_test_clear_cached_last_request();
    1648            1 :     free(m_libspdm_get_csr_request);
    1649            1 : }
    1650              : 
    1651              : /**
    1652              :  * Test 15: receives a valid GET_CSR request message from Requester with need_reset for SPDM 1.3
    1653              :  * Expected Behavior: the first get_csr with csr_tracking_tag 0: responder return need reset and available csr_tracking_tag;
    1654              :  *                    Without reset, then send get_csr with unmatched csr_tracking_tag:responder return unexpected error;
    1655              :  *                    Without reset, then send get_csr with matched csr_tracking_tag:responder return busy error;
    1656              :  *                    Without reset, then send get_csr with non-0 csr_tracking_tag, and overwrite is set:responder return invalid error;
    1657              :  *                    After reset, then send get_csr with unmatched csr_tracking_tag:responder return unexpected error;
    1658              :  *                    After reset, then send get_csr with csr_tracking_tag 0, and overwrite is set:responder return need reset and available csr_tracking_tag;
    1659              :  **/
    1660            1 : void libspdm_test_responder_csr_case15(void **state)
    1661              : {
    1662              :     libspdm_return_t status;
    1663              :     libspdm_test_context_t *spdm_test_context;
    1664              :     libspdm_context_t *spdm_context;
    1665              :     size_t response_size;
    1666              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1667              :     spdm_csr_response_t *spdm_response;
    1668              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
    1669              :     uint8_t cached_csr[LIBSPDM_MAX_CSR_SIZE];
    1670            1 :     libspdm_zero_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE);
    1671              : 
    1672              :     uint8_t *csr_pointer;
    1673              :     size_t csr_len;
    1674              :     uint8_t csr_tracking_tag;
    1675              : 
    1676            1 :     csr_tracking_tag = 0;
    1677              : 
    1678            1 :     if (!libspdm_test_read_cached_csr(&csr_pointer, &csr_len)) {
    1679            0 :         assert_false(true);
    1680              :     }
    1681              : 
    1682            1 :     libspdm_copy_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE, csr_pointer, csr_len);
    1683            1 :     free(csr_pointer);
    1684              : 
    1685            1 :     spdm_test_context = *state;
    1686            1 :     spdm_context = spdm_test_context->spdm_context;
    1687            1 :     spdm_test_context->case_id = 0xF;
    1688            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1689              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1690              : 
    1691            1 :     spdm_context->connection_info.connection_state =
    1692              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1693            1 :     spdm_context->local_context.capability.flags |=
    1694              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
    1695              : 
    1696            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
    1697              :     /*set responder need reset*/
    1698            1 :     spdm_context->local_context.capability.flags |=
    1699              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
    1700              : 
    1701            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1702              :         m_libspdm_use_hash_algo;
    1703            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1704              :         m_libspdm_use_asym_algo;
    1705              : 
    1706              :     /*set csr before reset*/
    1707            1 :     assert_true(libspdm_set_csr_before_reset());
    1708              : 
    1709            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) +
    1710              :                                        req_info_len);
    1711              : 
    1712            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1713            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1714            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1715            1 :     m_libspdm_get_csr_request->header.param2 =
    1716            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1717              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1718              : 
    1719            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1720            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1721              : 
    1722            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1723              :                      right_req_info, req_info_len);
    1724              : 
    1725            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) +
    1726              :                                             req_info_len;
    1727              : 
    1728            1 :     response_size = sizeof(response);
    1729            1 :     status = libspdm_get_response_csr(spdm_context,
    1730              :                                       m_libspdm_get_csr_request_size,
    1731              :                                       m_libspdm_get_csr_request,
    1732              :                                       &response_size, response);
    1733              : #if LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX
    1734              :     /*first get_csr: the responder need reset*/
    1735            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1736            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1737            1 :     spdm_response = (void *)response;
    1738            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1739              :                      SPDM_ERROR);
    1740            1 :     assert_int_equal(spdm_response->header.param1,
    1741              :                      SPDM_ERROR_CODE_RESET_REQUIRED);
    1742            1 :     assert_int_equal(spdm_response->header.param2, 1);
    1743              : 
    1744              :     /*unmatched csr_tracking_tag*/
    1745            1 :     csr_tracking_tag = 3;
    1746            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1747            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1748            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1749            1 :     m_libspdm_get_csr_request->header.param2 =
    1750            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1751              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1752              : 
    1753            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1754            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1755            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1756              :                      right_req_info, req_info_len);
    1757              : 
    1758            1 :     response_size = sizeof(response);
    1759            1 :     status = libspdm_get_response_csr(spdm_context,
    1760              :                                       m_libspdm_get_csr_request_size,
    1761              :                                       m_libspdm_get_csr_request,
    1762              :                                       &response_size, response);
    1763              :     /*second get_csr after device reset: get the responder cached csr*/
    1764            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1765            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1766            1 :     spdm_response = (void *)response;
    1767            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1768              :                      SPDM_ERROR);
    1769            1 :     assert_int_equal(spdm_response->header.param1,
    1770              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1771            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1772              : 
    1773              :     /*matched csr_tracking_tag without overwrite*/
    1774            1 :     csr_tracking_tag = 1;
    1775            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1776            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1777            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1778            1 :     m_libspdm_get_csr_request->header.param2 =
    1779            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1780              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1781              : 
    1782            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1783            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1784            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1785              :                      right_req_info, req_info_len);
    1786              : 
    1787            1 :     response_size = sizeof(response);
    1788            1 :     status = libspdm_get_response_csr(spdm_context,
    1789              :                                       m_libspdm_get_csr_request_size,
    1790              :                                       m_libspdm_get_csr_request,
    1791              :                                       &response_size, response);
    1792              :     /*second get_csr after device reset: get the responder cached csr*/
    1793            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1794            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1795            1 :     spdm_response = (void *)response;
    1796            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
    1797              :     (LIBSPDM_SET_CERT_CSR_PARAMS) ?
    1798            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY) :
    1799            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1800            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1801              : 
    1802              : 
    1803              :     /*matched csr_tracking_tag with overwrite*/
    1804            1 :     csr_tracking_tag = 1;
    1805            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1806            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1807            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1808            1 :     m_libspdm_get_csr_request->header.param2 =
    1809            1 :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET) |
    1810              :         SPDM_GET_CSR_REQUEST_ATTRIBUTES_OVERWRITE;
    1811              : 
    1812            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1813            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1814            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1815              :                      right_req_info, req_info_len);
    1816              : 
    1817            1 :     response_size = sizeof(response);
    1818            1 :     status = libspdm_get_response_csr(spdm_context,
    1819              :                                       m_libspdm_get_csr_request_size,
    1820              :                                       m_libspdm_get_csr_request,
    1821              :                                       &response_size, response);
    1822              :     /*second get_csr after device reset: get the responder cached csr*/
    1823            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1824            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1825            1 :     spdm_response = (void *)response;
    1826            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1827              :                      SPDM_ERROR);
    1828            1 :     assert_int_equal(spdm_response->header.param1,
    1829              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1830            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1831              : 
    1832              :     /*set csr after reset*/
    1833            1 :     assert_true(libspdm_set_csr_after_reset());
    1834              : 
    1835              :     /*unmatched csr_tracking_tag*/
    1836            1 :     csr_tracking_tag = 3;
    1837            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1838            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1839            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1840            1 :     m_libspdm_get_csr_request->header.param2 =
    1841            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1842              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1843              : 
    1844            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1845            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1846            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1847              :                      right_req_info, req_info_len);
    1848              : 
    1849            1 :     response_size = sizeof(response);
    1850            1 :     status = libspdm_get_response_csr(spdm_context,
    1851              :                                       m_libspdm_get_csr_request_size,
    1852              :                                       m_libspdm_get_csr_request,
    1853              :                                       &response_size, response);
    1854            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1855            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1856            1 :     spdm_response = (void *)response;
    1857            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1858              :                      SPDM_ERROR);
    1859            1 :     assert_int_equal(spdm_response->header.param1,
    1860              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1861            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1862              : 
    1863              :     /*csr_tracking_tag 0 and overwrite*/
    1864            1 :     csr_tracking_tag = 0;
    1865            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1866            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1867            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1868            1 :     m_libspdm_get_csr_request->header.param2 =
    1869              :         SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT |
    1870            1 :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET) |
    1871              :         SPDM_GET_CSR_REQUEST_ATTRIBUTES_OVERWRITE;
    1872              : 
    1873            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1874            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1875            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len,
    1876              :                      right_req_info, req_info_len);
    1877              : 
    1878            1 :     response_size = sizeof(response);
    1879            1 :     status = libspdm_get_response_csr(spdm_context,
    1880              :                                       m_libspdm_get_csr_request_size,
    1881              :                                       m_libspdm_get_csr_request,
    1882              :                                       &response_size, response);
    1883            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1884            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1885            1 :     spdm_response = (void *)response;
    1886            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1887              :                      SPDM_ERROR);
    1888            1 :     assert_int_equal(spdm_response->header.param1,
    1889              :                      SPDM_ERROR_CODE_RESET_REQUIRED);
    1890            1 :     assert_int_equal(spdm_response->header.param2, 1);
    1891              : 
    1892              : #else
    1893              :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1894              :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1895              :     spdm_response = (void *)response;
    1896              :     assert_int_equal(spdm_response->header.request_response_code,
    1897              :                      SPDM_ERROR);
    1898              :     assert_int_equal(spdm_response->header.param1,
    1899              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
    1900              :     assert_int_equal(spdm_response->header.param2, 0);
    1901              :     /*set csr after reset*/
    1902              :     assert_true(libspdm_set_csr_after_reset());
    1903              : #endif /*LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX*/
    1904              :     /*clear cached req_info*/
    1905            1 :     libspdm_test_clear_cached_last_request();
    1906            1 :     free(m_libspdm_get_csr_request);
    1907            1 : }
    1908              : 
    1909              : /**
    1910              :  * Test 16: Illegal combination of MULTI_KEY_CONN_RSP = true and CSRCertModel = 0.
    1911              :  * Expected Behavior: produces SPDM_ERROR_CODE_INVALID_REQUEST message.
    1912              :  **/
    1913            1 : void libspdm_test_responder_csr_case16(void **state)
    1914              : {
    1915              : #if LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX
    1916              :     libspdm_return_t status;
    1917              :     libspdm_test_context_t *spdm_test_context;
    1918              :     libspdm_context_t *spdm_context;
    1919              :     size_t response_size;
    1920              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1921              :     spdm_csr_response_t *spdm_response;
    1922              :     spdm_get_csr_request_t *m_libspdm_get_csr_request;
    1923              :     uint8_t cached_csr[LIBSPDM_MAX_CSR_SIZE];
    1924            1 :     libspdm_zero_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE);
    1925              : 
    1926              :     uint8_t *csr_pointer;
    1927              :     size_t csr_len;
    1928              :     uint8_t csr_tracking_tag;
    1929              : 
    1930            1 :     csr_tracking_tag = 0;
    1931              : 
    1932            1 :     if (!libspdm_test_read_cached_csr(&csr_pointer, &csr_len)) {
    1933            0 :         assert_false(true);
    1934              :     }
    1935              : 
    1936            1 :     libspdm_copy_mem(cached_csr, LIBSPDM_MAX_CSR_SIZE, csr_pointer, csr_len);
    1937            1 :     free(csr_pointer);
    1938              : 
    1939            1 :     spdm_test_context = *state;
    1940            1 :     spdm_context = spdm_test_context->spdm_context;
    1941            1 :     spdm_test_context->case_id = 0x10;
    1942            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1943              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1944              : 
    1945            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1946            1 :     spdm_context->local_context.capability.flags = SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CSR_CAP;
    1947              : 
    1948            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
    1949            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1950            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1951              : 
    1952            1 :     m_libspdm_get_csr_request = malloc(sizeof(spdm_get_csr_request_t) + req_info_len);
    1953              : 
    1954            1 :     m_libspdm_get_csr_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    1955            1 :     m_libspdm_get_csr_request->header.request_response_code = SPDM_GET_CSR;
    1956            1 :     m_libspdm_get_csr_request->header.param1 = 1;
    1957            1 :     m_libspdm_get_csr_request->header.param2 =
    1958            1 :         SPDM_CERTIFICATE_INFO_CERT_MODEL_NONE |
    1959              :         (csr_tracking_tag << SPDM_GET_CSR_REQUEST_ATTRIBUTES_CSR_TRACKING_TAG_OFFSET);
    1960              : 
    1961            1 :     m_libspdm_get_csr_request->opaque_data_length = 0;
    1962            1 :     m_libspdm_get_csr_request->requester_info_length = req_info_len;
    1963              : 
    1964            1 :     libspdm_copy_mem(m_libspdm_get_csr_request + 1, req_info_len, right_req_info, req_info_len);
    1965              : 
    1966            1 :     size_t m_libspdm_get_csr_request_size = sizeof(spdm_get_csr_request_t) + req_info_len;
    1967              : 
    1968            1 :     response_size = sizeof(response);
    1969            1 :     status = libspdm_get_response_csr(spdm_context,
    1970              :                                       m_libspdm_get_csr_request_size,
    1971              :                                       m_libspdm_get_csr_request,
    1972              :                                       &response_size, response);
    1973              : 
    1974            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1975            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1976            1 :     spdm_response = (void *)response;
    1977            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
    1978            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1979            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1980              : 
    1981              :     /*clear cached req_info*/
    1982            1 :     libspdm_test_clear_cached_last_request();
    1983            1 :     free(m_libspdm_get_csr_request);
    1984              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CSR_CAP_EX */
    1985            1 : }
    1986              : 
    1987            1 : int libspdm_responder_csr_test_main(void)
    1988              : {
    1989            1 :     const struct CMUnitTest spdm_responder_csr_tests[] = {
    1990              :         /* Success Case for csr response with device_cert mode */
    1991              :         cmocka_unit_test(libspdm_test_responder_csr_case1),
    1992              :         /* Bad request size*/
    1993              :         cmocka_unit_test(libspdm_test_responder_csr_case2),
    1994              :         /* Success Case for csr response with non-null right req_info */
    1995              :         cmocka_unit_test(libspdm_test_responder_csr_case3),
    1996              :         /* Success Case for csr response with non-null opaque_data */
    1997              :         cmocka_unit_test(libspdm_test_responder_csr_case4),
    1998              :         /* Failed Case for csr response with non-null wrong req_info */
    1999              :         cmocka_unit_test(libspdm_test_responder_csr_case5),
    2000              :         /* Responder need reset to gen csr, the second send after device reset*/
    2001              :         cmocka_unit_test(libspdm_test_responder_csr_case6),
    2002              :         /* Success Case for csr response with non-null right req_info and opaque_data */
    2003              :         cmocka_unit_test(libspdm_test_responder_csr_case7),
    2004              :         /* Failed Case for csr response  With chaotic req_info and opaque_data */
    2005              :         cmocka_unit_test(libspdm_test_responder_csr_case8),
    2006              :         /* the OpaqueDataFmt1 bit is selected in OtherParamsSelection of ALGORITHMS*/
    2007              :         cmocka_unit_test(libspdm_test_responder_csr_case9),
    2008              :         /* Failed Case  OpaqueDataFmt1, When AlignPadding is not zero*/
    2009              :         cmocka_unit_test(libspdm_test_responder_csr_case10),
    2010              :         /* Success Case for csr response with alias_cert mode */
    2011              :         cmocka_unit_test(libspdm_test_responder_csr_case11),
    2012              :         /* Responder need reset to gen csr, the second send without device reset*/
    2013              :         cmocka_unit_test(libspdm_test_responder_csr_case12),
    2014              :         /* Success Case: Responder need reset to gen csr for SPDM1.3, the second send with matched csr_tracking_tag after device reset*/
    2015              :         cmocka_unit_test(libspdm_test_responder_csr_case13),
    2016              :         /* Failed Case: Responder need reset to gen csr for SPDM1.3, test for busy error*/
    2017              :         cmocka_unit_test(libspdm_test_responder_csr_case14),
    2018              :         /* Failed Case: Responder need reset to gen csr for SPDM1.3, test for unmatched csr_tracking_tag and overwrite*/
    2019              :         cmocka_unit_test(libspdm_test_responder_csr_case15),
    2020              :         cmocka_unit_test(libspdm_test_responder_csr_case16),
    2021              :     };
    2022              : 
    2023            1 :     libspdm_test_context_t test_context = {
    2024              :         LIBSPDM_TEST_CONTEXT_VERSION,
    2025              :         false,
    2026              :     };
    2027              : 
    2028            1 :     libspdm_setup_test_context(&test_context);
    2029              : 
    2030              :     /*ensure that cached.csr exists in test_csr at the beginning*/
    2031            1 :     libspdm_clear_cached_csr();
    2032              : 
    2033            1 :     return cmocka_run_group_tests(spdm_responder_csr_tests,
    2034              :                                   libspdm_unit_test_group_setup,
    2035              :                                   libspdm_unit_test_group_teardown);
    2036              : }
    2037              : 
    2038              : #endif /*LIBSPDM_ENABLE_CAPABILITY_CSR_CAP*/
        

Generated by: LCOV version 2.0-1