diff options
Diffstat (limited to 'src/libimcv')
-rw-r--r-- | src/libimcv/plugins/imc_attestation/imc_attestation.c | 100 | ||||
-rw-r--r-- | src/libimcv/plugins/imv_attestation/imv_attestation.c | 23 | ||||
-rw-r--r-- | src/libimcv/tcg/pts/pts.c | 40 | ||||
-rw-r--r-- | src/libimcv/tcg/pts/pts.h | 21 | ||||
-rw-r--r-- | src/libimcv/tcg/tcg_pts_attr_file_meas.c | 29 | ||||
-rw-r--r-- | src/libimcv/tcg/tcg_pts_attr_file_meas.h | 24 | ||||
-rw-r--r-- | src/libimcv/tcg/tcg_pts_attr_req_file_meas.c | 114 | ||||
-rw-r--r-- | src/libimcv/tcg/tcg_pts_attr_req_file_meas.h | 51 |
8 files changed, 167 insertions, 235 deletions
diff --git a/src/libimcv/plugins/imc_attestation/imc_attestation.c b/src/libimcv/plugins/imc_attestation/imc_attestation.c index b267eef83..937a7ecc0 100644 --- a/src/libimcv/plugins/imc_attestation/imc_attestation.c +++ b/src/libimcv/plugins/imc_attestation/imc_attestation.c @@ -137,8 +137,8 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, TNC_UInt32 msg_len, TNC_MessageType msg_type) { - pa_tnc_msg_t *pa_tnc_msg, *msg_to_send; - pa_tnc_attr_t *attr, *attr_to_send; + pa_tnc_msg_t *pa_tnc_msg; + pa_tnc_attr_t *attr; linked_list_t *attr_list; imc_state_t *state; imc_attestation_state_t *attestation_state; @@ -172,7 +172,6 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, return result; } - msg_to_send = pa_tnc_msg_create(); attr_list = linked_list_create(); /* analyze PA-TNC attributes */ @@ -210,7 +209,7 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, } else if (attr->get_vendor_id(attr) == PEN_TCG) { - switch(attr->get_type(attr)) + switch (attr->get_type(attr)) { case TCG_PTS_REQ_PROTO_CAPS: { @@ -223,9 +222,9 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, pts->set_proto_caps(pts, imc_flags & imv_flags); /* Send PTS Protocol Capabilities attribute */ - attr_to_send = tcg_pts_attr_proto_caps_create(imc_flags & imv_flags, FALSE); - attr_to_send = (pa_tnc_attr_t*)attr_to_send; - attr_list->insert_last(attr_list,attr_to_send); + attr = tcg_pts_attr_proto_caps_create(imc_flags & imv_flags, + FALSE); + attr_list->insert_last(attr_list, attr); break; } case TCG_PTS_MEAS_ALGO: @@ -256,11 +255,12 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, { /* TODO send a TCG_PTS_H_ALG_NOT_SUPPORTED error */ } + /* Send Measurement Algorithm Selection attribute */ selected_algorithm = pts->get_meas_algorithm(pts); - attr_to_send = tcg_pts_attr_meas_algo_create(selected_algorithm, TRUE); - attr_to_send = (pa_tnc_attr_t*)attr_to_send; - attr_list->insert_last(attr_list,attr_to_send); + attr = tcg_pts_attr_meas_algo_create(selected_algorithm, + TRUE); + attr_list->insert_last(attr_list, attr); break; } @@ -271,12 +271,12 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, if (!pts->get_tpm_version_info(pts, &tpm_version_info)) { /* TODO return TCG_PTS_TPM_VERS_NOT_SUPPORTED error attribute */ + break; } /* Send TPM Version Info attribute */ - attr_to_send = tcg_pts_attr_tpm_version_info_create(tpm_version_info); - attr_to_send = (pa_tnc_attr_t*)attr_to_send; - attr_list->insert_last(attr_list,attr_to_send); + attr = tcg_pts_attr_tpm_version_info_create(tpm_version_info); + attr_list->insert_last(attr_list, attr); break; } @@ -306,11 +306,9 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, case TCG_PTS_REQ_FILE_MEAS: { tcg_pts_attr_req_file_meas_t *attr_cast; - tcg_pts_attr_file_meas_t *attr_file_meas; - u_int32_t delimiter; - chunk_t path; - u_int16_t request_id; - u_int16_t meas_len; + tcg_pts_attr_file_meas_t *attr_out; + char *pathname; + u_int16_t request_id, meas_len; pts_meas_algorithms_t selected_algorithm; chunk_t file_hash; bool directory_flag; @@ -319,12 +317,10 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, attr_cast = (tcg_pts_attr_req_file_meas_t*)attr; directory_flag = attr_cast->get_directory_flag(attr_cast); request_id = attr_cast->get_request_id(attr_cast); - delimiter = attr_cast->get_delimiter(attr_cast); - path = attr_cast->get_file_path(attr_cast); - path = chunk_clone(path); - - DBG3(DBG_IMC,"requested %s to be measured: %B", - (directory_flag)? "directory":"file", &path); + pathname = attr_cast->get_pathname(attr_cast); + + DBG2(DBG_IMC, "%s to be measured: '%s'", + directory_flag ? "directory" : "file", pathname); /* Send File Measurement attribute */ selected_algorithm = pts->get_meas_algorithm(pts); @@ -342,27 +338,28 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, * Hash the file or directory and add them as attribute */ - attr_to_send = directory_flag ? + attr = directory_flag ? tcg_pts_attr_file_meas_create(0, request_id, meas_len) : tcg_pts_attr_file_meas_create(1, request_id, meas_len); - attr_to_send->set_noskip_flag(attr_to_send, TRUE); - attr_file_meas = (tcg_pts_attr_file_meas_t*)attr_to_send; + attr->set_noskip_flag(attr, TRUE); + attr_out = (tcg_pts_attr_file_meas_t*)attr; - if(!directory_flag) + if (!directory_flag) { - if(pts->hash_file(pts,path,&file_hash) != true) + if (!pts->hash_file(pts, pathname, &file_hash)) { DBG1(DBG_IMC, "Hashing the given file has failed"); return TNC_RESULT_FATAL; } - attr_file_meas->add_file_meas(attr_file_meas, file_hash, path); + attr_out->add_file_meas(attr_out, file_hash, pathname); } else { enumerator_t *meas_enumerator; file_meas_entry_t *meas_entry; u_int64_t num_of_files = 0 ; - if(pts->hash_directory(pts, path, &file_measurements) != true) + + if (!pts->hash_directory(pts, pathname, &file_measurements)) { DBG1(DBG_IMC, "Hashing the files in a given directory has failed"); return TNC_RESULT_FATAL; @@ -372,21 +369,18 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, while (meas_enumerator->enumerate(meas_enumerator, &meas_entry)) { num_of_files++; - attr_file_meas->add_file_meas(attr_file_meas, - meas_entry->measurement, - meas_entry->file_name); + attr_out->add_file_meas(attr_out, + meas_entry->measurement, + meas_entry->filename); } - attr_file_meas->set_number_of_files(attr_file_meas, - num_of_files); + attr_out->set_number_of_files(attr_out, num_of_files); meas_enumerator->destroy(meas_enumerator); file_measurements->destroy(file_measurements); } - - attr_to_send = (pa_tnc_attr_t*)attr_file_meas; - attr_list->insert_last(attr_list,attr_to_send); + attr_list->insert_last(attr_list, attr); break; } /* TODO: Not implemented yet */ @@ -424,25 +418,29 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, } enumerator->destroy(enumerator); pa_tnc_msg->destroy(pa_tnc_msg); + + result = TNC_RESULT_SUCCESS; - if(attr_list->get_count(attr_list)) + if (attr_list->get_count(attr_list)) { - enumerator_t *attr_enumerator = attr_list->create_enumerator(attr_list); - while (attr_enumerator->enumerate(attr_enumerator, &attr_to_send)) + pa_tnc_msg = pa_tnc_msg_create(); + + enumerator = attr_list->create_enumerator(attr_list); + while (enumerator->enumerate(enumerator, &attr)) { - msg_to_send->add_attribute(msg_to_send, attr_to_send); + pa_tnc_msg->add_attribute(pa_tnc_msg, attr); } - attr_enumerator->destroy(attr_enumerator); - } + enumerator->destroy(enumerator); - msg_to_send->build(msg_to_send); - result = imc_attestation->send_message(imc_attestation, connection_id, - msg_to_send->get_encoding(msg_to_send)); + pa_tnc_msg->build(pa_tnc_msg); + result = imc_attestation->send_message(imc_attestation, connection_id, + pa_tnc_msg->get_encoding(pa_tnc_msg)); - attr_list->destroy(attr_list); - msg_to_send->destroy(msg_to_send); + attr_list->destroy(attr_list); + pa_tnc_msg->destroy(pa_tnc_msg); + } - return TNC_RESULT_SUCCESS; + return result; } /** diff --git a/src/libimcv/plugins/imv_attestation/imv_attestation.c b/src/libimcv/plugins/imv_attestation/imv_attestation.c index b9256c1ac..ead325186 100644 --- a/src/libimcv/plugins/imv_attestation/imv_attestation.c +++ b/src/libimcv/plugins/imv_attestation/imv_attestation.c @@ -236,7 +236,7 @@ static TNC_Result send_message(TNC_ConnectionID connection_id) /** * Add files to measure to PTS Request File Measurement attribute */ - product = "Ubuntu 10.10 x86_64"; + product = "Ubuntu 11.4 i686"; if (!pts_db) { @@ -250,17 +250,12 @@ static TNC_Result send_message(TNC_ConnectionID connection_id) while (enumerator->enumerate(enumerator, &id, &type, &path)) { bool is_directory; - chunk_t path_chunk; DBG2(DBG_IMV, "id = %d, type = %d, path = '%s'", id, type, path); - is_directory = (type != 0) ? true : false; - path[strlen(path)] = '\0'; - path_chunk = chunk_create(path, strlen(path)); - path_chunk = chunk_clone(path_chunk); - + is_directory = (type != 0) ? TRUE : FALSE; attr_req_file_meas = tcg_pts_attr_req_file_meas_create(is_directory, - (u_int16_t)id, delimiter, path_chunk); + id, delimiter, path); attr_req_file_meas->set_noskip_flag(attr_req_file_meas, TRUE); msg->add_attribute(msg, attr_req_file_meas); } @@ -302,7 +297,7 @@ TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id, enumerator_t *enumerator; TNC_Result result; bool fatal_error = FALSE; - bool comparisons_succeeded = true; + bool comparisons_succeeded = TRUE; if (!imv_attestation) { @@ -445,7 +440,7 @@ TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id, { enumerator_t *hash_enumerator; pts_meas_algorithms_t selected_algorithm; - char *product = "Ubuntu 10.10 x86_64"; + char *product = "Ubuntu 11.4 i686"; chunk_t db_measurement; DBG3(DBG_IMV, "Received measurement: %B", &meas_entry->measurement); @@ -468,12 +463,14 @@ TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id, /* Compare the received hash measurement with one saved in db */ if(chunk_equals(db_measurement, meas_entry->measurement)) { - DBG1(DBG_IMV, "Measurement comparison succeeded for: %s", meas_entry->file_name.ptr); + DBG1(DBG_IMV, "Measurement comparison succeeded for: %s", + meas_entry->filename); } else { - DBG1(DBG_IMV, "Measurement comparison failed for: %s", meas_entry->file_name.ptr); - comparisons_succeeded = false; + DBG1(DBG_IMV, "Measurement comparison failed for: %s", + meas_entry->filename); + comparisons_succeeded = FALSE; } } hash_enumerator->destroy(hash_enumerator); diff --git a/src/libimcv/tcg/pts/pts.c b/src/libimcv/tcg/pts/pts.c index 0d0304920..5a15b3a01 100644 --- a/src/libimcv/tcg/pts/pts.c +++ b/src/libimcv/tcg/pts/pts.c @@ -537,7 +537,7 @@ METHOD(pts_t, set_aik, void, } METHOD(pts_t, hash_file, bool, - private_pts_t *this, chunk_t path, chunk_t *out) + private_pts_t *this, char *pathname, chunk_t *out) { char buffer[PTS_BUF_SIZE]; chunk_t path_chunk; @@ -552,16 +552,15 @@ METHOD(pts_t, hash_file, bool, if (!hasher) { DBG1(DBG_IMC, "hasher %N not available", hash_algorithm_names, hash_alg); - return false; + return FALSE; } - - path_chunk = chunk_create_clone(malloc(path.len), path); - file = fopen(path_chunk.ptr, "rb"); + + file = fopen(pathname, "rb"); if (!file) { - DBG1(DBG_IMC,"file '%s' can not be opened, %s", path.ptr, strerror(errno)); + DBG1(DBG_IMC,"file '%s' can not be opened, %s", pathname, strerror(errno)); hasher->destroy(hasher); - return false; + return FALSE; } while (TRUE) { @@ -580,27 +579,27 @@ METHOD(pts_t, hash_file, bool, fclose(file); hasher->destroy(hasher); - return true; + return TRUE; } METHOD(pts_t, hash_directory, bool, - private_pts_t *this, chunk_t path, linked_list_t **file_measurements) + private_pts_t *this, char *pathname, linked_list_t **file_measurements) { DIR *dir; struct dirent *ent; chunk_t path_chunk; file_meas_entry_t *entry; linked_list_t *list = *file_measurements; + char filename[BUF_LEN]; list = linked_list_create(); entry = malloc_thing(file_meas_entry_t); - path_chunk = chunk_create_clone(malloc(path.len), path); - dir = opendir(path_chunk.ptr); + dir = opendir(pathname); if (dir == NULL) { - DBG1(DBG_IMC, "opening directory '%s' failed: %s", path.ptr, strerror(errno)); - return false; + DBG1(DBG_IMC, "opening directory '%s' failed: %s", pathname, strerror(errno)); + return FALSE; } while ((ent = readdir(dir))) { @@ -608,24 +607,21 @@ METHOD(pts_t, hash_directory, bool, { /* skip ".", ".." and hidden files (such as ".svn") */ continue; } + snprintf(filename, BUF_LEN, "%s/%s", pathname, ent->d_name); + entry->filename = strdup(filename); - if(this->public.hash_file(&this->public, chunk_cat("cc", path, chunk_create(ent->d_name, strlen(ent->d_name))) - , &entry->measurement) != true) + if (!hash_file(this, filename, &entry->measurement)) { DBG1(DBG_IMC, "Hashing the given file has failed"); - return false; + return FALSE; } - - entry->file_name_len = strlen(ent->d_name); - entry->file_name = chunk_create(ent->d_name,strlen(ent->d_name)); - - list->insert_last(list,entry); + list->insert_last(list, entry); } closedir(dir); *file_measurements = list; - return true; + return TRUE; } METHOD(pts_t, destroy, void, diff --git a/src/libimcv/tcg/pts/pts.h b/src/libimcv/tcg/pts/pts.h index f88effa8d..f76ee8eb1 100644 --- a/src/libimcv/tcg/pts/pts.h +++ b/src/libimcv/tcg/pts/pts.h @@ -36,9 +36,8 @@ typedef struct file_meas_entry_t file_meas_entry_t; * File Measurement entry */ struct file_meas_entry_t { - chunk_t measurement; - u_int16_t file_name_len; - chunk_t file_name; + char *filename; + chunk_t measurement; }; /** @@ -94,8 +93,8 @@ struct pts_t { * Get Attestation Identity Key * * @param aik chunk containing a AIK naked public key or certificate - * @param is_naked_key TRUE if AIK is naked public key, without certificate - * @return TRUE if AIK available + * @param is_naked_key TRUE if AIK is naked public key, without certificate + * @return TRUE if AIK available */ bool (*get_aik)(pts_t *this, chunk_t *aik, bool *is_naked_key); @@ -103,27 +102,27 @@ struct pts_t { * Set Attestation Identity Key * * @param aik chunk containing a AIK naked public key or certificate - * @param is_naked_key TRUE if AIK is naked public key, without certificate + * @param is_naked_key TRUE if AIK is naked public key, without certificate */ void (*set_aik)(pts_t *this, chunk_t aik, bool is_naked_key); /** * Hash the given file * - * @param path absolute path to file to be hashed + * @param pathname absolute path to file to be hashed * @param out hash output value of a given file - * @return TRUE if hashing file was successful + * @return TRUE if hashing file was successful */ - bool (*hash_file)(pts_t *this, chunk_t path, chunk_t *out); + bool (*hash_file)(pts_t *this, char *pathname, chunk_t *out); /** * Hash the given directory * - * @param path absolute path to directory to be hashed + * @param pathname absolute path to directory to be hashed * @param file_measurements list of hash output values of files in a given folder * @return TRUE if hashing directory was successful */ - bool (*hash_directory)(pts_t *this, chunk_t path, linked_list_t **file_measurements); + bool (*hash_directory)(pts_t *this, char *pathname, linked_list_t **file_measurements); /** * Destroys a pts_t object. diff --git a/src/libimcv/tcg/tcg_pts_attr_file_meas.c b/src/libimcv/tcg/tcg_pts_attr_file_meas.c index c0b6388d5..efeed7e17 100644 --- a/src/libimcv/tcg/tcg_pts_attr_file_meas.c +++ b/src/libimcv/tcg/tcg_pts_attr_file_meas.c @@ -144,6 +144,7 @@ METHOD(pa_tnc_attr_t, build, void, bio_writer_t *writer; enumerator_t *enumerator; file_meas_entry_t *entry; + chunk_t filename; writer = bio_writer_create(PTS_FILE_MEAS_SIZE); @@ -156,9 +157,10 @@ METHOD(pa_tnc_attr_t, build, void, enumerator = this->measurements->create_enumerator(this->measurements); while (enumerator->enumerate(enumerator, &entry)) { - writer->write_data (writer, entry->measurement); - writer->write_uint16 (writer, entry->file_name_len); - writer->write_data(writer, entry->file_name); + filename = chunk_create(entry->filename, strlen(entry->filename)); + writer->write_data (writer, entry->measurement); + writer->write_uint16(writer, strlen(entry->filename)); + writer->write_data (writer, filename); } enumerator->destroy(enumerator); @@ -171,7 +173,8 @@ METHOD(pa_tnc_attr_t, process, status_t, { bio_reader_t *reader; u_int32_t number_of_files; - u_int64_t number_of_files_64; + u_int16_t filename_length; + chunk_t filename; file_meas_entry_t *entry; if (this->value.len < PTS_FILE_MEAS_SIZE) @@ -183,11 +186,9 @@ METHOD(pa_tnc_attr_t, process, status_t, reader = bio_reader_create(this->value); reader->read_uint32(reader, &number_of_files); - number_of_files_64 = number_of_files; - this->number_of_files = (number_of_files_64 << 32); + this->number_of_files = (u_int64_t)number_of_files << 32; reader->read_uint32(reader, &number_of_files); this->number_of_files += number_of_files; - reader->read_uint16(reader, &this->request_id); reader->read_uint16(reader, &this->meas_len); @@ -197,9 +198,11 @@ METHOD(pa_tnc_attr_t, process, status_t, reader->read_data (reader, this->meas_len, &entry->measurement); entry->measurement = chunk_clone(entry->measurement); - reader->read_uint16 (reader, &entry->file_name_len); - reader->read_data(reader, entry->file_name_len, &entry->file_name); - entry->file_name = chunk_clone(entry->file_name); + reader->read_uint16 (reader, &filename_length); + reader->read_data(reader, filename_length, &filename); + entry->filename = malloc(filename.len + 1); + memcpy(entry->filename, filename.ptr, filename.len); + entry->filename[filename.len] = '\0'; this->measurements->insert_last(this->measurements, entry); } @@ -253,15 +256,13 @@ METHOD(tcg_pts_attr_file_meas_t, set_meas_len, void, } METHOD(tcg_pts_attr_file_meas_t, add_file_meas, void, - private_tcg_pts_attr_file_meas_t *this, chunk_t measurement, - chunk_t file_name) + private_tcg_pts_attr_file_meas_t *this, chunk_t measurement, char *filename) { file_meas_entry_t *entry; entry = malloc_thing(file_meas_entry_t); entry->measurement = measurement; - entry->file_name_len = file_name.len; - entry->file_name = file_name; + entry->filename = strdup(filename); this->measurements->insert_last(this->measurements, entry); } diff --git a/src/libimcv/tcg/tcg_pts_attr_file_meas.h b/src/libimcv/tcg/tcg_pts_attr_file_meas.h index 2bb892b8c..90b671385 100644 --- a/src/libimcv/tcg/tcg_pts_attr_file_meas.h +++ b/src/libimcv/tcg/tcg_pts_attr_file_meas.h @@ -42,7 +42,7 @@ struct tcg_pts_attr_file_meas_t { /** * Get Number of Files included * - * @return Number of Files included + * @return Number of Files included */ u_int64_t (*get_number_of_files)(tcg_pts_attr_file_meas_t *this); @@ -57,14 +57,14 @@ struct tcg_pts_attr_file_meas_t { /** * Get Request ID * - * @return Request ID + * @return Request ID */ u_int16_t (*get_request_id)(tcg_pts_attr_file_meas_t *this); /** * Set Request ID * - * @param request_id Request ID + * @param request_id Request ID */ void (*set_request_id)(tcg_pts_attr_file_meas_t *this, u_int16_t request_id); @@ -72,7 +72,7 @@ struct tcg_pts_attr_file_meas_t { /** * Get Measurement Length * - * @return Measurement Length + * @return Measurement Length */ u_int16_t (*get_meas_len)(tcg_pts_attr_file_meas_t *this); @@ -88,16 +88,16 @@ struct tcg_pts_attr_file_meas_t { * Add a file measurement entry * * @param measurement Measurement value - * @param file_name File Name + * @param filename Filename */ void (*add_file_meas)(tcg_pts_attr_file_meas_t *this, chunk_t measurement, - chunk_t file_name); + char *filename); /** * Enumerates over all file measurements * Format: chunk_t *measurement, chunk_t *file_name * - * @return enumerator + * @return enumerator */ enumerator_t* (*create_file_meas_enumerator)(tcg_pts_attr_file_meas_t *this); }; @@ -107,17 +107,17 @@ struct tcg_pts_attr_file_meas_t { * * @param directory_flag Directory Contents Flag * @param request_id Request ID - * @param delimiter Delimiter Character - * @param path File Path + * @param delimiter Delimiter Character + * @param path File Path */ pa_tnc_attr_t* tcg_pts_attr_file_meas_create(u_int64_t number_of_files, - u_int16_t request_id, - u_int16_t meas_len); + u_int16_t request_id, + u_int16_t meas_len); /** * Creates an tcg_pts_attr_file_meas_t object from received data * - * @param value unparsed attribute value + * @param value unparsed attribute value */ pa_tnc_attr_t* tcg_pts_attr_file_meas_create_from_data(chunk_t value); diff --git a/src/libimcv/tcg/tcg_pts_attr_req_file_meas.c b/src/libimcv/tcg/tcg_pts_attr_req_file_meas.c index f5d2210e3..0f37424b9 100644 --- a/src/libimcv/tcg/tcg_pts_attr_req_file_meas.c +++ b/src/libimcv/tcg/tcg_pts_attr_req_file_meas.c @@ -28,18 +28,20 @@ typedef struct private_tcg_pts_attr_req_file_meas_t private_tcg_pts_attr_req_fil * * 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Flags | Reserved | Request ID | + * | Flags | Reserved | Request ID | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Delimiter | + * | Delimiter | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * ~ Fully Qualified File Path Name (Variable Length) ~ + * ~ Fully Qualified File Pathname (Variable Length) ~ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ #define PTS_REQ_FILE_MEAS_SIZE 8 #define PTS_REQ_FILE_MEAS_RESERVED 0x00 +#define PTS_REQ_FILE_MEAS_NO_FLAGS 0x00 + +#define DIRECTORY_CONTENTS_FLAG (1<<7) /** * Private data of an tcg_pts_attr_req_file_meas_t object. @@ -87,9 +89,9 @@ struct private_tcg_pts_attr_req_file_meas_t { u_int32_t delimiter; /** - * Fully Qualified File Path Name + * Fully Qualified File Pathname */ - chunk_t path; + char *pathname; }; @@ -126,21 +128,22 @@ METHOD(pa_tnc_attr_t, set_noskip_flag,void, METHOD(pa_tnc_attr_t, build, void, private_tcg_pts_attr_req_file_meas_t *this) { + u_int8_t flags = PTS_REQ_FILE_MEAS_NO_FLAGS; + chunk_t pathname; bio_writer_t *writer; - u_int8_t flags = 0; - - writer = bio_writer_create(PTS_REQ_FILE_MEAS_SIZE); - if (this->directory_flag) + if (this->directory_flag) { - flags += 128; + flags |= DIRECTORY_CONTENTS_FLAG; } - writer->write_uint8(writer, flags); - writer->write_uint8(writer, PTS_REQ_FILE_MEAS_RESERVED); + pathname = chunk_create(this->pathname, strlen(this->pathname)); + + writer = bio_writer_create(PTS_REQ_FILE_MEAS_SIZE); + writer->write_uint8 (writer, flags); + writer->write_uint8 (writer, PTS_REQ_FILE_MEAS_RESERVED); writer->write_uint16(writer, this->request_id); writer->write_uint32(writer, this->delimiter); - writer->write_data (writer, this->path); - + writer->write_data (writer, pathname); this->value = chunk_clone(writer->get_buf(writer)); writer->destroy(writer); } @@ -151,7 +154,7 @@ METHOD(pa_tnc_attr_t, process, status_t, bio_reader_t *reader; u_int8_t flags; u_int8_t reserved; - u_int32_t file_path_len; + chunk_t pathname; if (this->value.len < PTS_REQ_FILE_MEAS_SIZE) { @@ -159,19 +162,21 @@ METHOD(pa_tnc_attr_t, process, status_t, *offset = 0; return FAILED; } + reader = bio_reader_create(this->value); - - reader->read_uint8(reader, &flags); - if((flags >> 7) & 1) this->directory_flag = true; - - reader->read_uint8(reader, &reserved); + reader->read_uint8 (reader, &flags); + reader->read_uint8 (reader, &reserved); reader->read_uint16(reader, &this->request_id); reader->read_uint32(reader, &this->delimiter); - file_path_len = reader->remaining(reader); - - reader->read_data(reader, file_path_len, &this->path); - this->path = chunk_clone(this->path); - + reader->read_data (reader, reader->remaining(reader), &pathname); + + this->directory_flag = (flags & DIRECTORY_CONTENTS_FLAG) != + PTS_REQ_FILE_MEAS_NO_FLAGS; + + this->pathname = malloc(pathname.len + 1); + memcpy(this->pathname, pathname.ptr, pathname.len); + this->pathname[pathname.len] = '\0'; + reader->destroy(reader); return SUCCESS; } @@ -179,8 +184,8 @@ METHOD(pa_tnc_attr_t, process, status_t, METHOD(pa_tnc_attr_t, destroy, void, private_tcg_pts_attr_req_file_meas_t *this) { + free(this->pathname); free(this->value.ptr); - free(this->path.ptr); free(this); } @@ -190,56 +195,31 @@ METHOD(tcg_pts_attr_req_file_meas_t, get_directory_flag, bool, return this->directory_flag; } -METHOD(tcg_pts_attr_req_file_meas_t, set_directory_flag, void, - private_tcg_pts_attr_req_file_meas_t *this, bool directory_flag) -{ - this->directory_flag = directory_flag; -} - METHOD(tcg_pts_attr_req_file_meas_t, get_request_id, u_int16_t, private_tcg_pts_attr_req_file_meas_t *this) { return this->request_id; } -METHOD(tcg_pts_attr_req_file_meas_t, set_request_id, void, - private_tcg_pts_attr_req_file_meas_t *this, u_int16_t request_id) -{ - this->request_id = request_id; -} - METHOD(tcg_pts_attr_req_file_meas_t, get_delimiter, u_int32_t, private_tcg_pts_attr_req_file_meas_t *this) { return this->delimiter; } -METHOD(tcg_pts_attr_req_file_meas_t, set_delimiter, void, - private_tcg_pts_attr_req_file_meas_t *this, u_int32_t delimiter) -{ - this->delimiter = delimiter; -} - -METHOD(tcg_pts_attr_req_file_meas_t, get_file_path, chunk_t, +METHOD(tcg_pts_attr_req_file_meas_t, get_pathname, char*, private_tcg_pts_attr_req_file_meas_t *this) { - return this->path; -} - -METHOD(tcg_pts_attr_req_file_meas_t, set_file_path, void, - private_tcg_pts_attr_req_file_meas_t *this, chunk_t path) -{ - this->path = path; + return this->pathname; } /** * Described in header. */ -pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create( - bool directory_flag, - u_int16_t request_id, - u_int32_t delimiter, - chunk_t path) +pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create(bool directory_flag, + u_int16_t request_id, + u_int32_t delimiter, + char *pathname) { private_tcg_pts_attr_req_file_meas_t *this; @@ -255,21 +235,17 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create( .process = _process, .destroy = _destroy, }, - .get_directory_flag= _get_directory_flag, - .set_directory_flag= _set_directory_flag, + .get_directory_flag = _get_directory_flag, .get_request_id = _get_request_id, - .set_request_id = _set_request_id, .get_delimiter = _get_delimiter, - .set_delimiter = _set_delimiter, - .get_file_path = _get_file_path, - .set_file_path = _set_file_path, + .get_pathname = _get_pathname, }, .vendor_id = PEN_TCG, .type = TCG_PTS_REQ_FILE_MEAS, .directory_flag = directory_flag, .request_id = request_id, .delimiter = delimiter, - .path = path, + .pathname = strdup(pathname), ); return &this->public.pa_tnc_attribute; @@ -295,14 +271,10 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create_from_data(chunk_t data) .process = _process, .destroy = _destroy, }, - .get_directory_flag= _get_directory_flag, - .set_directory_flag= _set_directory_flag, + .get_directory_flag = _get_directory_flag, .get_request_id = _get_request_id, - .set_request_id = _set_request_id, .get_delimiter = _get_delimiter, - .set_delimiter = _set_delimiter, - .get_file_path = _get_file_path, - .set_file_path = _set_file_path, + .get_pathname = _get_pathname, }, .vendor_id = PEN_TCG, .type = TCG_PTS_REQ_FILE_MEAS, diff --git a/src/libimcv/tcg/tcg_pts_attr_req_file_meas.h b/src/libimcv/tcg/tcg_pts_attr_req_file_meas.h index fd39406e4..44d5c7b44 100644 --- a/src/libimcv/tcg/tcg_pts_attr_req_file_meas.h +++ b/src/libimcv/tcg/tcg_pts_attr_req_file_meas.h @@ -45,28 +45,13 @@ struct tcg_pts_attr_req_file_meas_t { bool (*get_directory_flag)(tcg_pts_attr_req_file_meas_t *this); /** - * Set flag for PTS Request File Measurement - * - * @param directory_flag Directory Contents flag - */ - void (*set_directory_flag)(tcg_pts_attr_req_file_meas_t *this, - bool directory_flag); - - /** * Get Request ID * * @return Request ID */ u_int16_t (*get_request_id)(tcg_pts_attr_req_file_meas_t *this); - /** - * Set Request ID - * - * @param request_id Request ID - */ - void (*set_request_id)(tcg_pts_attr_req_file_meas_t *this, - u_int16_t request_id); - + /** * Get Delimiter * @@ -75,42 +60,26 @@ struct tcg_pts_attr_req_file_meas_t { u_int32_t (*get_delimiter)(tcg_pts_attr_req_file_meas_t *this); /** - * Set Delimiter + * Get Fully Qualified File Pathname * - * @param delimiter UTF-8 encoding of a Delimiter Character + * @return Pathname */ - void (*set_delimiter)(tcg_pts_attr_req_file_meas_t *this, - u_int32_t delimiter); - - /** - * Get Fully Qualified File Path Name - * - * @return File Path - */ - chunk_t (*get_file_path)(tcg_pts_attr_req_file_meas_t *this); + char* (*get_pathname)(tcg_pts_attr_req_file_meas_t *this); - /** - * Set Fully Qualified File Path Name - * - * @param path File Path - */ - void (*set_file_path)(tcg_pts_attr_req_file_meas_t *this, - chunk_t path); - }; /** * Creates an tcg_pts_attr_req_file_meas_t object * - * @param directory_flag Directory Contents Flag - * @param request_id Request ID + * @param directory_flag Directory Contents Flag + * @param request_id Request ID * @param delimiter Delimiter Character - * @param path File Path + * @param pathname File Pathname */ pa_tnc_attr_t* tcg_pts_attr_req_file_meas_create(bool directory_flag, - u_int16_t request_id, - u_int32_t delimiter, - chunk_t path); + u_int16_t request_id, + u_int32_t delimiter, + char *pathname); /** * Creates an tcg_pts_attr_req_file_meas_t object from received data |