Skip to content

Commit e0d668a

Browse files
committed
Fix chunk_seq_no wrap in chunk send ack.
Fix #2875 Signed-off-by: Aaron Li <[email protected]>
1 parent a7b369b commit e0d668a

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

library/spdm_responder_lib/libspdm_rsp_chunk_send_ack.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* Copyright Notice:
3-
* Copyright 2021-2024 DMTF. All rights reserved.
3+
* Copyright 2021-2025 DMTF. All rights reserved.
44
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
55
**/
66

@@ -160,6 +160,9 @@ libspdm_return_t libspdm_get_response_chunk_send(libspdm_context_t *spdm_context
160160
|| ((uint32_t) request_size
161161
> spdm_context->local_context.capability.data_transfer_size))) {
162162
status = LIBSPDM_STATUS_INVALID_MSG_FIELD;
163+
} else if (spdm_request->chunk_seq_no == 0) {
164+
/* Chunk seq no wrapped */
165+
status = LIBSPDM_STATUS_INVALID_MSG_FIELD;
163166
} else {
164167

165168
libspdm_copy_mem(

unit_test/test_spdm_responder/chunk_send_ack.c

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* Copyright Notice:
3-
* Copyright 2021-2022 DMTF. All rights reserved.
3+
* Copyright 2021-2025 DMTF. All rights reserved.
44
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
55
**/
66

@@ -1705,6 +1705,87 @@ void libspdm_test_responder_chunk_send_ack_rsp_case19(void** state)
17051705
libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
17061706
}
17071707

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+
17081789
int libspdm_responder_chunk_send_ack_test_main(void)
17091790
{
17101791
const struct CMUnitTest spdm_responder_chunk_send_ack_tests[] = {
@@ -1750,6 +1831,8 @@ int libspdm_responder_chunk_send_ack_test_main(void)
17501831
cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case18),
17511832
/* Request missing LAST_CHUNK when request size != data transfer size. */
17521833
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),
17531836
};
17541837

17551838
libspdm_test_context_t test_context = {

0 commit comments

Comments
 (0)