|
1 | 1 | /**
|
2 | 2 | * Copyright Notice:
|
3 |
| - * Copyright 2021-2022 DMTF. All rights reserved. |
| 3 | + * Copyright 2021-2025 DMTF. All rights reserved. |
4 | 4 | * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
|
5 | 5 | **/
|
6 | 6 |
|
@@ -1705,6 +1705,87 @@ void libspdm_test_responder_chunk_send_ack_rsp_case19(void** state)
|
1705 | 1705 | libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
|
1706 | 1706 | }
|
1707 | 1707 |
|
| 1708 | +/** |
| 1709 | + * Test 20: Request chunk seq warpped. |
| 1710 | + **/ |
| 1711 | +void libspdm_test_responder_chunk_send_ack_rsp_case20(void** state) |
| 1712 | +{ |
| 1713 | + libspdm_return_t status; |
| 1714 | + |
| 1715 | + libspdm_test_context_t* spdm_test_context; |
| 1716 | + libspdm_context_t* spdm_context; |
| 1717 | + |
| 1718 | + size_t request_size; |
| 1719 | + size_t response_size; |
| 1720 | + |
| 1721 | + uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE]; |
| 1722 | + uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE]; |
| 1723 | + |
| 1724 | + spdm_chunk_send_request_t* chunk_send_request; |
| 1725 | + spdm_chunk_send_ack_response_t* chunk_send_ack_response; |
| 1726 | + spdm_error_response_t* error_response; |
| 1727 | + |
| 1728 | + const uint8_t* chunk_src; |
| 1729 | + uint8_t* chunk_dst; |
| 1730 | + |
| 1731 | + /* Format the last chunk. */ |
| 1732 | + spdm_test_context = *state; |
| 1733 | + spdm_context = spdm_test_context->spdm_context; |
| 1734 | + spdm_test_context->case_id = 20; |
| 1735 | + |
| 1736 | + libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context); |
| 1737 | + spdm_context->chunk_context.send.chunk_in_use = true; |
| 1738 | + spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id; |
| 1739 | + spdm_context->chunk_context.send.chunk_seq_no = 65535; /* maximum chunk seq received */ |
| 1740 | + spdm_context->chunk_context.send.large_message_size = 0x10000; |
| 1741 | + spdm_context->chunk_context.send.chunk_bytes_transferred = 0x8000; |
| 1742 | + |
| 1743 | + chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1; |
| 1744 | + |
| 1745 | + libspdm_zero_mem(request, sizeof(request)); |
| 1746 | + chunk_send_request = (spdm_chunk_send_request_t*) request; |
| 1747 | + |
| 1748 | + chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12; |
| 1749 | + chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND; |
| 1750 | + chunk_send_request->header.param1 = 0; |
| 1751 | + chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */ |
| 1752 | + chunk_send_request->chunk_seq_no = 0; /* chunk seq wrapped */ |
| 1753 | + |
| 1754 | + chunk_send_request->chunk_size = |
| 1755 | + spdm_context->local_context.capability.data_transfer_size |
| 1756 | + - sizeof(spdm_chunk_send_request_t); |
| 1757 | + |
| 1758 | + chunk_dst = ((uint8_t*) (chunk_send_request + 1)); |
| 1759 | + |
| 1760 | + request_size = sizeof(spdm_chunk_send_request_t) |
| 1761 | + + chunk_send_request->chunk_size; |
| 1762 | + |
| 1763 | + libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size, |
| 1764 | + chunk_src, chunk_send_request->chunk_size); |
| 1765 | + |
| 1766 | + response_size = sizeof(response); |
| 1767 | + status = libspdm_get_response_chunk_send( |
| 1768 | + spdm_context, |
| 1769 | + request_size, request, |
| 1770 | + &response_size, response); |
| 1771 | + |
| 1772 | + assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD); |
| 1773 | + assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t) |
| 1774 | + + sizeof(spdm_error_response_t)); |
| 1775 | + |
| 1776 | + chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response; |
| 1777 | + assert_int_equal(chunk_send_ack_response->header.param1, |
| 1778 | + SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED); |
| 1779 | + |
| 1780 | + error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1); |
| 1781 | + assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12); |
| 1782 | + assert_int_equal(error_response->header.request_response_code, SPDM_ERROR); |
| 1783 | + assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST); |
| 1784 | + assert_int_equal(error_response->header.param2, 0); |
| 1785 | + |
| 1786 | + libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context); |
| 1787 | +} |
| 1788 | + |
1708 | 1789 | int libspdm_responder_chunk_send_ack_test_main(void)
|
1709 | 1790 | {
|
1710 | 1791 | const struct CMUnitTest spdm_responder_chunk_send_ack_tests[] = {
|
@@ -1750,6 +1831,8 @@ int libspdm_responder_chunk_send_ack_test_main(void)
|
1750 | 1831 | cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case18),
|
1751 | 1832 | /* Request missing LAST_CHUNK when request size != data transfer size. */
|
1752 | 1833 | cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case19),
|
| 1834 | + /* Request chunk seq warpped. */ |
| 1835 | + cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case20), |
1753 | 1836 | };
|
1754 | 1837 |
|
1755 | 1838 | libspdm_test_context_t test_context = {
|
|
0 commit comments