Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix incorrect use of measurement summary hash macros #2269

Merged
merged 3 commits into from
Jul 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 23 additions & 8 deletions include/industry_standard/spdm.h
Original file line number Diff line number Diff line change
Expand Up @@ -492,10 +492,16 @@ typedef struct {
* uint8_t signature[key_size];*/
} spdm_challenge_auth_response_t;

/* SPDM CHALLENGE request HashType */
#define SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH 0
#define SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH 1
#define SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH 0xFF
/* SPDM generic request measurement summary HashType */
#define SPDM_REQUEST_NO_MEASUREMENT_SUMMARY_HASH 0
#define SPDM_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH 1
#define SPDM_REQUEST_ALL_MEASUREMENTS_HASH 0xFF

/* SPDM CHALLENGE request measurement summary HashType */
#define SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH SPDM_REQUEST_NO_MEASUREMENT_SUMMARY_HASH
#define SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH \
SPDM_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH
#define SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH SPDM_REQUEST_ALL_MEASUREMENTS_HASH

#define SPDM_CHALLENGE_AUTH_RESPONSE_ATTRIBUTE_SLOT_ID_MASK 0xF
#define SPDM_CHALLENGE_AUTH_RESPONSE_ATTRIBUTE_BASIC_MUT_AUTH_REQ 0x00000080 /* Deprecated in SPDM 1.2*/
Expand Down Expand Up @@ -730,10 +736,12 @@ typedef struct {
/* SPDM KEY_EXCHANGE request session_policy */
#define SPDM_KEY_EXCHANGE_REQUEST_SESSION_POLICY_TERMINATION_POLICY_RUNTIME_UPDATE 0x00000001

/* SPDM KEY_EXCHANGE request HashType */
#define SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH 0
#define SPDM_KEY_EXCHANGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH 1
#define SPDM_KEY_EXCHANGE_REQUEST_ALL_MEASUREMENTS_HASH 0xFF
/* SPDM KEY_EXCHANGE request measurement summary HashType */
#define SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH \
SPDM_REQUEST_NO_MEASUREMENT_SUMMARY_HASH
#define SPDM_KEY_EXCHANGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH \
SPDM_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH
#define SPDM_KEY_EXCHANGE_REQUEST_ALL_MEASUREMENTS_HASH SPDM_REQUEST_ALL_MEASUREMENTS_HASH

/* SPDM KEY_EXCHANGE response */
typedef struct {
Expand Down Expand Up @@ -806,6 +814,13 @@ typedef struct {
* uint8_t opaque_data[opaque_length];*/
} spdm_psk_exchange_request_t;

/* SPDM PSK_EXCHANGE request measurement summary HashType */
#define SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH \
SPDM_REQUEST_NO_MEASUREMENT_SUMMARY_HASH
#define SPDM_PSK_EXCHANGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH \
SPDM_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH
#define SPDM_PSK_EXCHANGE_REQUEST_ALL_MEASUREMENTS_HASH SPDM_REQUEST_ALL_MEASUREMENTS_HASH

/* SPDM PSK_EXCHANGE response */
typedef struct {
spdm_message_header_t header;
Expand Down
6 changes: 3 additions & 3 deletions library/spdm_common_lib/libspdm_com_crypto_service.c
Original file line number Diff line number Diff line change
Expand Up @@ -1158,12 +1158,12 @@ libspdm_get_measurement_summary_hash_size(libspdm_context_t *spdm_context,
}

switch (measurement_summary_hash_type) {
case SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH:
case SPDM_REQUEST_NO_MEASUREMENT_SUMMARY_HASH:
return 0;
break;

case SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH:
case SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH:
case SPDM_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH:
case SPDM_REQUEST_ALL_MEASUREMENTS_HASH:
return libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
break;
default:
Expand Down
6 changes: 3 additions & 3 deletions library/spdm_requester_lib/libspdm_req_key_exchange.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,9 +300,9 @@ static libspdm_return_t libspdm_try_send_receive_key_exchange(
LIBSPDM_ASSERT((slot_id < SPDM_MAX_SLOT_COUNT) || (slot_id == 0xff));
LIBSPDM_ASSERT((slot_id != 0xff) ||
(spdm_context->local_context.peer_public_key_provision_size != 0));
LIBSPDM_ASSERT(measurement_hash_type == SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH ||
measurement_hash_type == SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH ||
measurement_hash_type == SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH);
LIBSPDM_ASSERT(measurement_hash_type == SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH ||
measurement_hash_type == SPDM_KEY_EXCHANGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH ||
measurement_hash_type == SPDM_KEY_EXCHANGE_REQUEST_ALL_MEASUREMENTS_HASH);

/* -=[Verify State Phase]=- */
if (libspdm_get_connection_version(spdm_context) < SPDM_MESSAGE_VERSION_11) {
Expand Down
6 changes: 3 additions & 3 deletions library/spdm_requester_lib/libspdm_req_psk_exchange.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,9 @@ static libspdm_return_t libspdm_try_send_receive_psk_exchange(
size_t message_size;
size_t transport_header_size;

LIBSPDM_ASSERT(measurement_hash_type == SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH ||
measurement_hash_type == SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH ||
measurement_hash_type == SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH);
LIBSPDM_ASSERT(measurement_hash_type == SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH ||
measurement_hash_type == SPDM_PSK_EXCHANGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH ||
measurement_hash_type == SPDM_PSK_EXCHANGE_REQUEST_ALL_MEASUREMENTS_HASH);

if (libspdm_get_connection_version(spdm_context) < SPDM_MESSAGE_VERSION_11) {
return LIBSPDM_STATUS_UNSUPPORTED_CAP;
Expand Down
2 changes: 1 addition & 1 deletion library/spdm_responder_lib/libspdm_rsp_key_exchange.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ libspdm_return_t libspdm_get_response_key_exchange(libspdm_context_t *spdm_conte
spdm_context, false, spdm_request->header.param1);

if ((measurement_summary_hash_size == 0) &&
(spdm_request->header.param1 != SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH)) {
(spdm_request->header.param1 != SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH)) {
return libspdm_generate_error_response(spdm_context,
SPDM_ERROR_CODE_INVALID_REQUEST,
0, response_size, response);
Expand Down
14 changes: 7 additions & 7 deletions library/spdm_responder_lib/libspdm_rsp_psk_exchange.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,13 @@ libspdm_return_t libspdm_get_response_psk_exchange(libspdm_context_t *spdm_conte

measurement_summary_hash_size = libspdm_get_measurement_summary_hash_size(
spdm_context, false, spdm_request->header.param1);
if ((measurement_summary_hash_size == 0) &&
(spdm_request->header.param1 != SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH)) {
return libspdm_generate_error_response(spdm_context,
SPDM_ERROR_CODE_INVALID_REQUEST,
0, response_size, response);
}

hmac_size = libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);

if (request_size < sizeof(spdm_psk_exchange_request_t)) {
Expand Down Expand Up @@ -319,13 +326,6 @@ libspdm_return_t libspdm_get_response_psk_exchange(libspdm_context_t *spdm_conte
result = true;
}

if ((measurement_summary_hash_size == 0) &&
(spdm_request->header.param2 != SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH)) {
libspdm_free_session_id(spdm_context, session_id);
return libspdm_generate_error_response(spdm_context,
SPDM_ERROR_CODE_INVALID_REQUEST,
0, response_size, response);
}
if (!result) {
libspdm_free_session_id(spdm_context, session_id);
return libspdm_generate_error_response(spdm_context,
Expand Down
8 changes: 4 additions & 4 deletions os_stub/spdm_device_secret_lib_sample/lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1213,11 +1213,11 @@ bool libspdm_generate_measurement_summary_hash(
bool result;

switch (measurement_summary_hash_type) {
case SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH:
case SPDM_REQUEST_NO_MEASUREMENT_SUMMARY_HASH:
break;

case SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH:
case SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH:
case SPDM_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH:
case SPDM_REQUEST_ALL_MEASUREMENTS_HASH:
if (measurement_summary_hash_size != libspdm_get_hash_size(base_hash_algo)) {
return false;
}
Expand Down Expand Up @@ -1275,7 +1275,7 @@ bool libspdm_generate_measurement_summary_hash(
.measurement_size;
/* filter unneeded data*/
if ((measurement_summary_hash_type ==
SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH) ||
SPDM_REQUEST_ALL_MEASUREMENTS_HASH) ||
((cached_measurment_block
->measurement_block_dmtf_header
.dmtf_spec_measurement_value_type &
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ void libspdm_test_requester_key_exchange_case1(void **State)
libspdm_zero_mem(measurement_hash, sizeof(measurement_hash));

status = libspdm_send_receive_key_exchange(spdm_context,
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
0, 0, &session_id, &heartbeat_period, &slot_id_param,
measurement_hash);
free(data);
Expand Down Expand Up @@ -402,7 +402,7 @@ void libspdm_test_requester_key_exchange_case2(void **State)
libspdm_zero_mem(measurement_hash, sizeof(measurement_hash));

status = libspdm_send_receive_key_exchange(spdm_context,
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
0, 0, &session_id, &heartbeat_period, &slot_id_param,
measurement_hash);
free(data);
Expand Down Expand Up @@ -485,7 +485,7 @@ void libspdm_test_requester_key_exchange_case3(void **State)

status = libspdm_send_receive_key_exchange(
spdm_context,
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0, 0xFF,
SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0, 0xFF,
&session_id, &heartbeat_period, &slot_id_param,
measurement_hash);

Expand Down Expand Up @@ -576,7 +576,7 @@ void libspdm_test_requester_key_exchange_case4(void **State)

status = libspdm_send_receive_key_exchange(
spdm_context,
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0, 0xFF,
SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0, 0xFF,
&session_id, &heartbeat_period, &slot_id_param,
measurement_hash);

Expand Down Expand Up @@ -667,7 +667,7 @@ void libspdm_test_requester_key_exchange_case5(void **State)

status = libspdm_send_receive_key_exchange(
spdm_context,
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0, 0xFF,
SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0, 0xFF,
&session_id, &heartbeat_period, &slot_id_param,
measurement_hash);

Expand Down Expand Up @@ -748,7 +748,7 @@ void libspdm_test_requester_key_exchange_ex_case1(void **State)
responder_opaque_data_size = sizeof(responder_opaque_data);
libspdm_zero_mem(measurement_hash, sizeof(measurement_hash));
status = libspdm_send_receive_key_exchange_ex(spdm_context,
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
0, 0,
&session_id, &heartbeat_period, &slot_id_param,
measurement_hash, requester_random_in,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ void libspdm_test_requester_psk_exchange_case1(void **State)
status = libspdm_send_receive_psk_exchange(spdm_context,
LIBSPDM_TEST_PSK_HINT_STRING,
sizeof(LIBSPDM_TEST_PSK_HINT_STRING),
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
0, &session_id, &heartbeat_period, measurement_hash);
if (status == LIBSPDM_STATUS_SUCCESS) {
libspdm_reset_message_k(spdm_context, spdm_context->session_info);
Expand Down Expand Up @@ -294,7 +294,7 @@ void libspdm_test_requester_psk_exchange_case2(void **State)
status = libspdm_send_receive_psk_exchange_ex(spdm_context,
LIBSPDM_TEST_PSK_HINT_STRING,
sizeof(LIBSPDM_TEST_PSK_HINT_STRING),
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
0, &session_id, &heartbeat_period,
measurement_hash, NULL, 0,
NULL, NULL, NULL, NULL, NULL, 0,
Expand Down Expand Up @@ -363,7 +363,7 @@ void libspdm_test_requester_psk_exchange_case3(void **State)
status = libspdm_send_receive_psk_exchange(spdm_context,
LIBSPDM_TEST_PSK_HINT_STRING,
sizeof(LIBSPDM_TEST_PSK_HINT_STRING),
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
0, &session_id, &heartbeat_period, measurement_hash);
if (status == LIBSPDM_STATUS_SUCCESS) {
libspdm_reset_message_k(spdm_context, spdm_context->session_info);
Expand Down Expand Up @@ -426,7 +426,7 @@ void libspdm_test_requester_psk_exchange_ex_case1(void **State)
status = libspdm_send_receive_psk_exchange_ex(spdm_context,
LIBSPDM_TEST_PSK_HINT_STRING,
sizeof(LIBSPDM_TEST_PSK_HINT_STRING),
SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0,
SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0,
&session_id, &heartbeat_period, measurement_hash, NULL, 0,
NULL, NULL, NULL, NULL,
NULL, 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ libspdm_return_t do_session_via_spdm(void *spdm_context)
spdm_context,
false, /* KeyExchange*/
NULL, 0,
SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH, 0, 0,
SPDM_KEY_EXCHANGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH, 0, 0,
&session_id, &heartbeat_period, measurement_hash);
if (LIBSPDM_STATUS_IS_ERROR(status)) {
LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "libspdm_start_session - %r\n", status));
Expand Down
Loading