object oriented approach to pts functional components

This commit is contained in:
Andreas Steffen
2011-11-28 21:20:23 +01:00
parent c6beb16689
commit 051dfbd654
26 changed files with 1371 additions and 419 deletions
@@ -266,7 +266,7 @@ bool imv_attestation_process(pa_tnc_attr_t *attr, linked_list_t *attr_list,
bool pcr_info_inclided, component_meas_error = FALSE;
pts_attr_simple_comp_evid_flag_t flags;
u_int32_t depth, comp_vendor_id, extended_pcr;
u_int8_t family, measurement_type;
u_int8_t measurement_type;
pts_qualifier_t qualifier;
pts_ita_funct_comp_name_t name;
pts_meas_algorithms_t hash_algorithm;
@@ -21,7 +21,6 @@
typedef struct private_imv_attestation_state_t private_imv_attestation_state_t;
typedef struct file_meas_request_t file_meas_request_t;
typedef struct comp_evid_request_t comp_evid_request_t;
/**
* PTS File/Directory Measurement request entry
@@ -32,15 +31,6 @@ struct file_meas_request_t {
bool is_dir;
};
/**
* Functional Component Evidence Request entry
*/
struct comp_evid_request_t {
u_int32_t vendor_id;
pts_qualifier_t qualifier;
pts_ita_funct_comp_name_t name;
};
/**
* Private data of an imv_attestation_state_t object.
*/
@@ -273,31 +263,23 @@ METHOD(imv_attestation_state_t, get_file_meas_request_count, int,
METHOD(imv_attestation_state_t, add_comp_evid_request, void,
private_imv_attestation_state_t *this, funct_comp_evid_req_entry_t *entry)
{
comp_evid_request_t *request;
pts_comp_func_name_t *request;
request = malloc_thing(comp_evid_request_t);
request->vendor_id = entry->vendor_id;
request->qualifier = entry->qualifier;
request->name = entry->name;
request = entry->name->clone(entry->name);
this->comp_evid_requests->insert_last(this->comp_evid_requests, request);
}
METHOD(imv_attestation_state_t, check_off_comp_evid_request, bool,
private_imv_attestation_state_t *this, u_int32_t vendor_id,
pts_qualifier_t qualifier, pts_ita_funct_comp_name_t comp_name)
private_imv_attestation_state_t *this, pts_comp_func_name_t *name)
{
enumerator_t *enumerator;
comp_evid_request_t *request;
pts_comp_func_name_t *request;
bool found = FALSE;
enumerator = this->comp_evid_requests->create_enumerator(this->comp_evid_requests);
while (enumerator->enumerate(enumerator, &request))
{
if (request->vendor_id == vendor_id &&
request->qualifier.kernel == qualifier.kernel &&
request->qualifier.sub_component == qualifier.sub_component &&
request->qualifier.type == qualifier.type &&
request->name == comp_name)
if (name->equals(name, request))
{
found = TRUE;
this->comp_evid_requests->remove_at(this->comp_evid_requests, enumerator);
@@ -81,8 +81,8 @@ struct imv_attestation_state_t {
* @param is_dir TRUE if directory
* @return unique request ID
*/
u_int16_t (*add_file_meas_request)(imv_attestation_state_t *this, int file_id,
bool is_dir);
u_int16_t (*add_file_meas_request)(imv_attestation_state_t *this,
int file_id, bool is_dir);
/**
* Returns the number of pending file/directory measurement requests
@@ -100,7 +100,7 @@ struct imv_attestation_state_t {
* @return TRUE if request ID found, FALSE otherwise
*/
bool (*check_off_file_meas_request)(imv_attestation_state_t *this,
u_int16_t id, int *file_id, bool *is_dir);
u_int16_t id, int *file_id, bool *is_dir);
/**
* Add an entry to the list of pending Function Component Evidences
@@ -108,26 +108,23 @@ struct imv_attestation_state_t {
* @param entry Functional Component Evidence Request
*/
void (*add_comp_evid_request)(imv_attestation_state_t *this,
funct_comp_evid_req_entry_t *entry);
funct_comp_evid_req_entry_t *entry);
/**
* Returns the number of pending Function Component Evidences
*
* @return number of pending evidences
* @return Number of pending evidences
*/
int (*get_comp_evid_request_count)(imv_attestation_state_t *this);
/**
* Check for presence of Component Evidence Request and remove if exists
*
* @param vendor_id Functional Component Name Vendor ID
* @param qualifier Qualifier of the requested Functional Component
* @param comp_name Name of the requested Functional Component
* @param name Name of the requested Functional Component
* @return TRUE if component request found, FALSE otherwise
*/
bool (*check_off_comp_evid_request)(imv_attestation_state_t *this,
u_int32_t vendor_id, pts_qualifier_t qualifier,
pts_ita_funct_comp_name_t comp_name);
pts_comp_func_name_t *name);
/**
* Indicates if a file measurement error occurred
+7
View File
@@ -18,6 +18,13 @@ libpts_la_SOURCES = \
pts/pts_file_meta.h pts/pts_file_meta.c \
pts/pts_file_type.h pts/pts_file_type.c \
pts/pts_meas_algo.h pts/pts_meas_algo.c \
pts/components/pts_component.h \
pts/components/pts_component_manager.h pts/components/pts_component_manager.c \
pts/components/pts_comp_func_name.h pts/components/pts_comp_func_name.c \
pts/components/ita/ita_comp_func_name.h pts/components/ita/ita_comp_func_name.c \
pts/components/ita/ita_comp_tboot.h pts/components/ita/ita_comp_tboot.c \
pts/components/ita/ita_comp_tgrub.h pts/components/ita/ita_comp_tgrub.c \
pts/components/tcg/tcg_comp_func_name.h pts/components/tcg/tcg_comp_func_name.c \
tcg/tcg_attr.h tcg/tcg_attr.c \
tcg/tcg_pts_attr_proto_caps.h tcg/tcg_pts_attr_proto_caps.c \
tcg/tcg_pts_attr_dh_nonce_params_req.h tcg/tcg_pts_attr_dh_nonce_params_req.c \
+31 -1
View File
@@ -14,11 +14,21 @@
#include "libpts.h"
#include "tcg/tcg_attr.h"
#include "pts/components/pts_component.h"
#include "pts/components/pts_component_manager.h"
#include "pts/components/tcg/tcg_comp_func_name.h"
#include "pts/components/ita/ita_comp_func_name.h"
#include "pts/components/ita/ita_comp_tboot.h"
#include "pts/components/ita/ita_comp_tgrub.h"
#include <imcv.h>
#include <debug.h>
/**
* PTS Functional Component manager
*/
pts_component_manager_t *pts_components;
/**
* Reference count for IMC/IMV instances
*/
@@ -37,6 +47,22 @@ bool libpts_init(void)
}
imcv_pa_tnc_attributes->add_vendor(imcv_pa_tnc_attributes, PEN_TCG,
tcg_attr_create_from_data, tcg_attr_names);
pts_components = pts_component_manager_create();
pts_components->add_vendor(pts_components, PEN_TCG,
pts_tcg_comp_func_names, PTS_TCG_QUALIFIER_TYPE_SIZE,
pts_tcg_qualifier_flag_names, pts_tcg_qualifier_type_names);
pts_components->add_vendor(pts_components, PEN_ITA,
pts_ita_comp_func_names, PTS_ITA_QUALIFIER_TYPE_SIZE,
pts_ita_qualifier_flag_names, pts_ita_qualifier_type_names);
pts_components->add_component(pts_components, PEN_ITA,
PTS_ITA_COMP_FUNC_NAME_TGRUB,
pts_ita_comp_tgrub_create);
pts_components->add_component(pts_components, PEN_ITA,
PTS_ITA_COMP_FUNC_NAME_TBOOT,
pts_ita_comp_tboot_create);
DBG1(DBG_LIB, "libpts initialized");
}
ref_get(&libpts_ref);
@@ -51,6 +77,10 @@ void libpts_deinit(void)
{
if (ref_put(&libpts_ref))
{
pts_components->remove_vendor(pts_components, PEN_TCG);
pts_components->remove_vendor(pts_components, PEN_ITA);
pts_components->destroy(pts_components);
if (!imcv_pa_tnc_attributes)
{
return;
+7
View File
@@ -25,6 +25,8 @@
#ifndef LIBPTS_H_
#define LIBPTS_H_
#include "pts/components/pts_component_manager.h"
#include <library.h>
/**
@@ -39,4 +41,9 @@ bool libpts_init(void);
*/
void libpts_deinit(void);
/**
* PTS Functional Component manager
*/
extern pts_component_manager_t* pts_components;
#endif /** LIBPTS_H_ @}*/
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2011 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "ita_comp_func_name.h"
char pts_ita_qualifier_flag_names[] = { 'K', 'S' };
ENUM_BEGIN(pts_ita_qualifier_type_names, PTS_ITA_QUALIFIER_TYPE_UNKNOWN,
PTS_ITA_QUALIFIER_TYPE_TNC,
"Unknown",
"Trusted Platform",
"Operating System",
"Graphical User Interface",
"Application",
"Networking",
"Library",
"TNC Defined Component"
);
ENUM_NEXT(pts_ita_qualifier_type_names, PTS_ITA_QUALIFIER_TYPE_ALL,
PTS_ITA_QUALIFIER_TYPE_ALL,
PTS_ITA_QUALIFIER_TYPE_TNC,
"All Matching Components"
);
ENUM_END(pts_ita_qualifier_type_names, PTS_ITA_QUALIFIER_TYPE_ALL);
ENUM(pts_ita_comp_func_names, PTS_ITA_COMP_FUNC_NAME_IGNORE,
PTS_ITA_COMP_FUNC_NAME_TBOOT,
"Ignore",
"Trusted GRUB Boot Loader",
"Trusted Boot"
);
@@ -0,0 +1,83 @@
/*
* Copyright (C) 2011 Sansar Choinyambuu
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_ita_comp_func_name pts_ita_comp_func_name
* @{ @ingroup pts
*/
#ifndef PTS_ITA_COMP_FUNC_NAME_H_
#define PTS_ITA_COMP_FUNC_NAME_H_
typedef enum pts_ita_qualifier_type_t pts_ita_qualifier_type_t;
typedef enum pts_ita_comp_func_name_t pts_ita_comp_func_name_t;
#include <library.h>
/**
* PTS Component Functional Name Qualifier Flags for the ITA namespace
*/
#define PTS_ITA_QUALIFIER_FLAG_KERNEL (1<<5)
#define PTS_ITA_QUALIFIER_FLAG_SUB (1<<4)
extern char pts_ita_qualifier_flag_names[];
/**
* Size of the PTS Component Functional Name Qualifier Type field
*/
#define PTS_ITA_QUALIFIER_TYPE_SIZE 4
/**
* PTS Component Functional Name Qualifier Types for the ITA namespace
* equal to section 5.2 of PTS Protocol: Binding to TNC IF-M Specification
*/
enum pts_ita_qualifier_type_t {
/** Unknown */
PTS_ITA_QUALIFIER_TYPE_UNKNOWN = 0x0,
/** Trusted Platform */
PTS_ITA_QUALIFIER_TYPE_TRUSTED = 0x1,
/** Operating System */
PTS_ITA_QUALIFIER_TYPE_OS = 0x2,
/** Graphical User Interface */
PTS_ITA_QUALIFIER_TYPE_GUI = 0x3,
/** Application */
PTS_ITA_QUALIFIER_TYPE_APP = 0x4,
/** Networking */
PTS_ITA_QUALIFIER_TYPE_NET = 0x5,
/** Library */
PTS_ITA_QUALIFIER_TYPE_LIB = 0x6,
/** TNC Defined Component */
PTS_ITA_QUALIFIER_TYPE_TNC = 0x7,
/** All Matching Components */
PTS_ITA_QUALIFIER_TYPE_ALL = 0xF,
};
extern enum_name_t *pts_ita_qualifier_type_names;
/**
* PTS Component Functional Name Binary Enumeration for the ITA namespace
*/
enum pts_ita_comp_func_name_t {
/** Ignore */
PTS_ITA_COMP_FUNC_NAME_IGNORE = 0x0000,
/** Trusted GRUB Boot Loader */
PTS_ITA_COMP_FUNC_NAME_TGRUB = 0x0001,
/** Trusted Boot */
PTS_ITA_COMP_FUNC_NAME_TBOOT = 0x0002,
};
extern enum_name_t *pts_ita_comp_func_names;
#endif /** PTS_ITA_COMP_FUNC_NAME_H_ @}*/
@@ -0,0 +1,91 @@
/*
* Copyright (C) 2011 Andreas Steffen
*
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "ita_comp_tboot.h"
#include "ita_comp_func_name.h"
#include "pts/components/pts_component.h"
#include <debug.h>
#include <pen/pen.h>
typedef struct pts_ita_comp_tboot_t pts_ita_comp_tboot_t;
/**
* Private data of a pts_ita_comp_tboot_t object.
*
*/
struct pts_ita_comp_tboot_t {
/**
* Public pts_component_manager_t interface.
*/
pts_component_t public;
/**
* Component Functional Name
*/
pts_comp_func_name_t *name;
};
METHOD(pts_component_t, get_comp_func_name, pts_comp_func_name_t*,
pts_ita_comp_tboot_t *this)
{
return this->name;
}
METHOD(pts_component_t, measure, bool,
pts_ita_comp_tboot_t *this)
{
/* TODO measure the tboot functional component */
return FALSE;
}
METHOD(pts_component_t, verify, bool,
pts_ita_comp_tboot_t *this)
{
/* TODO verify the measurement of the tboot functional component */
return FALSE;
}
METHOD(pts_component_t, destroy, void,
pts_ita_comp_tboot_t *this)
{
this->name->destroy(this->name);
free(this);
}
/**
* See header
*/
pts_component_t *pts_ita_comp_tboot_create(u_int8_t qualifier)
{
pts_ita_comp_tboot_t *this;
INIT(this,
.public = {
.get_comp_func_name = _get_comp_func_name,
.measure = _measure,
.verify = _verify,
.destroy = _destroy,
},
.name = pts_comp_func_name_create(PEN_ITA, PTS_ITA_COMP_FUNC_NAME_TBOOT,
qualifier),
);
return &this->public;
}
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2011 Sansar Choinyambuu
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_ita_comp_func_name pts_ita_comp_func_name
* @{ @ingroup pts
*/
#ifndef PTS_ITA_COMP_TBOOT_H_
#define PTS_ITA_COMP_TBOOT_H_
#include "pts/components/pts_component.h"
/**
* Create a PTS ITS Functional Component object
*
* @param qualifier PTS Component Functional Name Qualifier
*
*/
pts_component_t* pts_ita_comp_tboot_create(u_int8_t qualifier);
#endif /** PTS_ITA_COMP_TBOOT_H_ @}*/
@@ -0,0 +1,91 @@
/*
* Copyright (C) 2011 Andreas Steffen
*
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "ita_comp_tgrub.h"
#include "ita_comp_func_name.h"
#include "pts/components/pts_component.h"
#include <debug.h>
#include <pen/pen.h>
typedef struct pts_ita_comp_tgrub_t pts_ita_comp_tgrub_t;
/**
* Private data of a pts_ita_comp_tgrub_t object.
*
*/
struct pts_ita_comp_tgrub_t {
/**
* Public pts_component_manager_t interface.
*/
pts_component_t public;
/**
* Component Functional Name
*/
pts_comp_func_name_t *name;
};
METHOD(pts_component_t, get_comp_func_name, pts_comp_func_name_t*,
pts_ita_comp_tgrub_t *this)
{
return this->name;
}
METHOD(pts_component_t, measure, bool,
pts_ita_comp_tgrub_t *this)
{
/* TODO measure the tgrub functional component */
return FALSE;
}
METHOD(pts_component_t, verify, bool,
pts_ita_comp_tgrub_t *this)
{
/* TODO verify the measurement of the tgrub functional component */
return FALSE;
}
METHOD(pts_component_t, destroy, void,
pts_ita_comp_tgrub_t *this)
{
this->name->destroy(this->name);
free(this);
}
/**
* See header
*/
pts_component_t *pts_ita_comp_tgrub_create(u_int8_t qualifier)
{
pts_ita_comp_tgrub_t *this;
INIT(this,
.public = {
.get_comp_func_name = _get_comp_func_name,
.measure = _measure,
.verify = _verify,
.destroy = _destroy,
},
.name = pts_comp_func_name_create(PEN_ITA, PTS_ITA_COMP_FUNC_NAME_TBOOT,
qualifier),
);
return &this->public;
}
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2011 Sansar Choinyambuu
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_ita_comp_func_name pts_ita_comp_func_name
* @{ @ingroup pts
*/
#ifndef PTS_ITA_COMP_TGRUB_H_
#define PTS_ITA_COMP_TGRUB_H_
#include "pts/components/pts_component.h"
/**
* Create a PTS ITS Functional Component object
*
* @param qualifier PTS Component Functional Name Qualifier
*
*/
pts_component_t* pts_ita_comp_tgrub_create(u_int8_t qualifier);
#endif /** PTS_ITA_COMP_TGRUB_H_ @}*/
@@ -0,0 +1,132 @@
/*
* Copyright (C) 2011 Andreas Steffen
*
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "pts/components/pts_comp_func_name.h"
#include <debug.h>
#define PTS_QUALIFIER_UNKNOWN 0x00
#define PTS_QUALIFIER_WILDCARD 0x3F
typedef struct private_pts_comp_func_name_t private_pts_comp_func_name_t;
/**
* Private data of a pts_comp_func_name_t object.
*
*/
struct private_pts_comp_func_name_t {
/**
* Public pts_comp_func_name_t interface.
*/
pts_comp_func_name_t public;
/**
* PTS Component Functional Name Vendor ID
*/
u_int32_t vendor_id;
/**
* PTS Component Functional Name
*/
u_int32_t name;
/**
* PTS Component Functional Name Qualifier
*/
u_int8_t qualifier;
};
METHOD(pts_comp_func_name_t, get_vendor_id, u_int32_t,
private_pts_comp_func_name_t *this)
{
return this->vendor_id;
}
METHOD(pts_comp_func_name_t, get_name, u_int32_t,
private_pts_comp_func_name_t *this)
{
return this->name;
}
METHOD(pts_comp_func_name_t, get_qualifier, u_int8_t,
private_pts_comp_func_name_t *this)
{
return this->qualifier;
}
static bool equals(private_pts_comp_func_name_t *this,
private_pts_comp_func_name_t *other)
{
if (this->vendor_id != other->vendor_id ||
this->name != other->name)
{
return FALSE;
}
if (this->qualifier == PTS_QUALIFIER_UNKNOWN ||
other->qualifier == PTS_QUALIFIER_UNKNOWN)
{
return TRUE;
}
/* TODO handle qualifier wildcards */
return this->qualifier == other->qualifier;
}
METHOD(pts_comp_func_name_t, clone_, pts_comp_func_name_t*,
private_pts_comp_func_name_t *this)
{
private_pts_comp_func_name_t *clone;
clone = malloc_thing(private_pts_comp_func_name_t);
memcpy(clone, this, sizeof(private_pts_comp_func_name_t));
return &clone->public;
}
METHOD(pts_comp_func_name_t, destroy, void,
private_pts_comp_func_name_t *this)
{
free(this);
}
/**
* See header
*/
pts_comp_func_name_t* pts_comp_func_name_create(u_int32_t vendor_id,
u_int32_t name,
u_int8_t qualifier)
{
private_pts_comp_func_name_t *this;
INIT(this,
.public = {
.get_vendor_id = _get_vendor_id,
.get_name = _get_name,
.get_qualifier = _get_qualifier,
.equals = (bool(*)(pts_comp_func_name_t*,pts_comp_func_name_t*))equals,
.clone = _clone_,
.destroy = _destroy,
},
.vendor_id = vendor_id,
.name = name,
.qualifier = qualifier,
);
return &this->public;
}
@@ -0,0 +1,87 @@
/*
* Copyright (C) 2011 Sansar Choinyambuu
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_comp_func_name pts_comp_func_name
* @{ @ingroup pts
*/
#ifndef PTS_FUNC_COMP_NAME_H_
#define PTS_FUNC_COMP_NAME_H_
typedef struct pts_comp_func_name_t pts_comp_func_name_t;
#include <library.h>
/**
* PTS Component Functional Name object
*/
struct pts_comp_func_name_t {
/**
* Get the PTS Component Functional Name Vendor ID
*
* @return PTS Component Functional Name Vendor ID
*/
u_int32_t (*get_vendor_id)(pts_comp_func_name_t *this);
/**
* Get the PTS Component Functional Name
*
* @return PTS Component Functional Name
*/
u_int32_t (*get_name)(pts_comp_func_name_t *this);
/**
* Get the PTS Component Functional Name Qualifier
*
* @return PTS Component Functional Name Qualifier
*/
u_int8_t (*get_qualifier)(pts_comp_func_name_t *this);
/**
* Check to PTS Component Functional Names for equality
*
* @param other Other PTS Component Functional Name
* @return TRUE if equal
*/
bool (*equals)(pts_comp_func_name_t *this, pts_comp_func_name_t *other);
/**
* Clone a PTS Component Functional Name
*
* @return Cloned PTS Component Functional Name
*/
pts_comp_func_name_t* (*clone)(pts_comp_func_name_t *this);
/**
* Destroys a pts_component_t object.
*/
void (*destroy)(pts_comp_func_name_t *this);
};
/**
* Create a PTS Component Functional Name object
*
* @param vendor_id PTS Component Functional Name Vendor ID
* @param name PTS Component Functional Name
* @param PTS Component Functional Name Qualifier
*/
pts_comp_func_name_t* pts_comp_func_name_create(u_int32_t vendor_id,
u_int32_t name,
u_int8_t qualifier);
#endif /** PTS_FUNC_COMP_NAME_H_ @}*/
+63
View File
@@ -0,0 +1,63 @@
/*
* Copyright (C) 2011 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_component pts_component
* @{ @ingroup pts
*/
#ifndef PTS_COMPONENT_H_
#define PTS_COMPONENT_H_
typedef struct pts_component_t pts_component_t;
#include "pts/components/pts_comp_func_name.h"
#include <library.h>
/**
* PTS Functional Component Interface
*/
struct pts_component_t {
/**
* Get the PTS Component Functional Name
*
* @return PTS Component Functional Name
*/
pts_comp_func_name_t* (*get_comp_func_name)(pts_component_t *this);
/**
* Do measurements on the PTS Functional Component
*
* @return TRUE if component measurements are successful
*/
bool (*measure)(pts_component_t *this);
/**
* Verify the measurements of the PTS Functional Component
*
* @return TRUE if verification is successful
*/
bool (*verify)(pts_component_t *this);
/**
* Destroys a pts_component_t object.
*/
void (*destroy)(pts_component_t *this);
};
#endif /** PTS_COMPONENT_H_ @}*/
@@ -0,0 +1,314 @@
/*
* Copyright (C) 2011 Andreas Steffen
*
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "pts/components/pts_component_manager.h"
#include <utils/linked_list.h>
#include <debug.h>
typedef struct private_pts_component_manager_t private_pts_component_manager_t;
typedef struct vendor_entry_t vendor_entry_t;
typedef struct component_entry_t component_entry_t;
#define PTS_QUALIFIER_SIZE 6
/**
* Vendor-specific namespace information and list of registered components
*/
struct vendor_entry_t {
/**
* Vendor ID
*/
pen_t vendor_id;
/**
* Vendor-specific Component Functional names
*/
enum_name_t *comp_func_names;
/**
* Vendor-specific Qualifier Type names
*/
enum_name_t *qualifier_type_names;
/**
* Vendor-specific Qualifier Flag names
*/
char *qualifier_flag_names;
/**
* Vendor-specific size of Qualfiier Type field
*/
int qualifier_type_size;
/**
* List of vendor-specific registered Functional Components
*/
linked_list_t *components;
};
/**
* Destroy a vendor_entry_t object
*/
static void vendor_entry_destroy(vendor_entry_t *entry)
{
entry->components->destroy_function(entry->components, free);
free(entry);
}
/**
* Creation method for a vendor-specific Functional Component
*/
struct component_entry_t {
/**
* Vendor-Specific Component Functional Name
*/
u_int32_t name;
/**
* Functional Component creation method
*/
pts_component_create_t create;
};
/**
* Private data of a pts_component_manager_t object.
*
*/
struct private_pts_component_manager_t {
/**
* Public pts_component_manager_t interface.
*/
pts_component_manager_t public;
/**
* List of vendor-specific namespaces and registered components
*/
linked_list_t *list;
};
METHOD(pts_component_manager_t, add_vendor, void,
private_pts_component_manager_t *this, pen_t vendor_id,
enum_name_t *comp_func_names, int qualifier_type_size,
char *qualifier_flag_names, enum_name_t *qualifier_type_names)
{
vendor_entry_t *entry;
entry = malloc_thing(vendor_entry_t);
entry->vendor_id = vendor_id;
entry->comp_func_names = comp_func_names;
entry->qualifier_type_size = qualifier_type_size;
entry->qualifier_flag_names = qualifier_flag_names;
entry->qualifier_type_names = qualifier_type_names;
entry->components = linked_list_create();
this->list->insert_last(this->list, entry);
DBG2(DBG_TNC, "added %N functional component namespace",
pen_names, vendor_id);
}
METHOD(pts_component_manager_t, get_comp_func_names, enum_name_t*,
private_pts_component_manager_t *this, pen_t vendor_id)
{
enumerator_t *enumerator;
vendor_entry_t *entry;
enum_name_t *names = NULL;
enumerator = this->list->create_enumerator(this->list);
while (enumerator->enumerate(enumerator, &entry))
{
if (entry->vendor_id == vendor_id)
{
names = entry->comp_func_names;
break;
}
}
enumerator->destroy(enumerator);
return names;
}
METHOD(pts_component_manager_t, get_qualifier_type_names, enum_name_t*,
private_pts_component_manager_t *this, pen_t vendor_id)
{
enumerator_t *enumerator;
vendor_entry_t *entry;
enum_name_t *names = NULL;
enumerator = this->list->create_enumerator(this->list);
while (enumerator->enumerate(enumerator, &entry))
{
if (entry->vendor_id == vendor_id)
{
names = entry->qualifier_type_names;
break;
}
}
enumerator->destroy(enumerator);
return names;
}
METHOD(pts_component_manager_t, add_component, void,
private_pts_component_manager_t *this, pen_t vendor_id, u_int32_t name,
pts_component_create_t create)
{
enumerator_t *enumerator;
vendor_entry_t *entry;
component_entry_t *component;
enumerator = this->list->create_enumerator(this->list);
while (enumerator->enumerate(enumerator, &entry))
{
if (entry->vendor_id == vendor_id)
{
component = malloc_thing(component_entry_t);
component->name = name;
component->create = create;
entry->components->insert_last(entry->components, component);
DBG2(DBG_TNC, "added %N functional component \"%N\"",
pen_names, vendor_id,
get_comp_func_names(this, vendor_id), name);
}
}
enumerator->destroy(enumerator);
}
METHOD(pts_component_manager_t, remove_vendor, void,
private_pts_component_manager_t *this, pen_t vendor_id)
{
enumerator_t *enumerator;
vendor_entry_t *entry;
enumerator = this->list->create_enumerator(this->list);
while (enumerator->enumerate(enumerator, &entry))
{
if (entry->vendor_id == vendor_id)
{
this->list->remove_at(this->list, enumerator);
vendor_entry_destroy(entry);
DBG2(DBG_TNC, "removed %N functional component namespace",
pen_names, vendor_id);
}
}
enumerator->destroy(enumerator);
}
METHOD(pts_component_manager_t, get_qualifier, u_int8_t,
private_pts_component_manager_t *this, pts_comp_func_name_t *name,
char *flags)
{
enumerator_t *enumerator;
vendor_entry_t *entry;
u_int8_t qualifier, size, flag, type = 0;
int i;
enumerator = this->list->create_enumerator(this->list);
while (enumerator->enumerate(enumerator, &entry))
{
if (entry->vendor_id == name->get_vendor_id(name))
{
qualifier = name->get_qualifier(name);
size = entry->qualifier_type_size;
flag = (1 << size);
/* mask qualifier type field */
type = qualifier & (flag - 1);
/* determine flags */
size = PTS_QUALIFIER_SIZE - size;
if (flags)
{
for (i = 0 ; i < size; i++)
{
flags[size-i+1] = (qualifier & flag) ?
entry->qualifier_flag_names[i] : '.';
flag <<= 1;
}
}
}
}
enumerator->destroy(enumerator);
return type;
}
METHOD(pts_component_manager_t, create, pts_component_t*,
private_pts_component_manager_t *this, pts_comp_func_name_t *name)
{
enumerator_t *enumerator, *e2;
vendor_entry_t *entry;
component_entry_t *entry2;
pts_component_t *component = NULL;
enumerator = this->list->create_enumerator(this->list);
while (enumerator->enumerate(enumerator, &entry))
{
if (entry->vendor_id == name->get_vendor_id(name))
{
e2 = entry->components->create_enumerator(entry->components);
while (e2->enumerate(e2, &entry2))
{
if (entry2->name == name->get_name(name) && entry2->create)
{
component = entry2->create(name->get_qualifier(name));
break;
}
}
e2->destroy(e2);
break;
}
}
enumerator->destroy(enumerator);
return component;
}
METHOD(pts_component_manager_t, destroy, void,
private_pts_component_manager_t *this)
{
this->list->destroy_function(this->list, (void *)vendor_entry_destroy);
free(this);
}
/**
* See header
*/
pts_component_manager_t *pts_component_manager_create(void)
{
private_pts_component_manager_t *this;
INIT(this,
.public = {
.add_vendor = _add_vendor,
.add_component = _add_component,
.remove_vendor = _remove_vendor,
.get_comp_func_names = _get_comp_func_names,
.get_qualifier_type_names = _get_qualifier_type_names,
.get_qualifier = _get_qualifier,
.create = _create,
.destroy = _destroy,
},
.list = linked_list_create(),
);
return &this->public;
}
@@ -0,0 +1,119 @@
/*
* Copyright (C) 2011 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_component_manager pts_component_manager
* @{ @ingroup pts
*/
#ifndef PTS_COMPONENT_MANAGER_H_
#define PTS_COMPONENT_MANAGER_H_
typedef struct pts_component_manager_t pts_component_manager_t;
#include "pts/components/pts_component.h"
#include "pts/components/pts_comp_func_name.h"
#include <library.h>
#include <pen/pen.h>
typedef pts_component_t* (*pts_component_create_t)(u_int8_t qualifier);
/**
* Manages PTS Functional Components
*/
struct pts_component_manager_t {
/**
* Add vendor-specific functional component names
*
* @param vendor_id Private Enterprise Number (PEN)
* @param comp_func_names Vendor-specific Component Functional names
* @param qualifier_type_size Vendor-specific Qualifier Type size
* @param qualifier_flag_names Vendor-specific Qualifier Flag names
* @param qualifier_type_names Vendor-specific Qualifier Type names
*/
void (*add_vendor)(pts_component_manager_t *this, pen_t vendor_id,
enum_name_t *comp_func_names,
int qualifier_type_size,
char *qualifier_flag_names,
enum_name_t *qualifier_type_names);
/**
* Add vendor-specific functional component
*
* @param vendor_id Private Enterprise Number (PEN)
* @param names Component Functional Name
* @param create Functional Component creation method
*/
void (*add_component)(pts_component_manager_t *this, pen_t vendor_id,
u_int32_t name, pts_component_create_t create);
/**
* Remove vendor-specific components and associated namespace
*
* @param vendor_id Private Enterprise Number (PEN)
*/
void (*remove_vendor)(pts_component_manager_t *this, pen_t vendor_id);
/*
* Return the Functional Component names for a given vendor ID
*
* @param vendor_id Private Enterprise Number (PEN)
* @return Comp. Func. names if found, NULL else
*/
enum_name_t* (*get_comp_func_names)(pts_component_manager_t *this,
pen_t vendor_id);
/*
* Return the Functional Component Qualifier Type names for a given vendor ID
*
* @param vendor_id Private Enterprise Number (PEN)
* @return Qualifier Type names if found, NULL else
*/
enum_name_t* (*get_qualifier_type_names)(pts_component_manager_t *this,
pen_t vendor_id);
/*
* Return the Qualifier Type and Flags
*
* @param name Component Functional Name
* @param flags Qualifier Flags as a string in a char buffer
* @return Qualifier Type
*/
u_int8_t (*get_qualifier)(pts_component_manager_t *this,
pts_comp_func_name_t *name, char *flags);
/**
* Create a PTS Component object from a Functional Component Name object
*
* @param name Component Functional Name
* @return Component object if supported, NULL else
*/
pts_component_t* (*create)(pts_component_manager_t *this,
pts_comp_func_name_t *name);
/**
* Destroys a pts_component_manager_t object.
*/
void (*destroy)(pts_component_manager_t *this);
};
/**
* Create a PA-TNC attribute manager
*/
pts_component_manager_t* pts_component_manager_create(void);
#endif /** PTS_COMPONENT_MANAGER_H_ @}*/
@@ -0,0 +1,48 @@
/*
* Copyright (C) 2011 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "tcg_comp_func_name.h"
char pts_tcg_qualifier_flag_names[] = { 'K', 'S' };
ENUM_BEGIN(pts_tcg_qualifier_type_names, PTS_TCG_QUALIFIER_TYPE_UNKNOWN,
PTS_TCG_QUALIFIER_TYPE_TNC,
"Unknown",
"Trusted Platform",
"Operating System",
"Graphical User Interface",
"Application",
"Networking",
"Library",
"TNC Defined Component"
);
ENUM_NEXT(pts_tcg_qualifier_type_names, PTS_TCG_QUALIFIER_TYPE_ALL,
PTS_TCG_QUALIFIER_TYPE_ALL,
PTS_TCG_QUALIFIER_TYPE_TNC,
"All Matching Components"
);
ENUM_END(pts_tcg_qualifier_type_names, PTS_TCG_QUALIFIER_TYPE_ALL);
ENUM(pts_tcg_comp_func_names, PTS_TCG_COMP_FUNC_NAME_IGNORE,
PTS_TCG_COMP_FUNC_NAME_OPT_ROMS,
"Ignore",
"CRTM",
"BIOS",
"Platform Extensions",
"Motherboard Firmware",
"Initial Program Loader",
"Option ROMs"
);
@@ -0,0 +1,98 @@
/*
* Copyright (C) 2011 Sansar Choinyambuu
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_tcg_comp_func_name pts_tcg_comp_func_name
* @{ @ingroup pts
*/
#ifndef PTS_TCG_COMP_FUNC_NAME_H_
#define PTS_TCG_COMP_FUNC_NAME_H_
typedef enum pts_tcg_qualifier_type_t pts_tcg_qualifier_type_t;
typedef enum pts_tcg_comp_func_name_t pts_tcp_comp_func_name_t;
#include <library.h>
/**
* PTS Component Functional Name Qualifier Flags for the TCG namespace
* see section 5.2 of PTS Protocol: Binding to TNC IF-M Specification
*
* 0 1 2 3 4 5
* +-+-+-+-+-+-+
* |K|S| Type |
* +-+-+-+-+-+-+
*/
#define PTS_TCG_QUALIFIER_FLAG_KERNEL (1<<5)
#define PTS_TCG_QUALIFIER_FLAG_SUB (1<<4)
extern char pts_tcg_qualifier_flag_names[];
/**
* Size of the PTS Component Functional Name Qualifier Type field
*/
#define PTS_TCG_QUALIFIER_TYPE_SIZE 4
/**
* PTS Component Functional Name Qualifier Types for the TCG namespace
* see section 5.2 of PTS Protocol: Binding to TNC IF-M Specification
*/
enum pts_tcg_qualifier_type_t {
/** Unknown */
PTS_TCG_QUALIFIER_TYPE_UNKNOWN = 0x0,
/** Trusted Platform */
PTS_TCG_QUALIFIER_TYPE_TRUSTED = 0x1,
/** Operating System */
PTS_TCG_QUALIFIER_TYPE_OS = 0x2,
/** Graphical User Interface */
PTS_TCG_QUALIFIER_TYPE_GUI = 0x3,
/** Application */
PTS_TCG_QUALIFIER_TYPE_APP = 0x4,
/** Networking */
PTS_TCG_QUALIFIER_TYPE_NET = 0x5,
/** Library */
PTS_TCG_QUALIFIER_TYPE_LIB = 0x6,
/** TNC Defined Component */
PTS_TCG_QUALIFIER_TYPE_TNC = 0x7,
/** All matching Components */
PTS_TCG_QUALIFIER_TYPE_ALL = 0xF,
};
extern enum_name_t *pts_tcg_qualifier_type_names;
/**
* PTS Component Functional Name Binary Enumeration for the TCG namespace
* see section 5.3 of PTS Protocol: Binding to TNC IF-M Specification
*/
enum pts_tcg_comp_func_name_t {
/** Ignore */
PTS_TCG_COMP_FUNC_NAME_IGNORE = 0x0000,
/** CRTM */
PTS_TCG_COMP_FUNC_NAME_CRTM = 0x0001,
/** BIOS */
PTS_TCG_COMP_FUNC_NAME_BIOS = 0x0002,
/** Platform Extensions */
PTS_TCG_COMP_FUNC_NAME_PLATFORM_EXT = 0x0003,
/** Motherboard Firmware */
PTS_TCG_COMP_FUNC_NAME_BOARD = 0x0004,
/** Initial Program Loader */
PTS_TCG_COMP_FUNC_NAME_INIT_LOADER = 0x0005,
/** Option ROMs */
PTS_TCG_COMP_FUNC_NAME_OPT_ROMS = 0x0006,
};
extern enum_name_t *pts_tcg_comp_func_names;
#endif /** PTS_TCG_COMP_FUNC_NAME_H_ @}*/
-1
View File
@@ -30,7 +30,6 @@ typedef struct pcr_entry_t pcr_entry_t;
#include "pts_file_meas.h"
#include "pts_file_meta.h"
#include "pts_dh_group.h"
#include "pts_funct_comp_name.h"
#include "pts_funct_comp_evid_req.h"
#include <library.h>
+3 -5
View File
@@ -25,8 +25,9 @@ typedef struct pts_funct_comp_evid_req_t pts_funct_comp_evid_req_t;
typedef enum pts_attr_req_funct_comp_evid_flag_t pts_attr_req_funct_comp_evid_flag_t;
typedef struct funct_comp_evid_req_entry_t funct_comp_evid_req_entry_t;
#include "pts/components/pts_comp_func_name.h"
#include <library.h>
#include "pts_funct_comp_name.h"
#define PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM 0x00
@@ -50,10 +51,7 @@ enum pts_attr_req_funct_comp_evid_flag_t {
struct funct_comp_evid_req_entry_t {
pts_attr_req_funct_comp_evid_flag_t flags;
u_int32_t sub_comp_depth;
u_int32_t vendor_id;
u_int8_t family;
pts_qualifier_t qualifier;
pts_ita_funct_comp_name_t name;
pts_comp_func_name_t *name;
};
/**
-128
View File
@@ -1,128 +0,0 @@
/*
* Copyright (C) 2011 Sansar Choinyambuu
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup pts_funct_comp_name pts_funct_comp_name
* @{ @ingroup pts
*/
#ifndef PTS_FUNCT_COMP_NAME_H_
#define PTS_FUNCT_COMP_NAME_H_
typedef enum pts_funct_comp_type_t pts_funct_comp_type_t;
typedef enum pts_funct_comp_name_t pts_funct_comp_name_t;
typedef enum pts_ita_funct_comp_type_t pts_ita_funct_comp_type_t;
typedef enum pts_ita_funct_comp_name_t pts_ita_funct_comp_name_t;
typedef struct pts_qualifier_t pts_qualifier_t;
typedef struct pts_comp_funct_name_t pts_comp_funct_name_t;
/**
* PTS Component Functional Type for Qualifier field
*/
enum pts_funct_comp_type_t {
/** Unknown */
PTS_FUNC_COMP_TYPE_UNKNOWN = 0x0,
/** Trusted Platform */
PTS_FUNC_COMP_TYPE_TRUSTED = 0x1,
/** Operating System */
PTS_FUNC_COMP_TYPE_OS = 0x2,
/** Graphical User Interface */
PTS_FUNC_COMP_TYPE_GUI = 0x3,
/** Application */
PTS_FUNC_COMP_TYPE_APP = 0x4,
/** Networking */
PTS_FUNC_COMP_TYPE_NET = 0x5,
/** Library */
PTS_FUNC_COMP_TYPE_LIB = 0x6,
/** TNC Defined Component */
PTS_FUNC_COMP_TYPE_TNC = 0x7,
/** All matching Components */
PTS_FUNC_COMP_TYPE_ALL = 0xF,
};
/**
* PTS Component Functional Name Binary Enumeration
*/
enum pts_funct_comp_name_t {
/** Ignore */
PTS_FUNC_COMP_NAME_IGNORE = 0x0000,
/** CRTM */
PTS_FUNC_COMP_NAME_CRTM = 0x0001,
/** BIOS */
PTS_FUNC_COMP_NAME_BIOS = 0x0002,
/** Platform Extensions */
PTS_FUNC_COMP_NAME_PLATFORM_EXT = 0x0003,
/** Motherboard firmware */
PTS_FUNC_COMP_NAME_BOARD = 0x0004,
/** Initial Program Loader */
PTS_FUNC_COMP_NAME_INIT_LOADER = 0x0005,
/** Option ROMs */
PTS_FUNC_COMP_NAME_OPT_ROMS = 0x0006,
};
/**
* PTS Component Functional Type for Qualifier field in ITA namespace
*/
enum pts_ita_funct_comp_type_t {
/** Unknown */
PTS_ITA_FUNC_COMP_TYPE_UNKNOWN = 0x0,
/** Trusted Platform */
PTS_ITA_FUNC_COMP_TYPE_TRUSTED = 0x1,
/** All matching Components */
PTS_ITA_FUNC_COMP_TYPE_ALL = 0xF,
};
/**
* PTS Component Functional Name Binary Enumeration in ITA namespace
*/
enum pts_ita_funct_comp_name_t {
/** Components measured into PCR17 during tboot */
PTS_ITA_FUNC_COMP_NAME_TBOOT_POLICY = 0x0000,
/** Components measured into PCR18 during tboot */
PTS_ITA_FUNC_COMP_NAME_TBOOT_MLE = 0x0001,
/** MBR information and stage1 during boot by trustedGRUB */
PTS_ITA_FUNC_COMP_NAME_TGRUB_MBR_STAGE1 = 0x0002,
/** bootloader information stage2 part1 during boot by trustedGRUB */
PTS_ITA_FUNC_COMP_NAME_TGRUB_STAGE2_PART1 = 0x0003,
/** bootloader information stage2 part2 during boot by trustedGRUB */
PTS_ITA_FUNC_COMP_NAME_TGRUB_STAGE2_PART2 = 0x0004,
/** all commandline arguments from menu.lst and those entered in the shell
* during boot by trustedGRUB */
PTS_ITA_FUNC_COMP_NAME_TGRUB_CMD_LINE_ARGS = 0x0005,
/** all files checked via the checkfile-routine during boot by trustedGRUB */
PTS_ITA_FUNC_COMP_NAME_TGRUB_CHECKFILE = 0x0006,
/** all files which are actually loaded during boot by trustedGRUB */
PTS_ITA_FUNC_COMP_NAME_TGRUB_LOADED_FILES = 0x0007,
};
/**
* Qualifier for Functional Component
*/
struct pts_qualifier_t {
bool kernel;
bool sub_component;
pts_ita_funct_comp_type_t type;
};
/**
* Component Functional Name
*/
struct pts_comp_funct_name_t {
u_int32_t vendor_id;
u_int8_t family_qualifier;
u_int32_t name;
};
#endif /** PTS_FUNCT_COMP_NAME_H_ @}*/
@@ -29,19 +29,19 @@ typedef struct private_tcg_pts_attr_req_funct_comp_evid_t private_tcg_pts_attr_r
* 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 | Sub-component Depth (for Component #1) |
* | Flags | Sub-component Depth (for Component #1) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Component Functional Name #1 |
* | Component Functional Name #1 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Component Functional Name #1 |
* | Component Functional Name #1 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | ........ |
* | ........ |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Flags | Sub-component Depth (for Component #N) |
* | Flags | Sub-component Depth (for Component #N) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Component Functional Name #N |
* | Component Functional Name #N |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Component Functional Name #N |
* | Component Functional Name #N |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
@@ -52,25 +52,14 @@ typedef struct private_tcg_pts_attr_req_funct_comp_evid_t private_tcg_pts_attr_r
* 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
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Component Functional Name Vendor ID |Fam| Qualifier |
* | Component Functional Name Vendor ID |Fam| Qualifier |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Component Functional Name |
* | Component Functional Name |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
*/
/**
* Qualifier for Functional Component
* see section 5.2 of PTS Protocol: Binding to TNC IF-M Specification
*
*
* 0 1 2 3 4 5
* +-+-+-+-+-+-+
* |K|S| Type |
* +-+-+-+-+-+-+
*/
#define PTS_REQ_FUNCT_COMP_EVID_SIZE 12
#define PTS_REQ_FUNCT_COMP_FAMILY_MASK 0xC0
/**
* Private data of an tcg_pts_attr_req_funct_comp_evid_t object.
@@ -143,7 +132,6 @@ METHOD(pa_tnc_attr_t, build, void,
{
bio_writer_t *writer;
enumerator_t *enumerator;
u_int8_t qualifier = 0;
funct_comp_evid_req_entry_t *entry;
writer = bio_writer_create(PTS_REQ_FUNCT_COMP_EVID_SIZE);
@@ -151,26 +139,11 @@ METHOD(pa_tnc_attr_t, build, void,
enumerator = this->requests->create_enumerator(this->requests);
while (enumerator->enumerate(enumerator, &entry))
{
writer->write_uint8(writer, entry->flags);
writer->write_uint24 (writer, entry->sub_comp_depth);
writer->write_uint24 (writer, entry->vendor_id);
if (entry->family != PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM)
{
DBG1(DBG_TNC, "Functional Name Encoding Family is not set to 00");
}
qualifier += entry->qualifier.type;
if (entry->qualifier.kernel)
{
qualifier += 16;
}
if (entry->qualifier.sub_component)
{
qualifier += 32;
}
writer->write_uint8 (writer, qualifier);
writer->write_uint32 (writer, entry->name);
writer->write_uint8 (writer, entry->flags);
writer->write_uint24(writer, entry->sub_comp_depth);
writer->write_uint24(writer, entry->name->get_vendor_id(entry->name));
writer->write_uint8 (writer, entry->name->get_qualifier(entry->name));
writer->write_uint32(writer, entry->name->get_name(entry->name));
}
enumerator->destroy(enumerator);
@@ -182,15 +155,15 @@ METHOD(pa_tnc_attr_t, process, status_t,
private_tcg_pts_attr_req_funct_comp_evid_t *this, u_int32_t *offset)
{
bio_reader_t *reader;
u_int8_t flags, fam_and_qualifier, family = 0;
status_t status = FAILED;
funct_comp_evid_req_entry_t *entry = NULL;
u_int32_t sub_comp_depth, vendor_id, comp_name;
pts_qualifier_t qualifier;
u_int32_t sub_comp_depth, vendor_id, name;
u_int8_t flags, fam_and_qualifier, qualifier;
if (this->value.len < PTS_REQ_FUNCT_COMP_EVID_SIZE)
{
DBG1(DBG_TNC, "insufficient data for Request Functional Component Evidence");
DBG1(DBG_TNC, "insufficient data for Request Functional "
"Component Evidence");
*offset = 0;
return FAILED;
}
@@ -202,64 +175,46 @@ METHOD(pa_tnc_attr_t, process, status_t,
{
if (!reader->read_uint8(reader, &flags))
{
DBG1(DBG_TNC, "insufficient data for PTS Request Functional"
" Component Evidence Flags");
DBG1(DBG_TNC, "insufficient data for PTS Request Functional "
"Component Evidence Flags");
goto end;
}
if (!reader->read_uint24(reader, &sub_comp_depth))
{
DBG1(DBG_TNC, "insufficient data for PTS Request Functional"
" Component Evidence Sub Component Depth");
DBG1(DBG_TNC, "insufficient data for PTS Request Functional "
"Component Evidence Sub Component Depth");
goto end;
}
if (!reader->read_uint24(reader, &vendor_id))
{
DBG1(DBG_TNC, "insufficient data for PTS Request Functional"
" Component Evidence Component Name Vendor ID");
DBG1(DBG_TNC, "insufficient data for PTS Request Functional "
"Component Evidence Component Name Vendor ID");
goto end;
}
if (!reader->read_uint8(reader, &fam_and_qualifier))
{
DBG1(DBG_TNC, "insufficient data for PTS Request Functional"
" Component Evidence Family and Qualifier");
DBG1(DBG_TNC, "insufficient data for PTS Request Functional "
"Component Evidence Family and Qualifier");
goto end;
}
if (!reader->read_uint32(reader, &comp_name))
if (fam_and_qualifier & PTS_REQ_FUNCT_COMP_FAMILY_MASK)
{
DBG1(DBG_TNC, "insufficient data for PTS Request Functional"
" Component Evidence Component Functional Name");
DBG1(DBG_TNC, "the Functional Name Encoding Family "
"is not Binary Enumeration");
goto end;
}
DBG1(DBG_TNC, "Fam and Qualifier: %d", fam_and_qualifier);
if (!reader->read_uint32(reader, &name))
{
DBG1(DBG_TNC, "insufficient data for PTS Request Functional "
"Component Evidence Component Functional Name");
goto end;
}
qualifier = fam_and_qualifier & !PTS_REQ_FUNCT_COMP_FAMILY_MASK;
entry = malloc_thing(funct_comp_evid_req_entry_t);
if (((fam_and_qualifier >> 6) & 1) )
{
family += 1;
}
if (((fam_and_qualifier >> 7) & 1) )
{
family += 2;
}
if (((fam_and_qualifier >> 5) & 1) )
{
qualifier.kernel = TRUE;
}
if (((fam_and_qualifier >> 4) & 1) )
{
qualifier.sub_component = TRUE;
}
qualifier.type = (fam_and_qualifier & 0xFF);
entry->flags = flags;
entry->sub_comp_depth = sub_comp_depth;
entry->vendor_id = vendor_id;
entry->family = family;
entry->qualifier = qualifier;
entry->name = comp_name;
entry->name = pts_comp_func_name_create(vendor_id, name, qualifier);
this->requests->add(this->requests, entry);
}
@@ -24,7 +24,7 @@
typedef struct tcg_pts_attr_req_funct_comp_evid_t tcg_pts_attr_req_funct_comp_evid_t;
#include "tcg_attr.h"
#include "pts/pts_funct_comp_name.h"
#include "pts/components/pts_comp_func_name.h"
#include "pts/pts_funct_comp_evid_req.h"
#include "pa_tnc/pa_tnc_attr.h"
@@ -44,8 +44,7 @@ struct tcg_pts_attr_req_funct_comp_evid_t {
*
* @return PTS Functional Component Evidence Requests
*/
pts_funct_comp_evid_req_t* (*get_requests)(
tcg_pts_attr_req_funct_comp_evid_t *this);
pts_funct_comp_evid_req_t* (*get_requests)(tcg_pts_attr_req_funct_comp_evid_t *this);
};
@@ -54,8 +53,7 @@ struct tcg_pts_attr_req_funct_comp_evid_t {
*
* @param requests Linked list of PTS Functional Component Evidence Requests
*/
pa_tnc_attr_t* tcg_pts_attr_req_funct_comp_evid_create(
pts_funct_comp_evid_req_t *requests);
pa_tnc_attr_t* tcg_pts_attr_req_funct_comp_evid_create(pts_funct_comp_evid_req_t *requests);
/**
* Creates an tcg_pts_attr_req_funct_comp_evid_t object from received data
+27 -135
View File
@@ -77,23 +77,10 @@ typedef struct private_tcg_pts_attr_simple_comp_evid_t private_tcg_pts_attr_simp
*
*/
/**
* Qualifier for Functional Component
* see section 5.2 of PTS Protocol: Binding to TNC IF-M Specification
*
*
* 0 1 2 3 4 5
* +-+-+-+-+-+-+
* |K|S| Type |
* +-+-+-+-+-+-+
*/
#define PTS_SIMPLE_COMP_EVID_SIZE 40
#define PTS_SIMPLE_COMP_EVID_MEASUREMENT_TIME_SIZE 20
#define PTS_SIMPLE_COMP_EVID_RESERVED 0x00
#define PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM 0x00
#define PTS_SIMPLE_COMP_EVID_FAMILY_MASK 0xC0
/**
* Private data of an tcg_pts_attr_simple_comp_evid_t object.
@@ -139,26 +126,11 @@ struct private_tcg_pts_attr_simple_comp_evid_t {
* Sub-component Depth
*/
u_int32_t depth;
/**
* Component Functional Name Vendor ID
*/
u_int32_t comp_vendor_id;
/**
* Functional Name Encoding Family
*/
u_int8_t family;
/**
* Functional Name Category Qualifier
*/
pts_qualifier_t qualifier;
/**
* Component Functional Name
*/
pts_ita_funct_comp_name_t name;
pts_comp_func_name_t *name;
/**
* Measurement type
@@ -241,7 +213,7 @@ METHOD(pa_tnc_attr_t, build, void,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
bio_writer_t *writer;
u_int8_t flags = 0, qualifier = 0;
u_int8_t flags = 0;
writer = bio_writer_create(PTS_SIMPLE_COMP_EVID_SIZE);
/* Determine the flags to set*/
@@ -262,35 +234,11 @@ METHOD(pa_tnc_attr_t, build, void,
flags += 96;
}
writer->write_uint8(writer, flags);
writer->write_uint24 (writer, this->depth);
writer->write_uint24 (writer, this->comp_vendor_id);
if (this->family != PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM)
{
DBG1(DBG_TNC, "Functional Name Encoding Family is not set to 00");
}
qualifier += this->qualifier.type;
if (this->qualifier.kernel)
{
qualifier += 16;
}
if (this->qualifier.sub_component)
{
qualifier += 32;
}
/* Unknown or Wildcard should not be used for Qualification*/
if (!qualifier || qualifier == 63)
{
DBG1(DBG_TNC, "Unknown or Wildcard should not be used for"
" Functional Name Qualifier");
}
writer->write_uint8 (writer, qualifier);
writer->write_uint32(writer, this->name);
writer->write_uint8 (writer, flags);
writer->write_uint24(writer, this->depth);
writer->write_uint24(writer, this->name->get_vendor_id(this->name));
writer->write_uint8 (writer, this->name->get_qualifier(this->name));
writer->write_uint32(writer, this->name->get_name(this->name));
writer->write_uint8 (writer, (this->measurement_type << 7));
writer->write_uint24(writer, this->extended_pcr);
writer->write_uint16(writer, this->hash_algorithm);
@@ -325,12 +273,10 @@ METHOD(pa_tnc_attr_t, process, status_t,
private_tcg_pts_attr_simple_comp_evid_t *this, u_int32_t *offset)
{
bio_reader_t *reader;
u_int8_t flags;
u_int8_t fam_and_qualifier;
u_int8_t measurement_type;
u_int8_t flags, fam_and_qualifier, qualifier;
u_int8_t measurement_type, transformation;
u_int16_t algorithm;
u_int8_t transformation;
u_int32_t measurement_len;
u_int32_t vendor_id, name, measurement_len;
if (this->value.len < PTS_SIMPLE_COMP_EVID_SIZE)
{
@@ -364,48 +310,22 @@ METHOD(pa_tnc_attr_t, process, status_t,
}
reader->read_uint24(reader, &this->depth);
reader->read_uint24(reader, &this->comp_vendor_id);
reader->read_uint8(reader, &fam_and_qualifier);
if (((fam_and_qualifier >> 6) & 1) )
{
this->family += 1;
}
if (((fam_and_qualifier >> 7) & 1) )
{
this->family += 2;
}
if (((fam_and_qualifier >> 5) & 1) )
{
this->qualifier.kernel = true;
}
if (((fam_and_qualifier >> 4) & 1) )
{
this->qualifier.sub_component = true;
}
this->qualifier.type = ( fam_and_qualifier & 0xF );
/* Unknown or Wildcard should not be used for Qualification*/
if (!(fam_and_qualifier & 0x3F) || (fam_and_qualifier & 0x3F) == 0x3F)
{
DBG1(DBG_TNC, "Unknown or Wildcard should not be used for"
" Functional Name Qualifier");
}
reader->read_uint32(reader, &this->name);
reader->read_uint8(reader, &measurement_type);
this->measurement_type = (measurement_type >> 7 ) & 1;
reader->read_uint24(reader, &vendor_id);
reader->read_uint8 (reader, &fam_and_qualifier);
reader->read_uint32(reader, &name);
reader->read_uint8 (reader, &measurement_type);
reader->read_uint24(reader, &this->extended_pcr);
reader->read_uint16(reader, &algorithm);
reader->read_uint8 (reader, &transformation);
reader->read_data (reader, PTS_SIMPLE_COMP_EVID_MEASUREMENT_TIME_SIZE,
&this->measurement_time);
qualifier = fam_and_qualifier & (!PTS_SIMPLE_COMP_EVID_FAMILY_MASK);
this->name = pts_comp_func_name_create(vendor_id, name, qualifier);
this->measurement_type = (measurement_type >> 7 ) & 1;
this->hash_algorithm = algorithm;
reader->read_uint8(reader, &transformation);
this->transformation = transformation;
reader->read_data(reader, PTS_SIMPLE_COMP_EVID_MEASUREMENT_TIME_SIZE,
&this->measurement_time);
this->measurement_time = chunk_clone(this->measurement_time);
/* Optional Policy URI field is included */
@@ -466,25 +386,7 @@ METHOD(tcg_pts_attr_simple_comp_evid_t, get_sub_component_depth, u_int32_t,
return this->depth;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_spec_comp_funct_name_vendor_id, u_int32_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->comp_vendor_id;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_family, u_int8_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->family;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_qualifier, pts_qualifier_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->qualifier;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_comp_funct_name, pts_ita_funct_comp_name_t,
METHOD(tcg_pts_attr_simple_comp_evid_t, get_comp_func_name, pts_comp_func_name_t*,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->name;
@@ -578,10 +480,7 @@ pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create(tcg_pts_attr_simple_comp_evi
.is_pcr_info_included = _is_pcr_info_included,
.get_flags= _get_flags,
.get_sub_component_depth = _get_sub_component_depth,
.get_spec_comp_funct_name_vendor_id = _get_spec_comp_funct_name_vendor_id,
.get_family = _get_family,
.get_qualifier = _get_qualifier,
.get_comp_funct_name = _get_comp_funct_name,
.get_comp_func_name = _get_comp_func_name,
.get_measurement_type = _get_measurement_type,
.get_extended_pcr = _get_extended_pcr,
.get_hash_algorithm = _get_hash_algorithm,
@@ -598,9 +497,6 @@ pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create(tcg_pts_attr_simple_comp_evi
.pcr_info_included = params.pcr_info_included,
.flags = params.flags,
.depth = params.depth,
.comp_vendor_id = params.vendor_id,
.family = PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM,
.qualifier = params.qualifier,
.name = params.name,
.extended_pcr = params.extended_pcr,
.hash_algorithm = params.hash_algorithm,
@@ -638,10 +534,7 @@ pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create_from_data(chunk_t data)
.is_pcr_info_included = _is_pcr_info_included,
.get_flags= _get_flags,
.get_sub_component_depth = _get_sub_component_depth,
.get_spec_comp_funct_name_vendor_id = _get_spec_comp_funct_name_vendor_id,
.get_family = _get_family,
.get_qualifier = _get_qualifier,
.get_comp_funct_name = _get_comp_funct_name,
.get_comp_func_name = _get_comp_func_name,
.get_measurement_type = _get_measurement_type,
.get_extended_pcr = _get_extended_pcr,
.get_hash_algorithm = _get_hash_algorithm,
@@ -655,7 +548,6 @@ pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create_from_data(chunk_t data)
},
.vendor_id = PEN_TCG,
.type = TCG_PTS_SIMPLE_COMP_EVID,
.family = PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM,
.value = chunk_clone(data),
);
+3 -26
View File
@@ -28,7 +28,7 @@ typedef struct tcg_pts_attr_simple_comp_evid_params_t tcg_pts_attr_simple_comp_e
#include "tcg_attr.h"
#include "pts/pts_meas_algo.h"
#include "pts/pts_funct_comp_name.h"
#include "pts/components/pts_comp_func_name.h"
#include "pa_tnc/pa_tnc_attr.h"
/**
@@ -66,9 +66,7 @@ struct tcg_pts_attr_simple_comp_evid_params_t {
bool pcr_info_included;
pts_attr_simple_comp_evid_flag_t flags;
u_int32_t depth;
u_int32_t vendor_id;
pts_qualifier_t qualifier;
pts_ita_funct_comp_name_t name;
pts_comp_func_name_t *name;
u_int32_t extended_pcr;
pts_meas_algorithms_t hash_algorithm;
pts_pcr_transform_t transformation;
@@ -111,33 +109,12 @@ struct tcg_pts_attr_simple_comp_evid_t {
*/
u_int32_t (*get_sub_component_depth)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Get Specific Component Functional Name Vendor ID
*
* @return Component Functional Name Vendor ID
*/
u_int32_t (*get_spec_comp_funct_name_vendor_id)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Get Family
*
* @return Functional Name Family
*/
u_int8_t (*get_family)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Get Qualifier
*
* @return Functional Name Category Qualifier
*/
pts_qualifier_t (*get_qualifier)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Get Special Component Functional Name
*
* @return Component Functional Name
*/
pts_ita_funct_comp_name_t (*get_comp_funct_name)(tcg_pts_attr_simple_comp_evid_t *this);
pts_comp_func_name_t* (*get_comp_func_name)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Get Measurement Type