Implemented TCG PTS Simple Component Evidence Attribute

This commit is contained in:
Sansar Choinyambuu
2011-09-08 12:08:09 +02:00
committed by Andreas Steffen
parent 0105cc5c36
commit adc954a77d
3 changed files with 1044 additions and 1 deletions
+2 -1
View File
@@ -25,7 +25,8 @@ libimcv_la_SOURCES = \
tcg/tcg_pts_attr_get_aik.h tcg/tcg_pts_attr_get_aik.c \
tcg/tcg_pts_attr_aik.h tcg/tcg_pts_attr_aik.c \
tcg/tcg_pts_attr_req_funct_comp_evid.h tcg/tcg_pts_attr_req_funct_comp_evid.c \
tcg/tcg_pts_attr_gen_attest_evid.h tcg/tcg_pts_attr_gen_attest_evid.c
tcg/tcg_pts_attr_gen_attest_evid.h tcg/tcg_pts_attr_gen_attest_evid.c \
tcg/tcg_pts_attr_simple_comp_evid.h tcg/tcg_pts_attr_simple_comp_evid.c
# CFLAGS = -Wall -Werror
@@ -0,0 +1,724 @@
/*
* 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.
*/
#include "tcg_pts_attr_simple_comp_evid.h"
#include <pa_tnc/pa_tnc_msg.h>
#include <bio/bio_writer.h>
#include <bio/bio_reader.h>
#include <debug.h>
typedef struct private_tcg_pts_attr_simple_comp_evid_t private_tcg_pts_attr_simple_comp_evid_t;
/**
* Simple Component Evidence (see section 3.15.1 of PTS Protocol: Binding to TNC IF-M Specification)
*
* 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 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Specific Functional Component |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Specific Functional Component |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Measure. Type | Extended into PCR |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Hash Algorithm | PCR Transform | Reserved |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Measurement Date/Time |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Measurement Date/Time |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Measurement Date/Time |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Measurement Date/Time |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Measurement Date/Time |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Optional Policy URI Length | Opt. Verification Policy URI ~
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* ~ Optional Verification Policy URI ~
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Optional PCR Length | Optional PCR Before Value ~
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* ~ Optional PCR Before Value (Variable Length) ~
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* ~ Optional PCR After Value (Variable Length) ~
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* ~ Component Measurement (Variable Length) ~
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
/**
* Specific Functional Component -> Component Functional Name Structure
* (see section 5.1 of PTS Protocol: Binding to TNC IF-M Specification)
*
* 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 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
*/
/**
* 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
/**
* Private data of an tcg_pts_attr_simple_comp_evid_t object.
*/
struct private_tcg_pts_attr_simple_comp_evid_t {
/**
* Public members of tcg_pts_attr_simple_comp_evid_t
*/
tcg_pts_attr_simple_comp_evid_t public;
/**
* Attribute vendor ID
*/
pen_t vendor_id;
/**
* Attribute type
*/
u_int32_t type;
/**
* Attribute value
*/
chunk_t value;
/**
* Noskip flag
*/
bool noskip_flag;
/**
* Set of flags for Request Functional Component
*/
pts_attr_simple_comp_evid_flag_t flags;
/**
* 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
*/
tcg_pts_qualifier_t qualifier;
/**
* Component Functional Name
*/
pts_attr_req_funct_comp_name_bin_enum_t name;
/**
* Measurement type
*/
u_int8_t measurement_type;
/**
* Which PCR the functional component is extended into
*/
u_int32_t extended_pcr;
/**
* Hash Algorithm
*/
u_int16_t hash_algorithm;
/**
* Transformation type for PCR
*/
pts_attr_simple_comp_evid_pcr_transform_t transformation;
/**
* Measurement time
*/
chunk_t measurement_time;
/**
* Optional Policy URI
*/
chunk_t policy_uri;
/**
* Optional PCR before value
*/
chunk_t pcr_before;
/**
* Optional PCR after value
*/
chunk_t pcr_after;
/**
* Component Measurement
*/
chunk_t measurement;
};
METHOD(pa_tnc_attr_t, get_vendor_id, pen_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->vendor_id;
}
METHOD(pa_tnc_attr_t, get_type, u_int32_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->type;
}
METHOD(pa_tnc_attr_t, get_value, chunk_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->value;
}
METHOD(pa_tnc_attr_t, get_noskip_flag, bool,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->noskip_flag;
}
METHOD(pa_tnc_attr_t, set_noskip_flag,void,
private_tcg_pts_attr_simple_comp_evid_t *this, bool noskip)
{
this->noskip_flag = noskip;
}
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;
u_int8_t qualifier = 0;
u_int16_t algorithm = 0;
writer = bio_writer_create(PTS_SIMPLE_COMP_EVID_SIZE);
/* Determine the flags to set*/
if(this->flags & PTS_SIMPLE_COMP_EVID_FLAG_PCR) flags += 128;
if(this->flags & PTS_SIMPLE_COMP_EVID_FLAG_NO_VER) flags += 32;
else if(this->flags & PTS_SIMPLE_COMP_EVID_FLAG_VER_FAIL) flags += 64;
else if(this->flags & PTS_SIMPLE_COMP_EVID_FLAG_VER_PASS) 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, (this->measurement_type << 7));
writer->write_uint24 (writer, this->extended_pcr);
/* Determine the hash algorithm to set*/
if(this->hash_algorithm & PTS_MEAS_ALGO_SHA384) algorithm = 8192;
else if(this->hash_algorithm & PTS_MEAS_ALGO_SHA256) algorithm = 16384;
else if(this->hash_algorithm & PTS_MEAS_ALGO_SHA1) algorithm = 32768;
writer->write_uint16(writer, algorithm);
writer->write_uint8 (writer, this->transformation);
writer->write_data (writer, this->measurement_time);
/* Optional fields */
if(this->policy_uri.ptr)
{
writer->write_uint16 (writer, this->policy_uri.len);
writer->write_data (writer, this->policy_uri);
}
if(this->pcr_before.ptr && this->pcr_after.ptr &&
this->pcr_before.len == this->pcr_after.len)
{
writer->write_uint16 (writer, this->pcr_before.len);
writer->write_data (writer, this->pcr_before);
writer->write_data (writer, this->pcr_after);
}
writer->write_data (writer, this->measurement);
this->value = chunk_clone(writer->get_buf(writer));
writer->destroy(writer);
}
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_int16_t algorithm;
u_int8_t transformation;
u_int32_t measurement_len;
if (this->value.len < PTS_SIMPLE_COMP_EVID_SIZE)
{
DBG1(DBG_TNC, "insufficient data for Simple Component Evidence");
*offset = 0;
return FAILED;
}
reader = bio_reader_create(this->value);
reader->read_uint8(reader, &flags);
/* Determine the flags to set*/
if((flags >> 7) & 1) this->flags |= PTS_SIMPLE_COMP_EVID_FLAG_PCR;
if(!((flags >> 6) & 1) && !((flags >> 5) & 1))
this->flags |= PTS_SIMPLE_COMP_EVID_FLAG_NO_VALID;
else if(!((flags >> 6) & 1) && ((flags >> 5) & 1))
this->flags |= PTS_SIMPLE_COMP_EVID_FLAG_NO_VER;
else if(((flags >> 6) & 1) && !((flags >> 5) & 1))
this->flags |= PTS_SIMPLE_COMP_EVID_FLAG_VER_FAIL;
else if(((flags >> 6) & 1) && ((flags >> 5) & 1))
this->flags |= PTS_SIMPLE_COMP_EVID_FLAG_VER_PASS;
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;
/* TODO: Generate an IF-M error attribute indicating */
/* TCG_PTS_INVALID_NAME_FAM */
//if(&this->comp_vendor_id==PEN_TCG && this->family != PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM)
//{
// DBG1(DBG_TNC, "Functional Name Encoding Family is not set to 00");
//}
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 );
/* TODO: Check the type is defined in pts_attr_req_funct_comp_type_t */
/* 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);
/* TODO: Check the name is defined in pts_attr_req_funct_comp_name_bin_enum_t */
reader->read_uint8(reader, &measurement_type);
this->measurement_type = (measurement_type >> 7 ) & 1;
reader->read_uint24(reader, &this->extended_pcr);
reader->read_uint16(reader, &algorithm);
if((algorithm >> 13) & 1) this->hash_algorithm = PTS_MEAS_ALGO_SHA384;
else if((algorithm >> 14) & 1) this->hash_algorithm = PTS_MEAS_ALGO_SHA256;
else if((algorithm >> 15) & 1) this->hash_algorithm = PTS_MEAS_ALGO_SHA1;
reader->read_uint8(reader, &transformation);
this->transformation = transformation;
/* TODO: Check the transformation is defined in pts_attr_simple_comp_evid_pcr_transform_t */
reader->read_data(reader, PTS_SIMPLE_COMP_EVID_MEASUREMENT_TIME_SIZE,
&this->measurement_time);
/* Optional Policy URI field is included */
if(this->flags & PTS_SIMPLE_COMP_EVID_FLAG_VER_FAIL ||
this->flags & PTS_SIMPLE_COMP_EVID_FLAG_VER_PASS)
{
u_int16_t policy_uri_len;
reader->read_uint16(reader, &policy_uri_len);
reader->read_data(reader, policy_uri_len, &this->policy_uri);
}
/* Optional PCR value fields are included */
if(this->flags & PTS_SIMPLE_COMP_EVID_FLAG_PCR)
{
u_int16_t pcr_value_len;
reader->read_uint16(reader, &pcr_value_len);
reader->read_data(reader, pcr_value_len, &this->pcr_before);
reader->read_data(reader, pcr_value_len, &this->pcr_after);
}
measurement_len = reader->remaining(reader);
reader->read_data(reader, measurement_len, &this->measurement);
reader->destroy(reader);
return SUCCESS;
}
METHOD(pa_tnc_attr_t, destroy, void,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
free(this->value.ptr);
free(this->measurement_time.ptr);
free(this->policy_uri.ptr);
free(this->pcr_before.ptr);
free(this->pcr_after.ptr);
free(this->measurement.ptr);
free(this);
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_flags, pts_attr_simple_comp_evid_flag_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->flags;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_flags, void,
private_tcg_pts_attr_simple_comp_evid_t *this, pts_attr_simple_comp_evid_flag_t flags)
{
this->flags = flags;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_sub_component_depth, u_int32_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
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, tcg_pts_qualifier_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->qualifier;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_qualifier, void,
private_tcg_pts_attr_simple_comp_evid_t *this,
tcg_pts_qualifier_t qualifier)
{
this->qualifier = qualifier;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_comp_funct_name, pts_attr_req_funct_comp_name_bin_enum_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->name;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_comp_funct_name, void,
private_tcg_pts_attr_simple_comp_evid_t *this, pts_attr_req_funct_comp_name_bin_enum_t name)
{
this->name = name;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_measurement_type, u_int8_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->measurement_type;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_extended_pcr, u_int32_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->extended_pcr;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_extended_pcr, void,
private_tcg_pts_attr_simple_comp_evid_t *this, u_int32_t extended_pcr)
{
this->extended_pcr = extended_pcr;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_hash_algorithm, u_int16_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->hash_algorithm;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_hash_algorithm, void,
private_tcg_pts_attr_simple_comp_evid_t *this, u_int16_t hash_algorithm)
{
this->hash_algorithm = hash_algorithm;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_pcr_trans, pts_attr_simple_comp_evid_pcr_transform_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->transformation;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_pcr_trans, void,
private_tcg_pts_attr_simple_comp_evid_t *this, pts_attr_simple_comp_evid_pcr_transform_t transformation)
{
this->transformation = transformation;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_measurement_time, chunk_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->measurement_time;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_measurement_time, void,
private_tcg_pts_attr_simple_comp_evid_t *this, chunk_t measurement_time)
{
this->measurement_time = measurement_time;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_policy_uri, chunk_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->policy_uri;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_policy_uri, void,
private_tcg_pts_attr_simple_comp_evid_t *this, chunk_t policy_uri)
{
this->policy_uri = policy_uri;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_pcr_before_value, chunk_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->pcr_before;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_pcr_before_value, void,
private_tcg_pts_attr_simple_comp_evid_t *this, chunk_t pcr_before)
{
this->pcr_before = pcr_before;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_pcr_after_value, chunk_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->pcr_after;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_pcr_after_value, void,
private_tcg_pts_attr_simple_comp_evid_t *this, chunk_t pcr_after)
{
this->pcr_after = pcr_after;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_pcr_len, u_int16_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
if(this->pcr_before.ptr && this->pcr_after.ptr &&
this->pcr_before.len == this->pcr_after.len)
return this->pcr_before.len;
else return 0;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, get_comp_measurement, chunk_t,
private_tcg_pts_attr_simple_comp_evid_t *this)
{
return this->measurement;
}
METHOD(tcg_pts_attr_simple_comp_evid_t, set_comp_measurement, void,
private_tcg_pts_attr_simple_comp_evid_t *this, chunk_t measurement)
{
this->measurement = measurement;
}
/**
* Described in header.
*/
pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create(
pts_attr_simple_comp_evid_flag_t flags,
u_int32_t depth,
u_int32_t vendor_id,
tcg_pts_qualifier_t qualifier,
pts_attr_req_funct_comp_name_bin_enum_t name,
u_int32_t extended_pcr,
u_int16_t hash_algorithm,
pts_attr_simple_comp_evid_pcr_transform_t transformation,
chunk_t measurement_time,
chunk_t policy_uri,
chunk_t pcr_before,
chunk_t pcr_after,
chunk_t measurement)
{
private_tcg_pts_attr_simple_comp_evid_t *this;
INIT(this,
.public = {
.pa_tnc_attribute = {
.get_vendor_id = _get_vendor_id,
.get_type = _get_type,
.get_value = _get_value,
.get_noskip_flag = _get_noskip_flag,
.set_noskip_flag = _set_noskip_flag,
.build = _build,
.process = _process,
.destroy = _destroy,
},
.get_flags= _get_flags,
.set_flags= _set_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,
.set_qualifier = _set_qualifier,
.get_comp_funct_name = _get_comp_funct_name,
.set_comp_funct_name = _set_comp_funct_name,
.get_measurement_type = _get_measurement_type,
.get_extended_pcr = _get_extended_pcr,
.set_extended_pcr = _set_extended_pcr,
.get_hash_algorithm = _get_hash_algorithm,
.set_hash_algorithm = _set_hash_algorithm,
.get_pcr_trans = _get_pcr_trans,
.set_pcr_trans = _set_pcr_trans,
.get_measurement_time = _get_measurement_time,
.set_measurement_time = _set_measurement_time,
.get_policy_uri = _get_policy_uri,
.set_policy_uri = _set_policy_uri,
.get_pcr_before_value = _get_pcr_before_value,
.set_pcr_before_value = _set_pcr_before_value,
.get_pcr_after_value = _get_pcr_after_value,
.set_pcr_after_value = _set_pcr_after_value,
.get_pcr_len = _get_pcr_len,
.get_comp_measurement = _get_comp_measurement,
.set_comp_measurement = _set_comp_measurement,
},
.vendor_id = PEN_TCG,
.type = TCG_PTS_SIMPLE_COMP_EVID,
.flags = flags,
.depth = depth,
.comp_vendor_id = vendor_id,
.family = PTS_REQ_FUNCT_COMP_FAM_BIN_ENUM,
.qualifier = qualifier,
.name = name,
.extended_pcr = extended_pcr,
.hash_algorithm = hash_algorithm,
.transformation = transformation,
.measurement_time = measurement_time,
.policy_uri = policy_uri,
.pcr_before = pcr_before,
.pcr_after = pcr_after,
.measurement = measurement,
);
return &this->public.pa_tnc_attribute;
}
/**
* Described in header.
*/
pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create_from_data(chunk_t data)
{
private_tcg_pts_attr_simple_comp_evid_t *this;
INIT(this,
.public = {
.pa_tnc_attribute = {
.get_vendor_id = _get_vendor_id,
.get_type = _get_type,
.get_value = _get_value,
.get_noskip_flag = _get_noskip_flag,
.set_noskip_flag = _set_noskip_flag,
.build = _build,
.process = _process,
.destroy = _destroy,
},
.get_flags= _get_flags,
.set_flags= _set_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,
.set_qualifier = _set_qualifier,
.get_comp_funct_name = _get_comp_funct_name,
.set_comp_funct_name = _set_comp_funct_name,
.get_measurement_type = _get_measurement_type,
.get_extended_pcr = _get_extended_pcr,
.set_extended_pcr = _set_extended_pcr,
.get_hash_algorithm = _get_hash_algorithm,
.set_hash_algorithm = _set_hash_algorithm,
.get_pcr_trans = _get_pcr_trans,
.set_pcr_trans = _set_pcr_trans,
.get_measurement_time = _get_measurement_time,
.set_measurement_time = _set_measurement_time,
.get_policy_uri = _get_policy_uri,
.set_policy_uri = _set_policy_uri,
.get_pcr_before_value = _get_pcr_before_value,
.set_pcr_before_value = _set_pcr_before_value,
.get_pcr_after_value = _get_pcr_after_value,
.set_pcr_after_value = _set_pcr_after_value,
.get_pcr_len = _get_pcr_len,
.get_comp_measurement = _get_comp_measurement,
.set_comp_measurement = _set_comp_measurement,
},
.vendor_id = PEN_TCG,
.type = TCG_PTS_SIMPLE_COMP_EVID,
.value = chunk_clone(data),
);
return &this->public.pa_tnc_attribute;
}
@@ -0,0 +1,318 @@
/*
* 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 tcg_pts_attr_simple_comp_evid tcg_pts_attr_simple_comp_evid
* @{ @ingroup tcg_pts_attr_simple_comp_evid
*/
#ifndef TCG_PTS_ATTR_SIMPLE_COMP_EVID_H_
#define TCG_PTS_ATTR_SIMPLE_COMP_EVID_H_
typedef struct tcg_pts_attr_simple_comp_evid_t tcg_pts_attr_simple_comp_evid_t;
typedef enum pts_attr_simple_comp_evid_flag_t pts_attr_simple_comp_evid_flag_t;
typedef enum pts_attr_simple_comp_evid_pcr_transform_t pts_attr_simple_comp_evid_pcr_transform_t;
#include "tcg_attr.h"
#include "pa_tnc/pa_tnc_attr.h"
/* For Qualifier and Component Name fields, tcg_pts_qualifier_t,
* pts_attr_req_funct_comp_name_bin_enum_t, pts_attr_req_funct_comp_type_t */
#include "tcg_pts_attr_req_funct_comp_evid.h"
/* For Hash Algorithm field, pts_attr_meas_algorithms_t*/
#include "tcg_pts_attr_meas_algo_selection.h"
/**
* PTS Simple Component Evidence Flags
*/
enum pts_attr_simple_comp_evid_flag_t {
/** PCR information fields inlcuded */
PTS_SIMPLE_COMP_EVID_FLAG_PCR = (1<<0),
/** No Validation was attempted */
PTS_SIMPLE_COMP_EVID_FLAG_NO_VALID = (1<<1),
/** Attempted validation, unable to verify */
PTS_SIMPLE_COMP_EVID_FLAG_NO_VER = (1<<2),
/** Attempted validation, verification failed */
PTS_SIMPLE_COMP_EVID_FLAG_VER_FAIL = (1<<3),
/** Attempted validation, verification passed */
PTS_SIMPLE_COMP_EVID_FLAG_VER_PASS = (1<<4),
};
/**
* PTS Simple Component Evidence PCR Transformations
*/
enum pts_attr_simple_comp_evid_pcr_transform_t {
/** No Transformation */
PTS_SIMPLE_COMP_EVID_PCR_TRANS_NO = 0,
/** Hash Value matched PCR size */
PTS_SIMPLE_COMP_EVID_PCR_TRANS_MATCH = 1,
/** Hash value shorter than PCR size */
PTS_SIMPLE_COMP_EVID_PCR_TRANS_SHORT = 2,
/** Hash value longer than PCR size */
PTS_SIMPLE_COMP_EVID_PCR_TRANS_LONG = 3,
};
/**
* Class implementing the TCG PTS Simple Component Evidence attribute
*
*/
struct tcg_pts_attr_simple_comp_evid_t {
/**
* Public PA-TNC attribute interface
*/
pa_tnc_attr_t pa_tnc_attribute;
/**
* Get flags for PTS Simple Component Evidence
*
* @return Set of flags
*/
pts_attr_simple_comp_evid_flag_t (*get_flags)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set flags for PTS Simple Component Evidence
*
* @param flags Set of flags
*/
void (*set_flags)(tcg_pts_attr_simple_comp_evid_t *this,
pts_attr_simple_comp_evid_flag_t flags);
/**
* Get Sub-component Depth
*
* @return Sub-component Depth
*/
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
*/
tcg_pts_qualifier_t (*get_qualifier)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set qualifier for Component Functional Name
*
* @param qualifier Functional Name Category Qualifier
*/
void (*set_qualifier)(tcg_pts_attr_simple_comp_evid_t *this,
tcg_pts_qualifier_t qualifier);
/**
* Get Special Component Functional Name
*
* @return Component Functional Name
*/
pts_attr_req_funct_comp_name_bin_enum_t (*get_comp_funct_name)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set Component Functional Name
*
* @param name Component Functional Name
*/
void (*set_comp_funct_name)(tcg_pts_attr_simple_comp_evid_t *this,
pts_attr_req_funct_comp_name_bin_enum_t name);
/**
* Get Measurement Type
*
* @return Measurement Type
*/
u_int8_t (*get_measurement_type)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Get which PCR the functional component is extended into
*
* @return Number of PCR
*/
u_int32_t (*get_extended_pcr)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set which PCR the functional component is extended into
*
* @param pcr_number Number of PCR
*/
void (*set_extended_pcr)(tcg_pts_attr_simple_comp_evid_t *this,
u_int32_t extended_pcr);
/**
* Get Hash Algorithm
*
* @return Hash Algorithm
*/
u_int16_t (*get_hash_algorithm)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set Hash Algorithm
*
* @param hash_algorithm Hash Algorithm
*/
void (*set_hash_algorithm)(tcg_pts_attr_simple_comp_evid_t *this,
u_int16_t hash_algorithm);
/**
* Get PCR Transformation
*
* @return Transformation type of PCR
*/
pts_attr_simple_comp_evid_pcr_transform_t (*get_pcr_trans)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set PCR Transformation
*
* @param transformation Transformation type of PCR
*/
void (*set_pcr_trans)(tcg_pts_attr_simple_comp_evid_t *this,
pts_attr_simple_comp_evid_pcr_transform_t transformation);
/**
* Get Measurement Time
*
* @return Measurement time
*/
chunk_t (*get_measurement_time)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set Measurement Time
*
* @param time Measurement time
*/
void (*set_measurement_time)(tcg_pts_attr_simple_comp_evid_t *this,
chunk_t time);
/**
* Get Optional Policy URI
*
* @return Policy URI
*/
chunk_t (*get_policy_uri)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set Optional Policy URI
*
* @param policy_uri Policy URI
*/
void (*set_policy_uri)(tcg_pts_attr_simple_comp_evid_t *this,
chunk_t policy_uri);
/**
* Get Optional PCR Length
*
* @return Length of PCR before/after values
*/
u_int16_t (*get_pcr_len)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Get Optional PCR before value
*
* @return PCR before value
*/
chunk_t (*get_pcr_before_value)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set Optional PCR before value
*
* @param pcr_before PCR before value
*/
void (*set_pcr_before_value)(tcg_pts_attr_simple_comp_evid_t *this,
chunk_t pcr_before);
/**
* Get Optional PCR after value
*
* @return PCR after value
*/
chunk_t (*get_pcr_after_value)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set Optional PCR after value
*
* @param pcr_after PCR after value
*/
void (*set_pcr_after_value)(tcg_pts_attr_simple_comp_evid_t *this,
chunk_t pcr_after);
/**
* Get Component Measurement
*
* @return Component Measurement Hash
*/
chunk_t (*get_comp_measurement)(tcg_pts_attr_simple_comp_evid_t *this);
/**
* Set Component Measurement
*
* @param measurement Component Measurement Hash
*/
void (*set_comp_measurement)(tcg_pts_attr_simple_comp_evid_t *this,
chunk_t measurement);
};
/**
* Creates an tcg_pts_attr_simple_comp_evid_t object
*
* @param flags Set of flags
* @param depth Sub-component Depth
* @param vendor_id Component Functional Name Vendor ID
* @param qualifier Functional Name Category Qualifier
* @param name Component Functional Name
* @param extended_pcr Which PCR the functional component is extended into
* @param hash_algorithm Hash Algorithm
* @param transformation Transformation type for PCR
* @param measurement_time Measurement time
* @param policy_uri Optional Policy URI
* @param pcr_before Optional PCR before value
* @param pcr_after Optional PCR after value
* @param measurement Component Measurement
*/
pa_tnc_attr_t* tcg_pts_attr_simple_comp_evid_create(pts_attr_simple_comp_evid_flag_t flags,
u_int32_t depth,
u_int32_t vendor_id,
tcg_pts_qualifier_t qualifier,
pts_attr_req_funct_comp_name_bin_enum_t name,
u_int32_t extended_pcr,
u_int16_t hash_algorithm,
pts_attr_simple_comp_evid_pcr_transform_t transformation,
chunk_t measurement_time,
chunk_t policy_uri,
chunk_t pcr_before,
chunk_t pcr_after,
chunk_t measurement);
/**
* Creates an tcg_pts_attr_simple_comp_evid_t object from received data
*
* @param value unparsed attribute value
*/
pa_tnc_attr_t* tcg_pts_attr_simple_comp_evid_create_from_data(chunk_t value);
#endif /** TCG_PTS_ATTR_SIMPLE_COMP_EVID_H_ @}*/