finished refactoring functional components
This commit is contained in:
@@ -33,7 +33,7 @@
|
||||
#include <tcg/tcg_pts_attr_tpm_version_info.h>
|
||||
#include <tcg/tcg_pts_attr_get_aik.h>
|
||||
#include <tcg/tcg_pts_attr_aik.h>
|
||||
#include <tcg/tcg_pts_attr_req_funct_comp_evid.h>
|
||||
#include <tcg/tcg_pts_attr_req_func_comp_evid.h>
|
||||
#include <tcg/tcg_pts_attr_gen_attest_evid.h>
|
||||
#include <tcg/tcg_pts_attr_simple_comp_evid.h>
|
||||
#include <tcg/tcg_pts_attr_simple_evid_final.h>
|
||||
@@ -436,37 +436,29 @@ bool imc_attestation_process(pa_tnc_attr_t *attr, linked_list_t *attr_list,
|
||||
|
||||
break;
|
||||
}
|
||||
case TCG_PTS_REQ_FUNCT_COMP_EVID:
|
||||
case TCG_PTS_REQ_FUNC_COMP_EVID:
|
||||
{
|
||||
tcg_pts_attr_req_funct_comp_evid_t *attr_cast;
|
||||
tcg_pts_attr_req_func_comp_evid_t *attr_cast;
|
||||
pts_proto_caps_flag_t negotiated_caps;
|
||||
enumerator_t *e;
|
||||
pts_funct_comp_evid_req_t *requests;
|
||||
funct_comp_evid_req_entry_t *entry;
|
||||
u_int32_t requests_count;
|
||||
pts_attr_req_funct_comp_evid_flag_t flags;
|
||||
u_int32_t sub_comp_depth;
|
||||
pts_comp_func_name_t *name;
|
||||
u_int32_t depth;
|
||||
u_int8_t flags;
|
||||
enumerator_t *e;
|
||||
|
||||
attr_info = attr->get_value(attr);
|
||||
attr_cast = (tcg_pts_attr_req_funct_comp_evid_t*)attr;
|
||||
requests = attr_cast->get_requests(attr_cast);
|
||||
requests_count = requests->get_req_count(requests);
|
||||
attr_cast = (tcg_pts_attr_req_func_comp_evid_t*)attr;
|
||||
|
||||
DBG1(DBG_IMC, "IMV requests evidence%s for: %d functional components",
|
||||
(requests_count == 1) ? "":"s", requests_count);
|
||||
DBG1(DBG_IMC, "IMV requests evidence for %d functional components",
|
||||
attr_cast->get_count(attr_cast));
|
||||
|
||||
e = requests->create_enumerator(requests);
|
||||
while (e->enumerate(e, &entry))
|
||||
e = attr_cast->create_enumerator(attr_cast);
|
||||
while (e->enumerate(e, &flags, &depth, &name))
|
||||
{
|
||||
flags = entry->flags;
|
||||
sub_comp_depth = entry->sub_comp_depth;
|
||||
name = entry->name->clone(entry->name);
|
||||
negotiated_caps = pts->get_proto_caps(pts);
|
||||
|
||||
DBG1(DBG_IMC, "Requested Evidence flags: %d, depth: %d,"
|
||||
" vendor_id: %d, qualifier %d, name: %d",
|
||||
flags, sub_comp_depth, name->get_vendor_id(name),
|
||||
flags, depth, name->get_vendor_id(name),
|
||||
name->get_qualifier(name), name->get_name(name));
|
||||
|
||||
if (flags & PTS_REQ_FUNC_COMP_FLAG_TTC)
|
||||
@@ -500,7 +492,7 @@ bool imc_attestation_process(pa_tnc_attr_t *attr, linked_list_t *attr_list,
|
||||
attr_list->insert_last(attr_list, attr);
|
||||
break;
|
||||
}
|
||||
if (sub_comp_depth != 0)
|
||||
if (depth != 0)
|
||||
{
|
||||
DBG1(DBG_IMC, "current version of Attestation IMC does not "
|
||||
"support sub component measurement deeper than "
|
||||
@@ -513,14 +505,6 @@ bool imc_attestation_process(pa_tnc_attr_t *attr, linked_list_t *attr_list,
|
||||
"only functional component namings by ITA");
|
||||
return FALSE;
|
||||
}
|
||||
/* Check Family */
|
||||
if (name->get_qualifier(name) & PTS_REQ_FUNCT_COMP_FAMILY_MASK)
|
||||
{
|
||||
attr = ietf_attr_pa_tnc_error_create(PEN_TCG,
|
||||
TCG_PTS_INVALID_NAME_FAM, attr_info);
|
||||
attr_list->insert_last(attr_list, attr);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check if Unknown or Wildcard was set for qualifier */
|
||||
if (name->get_qualifier(name) & PTS_QUALIFIER_WILDCARD)
|
||||
|
||||
@@ -556,10 +556,10 @@ TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id,
|
||||
attestation_state->get_file_meas_request_count(attestation_state));
|
||||
attestation_state->set_measurement_error(attestation_state);
|
||||
}
|
||||
if (attestation_state->get_comp_evid_request_count(attestation_state))
|
||||
if (attestation_state->get_component_count(attestation_state))
|
||||
{
|
||||
DBG1(DBG_IMV, "failure due to %d pending simple component evidences",
|
||||
attestation_state->get_comp_evid_request_count(attestation_state));
|
||||
DBG1(DBG_IMV, "failure due to %d components waiting for evidence",
|
||||
attestation_state->get_component_count(attestation_state));
|
||||
attestation_state->set_measurement_error(attestation_state);
|
||||
}
|
||||
if (attestation_state->get_measurement_error(attestation_state))
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <tcg/tcg_pts_attr_dh_nonce_finish.h>
|
||||
#include <tcg/tcg_pts_attr_get_tpm_version_info.h>
|
||||
#include <tcg/tcg_pts_attr_get_aik.h>
|
||||
#include <tcg/tcg_pts_attr_req_funct_comp_evid.h>
|
||||
#include <tcg/tcg_pts_attr_req_func_comp_evid.h>
|
||||
#include <tcg/tcg_pts_attr_gen_attest_evid.h>
|
||||
#include <tcg/tcg_pts_attr_req_file_meas.h>
|
||||
#include <tcg/tcg_pts_attr_req_file_meta.h>
|
||||
@@ -38,7 +38,7 @@ bool imv_attestation_build(pa_tnc_msg_t *msg,
|
||||
{
|
||||
imv_attestation_handshake_state_t handshake_state;
|
||||
pts_t *pts;
|
||||
pa_tnc_attr_t *attr;
|
||||
pa_tnc_attr_t *attr = NULL;
|
||||
|
||||
handshake_state = attestation_state->get_handshake_state(attestation_state);
|
||||
pts = attestation_state->get_pts(attestation_state);
|
||||
@@ -208,11 +208,11 @@ bool imv_attestation_build(pa_tnc_msg_t *msg,
|
||||
}
|
||||
case IMV_ATTESTATION_STATE_COMP_EVID:
|
||||
{
|
||||
tcg_pts_attr_req_func_comp_evid_t *attr_cast;
|
||||
enumerator_t *enumerator;
|
||||
char flags[8];
|
||||
char *platform_info;
|
||||
pts_funct_comp_evid_req_t *requests = NULL;
|
||||
funct_comp_evid_req_entry_t *entry;
|
||||
char flags[8], *platform_info;
|
||||
pts_component_t *comp;
|
||||
pts_comp_func_name_t *comp_name;
|
||||
int vid, name, qualifier, type;
|
||||
enum_name_t *names, *types;
|
||||
bool first = TRUE;
|
||||
@@ -230,8 +230,6 @@ bool imv_attestation_build(pa_tnc_msg_t *msg,
|
||||
(platform_info) ? "" : "platform info");
|
||||
break;
|
||||
}
|
||||
DBG1(DBG_IMV, "platform is '%s'", platform_info);
|
||||
|
||||
|
||||
enumerator = pts_db->create_comp_evid_enumerator(pts_db, platform_info);
|
||||
if (!enumerator)
|
||||
@@ -240,17 +238,14 @@ bool imv_attestation_build(pa_tnc_msg_t *msg,
|
||||
}
|
||||
while (enumerator->enumerate(enumerator, &vid, &name, &qualifier))
|
||||
{
|
||||
entry = malloc_thing(funct_comp_evid_req_entry_t);
|
||||
entry->flags = PTS_REQ_FUNC_COMP_FLAG_PCR;
|
||||
entry->sub_comp_depth = 0;
|
||||
entry->name = pts_comp_func_name_create(vid, name, qualifier);
|
||||
comp_name = pts_comp_func_name_create(vid, name, qualifier);
|
||||
|
||||
names = pts_components->get_comp_func_names(pts_components, vid);
|
||||
types = pts_components->get_qualifier_type_names(pts_components, vid);
|
||||
if (names && types)
|
||||
{
|
||||
type = pts_components->get_qualifier(pts_components,
|
||||
entry->name, &flags);
|
||||
comp_name, flags);
|
||||
DBG2(DBG_TNC, "%N component evidence request '%N' [%s] '%N'",
|
||||
pen_names, vid, names, name, flags, types, type);
|
||||
}
|
||||
@@ -259,27 +254,36 @@ bool imv_attestation_build(pa_tnc_msg_t *msg,
|
||||
DBG2(DBG_TNC, "0x%06x component evidence request 0x%08x 0x%02x",
|
||||
vid, name, qualifier);
|
||||
}
|
||||
comp = pts_components->create(pts_components, comp_name);
|
||||
if (!comp)
|
||||
{
|
||||
DBG2(DBG_TNC, " functional component not registered");
|
||||
comp_name->destroy(comp_name);
|
||||
continue;
|
||||
}
|
||||
attestation_state->add_component(attestation_state, comp);
|
||||
if (first)
|
||||
{
|
||||
/* Create a requests object */
|
||||
requests = pts_funct_comp_evid_req_create();
|
||||
attr = tcg_pts_attr_req_func_comp_evid_create();
|
||||
attr->set_noskip_flag(attr, TRUE);
|
||||
first = FALSE;
|
||||
}
|
||||
requests->add(requests, entry);
|
||||
attestation_state->add_comp_evid_request(attestation_state, entry);
|
||||
attr_cast = (tcg_pts_attr_req_func_comp_evid_t *)attr;
|
||||
attr_cast->add_component(attr, comp->get_evidence_flags(comp),
|
||||
0, comp_name);
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
/* Send Request Functional Component Evidence attribute */
|
||||
attr = tcg_pts_attr_req_funct_comp_evid_create(requests);
|
||||
attr->set_noskip_flag(attr, TRUE);
|
||||
msg->add_attribute(msg, attr);
|
||||
if (attr)
|
||||
{
|
||||
/* Send Request Functional Component Evidence attribute */
|
||||
msg->add_attribute(msg, 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);
|
||||
|
||||
/* Send Generate Attestation Evidence attribute */
|
||||
attr = tcg_pts_attr_gen_attest_evid_create();
|
||||
attr->set_noskip_flag(attr, TRUE);
|
||||
msg->add_attribute(msg, attr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
@@ -268,6 +268,7 @@ bool imv_attestation_process(pa_tnc_attr_t *attr, linked_list_t *attr_list,
|
||||
u_int32_t depth, extended_pcr;
|
||||
u_int8_t measurement_type;
|
||||
pts_comp_func_name_t *name;
|
||||
pts_component_t *component;
|
||||
pts_meas_algorithms_t hash_algorithm;
|
||||
pts_pcr_transform_t transformation;
|
||||
chunk_t measurement_time, policy_uri;
|
||||
@@ -317,12 +318,15 @@ bool imv_attestation_process(pa_tnc_attr_t *attr, linked_list_t *attr_list,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!attestation_state->check_off_comp_evid_request(
|
||||
attestation_state, name))
|
||||
component = attestation_state->check_off_component(attestation_state,
|
||||
name);
|
||||
if (!component)
|
||||
{
|
||||
DBG1(DBG_IMV, " no entry found for component evidence request");
|
||||
break;
|
||||
}
|
||||
component->verify(component);
|
||||
component->destroy(component);
|
||||
|
||||
measurement_type = attr_cast->get_measurement_type(attr_cast);
|
||||
hash_algorithm = attr_cast->get_hash_algorithm(attr_cast);
|
||||
@@ -508,7 +512,7 @@ bool imv_attestation_process(pa_tnc_attr_t *attr, linked_list_t *attr_list,
|
||||
case TCG_PTS_REQ_TEMPL_REF_MANI_SET_META:
|
||||
case TCG_PTS_UPDATE_TEMPL_REF_MANI:
|
||||
case TCG_PTS_GET_AIK:
|
||||
case TCG_PTS_REQ_FUNCT_COMP_EVID:
|
||||
case TCG_PTS_REQ_FUNC_COMP_EVID:
|
||||
case TCG_PTS_GEN_ATTEST_EVID:
|
||||
case TCG_PTS_REQ_FILE_META:
|
||||
case TCG_PTS_REQ_FILE_MEAS:
|
||||
|
||||
@@ -77,9 +77,9 @@ struct private_imv_attestation_state_t {
|
||||
linked_list_t *file_meas_requests;
|
||||
|
||||
/**
|
||||
* List of Functional Component Evidence requests
|
||||
* List of Functional Components
|
||||
*/
|
||||
linked_list_t *comp_evid_requests;
|
||||
linked_list_t *components;
|
||||
|
||||
/**
|
||||
* PTS object
|
||||
@@ -191,7 +191,8 @@ METHOD(imv_state_t, destroy, void,
|
||||
private_imv_attestation_state_t *this)
|
||||
{
|
||||
this->file_meas_requests->destroy_function(this->file_meas_requests, free);
|
||||
this->comp_evid_requests->destroy_function(this->comp_evid_requests, free);
|
||||
this->components->destroy_offset(this->components,
|
||||
offsetof(pts_component_t, destroy));
|
||||
this->pts->destroy(this->pts);
|
||||
free(this);
|
||||
}
|
||||
@@ -260,30 +261,25 @@ METHOD(imv_attestation_state_t, get_file_meas_request_count, int,
|
||||
return this->file_meas_requests->get_count(this->file_meas_requests);
|
||||
}
|
||||
|
||||
METHOD(imv_attestation_state_t, add_comp_evid_request, void,
|
||||
private_imv_attestation_state_t *this, funct_comp_evid_req_entry_t *entry)
|
||||
METHOD(imv_attestation_state_t, add_component, void,
|
||||
private_imv_attestation_state_t *this, pts_component_t *entry)
|
||||
{
|
||||
pts_comp_func_name_t *request;
|
||||
|
||||
request = entry->name->clone(entry->name);
|
||||
this->comp_evid_requests->insert_last(this->comp_evid_requests, request);
|
||||
this->components->insert_last(this->components, entry);
|
||||
}
|
||||
|
||||
METHOD(imv_attestation_state_t, check_off_comp_evid_request, bool,
|
||||
METHOD(imv_attestation_state_t, check_off_component, pts_component_t*,
|
||||
private_imv_attestation_state_t *this, pts_comp_func_name_t *name)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
pts_comp_func_name_t *request;
|
||||
bool found = FALSE;
|
||||
pts_component_t *entry, *found = NULL;
|
||||
|
||||
enumerator = this->comp_evid_requests->create_enumerator(this->comp_evid_requests);
|
||||
while (enumerator->enumerate(enumerator, &request))
|
||||
enumerator = this->components->create_enumerator(this->components);
|
||||
while (enumerator->enumerate(enumerator, &entry))
|
||||
{
|
||||
if (name->equals(name, request))
|
||||
if (name->equals(name, entry->get_comp_func_name(entry)))
|
||||
{
|
||||
found = TRUE;
|
||||
this->comp_evid_requests->remove_at(this->comp_evid_requests, enumerator);
|
||||
free(request);
|
||||
found = entry;
|
||||
this->components->remove_at(this->components, enumerator);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -291,10 +287,10 @@ METHOD(imv_attestation_state_t, check_off_comp_evid_request, bool,
|
||||
return found;
|
||||
}
|
||||
|
||||
METHOD(imv_attestation_state_t, get_comp_evid_request_count, int,
|
||||
METHOD(imv_attestation_state_t, get_component_count, int,
|
||||
private_imv_attestation_state_t *this)
|
||||
{
|
||||
return this->comp_evid_requests->get_count(this->comp_evid_requests);
|
||||
return this->components->get_count(this->components);
|
||||
}
|
||||
|
||||
METHOD(imv_attestation_state_t, get_measurement_error, bool,
|
||||
@@ -333,9 +329,9 @@ imv_state_t *imv_attestation_state_create(TNC_ConnectionID connection_id)
|
||||
.add_file_meas_request = _add_file_meas_request,
|
||||
.check_off_file_meas_request = _check_off_file_meas_request,
|
||||
.get_file_meas_request_count = _get_file_meas_request_count,
|
||||
.add_comp_evid_request = _add_comp_evid_request,
|
||||
.check_off_comp_evid_request = _check_off_comp_evid_request,
|
||||
.get_comp_evid_request_count = _get_comp_evid_request_count,
|
||||
.add_component = _add_component,
|
||||
.check_off_component = _check_off_component,
|
||||
.get_component_count = _get_component_count,
|
||||
.get_measurement_error = _get_measurement_error,
|
||||
.set_measurement_error = _set_measurement_error,
|
||||
},
|
||||
@@ -345,7 +341,7 @@ imv_state_t *imv_attestation_state_create(TNC_ConnectionID connection_id)
|
||||
.rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION,
|
||||
.eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW,
|
||||
.file_meas_requests = linked_list_create(),
|
||||
.comp_evid_requests = linked_list_create(),
|
||||
.components = linked_list_create(),
|
||||
.pts = pts_create(FALSE),
|
||||
);
|
||||
|
||||
|
||||
@@ -103,28 +103,27 @@ struct imv_attestation_state_t {
|
||||
u_int16_t id, int *file_id, bool *is_dir);
|
||||
|
||||
/**
|
||||
* Add an entry to the list of pending Function Component Evidences
|
||||
* Add an entry to the list of Functional Components waiting for evidence
|
||||
*
|
||||
* @param entry Functional Component Evidence Request
|
||||
* @param entry Functional Component
|
||||
*/
|
||||
void (*add_comp_evid_request)(imv_attestation_state_t *this,
|
||||
funct_comp_evid_req_entry_t *entry);
|
||||
void (*add_component)(imv_attestation_state_t *this, pts_component_t *entry);
|
||||
|
||||
/**
|
||||
* Returns the number of pending Function Component Evidences
|
||||
* Returns the number of Functional Component waiting for evidence
|
||||
*
|
||||
* @return Number of pending evidences
|
||||
* @return Number of waiting Functional Components
|
||||
*/
|
||||
int (*get_comp_evid_request_count)(imv_attestation_state_t *this);
|
||||
int (*get_component_count)(imv_attestation_state_t *this);
|
||||
|
||||
/**
|
||||
* Check for presence of Component Evidence Request and remove if exists
|
||||
* Check for presence of Functional Component and remove and return it
|
||||
*
|
||||
* @param name Name of the requested Functional Component
|
||||
* @return TRUE if component request found, FALSE otherwise
|
||||
* @return Functional Component if found, NULL otherwise
|
||||
*/
|
||||
bool (*check_off_comp_evid_request)(imv_attestation_state_t *this,
|
||||
pts_comp_func_name_t *name);
|
||||
pts_component_t* (*check_off_component)(imv_attestation_state_t *this,
|
||||
pts_comp_func_name_t *name);
|
||||
|
||||
/**
|
||||
* Indicates if a file measurement error occurred
|
||||
|
||||
Reference in New Issue
Block a user