minor fixes in imc_attestation.c
[strongswan.git] / src / libpts / plugins / imv_attestation / imv_attestation_state.c
index a093e63..aa91bf2 100644 (file)
 
 #include "imv_attestation_state.h"
 
+#include <libpts.h>
+
 #include <utils/lexparser.h>
 #include <utils/linked_list.h>
 #include <debug.h>
 
 typedef struct private_imv_attestation_state_t private_imv_attestation_state_t;
 typedef struct file_meas_request_t file_meas_request_t;
-
-/**
- * PTS File/Directory Measurement request entry
- */
-struct file_meas_request_t {
-       u_int16_t id;
-       int file_id;
-       bool is_dir;
-};
+typedef struct func_comp_t func_comp_t;
 
 /**
  * Private data of an imv_attestation_state_t object.
@@ -108,6 +102,32 @@ struct private_imv_attestation_state_t {
 
 };
 
+/**
+ * PTS File/Directory Measurement request entry
+ */
+struct file_meas_request_t {
+       u_int16_t id;
+       int file_id;
+       bool is_dir;
+};
+
+/**
+ * PTS Functional Component entry
+ */
+struct func_comp_t {
+       pts_component_t *comp;
+       u_int8_t qualifier;
+};
+
+/**
+ * Frees a func_comp_t object
+ */
+static void free_func_comp(func_comp_t *this)
+{
+       this->comp->destroy(this->comp);
+       free(this);
+}
+
 typedef struct entry_t entry_t;
 
 /**
@@ -237,8 +257,7 @@ METHOD(imv_state_t, destroy, void,
        private_imv_attestation_state_t *this)
 {
        this->file_meas_requests->destroy_function(this->file_meas_requests, free);
-       this->components->destroy_offset(this->components,
-                                                                        offsetof(pts_component_t, destroy));
+       this->components->destroy_function(this->components, (void *)free_func_comp);
        this->pts->destroy(this->pts);
        free(this);
 }
@@ -307,24 +326,69 @@ 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_component, void,
-       private_imv_attestation_state_t *this, pts_component_t *entry)
+METHOD(imv_attestation_state_t, create_component, pts_component_t*,
+       private_imv_attestation_state_t *this, pts_comp_func_name_t *name,
+       u_int32_t depth, pts_database_t *pts_db)
 {
-       this->components->insert_last(this->components, entry);
+       enumerator_t *enumerator;
+       func_comp_t *entry, *new_entry;
+       pts_component_t *component;
+       bool found = FALSE;
+
+       enumerator = this->components->create_enumerator(this->components);
+       while (enumerator->enumerate(enumerator, &entry))
+       {
+               if (name->equals(name, entry->comp->get_comp_func_name(entry->comp)))
+               {
+                       found = TRUE;
+                       break;
+               }
+       }
+       enumerator->destroy(enumerator);
+
+       if (found)
+       {
+               if (name->get_qualifier(name) == entry->qualifier)
+               {
+                       /* duplicate entry */
+                       return NULL;
+               }
+               new_entry = malloc_thing(func_comp_t);
+               new_entry->qualifier = name->get_qualifier(name);
+               new_entry->comp = entry->comp->get_ref(entry->comp);
+               this->components->insert_last(this->components, new_entry);
+               return entry->comp;
+       }
+       else
+       {
+               component = pts_components->create(pts_components, name, depth, pts_db);
+               if (!component)
+               {
+                       /* unsupported component */
+                       return NULL;
+               }
+               new_entry = malloc_thing(func_comp_t);
+               new_entry->qualifier = name->get_qualifier(name);
+               new_entry->comp = component;
+               this->components->insert_last(this->components, new_entry);
+               return component;
+       }
 }
 
 METHOD(imv_attestation_state_t, get_component, pts_component_t*,
        private_imv_attestation_state_t *this, pts_comp_func_name_t *name)
 {
        enumerator_t *enumerator;
-       pts_component_t *entry, *found = NULL;
+       func_comp_t *entry;
+       pts_component_t *found = NULL;
 
        enumerator = this->components->create_enumerator(this->components);
        while (enumerator->enumerate(enumerator, &entry))
        {
-               if (name->equals(name, entry->get_comp_func_name(entry)))
+               if (name->equals(name, entry->comp->get_comp_func_name(entry->comp)) &&
+                       name->get_qualifier(name) == entry->qualifier)
                {
-                       found = entry;
+                       found = entry->comp;
                        break;
                }
        }
@@ -347,16 +411,16 @@ METHOD(imv_attestation_state_t, set_measurement_error, void,
 METHOD(imv_attestation_state_t, finalize_components, void,
        private_imv_attestation_state_t *this)
 {
-       pts_component_t *entry;
+       func_comp_t *entry;
 
        while (this->components->remove_last(this->components,
                                                                                (void**)&entry) == SUCCESS)
        {
-               if (!entry->finalize(entry))
+               if (!entry->comp->finalize(entry->comp, entry->qualifier))
                {
                        _set_measurement_error(this);
                }
-               entry->destroy(entry);
+               free_func_comp(entry);
        }
 }
 
@@ -372,7 +436,6 @@ METHOD(imv_attestation_state_t, components_finalized, bool,
 imv_state_t *imv_attestation_state_create(TNC_ConnectionID connection_id)
 {
        private_imv_attestation_state_t *this;
-       char *platform_info;
 
        INIT(this,
                .public = {
@@ -395,7 +458,7 @@ 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_component = _add_component,
+                       .create_component = _create_component,
                        .get_component = _get_component,
                        .finalize_components = _finalize_components,
                        .components_finalized = _components_finalized,
@@ -412,12 +475,5 @@ imv_state_t *imv_attestation_state_create(TNC_ConnectionID connection_id)
                .pts = pts_create(FALSE),
        );
 
-       platform_info = lib->settings->get_str(lib->settings,
-                                                "libimcv.plugins.imv-attestation.platform_info", NULL);
-       if (platform_info)
-       {
-               this->pts->set_platform_info(this->pts, platform_info);
-       }
-       
        return &this->public.interface;
 }