diff --git a/src/libpts/plugins/imv_attestation/imv_attestation_agent.c b/src/libpts/plugins/imv_attestation/imv_attestation_agent.c index ba3bbe33c..b5fde9830 100644 --- a/src/libpts/plugins/imv_attestation/imv_attestation_agent.c +++ b/src/libpts/plugins/imv_attestation/imv_attestation_agent.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -303,6 +304,32 @@ METHOD(imv_agent_if_t, batch_ending, TNC_Result, session = state->get_session(state); imv_id = this->agent->get_id(this->agent); + /* send an IETF attribute request if no platform info was received */ + if (!platform_info && + !(state->get_action_flags(state) & IMV_ATTESTATION_FLAG_ATTR_REQ)) + { + pa_tnc_attr_t *attr; + ietf_attr_attr_request_t *attr_cast; + imv_msg_t *os_msg; + + attr = ietf_attr_attr_request_create(PEN_IETF, + IETF_ATTR_PRODUCT_INFORMATION); + attr_cast = (ietf_attr_attr_request_t*)attr; + attr_cast->add(attr_cast, PEN_IETF, IETF_ATTR_STRING_VERSION); + + os_msg = imv_msg_create(this->agent, state, id, imv_id, TNC_IMCID_ANY, + msg_types[1]); + os_msg->add_attribute(os_msg, attr); + result = os_msg->send(os_msg, FALSE); + os_msg->destroy(os_msg); + + if (result != TNC_RESULT_SUCCESS) + { + return result; + } + state->set_action_flags(state, IMV_ATTESTATION_FLAG_ATTR_REQ); + } + /* create an empty out message - we might need it */ out_msg = imv_msg_create(this->agent, state, id, imv_id, TNC_IMCID_ANY, msg_types[0]); @@ -420,7 +447,8 @@ METHOD(imv_agent_if_t, batch_ending, TNC_Result, } /* finalized all workitems? */ - if (session && session->get_workitem_count(session, imv_id) == 0 && + if (session && session->get_policy_started(session) && + session->get_workitem_count(session, imv_id) == 0 && attestation_state->get_handshake_state(attestation_state) == IMV_ATTESTATION_STATE_END) { diff --git a/src/libpts/plugins/imv_attestation/imv_attestation_state.h b/src/libpts/plugins/imv_attestation/imv_attestation_state.h index f798aa063..fe57a8c5f 100644 --- a/src/libpts/plugins/imv_attestation/imv_attestation_state.h +++ b/src/libpts/plugins/imv_attestation/imv_attestation_state.h @@ -39,8 +39,9 @@ typedef enum imv_meas_error_t imv_meas_error_t; * IMV Attestation Flags set for completed actions */ enum imv_attestation_flag_t { - IMV_ATTESTATION_FLAG_ALGO = (1<<0), - IMV_ATTESTATION_FLAG_FILE_MEAS = (1<<1) + IMV_ATTESTATION_FLAG_ATTR_REQ = (1<<0), + IMV_ATTESTATION_FLAG_ALGO = (1<<1), + IMV_ATTESTATION_FLAG_FILE_MEAS = (1<<2) }; /**