diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libimcv/plugins/imc_attestation/imc_attestation.c | 28 | ||||
-rw-r--r-- | src/libimcv/plugins/imv_attestation/imv_attestation.c | 6 | ||||
-rw-r--r-- | src/libpts/pts/pts.c | 32 | ||||
-rw-r--r-- | src/libpts/pts/pts.h | 18 | ||||
-rw-r--r-- | src/libpts/pts/pts_error.c | 2 |
5 files changed, 78 insertions, 8 deletions
diff --git a/src/libimcv/plugins/imc_attestation/imc_attestation.c b/src/libimcv/plugins/imc_attestation/imc_attestation.c index a96bc3de0..a2033972d 100644 --- a/src/libimcv/plugins/imc_attestation/imc_attestation.c +++ b/src/libimcv/plugins/imc_attestation/imc_attestation.c @@ -345,12 +345,38 @@ TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id, char *pathname; u_int16_t request_id; bool is_directory; + u_int32_t delimiter; pts_file_meas_t *measurements; - + pts_error_code_t pts_error; + chunk_t attr_info; + attr_cast = (tcg_pts_attr_req_file_meas_t*)attr; is_directory = attr_cast->get_directory_flag(attr_cast); request_id = attr_cast->get_request_id(attr_cast); + delimiter = attr_cast->get_delimiter(attr_cast); pathname = attr_cast->get_pathname(attr_cast); + + if (pts->is_path_valid(pts, pathname, &pts_error) && pts_error) + { + attr_info = attr->get_value(attr); + attr = ietf_attr_pa_tnc_error_create(PEN_TCG, + pts_error, attr_info); + attr_list->insert_last(attr_list, attr); + break; + } + else if (!pts->is_path_valid(pts, pathname, &pts_error)) + { + break; + } + + if (delimiter != SOLIDUS_UTF && delimiter != REVERSE_SOLIDUS_UTF) + { + attr_info = attr->get_value(attr); + attr = ietf_attr_pa_tnc_error_create(PEN_TCG, + TCG_PTS_INVALID_DELIMITER, attr_info); + attr_list->insert_last(attr_list, attr); + break; + } /* Do PTS File Measurements and send them to PTS-IMV */ DBG2(DBG_IMC, "measurement request %d for %s '%s'", diff --git a/src/libimcv/plugins/imv_attestation/imv_attestation.c b/src/libimcv/plugins/imv_attestation/imv_attestation.c index 25684ea1c..f4c53830c 100644 --- a/src/libimcv/plugins/imv_attestation/imv_attestation.c +++ b/src/libimcv/plugins/imv_attestation/imv_attestation.c @@ -52,12 +52,6 @@ static const char imv_name[] = "Attestation"; #define IMV_VENDOR_ID PEN_TCG #define IMV_SUBTYPE PA_SUBTYPE_TCG_PTS -/** - * UTF-8 encoding of the character used to delimiter the filename - */ -#define SOLIDUS_UTF 0x002F -#define REVERSE_SOLIDUS_UTF 0x005C - static imv_agent_t *imv_attestation; /** diff --git a/src/libpts/pts/pts.c b/src/libpts/pts/pts.c index d1e6b594c..34d228354 100644 --- a/src/libpts/pts/pts.c +++ b/src/libpts/pts/pts.c @@ -269,6 +269,37 @@ static char* get_filename(char *pathname) return filename; } +METHOD(pts_t, is_path_valid, bool, private_pts_t *this, char *path, + pts_error_code_t *error_code) +{ + int error; + struct stat sb; + + error_code = NULL; + error = stat(path, &sb); + if (error == 0) + { + return TRUE; + } + else if (error == ENOENT || error == ENOTDIR) + { + DBG1(DBG_IMC, "file/directory does not exist %s", path); + *error_code = TCG_PTS_FILE_NOT_FOUND; + } + else if (error == EFAULT) + { + DBG1(DBG_IMC, "bad address %s", path); + *error_code = TCG_PTS_INVALID_PATH; + } + else + { + DBG1(DBG_IMC, "error: %s occured while validating path: %s", strerror(error), path); + return FALSE; + } + + return TRUE; +} + METHOD(pts_t, do_measurements, pts_file_meas_t*, private_pts_t *this, u_int16_t request_id, char *pathname, bool is_directory) { @@ -482,6 +513,7 @@ pts_t *pts_create(bool is_imc) .set_tpm_version_info = _set_tpm_version_info, .get_aik = _get_aik, .set_aik = _set_aik, + .is_path_valid = _is_path_valid, .do_measurements = _do_measurements, .destroy = _destroy, }, diff --git a/src/libpts/pts/pts.h b/src/libpts/pts/pts.h index c2de2ac32..4dd7b5e9a 100644 --- a/src/libpts/pts/pts.h +++ b/src/libpts/pts/pts.h @@ -23,6 +23,7 @@ typedef struct pts_t pts_t; +#include "pts_error.h" #include "pts_proto_caps.h" #include "pts_meas_algo.h" #include "pts_file_meas.h" @@ -30,6 +31,12 @@ typedef struct pts_t pts_t; #include <library.h> /** + * UTF-8 encoding of the character used to delimiter the filename + */ +#define SOLIDUS_UTF 0x002F +#define REVERSE_SOLIDUS_UTF 0x005C + +/** * Class implementing the TCG Platform Trust System (PTS) * */ @@ -107,6 +114,17 @@ struct pts_t { void (*set_aik)(pts_t *this, certificate_t *aik); /** + * Check whether path is valid file/directory on filesystem + * + * @param path Absolute path + * @param error_code Output variable for PTS error code + * @return TRUE if path is valid or file/directory doesn't exist + * or path is invalid + * FALSE if local error occured within stat function + */ + bool (*is_path_valid)(pts_t *this, char *path, pts_error_code_t *error_code); + + /** * Do PTS File Measurements * * @param request_id ID of PTS File Measurement Request diff --git a/src/libpts/pts/pts_error.c b/src/libpts/pts/pts_error.c index 843a38ac3..ec1e6c014 100644 --- a/src/libpts/pts/pts_error.c +++ b/src/libpts/pts/pts_error.c @@ -56,4 +56,4 @@ pa_tnc_attr_t* pts_hash_alg_error_create(pts_meas_algorithms_t algorithms) writer->destroy(writer); return attr; -} +}
\ No newline at end of file |