LCOV - code coverage report
Current view: top level - unit_test/test_spdm_crypt - test_spdm_crypt.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.4 % 443 436
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 16 16

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2024 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 "library/spdm_common_lib.h"
       9              : #include "spdm_crypt_ext_lib/spdm_crypt_ext_lib.h"
      10              : 
      11              : /* https://lapo.it/asn1js/#MCQGCisGAQQBgxyCEgEMFkFDTUU6V0lER0VUOjEyMzQ1Njc4OTA*/
      12              : uint8_t m_libspdm_subject_alt_name_buffer1[] = {
      13              :     0x30, 0x24, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83,
      14              :     0x1C, 0x82, 0x12, 0x01, 0x0C, 0x16, 0x41, 0x43, 0x4D, 0x45,
      15              :     0x3A, 0x57, 0x49, 0x44, 0x47, 0x45, 0x54, 0x3A, 0x31, 0x32,
      16              :     0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30
      17              : };
      18              : 
      19              : /* https://lapo.it/asn1js/#MCYGCisGAQQBgxyCEgGgGAwWQUNNRTpXSURHRVQ6MTIzNDU2Nzg5MA*/
      20              : uint8_t m_libspdm_subject_alt_name_buffer2[] = {
      21              :     0x30, 0x26, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83,
      22              :     0x1C, 0x82, 0x12, 0x01, 0xA0, 0x18, 0x0C, 0x16, 0x41, 0x43,
      23              :     0x4D, 0x45, 0x3A, 0x57, 0x49, 0x44, 0x47, 0x45, 0x54, 0x3A,
      24              :     0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30
      25              : };
      26              : 
      27              : /* https://lapo.it/asn1js/#MCigJgYKKwYBBAGDHIISAaAYDBZBQ01FOldJREdFVDoxMjM0NTY3ODkw*/
      28              : uint8_t m_libspdm_subject_alt_name_buffer3[] = {
      29              :     0x30, 0x28, 0xA0, 0x26, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01,
      30              :     0x83, 0x1C, 0x82, 0x12, 0x01, 0xA0, 0x18, 0x0C, 0x16, 0x41, 0x43,
      31              :     0x4D, 0x45, 0x3A, 0x57, 0x49, 0x44, 0x47, 0x45, 0x54, 0x3A, 0x31,
      32              :     0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30
      33              : };
      34              : 
      35              : uint8_t m_libspdm_dmtf_oid[] = { 0x2B, 0x06, 0x01, 0x4,  0x01,
      36              :                                  0x83, 0x1C, 0x82, 0x12, 0x01 };
      37              : 
      38            1 : void libspdm_test_crypt_spdm_get_dmtf_subject_alt_name_from_bytes(void **state)
      39              : {
      40              :     size_t common_name_size;
      41              :     char common_name[64];
      42              :     size_t dmtf_oid_size;
      43              :     uint8_t dmtf_oid[64];
      44              :     bool status;
      45              : 
      46            1 :     common_name_size = 64;
      47            1 :     dmtf_oid_size = 64;
      48            1 :     libspdm_zero_mem(common_name, common_name_size);
      49            1 :     libspdm_zero_mem(dmtf_oid, dmtf_oid_size);
      50            1 :     status = libspdm_get_dmtf_subject_alt_name_from_bytes(
      51              :         m_libspdm_subject_alt_name_buffer1, sizeof(m_libspdm_subject_alt_name_buffer1),
      52              :         common_name, &common_name_size, dmtf_oid, &dmtf_oid_size);
      53            1 :     assert_true(status);
      54            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
      55            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
      56              : 
      57            1 :     common_name_size = 64;
      58            1 :     dmtf_oid_size = 64;
      59            1 :     libspdm_zero_mem(common_name, common_name_size);
      60            1 :     libspdm_zero_mem(dmtf_oid, dmtf_oid_size);
      61            1 :     status = libspdm_get_dmtf_subject_alt_name_from_bytes(
      62              :         m_libspdm_subject_alt_name_buffer2, sizeof(m_libspdm_subject_alt_name_buffer2),
      63              :         common_name, &common_name_size, dmtf_oid, &dmtf_oid_size);
      64            1 :     assert_true(status);
      65            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
      66            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
      67              : 
      68            1 :     common_name_size = 64;
      69            1 :     dmtf_oid_size = 64;
      70            1 :     libspdm_zero_mem(common_name, common_name_size);
      71            1 :     libspdm_zero_mem(dmtf_oid, dmtf_oid_size);
      72            1 :     status = libspdm_get_dmtf_subject_alt_name_from_bytes(
      73              :         m_libspdm_subject_alt_name_buffer3, sizeof(m_libspdm_subject_alt_name_buffer3),
      74              :         common_name, &common_name_size, dmtf_oid, &dmtf_oid_size);
      75            1 :     assert_true(status);
      76            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
      77            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
      78            1 : }
      79              : 
      80            1 : void libspdm_test_crypt_spdm_get_dmtf_subject_alt_name(void **state)
      81              : {
      82              :     size_t common_name_size;
      83              :     char common_name[64];
      84              :     size_t dmtf_oid_size;
      85              :     uint8_t dmtf_oid[64];
      86              :     uint8_t *file_buffer;
      87              :     size_t file_buffer_size;
      88              :     bool status;
      89              : 
      90            1 :     status = libspdm_read_input_file("rsa2048/end_requester.cert.der",
      91              :                                      (void **)&file_buffer, &file_buffer_size);
      92            1 :     assert_true(status);
      93            1 :     dmtf_oid_size = 64;
      94            1 :     common_name_size = 64;
      95            1 :     status = libspdm_get_dmtf_subject_alt_name(file_buffer, file_buffer_size,
      96              :                                                common_name, &common_name_size,
      97              :                                                dmtf_oid, &dmtf_oid_size);
      98            1 :     assert_true(status);
      99            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
     100            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
     101            1 :     free(file_buffer);
     102              : 
     103            1 :     status = libspdm_read_input_file("rsa3072/end_requester.cert.der",
     104              :                                      (void **)&file_buffer, &file_buffer_size);
     105            1 :     assert_true(status);
     106            1 :     dmtf_oid_size = 64;
     107            1 :     common_name_size = 64;
     108            1 :     status = libspdm_get_dmtf_subject_alt_name(file_buffer, file_buffer_size,
     109              :                                                common_name, &common_name_size,
     110              :                                                dmtf_oid, &dmtf_oid_size);
     111            1 :     assert_true(status);
     112            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
     113            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
     114            1 :     free(file_buffer);
     115              : 
     116            1 :     status = libspdm_read_input_file("rsa4096/end_requester.cert.der",
     117              :                                      (void **)&file_buffer, &file_buffer_size);
     118            1 :     assert_true(status);
     119            1 :     dmtf_oid_size = 64;
     120            1 :     common_name_size = 64;
     121            1 :     status = libspdm_get_dmtf_subject_alt_name(file_buffer, file_buffer_size,
     122              :                                                common_name, &common_name_size,
     123              :                                                dmtf_oid, &dmtf_oid_size);
     124            1 :     assert_true(status);
     125            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
     126            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
     127            1 :     free(file_buffer);
     128              : 
     129            1 :     status = libspdm_read_input_file("ecp256/end_requester.cert.der",
     130              :                                      (void **)&file_buffer, &file_buffer_size);
     131            1 :     assert_true(status);
     132            1 :     dmtf_oid_size = 64;
     133            1 :     common_name_size = 64;
     134            1 :     status = libspdm_get_dmtf_subject_alt_name(file_buffer, file_buffer_size,
     135              :                                                common_name, &common_name_size,
     136              :                                                dmtf_oid, &dmtf_oid_size);
     137            1 :     assert_true(status);
     138            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
     139            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
     140            1 :     free(file_buffer);
     141              : 
     142            1 :     status = libspdm_read_input_file("ecp384/end_requester.cert.der",
     143              :                                      (void **)&file_buffer, &file_buffer_size);
     144            1 :     assert_true(status);
     145            1 :     dmtf_oid_size = 64;
     146            1 :     common_name_size = 64;
     147            1 :     status = libspdm_get_dmtf_subject_alt_name(file_buffer, file_buffer_size,
     148              :                                                common_name, &common_name_size,
     149              :                                                dmtf_oid, &dmtf_oid_size);
     150            1 :     assert_true(status);
     151            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
     152            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
     153            1 :     free(file_buffer);
     154              : 
     155            1 :     status = libspdm_read_input_file("ecp521/end_requester.cert.der",
     156              :                                      (void **)&file_buffer, &file_buffer_size);
     157            1 :     assert_true(status);
     158            1 :     dmtf_oid_size = 64;
     159            1 :     common_name_size = 64;
     160            1 :     status = libspdm_get_dmtf_subject_alt_name(file_buffer, file_buffer_size,
     161              :                                                common_name, &common_name_size,
     162              :                                                dmtf_oid, &dmtf_oid_size);
     163            1 :     assert_true(status);
     164            1 :     assert_memory_equal(m_libspdm_dmtf_oid, dmtf_oid, sizeof(m_libspdm_dmtf_oid));
     165            1 :     assert_string_equal(common_name, "ACME:WIDGET:1234567890");
     166            1 :     free(file_buffer);
     167            1 : }
     168              : 
     169            1 : void libspdm_test_crypt_spdm_x509_certificate_check(void **state)
     170              : {
     171              :     bool status;
     172              :     uint8_t *file_buffer;
     173              :     size_t file_buffer_size;
     174              : 
     175              :     if ((LIBSPDM_RSA_SSA_2048_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     176            1 :         status = libspdm_read_input_file("rsa2048/end_requester.cert.der",
     177              :                                          (void **)&file_buffer, &file_buffer_size);
     178            1 :         assert_true(status);
     179              : 
     180            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     181              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     182              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     183              :                                                 true, true);
     184            1 :         assert_true(status);
     185            1 :         free(file_buffer);
     186              :     }
     187              :     if ((LIBSPDM_RSA_SSA_3072_SUPPORT) && (LIBSPDM_SHA384_SUPPORT)) {
     188            1 :         status = libspdm_read_input_file("rsa3072/end_requester.cert.der",
     189              :                                          (void **)&file_buffer, &file_buffer_size);
     190            1 :         assert_true(status);
     191            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     192              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_3072,
     193              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384,
     194              :                                                 true, true);
     195            1 :         assert_true(status);
     196            1 :         free(file_buffer);
     197              :     }
     198              :     if ((LIBSPDM_RSA_SSA_4096_SUPPORT) && (LIBSPDM_SHA512_SUPPORT)) {
     199            1 :         status = libspdm_read_input_file("rsa4096/end_requester.cert.der",
     200              :                                          (void **)&file_buffer, &file_buffer_size);
     201            1 :         assert_true(status);
     202            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     203              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_4096,
     204              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512,
     205              :                                                 true, true);
     206            1 :         assert_true(status);
     207            1 :         free(file_buffer);
     208              :     }
     209              : 
     210              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     211            1 :         status = libspdm_read_input_file("ecp256/end_requester.cert.der",
     212              :                                          (void **)&file_buffer, &file_buffer_size);
     213            1 :         assert_true(status);
     214            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     215              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     216              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     217              :                                                 true, true);
     218            1 :         assert_true(status);
     219            1 :         free(file_buffer);
     220              :     }
     221              :     if ((LIBSPDM_ECDSA_P384_SUPPORT) && (LIBSPDM_SHA384_SUPPORT)) {
     222            1 :         status = libspdm_read_input_file("ecp384/end_requester.cert.der",
     223              :                                          (void **)&file_buffer, &file_buffer_size);
     224            1 :         assert_true(status);
     225            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     226              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P384,
     227              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384,
     228              :                                                 true, true);
     229            1 :         assert_true(status);
     230            1 :         free(file_buffer);
     231              :     }
     232              :     if ((LIBSPDM_ECDSA_P521_SUPPORT) && (LIBSPDM_SHA512_SUPPORT)) {
     233            1 :         status = libspdm_read_input_file("ecp521/end_requester.cert.der",
     234              :                                          (void **)&file_buffer, &file_buffer_size);
     235            1 :         assert_true(status);
     236            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     237              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P521,
     238              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512,
     239              :                                                 true, true);
     240            1 :         assert_true(status);
     241            1 :         free(file_buffer);
     242              :     }
     243              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     244              :         /*check for leaf cert basic constraints, CA = true,pathlen:none*/
     245            1 :         status = libspdm_read_input_file("ecp256/end_requester_ca_false.cert.der",
     246              :                                          (void **)&file_buffer, &file_buffer_size);
     247            1 :         assert_true(status);
     248            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     249              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     250              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     251              :                                                 true, true);
     252            1 :         assert_false(status);
     253            1 :         free(file_buffer);
     254              : 
     255              : 
     256              :         /*check for leaf cert basic constraints, basic constraints is excluded*/
     257            1 :         status = libspdm_read_input_file("ecp256/end_requester_without_basic_constraint.cert.der",
     258              :                                          (void **)&file_buffer, &file_buffer_size);
     259            1 :         assert_true(status);
     260            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     261              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     262              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     263              :                                                 true, true);
     264            1 :         assert_true(status);
     265            1 :         free(file_buffer);
     266              :     }
     267              :     if ((LIBSPDM_RSA_SSA_2048_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     268              :         /*check for leaf cert spdm defined eku*/
     269            1 :         status = libspdm_read_input_file("rsa2048/end_requester_with_spdm_req_rsp_eku.cert.der",
     270              :                                          (void **)&file_buffer, &file_buffer_size);
     271            1 :         assert_true(status);
     272              : 
     273            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     274              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     275              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     276              :                                                 true, true);
     277            1 :         assert_true(status);
     278            1 :         free(file_buffer);
     279              : 
     280            1 :         status = libspdm_read_input_file("rsa2048/end_requester_with_spdm_req_eku.cert.der",
     281              :                                          (void **)&file_buffer, &file_buffer_size);
     282            1 :         assert_true(status);
     283              : 
     284            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     285              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     286              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     287              :                                                 true, true);
     288            1 :         assert_true(status);
     289            1 :         free(file_buffer);
     290              : 
     291            1 :         status = libspdm_read_input_file("rsa2048/end_requester_with_spdm_rsp_eku.cert.der",
     292              :                                          (void **)&file_buffer, &file_buffer_size);
     293            1 :         assert_true(status);
     294              : 
     295            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     296              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     297              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     298              :                                                 true, true);
     299            1 :         assert_false(status);
     300            1 :         free(file_buffer);
     301              : 
     302            1 :         status = libspdm_read_input_file("rsa2048/end_responder_with_spdm_req_rsp_eku.cert.der",
     303              :                                          (void **)&file_buffer, &file_buffer_size);
     304            1 :         assert_true(status);
     305              : 
     306            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     307              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     308              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     309              :                                                 false, true);
     310            1 :         assert_true(status);
     311            1 :         free(file_buffer);
     312              : 
     313            1 :         status = libspdm_read_input_file("rsa2048/end_requester_with_spdm_req_eku.cert.der",
     314              :                                          (void **)&file_buffer, &file_buffer_size);
     315            1 :         assert_true(status);
     316              : 
     317            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     318              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     319              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     320              :                                                 false, true);
     321            1 :         assert_false(status);
     322            1 :         free(file_buffer);
     323              : 
     324            1 :         status = libspdm_read_input_file("rsa2048/end_requester_with_spdm_rsp_eku.cert.der",
     325              :                                          (void **)&file_buffer, &file_buffer_size);
     326            1 :         assert_true(status);
     327              : 
     328            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     329              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     330              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     331              :                                                 false, true);
     332            1 :         assert_true(status);
     333            1 :         free(file_buffer);
     334              :     }
     335              :     if ((LIBSPDM_RSA_SSA_3072_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     336              :         /* cert mismatched negotiated base_aysm_algo check */
     337            1 :         status = libspdm_read_input_file("rsa2048/end_requester.cert.der",
     338              :                                          (void **)&file_buffer, &file_buffer_size);
     339            1 :         assert_true(status);
     340            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     341              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_3072,
     342              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     343              :                                                 true, true);
     344            1 :         assert_false(status);
     345            1 :         free(file_buffer);
     346              : 
     347            1 :         status = libspdm_read_input_file("ecp256/end_requester.cert.der",
     348              :                                          (void **)&file_buffer, &file_buffer_size);
     349            1 :         assert_true(status);
     350            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     351              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_3072,
     352              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     353              :                                                 true, true);
     354            1 :         assert_false(status);
     355            1 :         free(file_buffer);
     356              :     }
     357              :     if ((LIBSPDM_RSA_SSA_4096_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     358              :         /*test web cert: cert public key algo is RSA case*/
     359            1 :         status = libspdm_read_input_file("test_web_cert/Google.cer",
     360              :                                          (void **)&file_buffer, &file_buffer_size);
     361            1 :         assert_true(status);
     362            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     363              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_4096,
     364              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     365              :                                                 false, true);
     366            1 :         assert_true(status);
     367            1 :         free(file_buffer);
     368              :     }
     369              :     if ((LIBSPDM_RSA_SSA_2048_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     370            1 :         status = libspdm_read_input_file("test_web_cert/Amazon.cer",
     371              :                                          (void **)&file_buffer, &file_buffer_size);
     372            1 :         assert_true(status);
     373            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     374              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     375              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     376              :                                                 false, true);
     377            1 :         assert_true(status);
     378            1 :         free(file_buffer);
     379              :     }
     380              : 
     381              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     382              :         /*test web cert: ccert public key algo is ECC case*/
     383            1 :         status = libspdm_read_input_file("test_web_cert/GitHub.cer",
     384              :                                          (void **)&file_buffer, &file_buffer_size);
     385            1 :         assert_true(status);
     386            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     387              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     388              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     389              :                                                 false, true);
     390            1 :         assert_true(status);
     391            1 :         free(file_buffer);
     392              :     }
     393              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     394            1 :         status = libspdm_read_input_file("test_web_cert/YouTube.cer",
     395              :                                          (void **)&file_buffer, &file_buffer_size);
     396            1 :         assert_true(status);
     397            1 :         status = libspdm_x509_certificate_check(file_buffer, file_buffer_size,
     398              :                                                 SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     399              :                                                 SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     400              :                                                 false, true);
     401            1 :         assert_true(status);
     402            1 :         free(file_buffer);
     403              :     }
     404            1 : }
     405              : 
     406            1 : void libspdm_test_crypt_spdm_x509_certificate_check_ex(void **state)
     407              : {
     408              :     bool status;
     409              :     uint8_t *file_buffer;
     410              :     size_t file_buffer_size;
     411              : 
     412              :     if ((LIBSPDM_RSA_SSA_2048_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     413            1 :         status = libspdm_read_input_file("rsa2048/end_requester.cert.der",
     414              :                                          (void **)&file_buffer, &file_buffer_size);
     415            1 :         assert_true(status);
     416              : 
     417            1 :         status = libspdm_x509_certificate_check_ex(file_buffer, file_buffer_size,
     418              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     419              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     420              :                                                    true,
     421              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     422            1 :         assert_true(status);
     423              : 
     424            1 :         status = libspdm_x509_certificate_check_ex(file_buffer, file_buffer_size,
     425              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     426              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     427              :                                                    true,
     428              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     429            1 :         assert_true(status);
     430            1 :         free(file_buffer);
     431              :     }
     432              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     433            1 :         status = libspdm_read_input_file("ecp256/end_responder.cert.der",
     434              :                                          (void **)&file_buffer, &file_buffer_size);
     435            1 :         assert_true(status);
     436            1 :         status = libspdm_x509_certificate_check_ex(file_buffer, file_buffer_size,
     437              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     438              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     439              :                                                    false,
     440              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     441            1 :         assert_true(status);
     442              : 
     443            1 :         status = libspdm_x509_certificate_check_ex(file_buffer, file_buffer_size,
     444              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     445              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     446              :                                                    false,
     447              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     448            1 :         assert_false(status);
     449            1 :         free(file_buffer);
     450              : 
     451            1 :         status = libspdm_read_input_file("ecp256/end_requester_without_basic_constraint.cert.der",
     452              :                                          (void **)&file_buffer, &file_buffer_size);
     453            1 :         assert_true(status);
     454            1 :         status = libspdm_x509_certificate_check_ex(file_buffer, file_buffer_size,
     455              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     456              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     457              :                                                    false,
     458              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     459              :         /*the expected result is false, because basic_constraint is mandatory in SPDM 1.3*/
     460            1 :         assert_false(status);
     461            1 :         free(file_buffer);
     462              :     }
     463              : 
     464            1 : }
     465              : 
     466            1 : void libspdm_test_crypt_spdm_x509_set_cert_certificate_check_ex(void **state)
     467              : {
     468              :     bool status;
     469              :     uint8_t *file_buffer;
     470              :     size_t file_buffer_size;
     471              : 
     472              :     if ((LIBSPDM_RSA_SSA_2048_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     473            1 :         status = libspdm_read_input_file("rsa2048/end_responder.cert.der",
     474              :                                          (void **)&file_buffer, &file_buffer_size);
     475            1 :         assert_true(status);
     476              : 
     477            1 :         status = libspdm_x509_set_cert_certificate_check_ex(file_buffer, file_buffer_size,
     478              :                                                             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     479              :                                                             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     480              :                                                             false,
     481              :                                                             SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     482            1 :         assert_true(status);
     483              : 
     484            1 :         status = libspdm_x509_set_cert_certificate_check_ex(file_buffer, file_buffer_size,
     485              :                                                             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     486              :                                                             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     487              :                                                             false,
     488              :                                                             SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     489            1 :         assert_false(status);
     490            1 :         free(file_buffer);
     491              :     }
     492              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     493            1 :         status = libspdm_read_input_file("ecp256/end_requester.cert.der",
     494              :                                          (void **)&file_buffer, &file_buffer_size);
     495            1 :         assert_true(status);
     496            1 :         status = libspdm_x509_set_cert_certificate_check_ex(file_buffer, file_buffer_size,
     497              :                                                             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     498              :                                                             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     499              :                                                             true,
     500              :                                                             SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     501            1 :         assert_true(status);
     502              : 
     503            1 :         status = libspdm_x509_set_cert_certificate_check_ex(file_buffer, file_buffer_size,
     504              :                                                             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     505              :                                                             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     506              :                                                             true,
     507              :                                                             SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     508            1 :         assert_false(status);
     509              : 
     510            1 :         status = libspdm_read_input_file("ecp256/end_requester_ca_false.cert.der",
     511              :                                          (void **)&file_buffer, &file_buffer_size);
     512            1 :         assert_true(status);
     513            1 :         status = libspdm_x509_set_cert_certificate_check_ex(file_buffer, file_buffer_size,
     514              :                                                             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     515              :                                                             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     516              :                                                             true,
     517              :                                                             SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     518            1 :         assert_true(status);
     519            1 :         free(file_buffer);
     520              :     }
     521              : 
     522            1 : }
     523              : 
     524            1 : void libspdm_test_crypt_spdm_verify_cert_chain_data_ex(void **state)
     525              : {
     526              :     bool status;
     527              :     uint8_t *file_buffer;
     528              :     size_t file_buffer_size;
     529              : 
     530              :     if ((LIBSPDM_RSA_SSA_2048_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     531            1 :         status = libspdm_read_input_file("rsa2048/bundle_requester.certchain.der",
     532              :                                          (void **)&file_buffer, &file_buffer_size);
     533            1 :         assert_true(status);
     534              : 
     535            1 :         status = libspdm_verify_cert_chain_data_ex(file_buffer, file_buffer_size,
     536              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     537              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     538              :                                                    true,
     539              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     540            1 :         assert_true(status);
     541              : 
     542            1 :         status = libspdm_verify_cert_chain_data_ex(file_buffer, file_buffer_size + 1,
     543              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     544              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     545              :                                                    true,
     546              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     547            1 :         assert_false(status);
     548              : 
     549            1 :         status = libspdm_verify_cert_chain_data_ex(file_buffer, file_buffer_size,
     550              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     551              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     552              :                                                    true,
     553              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     554            1 :         assert_true(status);
     555            1 :         free(file_buffer);
     556              :     }
     557              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     558            1 :         status = libspdm_read_input_file("ecp256/bundle_responder.certchain.der",
     559              :                                          (void **)&file_buffer, &file_buffer_size);
     560            1 :         assert_true(status);
     561            1 :         status = libspdm_verify_cert_chain_data_ex(file_buffer, file_buffer_size,
     562              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     563              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     564              :                                                    false,
     565              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     566            1 :         assert_true(status);
     567              : 
     568            1 :         status = libspdm_verify_cert_chain_data_ex(file_buffer, file_buffer_size + 1,
     569              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     570              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     571              :                                                    false,
     572              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     573            1 :         assert_false(status);
     574              : 
     575            1 :         status = libspdm_verify_cert_chain_data_ex(file_buffer, file_buffer_size,
     576              :                                                    SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     577              :                                                    SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     578              :                                                    false,
     579              :                                                    SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     580            1 :         assert_false(status);
     581            1 :         free(file_buffer);
     582              :     }
     583            1 : }
     584              : 
     585              : 
     586            1 : void libspdm_test_crypt_spdm_verify_certificate_chain_buffer_ex(void **state)
     587              : {
     588              :     bool status;
     589              :     void *data;
     590              :     size_t data_size;
     591              : 
     592              :     if ((LIBSPDM_RSA_SSA_2048_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     593            1 :         libspdm_read_responder_public_certificate_chain(
     594              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     595              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     596              :             &data,&data_size,
     597              :             NULL, NULL);
     598              : 
     599            1 :         status = libspdm_verify_certificate_chain_buffer_ex(
     600              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     601              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     602              :             data,data_size,
     603              :             true,
     604              :             SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     605            1 :         assert_true(status);
     606              : 
     607            1 :         status = libspdm_verify_certificate_chain_buffer_ex(
     608              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     609              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     610              :             data,data_size + 1,
     611              :             true,
     612              :             SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     613            1 :         assert_false(status);
     614              : 
     615            1 :         status = libspdm_verify_certificate_chain_buffer_ex(
     616              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     617              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
     618              :             data,data_size,
     619              :             true,
     620              :             SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     621            1 :         assert_true(status);
     622            1 :         free(data);
     623              :     }
     624              : 
     625              :     if ((LIBSPDM_ECDSA_P256_SUPPORT) && (LIBSPDM_SHA256_SUPPORT)) {
     626            1 :         libspdm_read_responder_public_certificate_chain(
     627              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     628              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     629              :             &data,&data_size,
     630              :             NULL, NULL);
     631              : 
     632            1 :         status = libspdm_verify_certificate_chain_buffer_ex(
     633              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     634              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     635              :             data,data_size,
     636              :             false,
     637              :             SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     638            1 :         assert_true(status);
     639              : 
     640            1 :         status = libspdm_verify_certificate_chain_buffer_ex(
     641              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     642              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     643              :             data,data_size + 1,
     644              :             false,
     645              :             SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     646            1 :         assert_false(status);
     647              : 
     648            1 :         status = libspdm_verify_certificate_chain_buffer_ex(
     649              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256,
     650              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
     651              :             data,data_size,
     652              :             false,
     653              :             SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT);
     654            1 :         assert_false(status);
     655            1 :         free(data);
     656              :     }
     657            1 : }
     658              : 
     659            1 : void libspdm_test_crypt_asym_verify(void **state)
     660              : {
     661              :     spdm_version_number_t spdm_version;
     662              :     void *context;
     663              :     void *data;
     664              :     size_t data_size;
     665              :     uint8_t signature[LIBSPDM_MAX_SPDM_MSG_SIZE];
     666              :     size_t sig_size;
     667              :     uint8_t signature_endian;
     668              :     char *file;
     669              :     bool status;
     670              : 
     671            1 :     spdm_version = SPDM_MESSAGE_VERSION_11;
     672              : 
     673            1 :     file = "ecp256/end_responder.key";
     674            1 :     libspdm_read_input_file(file, &data, &data_size);
     675            1 :     status = libspdm_asym_get_private_key_from_pem(
     676              :         m_libspdm_use_asym_algo, data, data_size, NULL, &context);
     677              : 
     678            1 :     if (!status) {
     679            0 :         libspdm_zero_mem(data, data_size);
     680            0 :         free(data);
     681            0 :         assert_true(status);
     682              :     }
     683              : 
     684            1 :     const uint8_t message[] = {
     685              :         0x19, 0x90, 0x2d, 0x02, 0x34, 0x6e, 0xd5, 0x90,
     686              :         0x0e, 0x69, 0x51, 0x2f, 0xf2, 0xbd, 0x9d, 0x33,
     687              :         0x26, 0x71, 0x8f, 0x62, 0xa0, 0x01, 0xbd, 0xfd,
     688              :         0x94, 0xe2, 0x98, 0x17, 0x24, 0xfd, 0xca, 0xf0
     689              :     };
     690              : 
     691            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
     692              : 
     693            1 :     libspdm_asym_sign(spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     694              :                       SPDM_MEASUREMENTS,
     695              :                       m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     696              :                       context,
     697              :                       message, sizeof(message),
     698              :                       signature, &sig_size);
     699              : 
     700              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     701              :     status = libspdm_asym_sign(spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     702              :                                SPDM_MEASUREMENTS,
     703              :                                m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     704              :                                context,
     705              :                                message, sizeof(message),
     706              :                                signature, &sig_size);
     707              :     assert_true(status);
     708              : #else
     709              :     uint8_t message_hash[LIBSPDM_MAX_HASH_SIZE];
     710            1 :     status = libspdm_hash_all(m_libspdm_use_hash_algo, message, sizeof(message), message_hash);
     711              : 
     712            1 :     assert_true(status);
     713            1 :     status = libspdm_asym_sign_hash(spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     714              :                                     SPDM_MEASUREMENTS,
     715              :                                     m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     716              :                                     context,
     717            1 :                                     message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
     718              :                                     signature, &sig_size);
     719            1 :     assert_true(status);
     720              : #endif
     721              : 
     722              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     723              :     /* Big Endian Signature. Big Endian Verify */
     724              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
     725              :     status = libspdm_asym_verify_ex(
     726              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     727              :             SPDM_MEASUREMENTS,
     728              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     729              :             context,
     730              :             message, sizeof(message),
     731              :             signature, sig_size,
     732              :             &signature_endian);
     733              :     assert_true(status);
     734              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     735              : 
     736              :     /*  Error: Big Endian Signature. Little Endian Verify */
     737              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
     738              :     status = libspdm_asym_verify_ex(
     739              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     740              :             SPDM_MEASUREMENTS,
     741              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     742              :             context,
     743              :             message, sizeof(message),
     744              :             signature, sig_size,
     745              :             &signature_endian);
     746              :     assert_true(!status);
     747              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
     748              : 
     749              :     /* Big Endian Signature. Big or Little Endian Verify */
     750              :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
     751              :     status = libspdm_asym_verify_ex(
     752              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     753              :             SPDM_MEASUREMENTS,
     754              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     755              :             context,
     756              :             message, sizeof(message),
     757              :             signature, sig_size,
     758              :             &signature_endian);
     759              :     assert_true(status);
     760              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     761              : 
     762              :     libspdm_copy_signature_swap_endian(
     763              :         m_libspdm_use_asym_algo,
     764              :         signature, sig_size, signature, sig_size);
     765              : 
     766              :     /* Little Endian Signature. Little Endian Verify */
     767              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
     768              :     status = libspdm_asym_verify_ex(
     769              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     770              :             SPDM_MEASUREMENTS,
     771              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     772              :             context,
     773              :             message, sizeof(message),
     774              :             signature, sig_size,
     775              :             &signature_endian);
     776              :     assert_true(status);
     777              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
     778              : 
     779              :     /* Error: Little Endian Signature. Big Endian Verify */
     780              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
     781              :     status = libspdm_asym_verify_ex(
     782              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     783              :             SPDM_MEASUREMENTS,
     784              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     785              :             context,
     786              :             message, sizeof(message),
     787              :             signature, sig_size,
     788              :             &signature_endian);
     789              :     assert_true(!status);
     790              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     791              : 
     792              :     /* Little Endian Signature. Big or Little Endian Verify */
     793              :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
     794              :     status = libspdm_asym_verify_ex(
     795              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     796              :             SPDM_MEASUREMENTS,
     797              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     798              :             context,
     799              :             message, sizeof(message),
     800              :             signature, sig_size,
     801              :             &signature_endian);
     802              :     assert_true(status);
     803              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
     804              : #else
     805              :     /* Big Endian Signature. Big Endian Verify */
     806            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
     807            2 :     status = libspdm_asym_verify_hash_ex(
     808            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     809              :             SPDM_MEASUREMENTS,
     810              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     811              :             context,
     812            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
     813              :             signature, sig_size,
     814              :             &signature_endian);
     815            1 :     assert_true(status);
     816            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     817              : 
     818              :     /*  Error: Big Endian Signature. Little Endian Verify */
     819            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
     820            2 :     status = libspdm_asym_verify_hash_ex(
     821            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     822              :             SPDM_MEASUREMENTS,
     823              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     824              :             context,
     825            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
     826              :             signature, sig_size,
     827              :             &signature_endian);
     828            1 :     assert_true(!status);
     829            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
     830              : 
     831              :     /* Big Endian Signature. Big or Little Endian Verify */
     832            1 :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
     833            2 :     status = libspdm_asym_verify_hash_ex(
     834            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     835              :             SPDM_MEASUREMENTS,
     836              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     837              :             context,
     838            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
     839              :             signature, sig_size,
     840              :             &signature_endian);
     841            1 :     assert_true(status);
     842            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     843              : 
     844            1 :     libspdm_copy_signature_swap_endian(
     845              :         m_libspdm_use_asym_algo,
     846              :         signature, sig_size, signature, sig_size);
     847              : 
     848              :     /* Little Endian Signature. Little Endian Verify */
     849            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
     850            2 :     status = libspdm_asym_verify_hash_ex(
     851            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     852              :             SPDM_MEASUREMENTS,
     853              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     854              :             context,
     855            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
     856              :             signature, sig_size,
     857              :             &signature_endian);
     858            1 :     assert_true(status);
     859            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
     860              : 
     861              :     /* Error: Little Endian Signature. Big Endian Verify */
     862            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
     863            2 :     status = libspdm_asym_verify_hash_ex(
     864            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     865              :             SPDM_MEASUREMENTS,
     866              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     867              :             context,
     868            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
     869              :             signature, sig_size,
     870              :             &signature_endian);
     871            1 :     assert_true(!status);
     872            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     873              : 
     874              :     /* Little Endian Signature. Big or Little Endian Verify */
     875            1 :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
     876            2 :     status = libspdm_asym_verify_hash_ex(
     877            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     878              :             SPDM_MEASUREMENTS,
     879              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     880              :             context,
     881            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
     882              :             signature, sig_size,
     883              :             &signature_endian);
     884            1 :     assert_true(status);
     885            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
     886              : 
     887              : #endif
     888            1 : }
     889              : 
     890            1 : void libspdm_test_crypt_req_asym_verify(void **state)
     891              : {
     892              :     spdm_version_number_t spdm_version;
     893              :     void *context;
     894              :     void *data;
     895              :     size_t data_size;
     896              :     uint8_t signature[LIBSPDM_MAX_SPDM_MSG_SIZE];
     897              :     size_t sig_size;
     898              :     uint8_t signature_endian;
     899              :     char *file;
     900              :     bool status;
     901              : 
     902            1 :     spdm_version = SPDM_MESSAGE_VERSION_11;
     903              : 
     904            1 :     const uint8_t message[] = {
     905              :         0x19, 0x90, 0x2d, 0x02, 0x34, 0x6e, 0xd5, 0x90,
     906              :         0x0e, 0x69, 0x51, 0x2f, 0xf2, 0xbd, 0x9d, 0x33,
     907              :         0x26, 0x71, 0x8f, 0x62, 0xa0, 0x01, 0xbd, 0xfd,
     908              :         0x94, 0xe2, 0x98, 0x17, 0x24, 0xfd, 0xca, 0xf0
     909              :     };
     910              : 
     911            1 :     file = "rsa2048/end_requester.key";
     912            1 :     status = libspdm_read_input_file(file, &data, &data_size);
     913            1 :     assert_true(status);
     914              : 
     915            1 :     status = libspdm_req_asym_get_private_key_from_pem(m_libspdm_use_req_asym_algo,
     916              :                                                        data,
     917              :                                                        data_size, NULL,
     918              :                                                        &context);
     919            1 :     if (!status) {
     920            0 :         libspdm_zero_mem(data, data_size);
     921            0 :         free(data);
     922            0 :         assert_true(status);
     923              :     }
     924            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
     925              : 
     926              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     927              :     status = libspdm_req_asym_sign(spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     928              :                                    SPDM_FINISH,
     929              :                                    m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
     930              :                                    context,
     931              :                                    message, sizeof(message),
     932              :                                    signature, &sig_size);
     933              :     assert_true(status);
     934              : #else
     935              :     uint8_t message_hash[LIBSPDM_MAX_HASH_SIZE];
     936            1 :     status = libspdm_hash_all(m_libspdm_use_hash_algo, message, sizeof(message), message_hash);
     937            1 :     assert_true(status);
     938            1 :     status = libspdm_req_asym_sign_hash(spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     939              :                                         SPDM_FINISH,
     940              :                                         m_libspdm_use_req_asym_algo,
     941              :                                         m_libspdm_use_hash_algo, context,
     942              :                                         message_hash,
     943            1 :                                         libspdm_get_hash_size(m_libspdm_use_hash_algo),
     944              :                                         signature,
     945              :                                         &sig_size);
     946            1 :     assert_true(status);
     947              : #endif
     948              : 
     949              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     950              :     /* Big Endian Signature. Big Endian Verify */
     951              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
     952              :     status = libspdm_req_asym_verify_ex(
     953              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     954              :             SPDM_FINISH,
     955              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
     956              :             context,
     957              :             message, sizeof(message),
     958              :             signature, sig_size,
     959              :             &signature_endian);
     960              :     assert_true(status);
     961              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     962              : 
     963              :     /*  Error: Big Endian Signature. Little Endian Verify */
     964              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
     965              :     status = libspdm_req_asym_verify_ex(
     966              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     967              :             SPDM_FINISH,
     968              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
     969              :             context,
     970              :             message, sizeof(message),
     971              :             signature, sig_size,
     972              :             &signature_endian);
     973              :     assert_true(!status);
     974              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
     975              : 
     976              :     /* Big Endian Signature. Big or Little Endian Verify */
     977              :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
     978              :     status = libspdm_req_asym_verify_ex(
     979              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     980              :             SPDM_FINISH,
     981              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
     982              :             context,
     983              :             message, sizeof(message),
     984              :             signature, sig_size,
     985              :             &signature_endian);
     986              :     assert_true(status);
     987              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
     988              : 
     989              :     libspdm_copy_signature_swap_endian(
     990              :         m_libspdm_use_req_asym_algo,
     991              :         signature, sig_size, signature, sig_size);
     992              : 
     993              :     /* Little Endian Signature. Little Endian Verify */
     994              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
     995              :     status = libspdm_req_asym_verify_ex(
     996              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     997              :             SPDM_FINISH,
     998              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
     999              :             context,
    1000              :             message, sizeof(message),
    1001              :             signature, sig_size,
    1002              :             &signature_endian);
    1003              :     assert_true(status);
    1004              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
    1005              : 
    1006              :     /* Error: Little Endian Signature. Big Endian Verify */
    1007              :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
    1008              :     status = libspdm_req_asym_verify_ex(
    1009              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1010              :             SPDM_FINISH,
    1011              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1012              :             context,
    1013              :             message, sizeof(message),
    1014              :             signature, sig_size,
    1015              :             &signature_endian);
    1016              :     assert_true(!status);
    1017              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
    1018              : 
    1019              :     /* Little Endian Signature. Big or Little Endian Verify */
    1020              :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
    1021              :     status = libspdm_req_asym_verify_ex(
    1022              :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1023              :             SPDM_FINISH,
    1024              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1025              :             context,
    1026              :             message, sizeof(message),
    1027              :             signature, sig_size,
    1028              :             &signature_endian);
    1029              :     assert_true(status);
    1030              :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
    1031              : 
    1032              : #else
    1033              :     /* Big Endian Signature. Big Endian Verify */
    1034            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
    1035            2 :     status = libspdm_req_asym_verify_hash_ex(
    1036            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1037              :             SPDM_FINISH,
    1038              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1039              :             context,
    1040            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
    1041              :             signature, sig_size,
    1042              :             &signature_endian);
    1043            1 :     assert_true(status);
    1044            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
    1045              : 
    1046              :     /*  Error: Big Endian Signature. Little Endian Verify */
    1047            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
    1048            2 :     status = libspdm_req_asym_verify_hash_ex(
    1049            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1050              :             SPDM_FINISH,
    1051              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1052              :             context,
    1053            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
    1054              :             signature, sig_size,
    1055              :             &signature_endian);
    1056            1 :     assert_true(!status);
    1057            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
    1058              : 
    1059              :     /* Big Endian Signature. Big or Little Endian Verify */
    1060            1 :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
    1061            2 :     status = libspdm_req_asym_verify_hash_ex(
    1062            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1063              :             SPDM_FINISH,
    1064              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1065              :             context,
    1066            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
    1067              :             signature, sig_size,
    1068              :             &signature_endian);
    1069            1 :     assert_true(status);
    1070            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
    1071              : 
    1072            1 :     libspdm_copy_signature_swap_endian(
    1073              :         m_libspdm_use_req_asym_algo,
    1074              :         signature, sig_size, signature, sig_size);
    1075              : 
    1076              :     /* Little Endian Signature. Little Endian Verify */
    1077            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
    1078            2 :     status = libspdm_req_asym_verify_hash_ex(
    1079            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1080              :             SPDM_FINISH,
    1081              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1082              :             context,
    1083            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
    1084              :             signature, sig_size,
    1085              :             &signature_endian);
    1086            1 :     assert_true(status);
    1087            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
    1088              : 
    1089              :     /* Error: Little Endian Signature. Big Endian Verify */
    1090            1 :     signature_endian = LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
    1091            2 :     status = libspdm_req_asym_verify_hash_ex(
    1092            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1093              :             SPDM_FINISH,
    1094              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1095              :             context,
    1096            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
    1097              :             signature, sig_size,
    1098              :             &signature_endian);
    1099            1 :     assert_true(!status);
    1100            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY);
    1101              : 
    1102              :     /* Little Endian Signature. Big or Little Endian Verify */
    1103            1 :     signature_endian= LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
    1104            2 :     status = libspdm_req_asym_verify_hash_ex(
    1105            1 :         spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1106              :             SPDM_FINISH,
    1107              :             m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
    1108              :             context,
    1109            1 :             message_hash, libspdm_get_hash_size(m_libspdm_use_hash_algo),
    1110              :             signature, sig_size,
    1111              :             &signature_endian);
    1112            1 :     assert_true(status);
    1113            1 :     assert_int_equal(signature_endian, LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY);
    1114              : #endif
    1115            1 : }
    1116              : 
    1117              : bool libspdm_is_palindrome(const uint8_t *buf, size_t buf_size);
    1118              : 
    1119              : bool libspdm_is_signature_buffer_palindrome(
    1120              :     uint32_t base_asym_algo, const uint8_t *buf, size_t buf_size);
    1121              : 
    1122            1 : void libspdm_test_crypt_palindrome(void **state)
    1123              : {
    1124              :     bool status;
    1125              : 
    1126              :     /* Test valid palindrome with even number of elements */
    1127            1 :     uint8_t buf1[] = {0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0};
    1128            1 :     status = libspdm_is_palindrome(buf1, sizeof(buf1));
    1129            1 :     assert_true(status);
    1130              : 
    1131              :     /* Test valid palindrome with odd number of elements */
    1132            1 :     uint8_t buf2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    1133            1 :     status = libspdm_is_palindrome(buf2, sizeof(buf2));
    1134            1 :     assert_true(status);
    1135              : 
    1136              :     /* Test invalid palindrome where inner corner-case element is not matching */
    1137            1 :     uint8_t buf3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 5, 4, 3, 2, 1, 0 };
    1138            1 :     status = libspdm_is_palindrome(buf3, sizeof(buf3));
    1139            1 :     assert_false(status);
    1140              : 
    1141              :     /* Test invalid palindrome where outer corner-case element is not matching */
    1142            1 :     uint8_t buf4[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 8 };
    1143            1 :     status = libspdm_is_palindrome(buf4, sizeof(buf4));
    1144            1 :     assert_false(status);
    1145              : 
    1146              :     /* Test invalid palindrome where middle element is not matching */
    1147            1 :     uint8_t buf5[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 4, 2, 1, 0 };
    1148            1 :     status = libspdm_is_palindrome(buf5, sizeof(buf5));
    1149            1 :     assert_false(status);
    1150            1 : }
    1151              : 
    1152            1 : void libspdm_test_crypt_rsa_palindrome(void **state)
    1153              : {
    1154              :     /* Test RSA Buffers as palindrone */
    1155              :     int i;
    1156              :     bool status;
    1157              : 
    1158            1 :     const uint32_t rsa_algos[] = {
    1159              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048,
    1160              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSAPSS_2048,
    1161              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_3072,
    1162              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSAPSS_3072,
    1163              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_4096,
    1164              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSAPSS_4096
    1165              :     };
    1166              : 
    1167              :     /* Palindrome for RSA */
    1168            1 :     uint8_t buf0[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0 };
    1169              : 
    1170              :     /* Not Palindrome cases for RSA */
    1171              : 
    1172              :     /* Test invalid palindrome where inner corner-case element is not matching */
    1173            1 :     uint8_t buf1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 5, 4, 3, 2, 1, 0 };
    1174              : 
    1175              :     /* Test invalid palindrome where outer corner-case element is not matching */
    1176            1 :     uint8_t buf2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 8 };
    1177              : 
    1178              :     /* Test invalid palindrome where middle element is not matching */
    1179            1 :     uint8_t buf3[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 4, 2, 1, 0 };
    1180              : 
    1181              :     /* Test each of these buffers against each RSA algo type */
    1182            7 :     for (i = 0; i < (sizeof(rsa_algos) / sizeof(rsa_algos[0])); i++) {
    1183              :         /* Test case where buffer is palindrone */
    1184            6 :         status = libspdm_is_signature_buffer_palindrome(rsa_algos[i], buf0, sizeof(buf0));
    1185            6 :         assert_true(status);
    1186              : 
    1187              :         /* Test cases where buffer is NOT palindrone */
    1188            6 :         status = libspdm_is_signature_buffer_palindrome(rsa_algos[i], buf1, sizeof(buf1));
    1189            6 :         assert_false(status);
    1190            6 :         status = libspdm_is_signature_buffer_palindrome(rsa_algos[i], buf2, sizeof(buf2));
    1191            6 :         assert_false(status);
    1192            6 :         status = libspdm_is_signature_buffer_palindrome(rsa_algos[i], buf3, sizeof(buf3));
    1193            6 :         assert_false(status);
    1194              :     }
    1195            1 : }
    1196              : 
    1197            1 : void libspdm_test_crypt_ecdsa_palindrome(void **state)
    1198              : {
    1199              :     int i;
    1200              :     bool status;
    1201              : 
    1202              :     /* Test ECDSA Buffers as palindrome */
    1203            1 :     const uint32_t ecdsa_algos[] = {
    1204              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256,
    1205              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P384,
    1206              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P521
    1207              :     };
    1208              : 
    1209              :     /* Test for valid ECDSA buffer palindrome */
    1210            1 :     uint8_t buf0[] = { 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0 };
    1211              : 
    1212              :     /* Tests for ECDSA buffer not palidrome */
    1213              : 
    1214              :     /* Test for invalid palindrome where outer element of 1st buffer does not match */
    1215            1 :     uint8_t buf1[] = { 0, 1, 2, 3, 3, 2, 1, 1, 0, 1, 2, 3, 3, 2, 1, 0 };
    1216              : 
    1217              :     /* Test for invalid palindrome where outer element of 2nd buffer does not match */
    1218            1 :     uint8_t buf2[] = { 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 1 };
    1219              : 
    1220              :     /* Test for invalid palindrome where inner element of 1st buffer does not match */
    1221            1 :     uint8_t buf3[] = { 0, 1, 2, 3, 4, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0 };
    1222              : 
    1223              :     /* Test for invalid palindrome where inner element of 2nd buffer does not match */
    1224            1 :     uint8_t buf4[] = { 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 4, 2, 1, 0 };
    1225              : 
    1226              :     /* Test for invalid palindrome where middle element of 1st buffer does not match */
    1227            1 :     uint8_t buf5[] = { 0, 1, 2, 3, 3, 2, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0 };
    1228              : 
    1229              :     /* Test for invalid palindrome where middle element of 2nd buffer does not match */
    1230            1 :     uint8_t buf6[] = { 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 0, 1, 0 };
    1231              : 
    1232              :     /* Test each of the buffers against each ECDSA algo type */
    1233            4 :     for (i = 0; i < (sizeof(ecdsa_algos) / sizeof(ecdsa_algos[0])); i++) {
    1234              :         /* Test case where buffer is palindrone */
    1235            3 :         status = libspdm_is_signature_buffer_palindrome(ecdsa_algos[i], buf0, sizeof(buf0));
    1236            3 :         assert_true(status);
    1237              : 
    1238              :         /* Test cases where buffer is NOT palindrone */
    1239            3 :         status = libspdm_is_signature_buffer_palindrome(ecdsa_algos[i], buf1, sizeof(buf1));
    1240            3 :         assert_false(status);
    1241            3 :         status = libspdm_is_signature_buffer_palindrome(ecdsa_algos[i], buf2, sizeof(buf2));
    1242            3 :         assert_false(status);
    1243            3 :         status = libspdm_is_signature_buffer_palindrome(ecdsa_algos[i], buf3, sizeof(buf3));
    1244            3 :         assert_false(status);
    1245            3 :         status = libspdm_is_signature_buffer_palindrome(ecdsa_algos[i], buf4, sizeof(buf4));
    1246            3 :         assert_false(status);
    1247            3 :         status = libspdm_is_signature_buffer_palindrome(ecdsa_algos[i], buf5, sizeof(buf5));
    1248            3 :         assert_false(status);
    1249            3 :         status = libspdm_is_signature_buffer_palindrome(ecdsa_algos[i], buf6, sizeof(buf6));
    1250            3 :         assert_false(status);
    1251              :     }
    1252            1 : }
    1253              : 
    1254            1 : int libspdm_crypt_lib_setup(void **state)
    1255              : {
    1256            1 :     return 0;
    1257              : }
    1258              : 
    1259            1 : int libspdm_crypt_lib_teardown(void **state)
    1260              : {
    1261            1 :     return 0;
    1262              : }
    1263              : 
    1264            1 : int libspdm_crypt_lib_test_main(void)
    1265              : {
    1266            1 :     const struct CMUnitTest spdm_crypt_lib_tests[] = {
    1267              :         cmocka_unit_test(
    1268              :             libspdm_test_crypt_spdm_get_dmtf_subject_alt_name_from_bytes),
    1269              : 
    1270              :         cmocka_unit_test(libspdm_test_crypt_spdm_get_dmtf_subject_alt_name),
    1271              : 
    1272              :         cmocka_unit_test(libspdm_test_crypt_spdm_x509_certificate_check),
    1273              : 
    1274              :         cmocka_unit_test(libspdm_test_crypt_spdm_x509_certificate_check_ex),
    1275              : 
    1276              :         cmocka_unit_test(libspdm_test_crypt_spdm_x509_set_cert_certificate_check_ex),
    1277              : 
    1278              :         cmocka_unit_test(libspdm_test_crypt_spdm_verify_cert_chain_data_ex),
    1279              : 
    1280              :         cmocka_unit_test(libspdm_test_crypt_spdm_verify_certificate_chain_buffer_ex),
    1281              : 
    1282              :         cmocka_unit_test(libspdm_test_crypt_asym_verify),
    1283              : 
    1284              :         cmocka_unit_test(libspdm_test_crypt_req_asym_verify),
    1285              : 
    1286              :         cmocka_unit_test(libspdm_test_crypt_palindrome),
    1287              : 
    1288              :         cmocka_unit_test(libspdm_test_crypt_rsa_palindrome),
    1289              : 
    1290              :         cmocka_unit_test(libspdm_test_crypt_ecdsa_palindrome),
    1291              :     };
    1292              : 
    1293            1 :     return cmocka_run_group_tests(spdm_crypt_lib_tests,
    1294              :                                   libspdm_crypt_lib_setup,
    1295              :                                   libspdm_crypt_lib_teardown);
    1296              : }
    1297              : 
    1298            1 : int main(void)
    1299              : {
    1300            1 :     int return_value = 0;
    1301              : 
    1302            1 :     if (libspdm_crypt_lib_test_main() != 0) {
    1303            0 :         return_value = 1;
    1304              :     }
    1305              : 
    1306            1 :     return return_value;
    1307              : }
        

Generated by: LCOV version 2.0-1