decoupled request ID from files table primary key

This commit is contained in:
Andreas Steffen
2011-09-10 22:39:56 +02:00
parent cfedfcca31
commit f4ef026762
3 changed files with 32 additions and 16 deletions
@@ -233,6 +233,7 @@ static TNC_Result send_message(TNC_ConnectionID connection_id)
enumerator_t *enumerator; enumerator_t *enumerator;
u_int32_t delimiter = SOLIDUS_UTF; u_int32_t delimiter = SOLIDUS_UTF;
char *platform_info, *pathname; char *platform_info, *pathname;
u_int16_t request_id;
int id, type; int id, type;
bool is_dir; bool is_dir;
@@ -277,11 +278,12 @@ static TNC_Result send_message(TNC_ConnectionID connection_id)
is_dir = (type != 0); is_dir = (type != 0);
DBG2(DBG_IMV, "measurement request %d for %s '%s'", DBG2(DBG_IMV, "measurement request %d for %s '%s'",
id, is_dir ? "directory" : "file", pathname); id, is_dir ? "directory" : "file", pathname);
attr = tcg_pts_attr_req_file_meas_create(is_dir, id, delimiter, request_id = attestation_state->add_request(attestation_state,
pathname); id, is_dir);
attr = tcg_pts_attr_req_file_meas_create(is_dir, request_id,
delimiter, pathname);
attr->set_noskip_flag(attr, TRUE); attr->set_noskip_flag(attr, TRUE);
msg->add_attribute(msg, attr); msg->add_attribute(msg, attr);
attestation_state->add_request(attestation_state, id , is_dir);
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
break; break;
@@ -486,7 +488,7 @@ TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id,
{ {
tcg_pts_attr_file_meas_t *attr_cast; tcg_pts_attr_file_meas_t *attr_cast;
u_int16_t request_id; u_int16_t request_id;
int file_count; int file_count, file_id;
pts_meas_algorithms_t algo; pts_meas_algorithms_t algo;
pts_file_meas_t *measurements; pts_file_meas_t *measurements;
char *platform_info; char *platform_info;
@@ -509,7 +511,7 @@ TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id,
request_id, file_count, (file_count == 1) ? "":"s"); request_id, file_count, (file_count == 1) ? "":"s");
if (!attestation_state->check_off_request(attestation_state, if (!attestation_state->check_off_request(attestation_state,
request_id, &is_dir)) request_id, &file_id, &is_dir))
{ {
DBG1(DBG_IMV, " no entry found for this request"); DBG1(DBG_IMV, " no entry found for this request");
break; break;
@@ -517,7 +519,7 @@ TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id,
/* check hashes from database against measurements */ /* check hashes from database against measurements */
e_hash = pts_db->create_hash_enumerator(pts_db, e_hash = pts_db->create_hash_enumerator(pts_db,
platform_info, algo, request_id, is_dir); platform_info, algo, file_id, is_dir);
if (!measurements->verify(measurements, e_hash, is_dir)) if (!measurements->verify(measurements, e_hash, is_dir))
{ {
measurement_error = TRUE; measurement_error = TRUE;
@@ -26,7 +26,8 @@ typedef struct request_t request_t;
* PTS File/Directory Measurement request entry * PTS File/Directory Measurement request entry
*/ */
struct request_t { struct request_t {
int id; u_int16_t id;
int file_id;
bool is_dir; bool is_dir;
}; };
@@ -65,6 +66,11 @@ struct private_imv_attestation_state_t {
*/ */
TNC_IMV_Evaluation_Result eval; TNC_IMV_Evaluation_Result eval;
/**
* Request counter
*/
u_int16_t request_counter;
/** /**
* List of PTS File/Directory Measurement requests * List of PTS File/Directory Measurement requests
*/ */
@@ -194,19 +200,23 @@ METHOD(imv_attestation_state_t, get_pts, pts_t*,
return this->pts; return this->pts;
} }
METHOD(imv_attestation_state_t, add_request, void, METHOD(imv_attestation_state_t, add_request, u_int16_t,
private_imv_attestation_state_t *this, int id, bool is_dir) private_imv_attestation_state_t *this, int file_id, bool is_dir)
{ {
request_t *request; request_t *request;
request = malloc_thing(request_t); request = malloc_thing(request_t);
request->id = id; request->id = ++this->request_counter;
request->file_id = file_id;
request->is_dir = is_dir; request->is_dir = is_dir;
this->requests->insert_last(this->requests, request); this->requests->insert_last(this->requests, request);
return this->request_counter;
} }
METHOD(imv_attestation_state_t, check_off_request, bool, METHOD(imv_attestation_state_t, check_off_request, bool,
private_imv_attestation_state_t *this, int id, bool* is_dir) private_imv_attestation_state_t *this, u_int16_t id, int *file_id,
bool* is_dir)
{ {
enumerator_t *enumerator; enumerator_t *enumerator;
request_t *request; request_t *request;
@@ -218,6 +228,7 @@ METHOD(imv_attestation_state_t, check_off_request, bool,
if (request->id == id) if (request->id == id)
{ {
found = TRUE; found = TRUE;
*file_id = request->file_id;
*is_dir = request->is_dir; *is_dir = request->is_dir;
this->requests->remove_at(this->requests, enumerator); this->requests->remove_at(this->requests, enumerator);
free(request); free(request);
@@ -75,10 +75,12 @@ struct imv_attestation_state_t {
/** /**
* Add an entry to the list of pending file/directory measurement requests * Add an entry to the list of pending file/directory measurement requests
* *
* @param id unique request ID * @param file_id primary key into file table
* @param is_dir TRUE if directory * @param is_dir TRUE if directory
* @return unique request ID
*/ */
void (*add_request)(imv_attestation_state_t *this, int id, bool is_dir); u_int16_t (*add_request)(imv_attestation_state_t *this, int file_id,
bool is_dir);
/** /**
* Returns the number of pending file/directory measurement requests * Returns the number of pending file/directory measurement requests
@@ -91,11 +93,12 @@ struct imv_attestation_state_t {
* Check for presence of request_id and if found remove it from the list * Check for presence of request_id and if found remove it from the list
* *
* @param id unique request ID * @param id unique request ID
* @param file_id primary key into file table
* @param is_dir return TRUE if request was for a directory * @param is_dir return TRUE if request was for a directory
* @return TRUE if request ID found, FALSE otherwise * @return TRUE if request ID found, FALSE otherwise
*/ */
bool (*check_off_request)(imv_attestation_state_t *this, int id, bool (*check_off_request)(imv_attestation_state_t *this, u_int16_t id,
bool *is_dir); int *file_id, bool *is_dir);
}; };