diff options
author | Andreas Steffen <andreas.steffen@strongswan.org> | 2011-12-18 17:55:20 +0100 |
---|---|---|
committer | Andreas Steffen <andreas.steffen@strongswan.org> | 2011-12-18 17:55:20 +0100 |
commit | 458c52d29dd51f54e5b4f617c4e0a2036274248a (patch) | |
tree | 30e08e9b9253bfd63ed442a3f2e16e333d55095e /src | |
parent | a98262ff6edb05b4d3e0996a40e63f6bb4725227 (diff) | |
download | strongswan-458c52d29dd51f54e5b4f617c4e0a2036274248a.tar.bz2 strongswan-458c52d29dd51f54e5b4f617c4e0a2036274248a.tar.xz |
build PA-TNC message only if there are PA-TNC attributes to send
Diffstat (limited to 'src')
3 files changed, 43 insertions, 20 deletions
diff --git a/src/libpts/plugins/imv_attestation/imv_attestation.c b/src/libpts/plugins/imv_attestation/imv_attestation.c index 30c1832ad..4aa393678 100644 --- a/src/libpts/plugins/imv_attestation/imv_attestation.c +++ b/src/libpts/plugins/imv_attestation/imv_attestation.c @@ -169,30 +169,52 @@ TNC_Result TNC_IMV_NotifyConnectionChange(TNC_IMVID imv_id, static TNC_Result send_message(TNC_ConnectionID connection_id) { pa_tnc_msg_t *msg; + pa_tnc_attr_t *attr; imv_state_t *state; imv_attestation_state_t *attestation_state; TNC_Result result; + linked_list_t *attr_list; + enumerator_t *enumerator; if (!imv_attestation->get_state(imv_attestation, connection_id, &state)) { return TNC_RESULT_FATAL; } attestation_state = (imv_attestation_state_t*)state; - msg = pa_tnc_msg_create(); + attr_list = linked_list_create(); - if (imv_attestation_build(msg, attestation_state, supported_algorithms, + if (imv_attestation_build(attr_list, attestation_state, supported_algorithms, supported_dh_groups, pts_db)) { - msg->build(msg); - result = imv_attestation->send_message(imv_attestation, connection_id, - FALSE, 0, TNC_IMCID_ANY, - msg->get_encoding(msg)); + if (attr_list->get_count(attr_list)) + { + msg = pa_tnc_msg_create(); + + /* move PA-TNC attributes to PA-TNC message */ + enumerator = attr_list->create_enumerator(attr_list); + while (enumerator->enumerate(enumerator, &attr)) + { + msg->add_attribute(msg, attr); + } + enumerator->destroy(enumerator); + + msg->build(msg); + result = imv_attestation->send_message(imv_attestation, + connection_id, FALSE, 0, TNC_IMCID_ANY, + msg->get_encoding(msg)); + msg->destroy(msg); + } + else + { + result = TNC_RESULT_SUCCESS; + } + attr_list->destroy(attr_list); } else { + attr_list->destroy_offset(attr_list, offsetof(pa_tnc_attr_t, destroy)); result = TNC_RESULT_FATAL; } - msg->destroy(msg); return result; } @@ -310,6 +332,7 @@ static TNC_Result receive_message(TNC_IMVID imv_id, { pa_tnc_msg = pa_tnc_msg_create(); + /* move PA-TNC attributes to PA-TNC message */ enumerator = attr_list->create_enumerator(attr_list); while (enumerator->enumerate(enumerator, &attr)) { diff --git a/src/libpts/plugins/imv_attestation/imv_attestation_build.c b/src/libpts/plugins/imv_attestation/imv_attestation_build.c index 089ecbe9c..efcb1c695 100644 --- a/src/libpts/plugins/imv_attestation/imv_attestation_build.c +++ b/src/libpts/plugins/imv_attestation/imv_attestation_build.c @@ -30,7 +30,7 @@ #include <debug.h> -bool imv_attestation_build(pa_tnc_msg_t *msg, +bool imv_attestation_build(linked_list_t *attr_list, imv_attestation_state_t *attestation_state, pts_meas_algorithms_t supported_algorithms, pts_dh_group_t supported_dh_groups, @@ -90,12 +90,12 @@ bool imv_attestation_build(pa_tnc_msg_t *msg, flags = pts->get_proto_caps(pts); attr = tcg_pts_attr_proto_caps_create(flags, TRUE); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); /* Send Measurement Algorithms attribute */ attr = tcg_pts_attr_meas_algo_create(supported_algorithms, FALSE); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); attestation_state->set_handshake_state(attestation_state, IMV_ATTESTATION_STATE_NONCE_REQ); @@ -111,7 +111,7 @@ bool imv_attestation_build(pa_tnc_msg_t *msg, attr = tcg_pts_attr_dh_nonce_params_req_create(min_nonce_len, supported_dh_groups); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); attestation_state->set_handshake_state(attestation_state, IMV_ATTESTATION_STATE_TPM_INIT); @@ -130,18 +130,18 @@ bool imv_attestation_build(pa_tnc_msg_t *msg, attr = tcg_pts_attr_dh_nonce_finish_create(selected_algorithm, initiator_value, initiator_nonce); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); } /* Send Get TPM Version attribute */ attr = tcg_pts_attr_get_tpm_version_info_create(); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); /* Send Get AIK attribute */ attr = tcg_pts_attr_get_aik_create(); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); attestation_state->set_handshake_state(attestation_state, IMV_ATTESTATION_STATE_MEAS); @@ -187,7 +187,7 @@ bool imv_attestation_build(pa_tnc_msg_t *msg, attr = tcg_pts_attr_req_file_meta_create(is_dir, delimiter, pathname); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); } enumerator->destroy(enumerator); @@ -208,7 +208,7 @@ bool imv_attestation_build(pa_tnc_msg_t *msg, attr = tcg_pts_attr_req_file_meas_create(is_dir, request_id, delimiter, pathname); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); } enumerator->destroy(enumerator); break; @@ -275,12 +275,12 @@ bool imv_attestation_build(pa_tnc_msg_t *msg, if (attr) { /* Send Request Functional Component Evidence attribute */ - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); /* Send Generate Attestation Evidence attribute */ attr = tcg_pts_attr_gen_attest_evid_create(); attr->set_noskip_flag(attr, TRUE); - msg->add_attribute(msg, attr); + attr_list->insert_last(attr_list, attr); } break; } diff --git a/src/libpts/plugins/imv_attestation/imv_attestation_build.h b/src/libpts/plugins/imv_attestation/imv_attestation_build.h index e397e8458..7f934fd09 100644 --- a/src/libpts/plugins/imv_attestation/imv_attestation_build.h +++ b/src/libpts/plugins/imv_attestation/imv_attestation_build.h @@ -34,14 +34,14 @@ /** * Process a TCG PTS attribute * - * @param msg PA-TNC message to be built + * @param attr_list list of PA-TNC attriubutes to be built * @param attestation_state attestation state of a given connection * @param supported_algorithms supported PTS measurement algorithms * @param supported_dh_groups supported DH groups * @param pts_db PTS configuration database * @return TRUE if successful */ -bool imv_attestation_build(pa_tnc_msg_t *msg, +bool imv_attestation_build(linked_list_t *attr_list, imv_attestation_state_t *attestation_state, pts_meas_algorithms_t supported_algorithms, pts_dh_group_t supported_dh_groups, |