From 0ae216b8fa8fc84dcd0579a28cfc5e9fb082252b Mon Sep 17 00:00:00 2001 From: Aaron Li Date: Tue, 23 Dec 2025 10:37:38 +0800 Subject: [PATCH] add libspdm_meas_log_reset_callback_func fix #2816 Signed-off-by: Aaron Li --- include/internal/libspdm_common_lib.h | 4 ++++ include/library/spdm_common_lib.h | 15 +++++++++++++ include/library/spdm_responder_lib.h | 15 +++++++++++++ .../libspdm_com_context_data.c | 6 +++++ .../libspdm_rsp_measurements.c | 9 ++++++++ unit_test/test_spdm_responder/measurements.c | 22 +++++++++++++++++++ 6 files changed, 71 insertions(+) diff --git a/include/internal/libspdm_common_lib.h b/include/internal/libspdm_common_lib.h index 137718cfed0..222f45eecea 100644 --- a/include/internal/libspdm_common_lib.h +++ b/include/internal/libspdm_common_lib.h @@ -687,6 +687,10 @@ typedef struct { #if (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && (LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT) libspdm_get_endpoint_info_callback_func get_endpoint_info_callback; #endif /* (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && (LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT) */ + +#if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP + libspdm_meas_log_reset_callback_func spdm_meas_log_reset_callback; +#endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */ } libspdm_context_t; #define LIBSPDM_CONTEXT_SIZE_WITHOUT_SECURED_CONTEXT (sizeof(libspdm_context_t)) diff --git a/include/library/spdm_common_lib.h b/include/library/spdm_common_lib.h index 138ebf6268a..0c0bd7d4f60 100644 --- a/include/library/spdm_common_lib.h +++ b/include/library/spdm_common_lib.h @@ -1036,6 +1036,21 @@ typedef libspdm_return_t (*libspdm_get_endpoint_info_callback_func)( const void *endpoint_info); #endif /* LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP && LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */ +#if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP +/** + * A Callback function to notify integrator measurement log is reset. + * This is used to support the "Content changed" field in the MEASUREMENTS response. + * + * @param spdm_context A pointer to the SPDM context. + * @param session_id A pointer to the session ID. + * If non-NULL then message is within a secure session. + * If NULL then message is outside a secure session. + **/ +typedef void (*libspdm_meas_log_reset_callback_func)( + void *spdm_context, + const uint32_t *session_id); +#endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */ + #ifdef __cplusplus } #endif diff --git a/include/library/spdm_responder_lib.h b/include/library/spdm_responder_lib.h index 2801622b23e..82edebcccc2 100644 --- a/include/library/spdm_responder_lib.h +++ b/include/library/spdm_responder_lib.h @@ -315,6 +315,21 @@ libspdm_return_t libspdm_register_get_endpoint_info_callback_func( void *spdm_context, libspdm_get_endpoint_info_callback_func get_endpoint_info_callback); #endif /* LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP && LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */ +#if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP +/** + * This function registers the callback function for notify + * integrator L1L2 is reset. + * + * @param spdm_context A pointer to the SPDM context. + * @param spdm_meas_log_reset_callback L1L2 reset callback function + * + * @retval LIBSPDM_STATUS_SUCCESS Success + * @retval LIBSPDM_STATUS_INVALID_PARAMETER Some parameters invalid or NULL + */ +libspdm_return_t libspdm_register_meas_log_reset_callback( + void *spdm_context, libspdm_meas_log_reset_callback_func spdm_meas_log_reset_callback); +#endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */ + /** * This function allows the consumer to terminate a session. * For example, it can be used when watchdog fires. diff --git a/library/spdm_common_lib/libspdm_com_context_data.c b/library/spdm_common_lib/libspdm_com_context_data.c index 7e4b6299249..49023a71cbd 100644 --- a/library/spdm_common_lib/libspdm_com_context_data.c +++ b/library/spdm_common_lib/libspdm_com_context_data.c @@ -1384,6 +1384,12 @@ void libspdm_reset_message_m(libspdm_context_t *spdm_context, void *session_info } } #endif +#if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP + if (spdm_context->spdm_meas_log_reset_callback != NULL) { + spdm_context->spdm_meas_log_reset_callback( + spdm_context, spdm_session_info == NULL ? NULL : &spdm_session_info->session_id); + } +#endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */ } /** diff --git a/library/spdm_responder_lib/libspdm_rsp_measurements.c b/library/spdm_responder_lib/libspdm_rsp_measurements.c index d3d6da20186..a45e37a1e06 100644 --- a/library/spdm_responder_lib/libspdm_rsp_measurements.c +++ b/library/spdm_responder_lib/libspdm_rsp_measurements.c @@ -7,6 +7,15 @@ #include "internal/libspdm_responder_lib.h" #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP + +libspdm_return_t libspdm_register_meas_log_reset_callback( + void *spdm_context, libspdm_meas_log_reset_callback_func spdm_meas_log_reset_callback) +{ + libspdm_context_t *context = (libspdm_context_t *)spdm_context; + context->spdm_meas_log_reset_callback = spdm_meas_log_reset_callback; + return LIBSPDM_STATUS_SUCCESS; +} + bool libspdm_generate_measurement_signature(libspdm_context_t *spdm_context, libspdm_session_info_t *session_info, uint8_t slot_id, diff --git a/unit_test/test_spdm_responder/measurements.c b/unit_test/test_spdm_responder/measurements.c index 7128c07a44f..bb38fae4820 100644 --- a/unit_test/test_spdm_responder/measurements.c +++ b/unit_test/test_spdm_responder/measurements.c @@ -10,6 +10,27 @@ #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP +void spdm_meas_log_reset_callback ( + void *spdm_context, + const uint32_t *session_id) +{ + libspdm_context_t *context = spdm_context; + if (session_id == NULL) { +#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT + assert_int_equal(context->transcript.message_m.buffer_size, 0); +#else + assert_null(context->transcript.digest_context_l1l2); +#endif + } else { + libspdm_session_info_t* session_info = &context->session_info[0]; +#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT + assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0); +#else + assert_null(session_info->session_transcript.digest_context_l1l2); +#endif + } +} + spdm_get_measurements_request_t m_libspdm_get_measurements_request1 = { { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS, 0, SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS }, @@ -147,6 +168,7 @@ static void rsp_measurements_case1(void **state) m_libspdm_use_measurement_spec; spdm_context->connection_info.algorithm.measurement_hash_algo = m_libspdm_use_measurement_hash_algo; + spdm_context->spdm_meas_log_reset_callback = spdm_meas_log_reset_callback; libspdm_reset_message_m(spdm_context, NULL); libspdm_secret_lib_meas_opaque_data_size = 0;