diff options
author | Yves-Alexis Perez <corsac@debian.org> | 2013-10-17 21:23:38 +0200 |
---|---|---|
committer | Yves-Alexis Perez <corsac@debian.org> | 2013-10-17 21:23:38 +0200 |
commit | 9d37ad77ef660b92ea51b69d74e14f931d2a04e2 (patch) | |
tree | d6bbb4a5fed1959f8675df9ee7c03713b543fcc9 /src/libpts/tcg | |
parent | 104f57d4b0fb6d7547d6898352eaa5fb4b222010 (diff) | |
parent | e5ee4e7fcdd58b7d86bf1b458da2c63e8e19627b (diff) | |
download | vyos-strongswan-9d37ad77ef660b92ea51b69d74e14f931d2a04e2.tar.gz vyos-strongswan-9d37ad77ef660b92ea51b69d74e14f931d2a04e2.zip |
Merge tag 'v5.1.0-1' into sid
tag strongSwan 5.1.0-1
Diffstat (limited to 'src/libpts/tcg')
36 files changed, 422 insertions, 572 deletions
diff --git a/src/libpts/tcg/tcg_attr.c b/src/libpts/tcg/tcg_attr.c index 656791a8f..b91bf8283 100644 --- a/src/libpts/tcg/tcg_attr.c +++ b/src/libpts/tcg/tcg_attr.c @@ -31,8 +31,23 @@ #include "tcg/tcg_pts_attr_req_file_meta.h" #include "tcg/tcg_pts_attr_unix_file_meta.h" -ENUM_BEGIN(tcg_attr_names, TCG_PTS_REQ_FUNC_COMP_EVID, +ENUM_BEGIN(tcg_attr_names, TCG_SCAP_REFERENCES, + TCG_SCAP_SUMMARY_RESULTS, + "SCAP References", + "SCAP Capabilities and Inventory", + "SCAP Content", + "SCAP Assessment", + "SCAP Results", + "SCAP Summary Results"); +ENUM_NEXT(tcg_attr_names, TCG_SWID_INVENTORY_REQUEST, + TCG_SWID_TAG_IDENTIFIER_RESPONSE, + TCG_SCAP_SUMMARY_RESULTS, + "SWID Inventory Request", + "SWID Tag Response", + "SWID Tag Identifier Response"); +ENUM_NEXT(tcg_attr_names, TCG_PTS_REQ_FUNC_COMP_EVID, TCG_PTS_REQ_FUNC_COMP_EVID, + TCG_SWID_TAG_IDENTIFIER_RESPONSE, "Request Functional Component Evidence"); ENUM_NEXT(tcg_attr_names, TCG_PTS_GEN_ATTEST_EVID, TCG_PTS_GEN_ATTEST_EVID, diff --git a/src/libpts/tcg/tcg_attr.h b/src/libpts/tcg/tcg_attr.h index b45e1488f..ed6c97619 100644 --- a/src/libpts/tcg/tcg_attr.h +++ b/src/libpts/tcg/tcg_attr.h @@ -14,8 +14,8 @@ */ /** - * @defgroup tcg_attrt tcg_attr - * @{ @ingroup tcg_attr + * @defgroup tcg_attr tcg_attr + * @{ @ingroup libpts */ #ifndef TCG_ATTR_H_ @@ -31,6 +31,19 @@ typedef enum tcg_attr_t tcg_attr_t; */ enum tcg_attr_t { + /* SCAP Messages */ + TCG_SCAP_REFERENCES = 0x00000001, + TCG_SCAP_CAPS_AND_INVENTORY = 0x00000002, + TCG_SCAP_CONTENT = 0x00000003, + TCG_SCAP_ASSESSMENT = 0x00000004, + TCG_SCAP_RESULTS = 0x00000005, + TCG_SCAP_SUMMARY_RESULTS = 0x00000006, + + /* SWID Messages */ + TCG_SWID_INVENTORY_REQUEST = 0x00000011, + TCG_SWID_TAG_RESPONSE = 0x00000012, + TCG_SWID_TAG_IDENTIFIER_RESPONSE = 0x00000013, + /* PTS Protocol Negotiations */ TCG_PTS_REQ_PROTO_CAPS = 0x01000000, TCG_PTS_PROTO_CAPS = 0x02000000, diff --git a/src/libpts/tcg/tcg_pts_attr_aik.c b/src/libpts/tcg/tcg_pts_attr_aik.c index 9be3794b6..17a8db5d6 100644 --- a/src/libpts/tcg/tcg_pts_attr_aik.c +++ b/src/libpts/tcg/tcg_pts_attr_aik.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_aik_t private_tcg_pts_attr_aik_t; @@ -49,20 +49,15 @@ struct private_tcg_pts_attr_aik_t { tcg_pts_attr_aik_t public; /** - * Attribute vendor ID + * Vendor-specific attribute type */ - pen_t vendor_id; - - /** - * Attribute type - */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ @@ -79,13 +74,7 @@ struct private_tcg_pts_attr_aik_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_aik_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_aik_t *this) { return this->type; @@ -117,6 +106,10 @@ METHOD(pa_tnc_attr_t, build, void, cred_encoding_type_t encoding_type = CERT_ASN1_DER; chunk_t aik_blob; + if (this->value.ptr) + { + return; + } if (this->aik->get_type(this->aik) == CERT_TRUSTED_PUBKEY) { flags |= PTS_AIK_FLAGS_NAKED_KEY; @@ -130,9 +123,9 @@ METHOD(pa_tnc_attr_t, build, void, writer = bio_writer_create(PTS_AIK_SIZE); writer->write_uint8(writer, flags); writer->write_data (writer, aik_blob); - this->value = chunk_clone(writer->get_buf(writer)); - free(aik_blob.ptr); + this->value = writer->extract_buf(writer); writer->destroy(writer); + free(aik_blob.ptr); } METHOD(pa_tnc_attr_t, process, status_t, @@ -142,7 +135,7 @@ METHOD(pa_tnc_attr_t, process, status_t, u_int8_t flags; certificate_type_t type; chunk_t aik_blob; - + if (this->value.len < PTS_AIK_SIZE) { DBG1(DBG_TNC, "insufficient data for Attestation Identity Key"); @@ -202,7 +195,6 @@ pa_tnc_attr_t *tcg_pts_attr_aik_create(certificate_t *aik) 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, @@ -214,8 +206,7 @@ pa_tnc_attr_t *tcg_pts_attr_aik_create(certificate_t *aik) }, .get_aik = _get_aik, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_AIK, + .type = { PEN_TCG, TCG_PTS_AIK }, .aik = aik->get_ref(aik), .ref = 1, ); @@ -234,7 +225,6 @@ pa_tnc_attr_t *tcg_pts_attr_aik_create_from_data(chunk_t data) 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, @@ -246,8 +236,7 @@ pa_tnc_attr_t *tcg_pts_attr_aik_create_from_data(chunk_t data) }, .get_aik = _get_aik, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_AIK, + .type = { PEN_TCG, TCG_PTS_AIK }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_aik.h b/src/libpts/tcg/tcg_pts_attr_aik.h index 96e90582b..758fd58db 100644 --- a/src/libpts/tcg/tcg_pts_attr_aik.h +++ b/src/libpts/tcg/tcg_pts_attr_aik.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_aik tcg_pts_attr_aik - * @{ @ingroup tcg_pts_attr_aik + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_AIK_H_ @@ -38,7 +38,7 @@ struct tcg_pts_attr_aik_t { * Public PA-TNC attribute interface */ pa_tnc_attr_t pa_tnc_attribute; - + /** * Get AIK * @@ -50,7 +50,7 @@ struct tcg_pts_attr_aik_t { /** * Creates an tcg_pts_attr_aik_t object - * + * * @param aik Attestation Identity Key */ pa_tnc_attr_t* tcg_pts_attr_aik_create(certificate_t *aik); diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.c b/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.c index dce98e87d..6119b4973 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.c +++ b/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_dh_nonce_finish_t private_tcg_pts_attr_dh_nonce_finish_t; @@ -36,7 +36,7 @@ typedef struct private_tcg_pts_attr_dh_nonce_finish_t * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | D-H Initiator Nonce ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * */ #define PTS_DH_NONCE_FINISH_SIZE 12 @@ -53,14 +53,9 @@ struct private_tcg_pts_attr_dh_nonce_finish_t { tcg_pts_attr_dh_nonce_finish_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -71,7 +66,7 @@ struct private_tcg_pts_attr_dh_nonce_finish_t { * Noskip flag */ bool noskip_flag; - + /** * Selected Hashing Algorithm */ @@ -93,13 +88,7 @@ struct private_tcg_pts_attr_dh_nonce_finish_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_dh_nonce_finish_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_dh_nonce_finish_t *this) { return this->type; @@ -128,14 +117,18 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_DH_NONCE_FINISH_SIZE); writer->write_uint8 (writer, PTS_DH_NONCE_FINISH_RESERVED); writer->write_uint8 (writer, this->initiator_nonce.len); writer->write_uint16(writer, this->hash_algo); writer->write_data (writer, this->initiator_value); writer->write_data (writer, this->initiator_nonce); - - this->value = chunk_clone(writer->get_buf(writer)); + + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -217,7 +210,6 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_finish_create( 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, @@ -231,8 +223,7 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_finish_create( .get_initiator_nonce = _get_initiator_nonce, .get_initiator_value = _get_initiator_value, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_DH_NONCE_FINISH, + .type = { PEN_TCG, TCG_PTS_DH_NONCE_FINISH }, .hash_algo = hash_algo, .initiator_value = initiator_value, .initiator_nonce = chunk_clone(initiator_nonce), @@ -252,7 +243,6 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_finish_create_from_data(chunk_t value) 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, @@ -266,8 +256,7 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_finish_create_from_data(chunk_t value) .get_initiator_nonce = _get_initiator_nonce, .get_initiator_value = _get_initiator_value, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_DH_NONCE_FINISH, + .type = { PEN_TCG, TCG_PTS_DH_NONCE_FINISH }, .value = chunk_clone(value), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.h b/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.h index 7148065c5..57cb5a9b6 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.h +++ b/src/libpts/tcg/tcg_pts_attr_dh_nonce_finish.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_dh_nonce_finish tcg_pts_attr_dh_nonce_finish - * @{ @ingroup tcg_pts_attr_dh_nonce_finish + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_DH_NONCE_FINISH_H_ @@ -64,7 +64,7 @@ struct tcg_pts_attr_dh_nonce_finish_t { * @return DH Initiator Nonce */ chunk_t (*get_initiator_nonce)(tcg_pts_attr_dh_nonce_finish_t *this); - + }; /** @@ -76,7 +76,7 @@ struct tcg_pts_attr_dh_nonce_finish_t { */ pa_tnc_attr_t* tcg_pts_attr_dh_nonce_finish_create( pts_meas_algorithms_t hash_algo, - chunk_t initiator_value, + chunk_t initiator_value, chunk_t initiator_nonce); /** diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.c b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.c index 36266fe12..7761b977d 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.c +++ b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_dh_nonce_params_req_t private_tcg_pts_attr_dh_nonce_params_req_t; @@ -32,7 +32,7 @@ typedef struct private_tcg_pts_attr_dh_nonce_params_req_t * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Reserved | Min. Nonce Len | D-H Group Set | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * */ #define PTS_DH_NONCE_PARAMS_REQ_SIZE 4 @@ -49,14 +49,9 @@ struct private_tcg_pts_attr_dh_nonce_params_req_t { tcg_pts_attr_dh_nonce_params_req_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -67,7 +62,7 @@ struct private_tcg_pts_attr_dh_nonce_params_req_t { * Noskip flag */ bool noskip_flag; - + /** * Minimum acceptable length of nonce */ @@ -84,13 +79,7 @@ struct private_tcg_pts_attr_dh_nonce_params_req_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_dh_nonce_params_req_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_dh_nonce_params_req_t *this) { return this->type; @@ -119,12 +108,16 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_DH_NONCE_PARAMS_REQ_SIZE); writer->write_uint8 (writer, PTS_DH_NONCE_PARAMS_REQ_RESERVED); writer->write_uint8 (writer, this->min_nonce_len); writer->write_uint16(writer, this->dh_groups); - - this->value = chunk_clone(writer->get_buf(writer)); + + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -191,7 +184,6 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_req_create(u_int8_t min_nonce_len, 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, @@ -204,8 +196,7 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_req_create(u_int8_t min_nonce_len, .get_min_nonce_len = _get_min_nonce_len, .get_dh_groups = _get_dh_groups, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_DH_NONCE_PARAMS_REQ, + .type = { PEN_TCG, TCG_PTS_DH_NONCE_PARAMS_REQ }, .min_nonce_len = min_nonce_len, .dh_groups = dh_groups, .ref = 1, @@ -224,7 +215,6 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_req_create_from_data(chunk_t value) 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, @@ -237,8 +227,7 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_req_create_from_data(chunk_t value) .get_min_nonce_len = _get_min_nonce_len, .get_dh_groups = _get_dh_groups, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_DH_NONCE_PARAMS_REQ, + .type = { PEN_TCG, TCG_PTS_DH_NONCE_PARAMS_REQ }, .value = chunk_clone(value), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.h b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.h index 170077156..22e1bd189 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.h +++ b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_req.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_dh_nonce_params_req tcg_pts_attr_dh_nonce_params_req - * @{ @ingroup tcg_pts_attr_dh_nonce_params_req + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_DH_NONCE_PARAMS_REQ_H_ diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.c b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.c index 09bfa3aac..eb0d0e533 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.c +++ b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_dh_nonce_params_resp_t private_tcg_pts_attr_dh_nonce_params_resp_t; @@ -38,7 +38,7 @@ typedef struct private_tcg_pts_attr_dh_nonce_params_resp_t * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | D-H Responder Public Value ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * */ #define PTS_DH_NONCE_PARAMS_RESP_SIZE 16 @@ -55,14 +55,9 @@ struct private_tcg_pts_attr_dh_nonce_params_resp_t { tcg_pts_attr_dh_nonce_params_resp_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -73,7 +68,7 @@ struct private_tcg_pts_attr_dh_nonce_params_resp_t { * Noskip flag */ bool noskip_flag; - + /** * Selected Diffie Hellman group */ @@ -100,13 +95,7 @@ struct private_tcg_pts_attr_dh_nonce_params_resp_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_dh_nonce_params_resp_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_dh_nonce_params_resp_t *this) { return this->type; @@ -135,6 +124,10 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_DH_NONCE_PARAMS_RESP_SIZE); writer->write_uint24(writer, PTS_DH_NONCE_PARAMS_RESP_RESERVED); writer->write_uint8 (writer, this->responder_nonce.len); @@ -142,8 +135,8 @@ METHOD(pa_tnc_attr_t, build, void, writer->write_uint16(writer, this->hash_algo_set); writer->write_data (writer, this->responder_nonce); writer->write_data (writer, this->responder_value); - - this->value = chunk_clone(writer->get_buf(writer)); + + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -233,7 +226,6 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_resp_create(pts_dh_group_t dh_group, 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, @@ -248,8 +240,7 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_resp_create(pts_dh_group_t dh_group, .get_responder_nonce = _get_responder_nonce, .get_responder_value = _get_responder_value, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_DH_NONCE_PARAMS_RESP, + .type = { PEN_TCG, TCG_PTS_DH_NONCE_PARAMS_RESP }, .dh_group = dh_group, .hash_algo_set = hash_algo_set, .responder_nonce = chunk_clone(responder_nonce), @@ -270,7 +261,6 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_resp_create_from_data(chunk_t value) 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, @@ -285,8 +275,7 @@ pa_tnc_attr_t *tcg_pts_attr_dh_nonce_params_resp_create_from_data(chunk_t value) .get_responder_nonce = _get_responder_nonce, .get_responder_value = _get_responder_value, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_DH_NONCE_PARAMS_RESP, + .type = { PEN_TCG, TCG_PTS_DH_NONCE_PARAMS_RESP }, .value = chunk_clone(value), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.h b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.h index d2141f8b9..aaf85ef37 100644 --- a/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.h +++ b/src/libpts/tcg/tcg_pts_attr_dh_nonce_params_resp.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_dh_nonce_params_resp tcg_pts_attr_dh_nonce_params_resp - * @{ @ingroup tcg_pts_attr_dh_nonce_params_resp + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_DH_NONCE_PARAMS_RESP_H_ @@ -67,7 +67,7 @@ struct tcg_pts_attr_dh_nonce_params_resp_t { * @return DH Responder Public Value */ chunk_t (*get_responder_value)(tcg_pts_attr_dh_nonce_params_resp_t *this); - + }; /** @@ -76,11 +76,11 @@ struct tcg_pts_attr_dh_nonce_params_resp_t { * @param dh_group Selected DH group * @param hash_algo_set Set of supported hash algorithms * @param responder_nonce DH Responder Nonce - * @param responder_pub_val DH Responder Public value + * @param responder_value DH Responder Public value */ pa_tnc_attr_t* tcg_pts_attr_dh_nonce_params_resp_create(pts_dh_group_t dh_group, pts_meas_algorithms_t hash_algo_set, - chunk_t responder_nonce, + chunk_t responder_nonce, chunk_t responder_value); /** diff --git a/src/libpts/tcg/tcg_pts_attr_file_meas.c b/src/libpts/tcg/tcg_pts_attr_file_meas.c index 737da65c1..b9095f5be 100644 --- a/src/libpts/tcg/tcg_pts_attr_file_meas.c +++ b/src/libpts/tcg/tcg_pts_attr_file_meas.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,15 +18,15 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <utils/linked_list.h> -#include <debug.h> +#include <collections/linked_list.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_file_meas_t private_tcg_pts_attr_file_meas_t; /** * File Measurement * see section 3.19.2 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -64,25 +64,20 @@ struct private_tcg_pts_attr_file_meas_t { tcg_pts_attr_file_meas_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ bool noskip_flag; - + /** * PTS File Measurements */ @@ -94,13 +89,7 @@ struct private_tcg_pts_attr_file_meas_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_file_meas_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_file_meas_t *this) { return this->type; @@ -134,7 +123,11 @@ METHOD(pa_tnc_attr_t, build, void, char *filename; chunk_t measurement; bool first = TRUE; - + + if (this->value.ptr) + { + return; + } number_of_files = this->measurements->get_file_count(this->measurements); request_id = this->measurements->get_request_id(this->measurements); @@ -151,8 +144,7 @@ METHOD(pa_tnc_attr_t, build, void, first = FALSE; } writer->write_data (writer, measurement); - writer->write_uint16(writer, strlen(filename)); - writer->write_data (writer, chunk_create(filename, strlen(filename))); + writer->write_data16(writer, chunk_create(filename, strlen(filename))); } enumerator->destroy(enumerator); @@ -162,7 +154,7 @@ METHOD(pa_tnc_attr_t, build, void, writer->write_uint16(writer, 0); } - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -171,12 +163,12 @@ METHOD(pa_tnc_attr_t, process, status_t, { bio_reader_t *reader; u_int64_t number_of_files; - u_int16_t request_id, meas_len, filename_len; - size_t len; + u_int16_t request_id, meas_len; chunk_t measurement, filename; + size_t len; char buf[BUF_LEN]; status_t status = FAILED; - + if (this->value.len < PTS_FILE_MEAS_SIZE) { DBG1(DBG_TNC, "insufficient data for PTS file measurement header"); @@ -188,9 +180,10 @@ METHOD(pa_tnc_attr_t, process, status_t, reader->read_uint64(reader, &number_of_files); reader->read_uint16(reader, &request_id); reader->read_uint16(reader, &meas_len); - + *offset = PTS_FILE_MEAS_SIZE; + this->measurements = pts_file_meas_create(request_id); - + while (number_of_files--) { if (!reader->read_data(reader, meas_len, &measurement)) @@ -198,16 +191,14 @@ METHOD(pa_tnc_attr_t, process, status_t, DBG1(DBG_TNC, "insufficient data for PTS file measurement"); goto end; } - if (!reader->read_uint16(reader, &filename_len)) - { - DBG1(DBG_TNC, "insufficient data for filename length"); - goto end; - } - if (!reader->read_data(reader, filename_len, &filename)) + *offset += meas_len; + + if (!reader->read_data16(reader, &filename)) { DBG1(DBG_TNC, "insufficient data for filename"); goto end; } + *offset += 2 + filename.len; len = min(filename.len, BUF_LEN-1); memcpy(buf, filename.ptr, len); @@ -232,7 +223,7 @@ METHOD(pa_tnc_attr_t, destroy, void, { if (ref_put(&this->ref)) { - this->measurements->destroy(this->measurements); + DESTROY_IF(this->measurements); free(this->value.ptr); free(this); } @@ -254,7 +245,6 @@ pa_tnc_attr_t *tcg_pts_attr_file_meas_create(pts_file_meas_t *measurements) 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, @@ -266,8 +256,7 @@ pa_tnc_attr_t *tcg_pts_attr_file_meas_create(pts_file_meas_t *measurements) }, .get_measurements = _get_measurements, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_FILE_MEAS, + .type = { PEN_TCG, TCG_PTS_FILE_MEAS }, .measurements = measurements, .ref = 1, ); @@ -286,7 +275,6 @@ pa_tnc_attr_t *tcg_pts_attr_file_meas_create_from_data(chunk_t data) 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, @@ -298,8 +286,7 @@ pa_tnc_attr_t *tcg_pts_attr_file_meas_create_from_data(chunk_t data) }, .get_measurements = _get_measurements, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_FILE_MEAS, + .type = { PEN_TCG, TCG_PTS_FILE_MEAS }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_file_meas.h b/src/libpts/tcg/tcg_pts_attr_file_meas.h index c432ba9a9..8d50cd9c6 100644 --- a/src/libpts/tcg/tcg_pts_attr_file_meas.h +++ b/src/libpts/tcg/tcg_pts_attr_file_meas.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_file_meas tcg_pts_attr_file_meas - * @{ @ingroup tcg_pts_attr_file_meas + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_FILE_MEAS_H_ @@ -38,19 +38,19 @@ struct tcg_pts_attr_file_meas_t { * Public PA-TNC attribute interface */ pa_tnc_attr_t pa_tnc_attribute; - + /** * Get PTS File Measurements * * @return PTS File Measurements */ pts_file_meas_t* (*get_measurements)(tcg_pts_attr_file_meas_t *this); - + }; /** * Creates an tcg_pts_attr_file_meas_t object - * + * * @param measurements PTS File Measurements */ pa_tnc_attr_t* tcg_pts_attr_file_meas_create(pts_file_meas_t *measurements); diff --git a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.c b/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.c index 054285c4e..f263747a3 100644 --- a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.c +++ b/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_gen_attest_evid_t private_tcg_pts_attr_gen_attest_evid_t; @@ -33,7 +33,7 @@ typedef struct private_tcg_pts_attr_gen_attest_evid_t * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Reserved | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * */ #define PTS_GEN_ATTEST_EVID_SIZE 4 @@ -50,14 +50,9 @@ struct private_tcg_pts_attr_gen_attest_evid_t { tcg_pts_attr_gen_attest_evid_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -75,13 +70,7 @@ struct private_tcg_pts_attr_gen_attest_evid_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_gen_attest_evid_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_gen_attest_evid_t *this) { return this->type; @@ -110,10 +99,14 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_GEN_ATTEST_EVID_SIZE); writer->write_uint32 (writer, PTS_GEN_ATTEST_EVID_RESERVED); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -122,7 +115,7 @@ METHOD(pa_tnc_attr_t, process, status_t, { bio_reader_t *reader; u_int32_t reserved; - + if (this->value.len < PTS_GEN_ATTEST_EVID_SIZE) { DBG1(DBG_TNC, "insufficient data for Generate Attestation Evidence"); @@ -163,7 +156,6 @@ pa_tnc_attr_t *tcg_pts_attr_gen_attest_evid_create() 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, @@ -174,8 +166,7 @@ pa_tnc_attr_t *tcg_pts_attr_gen_attest_evid_create() .destroy = _destroy, }, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_GEN_ATTEST_EVID, + .type = { PEN_TCG, TCG_PTS_GEN_ATTEST_EVID }, .ref = 1, ); @@ -193,7 +184,6 @@ pa_tnc_attr_t *tcg_pts_attr_gen_attest_evid_create_from_data(chunk_t data) 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, @@ -204,8 +194,7 @@ pa_tnc_attr_t *tcg_pts_attr_gen_attest_evid_create_from_data(chunk_t data) .destroy = _destroy, }, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_GEN_ATTEST_EVID, + .type = { PEN_TCG, TCG_PTS_GEN_ATTEST_EVID }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.h b/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.h index 0a65f2143..88f070406 100644 --- a/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.h +++ b/src/libpts/tcg/tcg_pts_attr_gen_attest_evid.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_gen_attest_evid tcg_pts_attr_gen_attest_evid - * @{ @ingroup tcg_pts_attr_gen_attest_evid + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_GEN_ATTEST_EVID_H_ diff --git a/src/libpts/tcg/tcg_pts_attr_get_aik.c b/src/libpts/tcg/tcg_pts_attr_get_aik.c index 1875375a4..cf944d2a9 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_aik.c +++ b/src/libpts/tcg/tcg_pts_attr_get_aik.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_get_aik_t private_tcg_pts_attr_get_aik_t; @@ -47,14 +47,9 @@ struct private_tcg_pts_attr_get_aik_t { tcg_pts_attr_get_aik_t public; /** - * Attribute vendor ID + * Vendor-specific attribute type */ - pen_t vendor_id; - - /** - * Attribute type - */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -72,13 +67,7 @@ struct private_tcg_pts_attr_get_aik_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_get_aik_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_get_aik_t *this) { return this->type; @@ -107,10 +96,14 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_GET_AIK_SIZE); writer->write_uint32 (writer, PTS_GET_AIK_RESERVED); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -119,7 +112,7 @@ METHOD(pa_tnc_attr_t, process, status_t, { bio_reader_t *reader; u_int32_t reserved; - + if (this->value.len < PTS_GET_AIK_SIZE) { DBG1(DBG_TNC, "insufficient data for Get AIK"); @@ -160,7 +153,6 @@ pa_tnc_attr_t *tcg_pts_attr_get_aik_create() 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, @@ -171,8 +163,7 @@ pa_tnc_attr_t *tcg_pts_attr_get_aik_create() .destroy = _destroy, }, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_GET_AIK, + .type = { PEN_TCG, TCG_PTS_GET_AIK }, .ref = 1, ); @@ -190,7 +181,6 @@ pa_tnc_attr_t *tcg_pts_attr_get_aik_create_from_data(chunk_t data) 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, @@ -201,8 +191,7 @@ pa_tnc_attr_t *tcg_pts_attr_get_aik_create_from_data(chunk_t data) .destroy = _destroy, }, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_GET_AIK, + .type = { PEN_TCG, TCG_PTS_GET_AIK }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_get_aik.h b/src/libpts/tcg/tcg_pts_attr_get_aik.h index e5c74b4dc..aca890a20 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_aik.h +++ b/src/libpts/tcg/tcg_pts_attr_get_aik.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_get_aik tcg_pts_attr_get_aik - * @{ @ingroup tcg_pts_attr_get_aik + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_GET_AIK_H_ diff --git a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.c b/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.c index cb6834ca5..647c426ed 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.c +++ b/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_get_tpm_version_info_t private_tcg_pts_attr_get_tpm_version_info_t; @@ -33,7 +33,7 @@ typedef struct private_tcg_pts_attr_get_tpm_version_info_t * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Reserved | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * */ #define PTS_GET_TPM_VER_INFO_SIZE 4 @@ -50,14 +50,9 @@ struct private_tcg_pts_attr_get_tpm_version_info_t { tcg_pts_attr_get_tpm_version_info_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -75,13 +70,7 @@ struct private_tcg_pts_attr_get_tpm_version_info_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_get_tpm_version_info_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_get_tpm_version_info_t *this) { return this->type; @@ -110,10 +99,14 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_GET_TPM_VER_INFO_SIZE); writer->write_uint32 (writer, PTS_GET_TPM_VER_INFO_RESERVED); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -122,7 +115,7 @@ METHOD(pa_tnc_attr_t, process, status_t, { bio_reader_t *reader; u_int32_t reserved; - + if (this->value.len < PTS_GET_TPM_VER_INFO_SIZE) { DBG1(DBG_TNC, "insufficient data for Get TPM Version Information"); @@ -163,7 +156,6 @@ pa_tnc_attr_t *tcg_pts_attr_get_tpm_version_info_create() 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, @@ -174,8 +166,7 @@ pa_tnc_attr_t *tcg_pts_attr_get_tpm_version_info_create() .destroy = _destroy, }, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_GET_TPM_VERSION_INFO, + .type = { PEN_TCG, TCG_PTS_GET_TPM_VERSION_INFO }, .ref = 1, ); @@ -193,7 +184,6 @@ pa_tnc_attr_t *tcg_pts_attr_get_tpm_version_info_create_from_data(chunk_t data) 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, @@ -204,8 +194,7 @@ pa_tnc_attr_t *tcg_pts_attr_get_tpm_version_info_create_from_data(chunk_t data) .destroy = _destroy, }, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_GET_TPM_VERSION_INFO, + .type = { PEN_TCG, TCG_PTS_GET_TPM_VERSION_INFO }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.h b/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.h index 1b693402a..360049690 100644 --- a/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.h +++ b/src/libpts/tcg/tcg_pts_attr_get_tpm_version_info.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_get_tpm_version_info tcg_pts_attr_get_tpm_version_info - * @{ @ingroup tcg_pts_attr_get_tpm_version_info + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_GET_TPM_VERSION_INFO_H_ diff --git a/src/libpts/tcg/tcg_pts_attr_meas_algo.c b/src/libpts/tcg/tcg_pts_attr_meas_algo.c index ed520e3cd..a4dac9070 100644 --- a/src/libpts/tcg/tcg_pts_attr_meas_algo.c +++ b/src/libpts/tcg/tcg_pts_attr_meas_algo.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,12 +18,12 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_meas_algo_t private_tcg_pts_attr_meas_algo_t; /** - * PTS Measurement Algorithm + * PTS Measurement Algorithm * see section 3.9.1 of PTS Protocol: Binding to TNC IF-M Specification * * 1 2 3 @@ -31,7 +31,7 @@ typedef struct private_tcg_pts_attr_meas_algo_t private_tcg_pts_attr_meas_algo_t * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Reserved | Hash Algorithm Set | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * */ #define PTS_MEAS_ALGO_SIZE 4 @@ -48,14 +48,9 @@ struct private_tcg_pts_attr_meas_algo_t { tcg_pts_attr_meas_algo_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -66,7 +61,7 @@ struct private_tcg_pts_attr_meas_algo_t { * Noskip flag */ bool noskip_flag; - + /** * Set of algorithms */ @@ -78,13 +73,7 @@ struct private_tcg_pts_attr_meas_algo_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_meas_algo_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_meas_algo_t *this) { return this->type; @@ -113,10 +102,14 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_MEAS_ALGO_SIZE); writer->write_uint16(writer, PTS_MEAS_ALGO_RESERVED); writer->write_uint16(writer, this->algorithms); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -175,7 +168,6 @@ pa_tnc_attr_t *tcg_pts_attr_meas_algo_create(pts_meas_algorithms_t algorithms, 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, @@ -187,8 +179,8 @@ pa_tnc_attr_t *tcg_pts_attr_meas_algo_create(pts_meas_algorithms_t algorithms, }, .get_algorithms = _get_algorithms, }, - .vendor_id = PEN_TCG, - .type = selection ? TCG_PTS_MEAS_ALGO_SELECTION : TCG_PTS_MEAS_ALGO, + .type = { PEN_TCG, + selection ? TCG_PTS_MEAS_ALGO_SELECTION : TCG_PTS_MEAS_ALGO }, .algorithms = algorithms, .ref = 1, ); @@ -208,7 +200,6 @@ pa_tnc_attr_t *tcg_pts_attr_meas_algo_create_from_data(chunk_t data, 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, @@ -220,8 +211,8 @@ pa_tnc_attr_t *tcg_pts_attr_meas_algo_create_from_data(chunk_t data, }, .get_algorithms = _get_algorithms, }, - .vendor_id = PEN_TCG, - .type = selection ? TCG_PTS_MEAS_ALGO_SELECTION : TCG_PTS_MEAS_ALGO, + .type = { PEN_TCG, + selection ? TCG_PTS_MEAS_ALGO_SELECTION : TCG_PTS_MEAS_ALGO }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_meas_algo.h b/src/libpts/tcg/tcg_pts_attr_meas_algo.h index 885e2c16b..758100bbc 100644 --- a/src/libpts/tcg/tcg_pts_attr_meas_algo.h +++ b/src/libpts/tcg/tcg_pts_attr_meas_algo.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_meas_algo tcg_pts_attr_meas_algo - * @{ @ingroup tcg_pts_attr_meas_algo + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_MEAS_ALGO_H_ diff --git a/src/libpts/tcg/tcg_pts_attr_proto_caps.c b/src/libpts/tcg/tcg_pts_attr_proto_caps.c index 055c750ff..6473ea808 100644 --- a/src/libpts/tcg/tcg_pts_attr_proto_caps.c +++ b/src/libpts/tcg/tcg_pts_attr_proto_caps.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_proto_caps_t private_tcg_pts_attr_proto_caps_t; @@ -31,7 +31,7 @@ typedef struct private_tcg_pts_attr_proto_caps_t private_tcg_pts_attr_proto_caps * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Reserved |C|V|D|T|X| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * */ #define PTS_PROTO_CAPS_SIZE 4 @@ -48,14 +48,9 @@ struct private_tcg_pts_attr_proto_caps_t { tcg_pts_attr_proto_caps_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -66,7 +61,7 @@ struct private_tcg_pts_attr_proto_caps_t { * Noskip flag */ bool noskip_flag; - + /** * Set of flags */ @@ -78,13 +73,7 @@ struct private_tcg_pts_attr_proto_caps_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_proto_caps_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_proto_caps_t *this) { return this->type; @@ -113,11 +102,15 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_PROTO_CAPS_SIZE); writer->write_uint16(writer, PTS_PROTO_CAPS_RESERVED); writer->write_uint16(writer, this->flags); - - this->value = chunk_clone(writer->get_buf(writer)); + + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -176,7 +169,6 @@ pa_tnc_attr_t *tcg_pts_attr_proto_caps_create(pts_proto_caps_flag_t flags, 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, @@ -188,8 +180,8 @@ pa_tnc_attr_t *tcg_pts_attr_proto_caps_create(pts_proto_caps_flag_t flags, }, .get_flags = _get_flags, }, - .vendor_id = PEN_TCG, - .type = request ? TCG_PTS_REQ_PROTO_CAPS : TCG_PTS_PROTO_CAPS, + .type = { PEN_TCG, + request ? TCG_PTS_REQ_PROTO_CAPS : TCG_PTS_PROTO_CAPS }, .flags = flags, .ref = 1, ); @@ -208,7 +200,6 @@ pa_tnc_attr_t *tcg_pts_attr_proto_caps_create_from_data(chunk_t data, 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, @@ -220,8 +211,8 @@ pa_tnc_attr_t *tcg_pts_attr_proto_caps_create_from_data(chunk_t data, }, .get_flags = _get_flags, }, - .vendor_id = PEN_TCG, - .type = request ? TCG_PTS_REQ_PROTO_CAPS : TCG_PTS_PROTO_CAPS, + .type = { PEN_TCG, + request ? TCG_PTS_REQ_PROTO_CAPS : TCG_PTS_PROTO_CAPS }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_proto_caps.h b/src/libpts/tcg/tcg_pts_attr_proto_caps.h index 15cfbc7cb..cc59f4ef1 100644 --- a/src/libpts/tcg/tcg_pts_attr_proto_caps.h +++ b/src/libpts/tcg/tcg_pts_attr_proto_caps.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_proto_caps tcg_pts_attr_proto_caps - * @{ @ingroup tcg_pts_attr_proto_caps + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_PROTO_CAPS_H_ diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meas.c b/src/libpts/tcg/tcg_pts_attr_req_file_meas.c index 17781f745..f0bc7cf60 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meas.c +++ b/src/libpts/tcg/tcg_pts_attr_req_file_meas.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,14 +18,16 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> + +#include <string.h> typedef struct private_tcg_pts_attr_req_file_meas_t private_tcg_pts_attr_req_file_meas_t; /** * Request File Measurement * see section 3.19.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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -54,25 +56,20 @@ struct private_tcg_pts_attr_req_file_meas_t { tcg_pts_attr_req_file_meas_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ bool noskip_flag; - + /** * Directory Contents flag */ @@ -82,12 +79,12 @@ struct private_tcg_pts_attr_req_file_meas_t { * Request ID */ u_int16_t request_id; - + /** * UTF8 Encoding of Delimiter Character */ u_int32_t delimiter; - + /** * Fully Qualified File Pathname */ @@ -99,13 +96,7 @@ struct private_tcg_pts_attr_req_file_meas_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_req_file_meas_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_req_file_meas_t *this) { return this->type; @@ -135,7 +126,11 @@ METHOD(pa_tnc_attr_t, build, void, u_int8_t flags = PTS_REQ_FILE_MEAS_NO_FLAGS; chunk_t pathname; bio_writer_t *writer; - + + if (this->value.ptr) + { + return; + } if (this->directory_flag) { flags |= DIRECTORY_CONTENTS_FLAG; @@ -148,7 +143,7 @@ METHOD(pa_tnc_attr_t, build, void, writer->write_uint16(writer, this->request_id); writer->write_uint32(writer, this->delimiter); writer->write_data (writer, pathname); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -159,7 +154,7 @@ METHOD(pa_tnc_attr_t, process, status_t, u_int8_t flags; u_int8_t reserved; chunk_t pathname; - + if (this->value.len < PTS_REQ_FILE_MEAS_SIZE) { DBG1(DBG_TNC, "insufficient data for Request File Measurement"); @@ -176,10 +171,7 @@ METHOD(pa_tnc_attr_t, process, status_t, this->directory_flag = (flags & DIRECTORY_CONTENTS_FLAG) != PTS_REQ_FILE_MEAS_NO_FLAGS; - - this->pathname = malloc(pathname.len + 1); - memcpy(this->pathname, pathname.ptr, pathname.len); - this->pathname[pathname.len] = '\0'; + this->pathname = strndup(pathname.ptr, pathname.len); reader->destroy(reader); return SUCCESS; @@ -240,7 +232,6 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create(bool directory_flag, 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, @@ -255,8 +246,7 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create(bool directory_flag, .get_delimiter = _get_delimiter, .get_pathname = _get_pathname, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_REQ_FILE_MEAS, + .type = { PEN_TCG, TCG_PTS_REQ_FILE_MEAS }, .directory_flag = directory_flag, .request_id = request_id, .delimiter = delimiter, @@ -278,7 +268,6 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create_from_data(chunk_t data) 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, @@ -293,8 +282,7 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create_from_data(chunk_t data) .get_delimiter = _get_delimiter, .get_pathname = _get_pathname, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_REQ_FILE_MEAS, + .type = { PEN_TCG, TCG_PTS_REQ_FILE_MEAS }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meas.h b/src/libpts/tcg/tcg_pts_attr_req_file_meas.h index 19d189eff..85a6b9a43 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meas.h +++ b/src/libpts/tcg/tcg_pts_attr_req_file_meas.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_req_file_meas tcg_pts_attr_req_file_meas - * @{ @ingroup tcg_pts_attr_req_file_meas + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_REQ_FILE_MEAS_H_ @@ -36,7 +36,7 @@ struct tcg_pts_attr_req_file_meas_t { * Public PA-TNC attribute interface */ pa_tnc_attr_t pa_tnc_attribute; - + /** * Get flag for PTS Request File Measurement * @@ -50,7 +50,6 @@ struct tcg_pts_attr_req_file_meas_t { * @return Request ID */ u_int16_t (*get_request_id)(tcg_pts_attr_req_file_meas_t *this); - /** * Get Delimiter @@ -58,19 +57,19 @@ struct tcg_pts_attr_req_file_meas_t { * @return UTF-8 encoding of a Delimiter Character */ u_int32_t (*get_delimiter)(tcg_pts_attr_req_file_meas_t *this); - + /** * Get Fully Qualified File Pathname * * @return Pathname */ char* (*get_pathname)(tcg_pts_attr_req_file_meas_t *this); - + }; /** * Creates an tcg_pts_attr_req_file_meas_t object - * + * * @param directory_flag Directory Contents Flag * @param request_id Request ID * @param delimiter Delimiter Character diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meta.c b/src/libpts/tcg/tcg_pts_attr_req_file_meta.c index bef6b5db6..e475cd35b 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meta.c +++ b/src/libpts/tcg/tcg_pts_attr_req_file_meta.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,14 +18,16 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> + +#include <string.h> typedef struct private_tcg_pts_attr_req_file_meta_t private_tcg_pts_attr_req_file_meta_t; /** * Request File Metadata * see section 3.17.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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -52,35 +54,30 @@ struct private_tcg_pts_attr_req_file_meta_t { tcg_pts_attr_req_file_meta_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ bool noskip_flag; - + /** * Directory Contents flag */ bool directory_flag; - + /** * UTF8 Encoding of Delimiter Character */ u_int8_t delimiter; - + /** * Fully Qualified File Pathname */ @@ -92,13 +89,7 @@ struct private_tcg_pts_attr_req_file_meta_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_req_file_meta_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_req_file_meta_t *this) { return this->type; @@ -128,7 +119,11 @@ METHOD(pa_tnc_attr_t, build, void, u_int8_t flags = PTS_REQ_FILE_META_NO_FLAGS; chunk_t pathname; bio_writer_t *writer; - + + if (this->value.ptr) + { + return; + } if (this->directory_flag) { flags |= DIRECTORY_CONTENTS_FLAG; @@ -139,9 +134,9 @@ METHOD(pa_tnc_attr_t, build, void, writer->write_uint8 (writer, flags); writer->write_uint8 (writer, this->delimiter); writer->write_uint16(writer, PTS_REQ_FILE_META_RESERVED); - + writer->write_data (writer, pathname); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -152,7 +147,7 @@ METHOD(pa_tnc_attr_t, process, status_t, u_int8_t flags; u_int16_t reserved; chunk_t pathname; - + if (this->value.len < PTS_REQ_FILE_META_SIZE) { DBG1(DBG_TNC, "insufficient data for Request File Metadata"); @@ -164,15 +159,12 @@ METHOD(pa_tnc_attr_t, process, status_t, reader->read_uint8 (reader, &flags); reader->read_uint8 (reader, &this->delimiter); reader->read_uint16(reader, &reserved); - + reader->read_data (reader, reader->remaining(reader), &pathname); this->directory_flag = (flags & DIRECTORY_CONTENTS_FLAG) != PTS_REQ_FILE_META_NO_FLAGS; - - this->pathname = malloc(pathname.len + 1); - memcpy(this->pathname, pathname.ptr, pathname.len); - this->pathname[pathname.len] = '\0'; + this->pathname = strndup(pathname.ptr, pathname.len); reader->destroy(reader); return SUCCESS; @@ -226,7 +218,6 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meta_create(bool directory_flag, 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, @@ -240,8 +231,7 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meta_create(bool directory_flag, .get_delimiter = _get_delimiter, .get_pathname = _get_pathname, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_REQ_FILE_META, + .type = { PEN_TCG, TCG_PTS_REQ_FILE_META }, .directory_flag = directory_flag, .delimiter = delimiter, .pathname = strdup(pathname), @@ -262,7 +252,6 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meta_create_from_data(chunk_t data) 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, @@ -276,8 +265,7 @@ pa_tnc_attr_t *tcg_pts_attr_req_file_meta_create_from_data(chunk_t data) .get_delimiter = _get_delimiter, .get_pathname = _get_pathname, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_REQ_FILE_META, + .type = { PEN_TCG, TCG_PTS_REQ_FILE_META }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_req_file_meta.h b/src/libpts/tcg/tcg_pts_attr_req_file_meta.h index 7620c50ab..311418be2 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_file_meta.h +++ b/src/libpts/tcg/tcg_pts_attr_req_file_meta.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_req_file_meta tcg_pts_attr_req_file_meta - * @{ @ingroup tcg_pts_attr_req_file_meta + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_REQ_FILE_META_H_ @@ -36,7 +36,7 @@ struct tcg_pts_attr_req_file_meta_t { * Public PA-TNC attribute interface */ pa_tnc_attr_t pa_tnc_attribute; - + /** * Get directory flag for PTS Request File Metadata * @@ -50,19 +50,19 @@ struct tcg_pts_attr_req_file_meta_t { * @return UTF-8 encoding of a Delimiter Character */ u_int8_t (*get_delimiter)(tcg_pts_attr_req_file_meta_t *this); - + /** * Get Fully Qualified File Pathname * * @return Pathname */ char* (*get_pathname)(tcg_pts_attr_req_file_meta_t *this); - + }; /** * Creates an tcg_pts_attr_req_file_meta_t object - * + * * @param directory_flag Directory Contents Flag * @param delimiter Delimiter Character * @param pathname File Pathname diff --git a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.c b/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.c index bfd108b9f..5249fa2ad 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.c +++ b/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,8 +18,8 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <utils/linked_list.h> -#include <debug.h> +#include <collections/linked_list.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_req_func_comp_evid_t private_tcg_pts_attr_req_func_comp_evid_t; @@ -47,7 +47,7 @@ typedef struct private_tcg_pts_attr_req_func_comp_evid_t private_tcg_pts_attr_re */ /** - * Component Functional Name Structure + * Component Functional Name Structure * (see section 5.1 of PTS Protocol: Binding to TNC IF-M Specification) * * 1 2 3 @@ -58,7 +58,7 @@ typedef struct private_tcg_pts_attr_req_func_comp_evid_t private_tcg_pts_attr_re * | Component Functional Name | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - + #define PTS_REQ_FUNC_COMP_EVID_SIZE 12 #define PTS_REQ_FUNC_COMP_FAMILY_MASK 0xC0 @@ -73,20 +73,15 @@ struct private_tcg_pts_attr_req_func_comp_evid_t { tcg_pts_attr_req_func_comp_evid_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ @@ -140,13 +135,7 @@ static void free_entry(entry_t *this) } } -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_req_func_comp_evid_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_req_func_comp_evid_t *this) { return this->type; @@ -177,6 +166,10 @@ METHOD(pa_tnc_attr_t, build, void, enumerator_t *enumerator; entry_t *entry; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_REQ_FUNC_COMP_EVID_SIZE); enumerator = this->list->create_enumerator(this->list); @@ -190,7 +183,7 @@ METHOD(pa_tnc_attr_t, build, void, } enumerator->destroy(enumerator); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -256,7 +249,7 @@ METHOD(pa_tnc_attr_t, process, status_t, entry->flags = flags; entry->depth = depth; entry->name = pts_comp_func_name_create(vendor_id, name, qualifier); - + this->list->insert_last(this->list, entry); } status = SUCCESS; @@ -320,7 +313,6 @@ pa_tnc_attr_t *tcg_pts_attr_req_func_comp_evid_create(void) 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, @@ -334,8 +326,7 @@ pa_tnc_attr_t *tcg_pts_attr_req_func_comp_evid_create(void) .get_count = _get_count, .create_enumerator = _create_enumerator, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_REQ_FUNC_COMP_EVID, + .type = { PEN_TCG, TCG_PTS_REQ_FUNC_COMP_EVID }, .list = linked_list_create(), .ref = 1, ); @@ -353,7 +344,6 @@ pa_tnc_attr_t *tcg_pts_attr_req_func_comp_evid_create_from_data(chunk_t data) 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, @@ -367,8 +357,7 @@ pa_tnc_attr_t *tcg_pts_attr_req_func_comp_evid_create_from_data(chunk_t data) .get_count = _get_count, .create_enumerator = _create_enumerator, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_REQ_FUNC_COMP_EVID, + .type = { PEN_TCG, TCG_PTS_REQ_FUNC_COMP_EVID }, .list = linked_list_create(), .value = chunk_clone(data), .ref = 1, diff --git a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.h b/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.h index 031955aca..749413c2e 100644 --- a/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.h +++ b/src/libpts/tcg/tcg_pts_attr_req_func_comp_evid.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_req_func_comp_evid tcg_pts_attr_req_func_comp_evid - * @{ @ingroup tcg_pts_attr_req_func_comp_evid + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_REQ_FUNC_COMP_EVID_H_ @@ -37,7 +37,7 @@ struct tcg_pts_attr_req_func_comp_evid_t { * Public PA-TNC attribute interface */ pa_tnc_attr_t pa_tnc_attribute; - + /** * Add a component to the Functional Component Evidence Request * @@ -62,7 +62,7 @@ struct tcg_pts_attr_req_func_comp_evid_t { * @return Entry enumerator */ enumerator_t* (*create_enumerator)(tcg_pts_attr_req_func_comp_evid_t *this); - + }; /** diff --git a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.c b/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.c index d2c197ac4..40f380ab4 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.c +++ b/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,16 +18,16 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> #include <time.h> typedef struct private_tcg_pts_attr_simple_comp_evid_t private_tcg_pts_attr_simple_comp_evid_t; /** - * Simple Component Evidence + * 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -66,7 +66,7 @@ typedef struct private_tcg_pts_attr_simple_comp_evid_t private_tcg_pts_attr_simp */ /** - * Specific Functional Component -> Component Functional Name Structure + * Specific Functional Component -> Component Functional Name Structure * see section 5.1 of PTS Protocol: Binding to TNC IF-M Specification * * 1 2 3 @@ -100,25 +100,20 @@ struct private_tcg_pts_attr_simple_comp_evid_t { tcg_pts_attr_simple_comp_evid_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ bool noskip_flag; - + /** * PTS Component Evidence */ @@ -130,13 +125,7 @@ struct private_tcg_pts_attr_simple_comp_evid_t { refcount_t ref; }; -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, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_simple_comp_evid_t *this) { return this->type; @@ -185,16 +174,22 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; bool has_pcr_info; - char utc_time_buf[25]; + char utc_time_buf[25], *policy_uri; u_int8_t flags; + u_int16_t len; u_int32_t depth, extended_pcr; pts_comp_func_name_t *name; pts_meas_algorithms_t hash_algorithm; pts_pcr_transform_t transform; pts_comp_evid_validation_t validation; time_t measurement_time; - chunk_t measurement, utc_time, pcr_before, pcr_after, policy_uri; - + chunk_t measurement, utc_time, pcr_before, pcr_after; + + if (this->value.ptr) + { + return; + } + /* Extract parameters from comp_evidence_t object */ name = this->evidence->get_comp_func_name(this->evidence, &depth); @@ -205,7 +200,7 @@ METHOD(pa_tnc_attr_t, build, void, &pcr_before, &pcr_after); validation = this->evidence->get_validation(this->evidence, &policy_uri); - + /* Determine the flags to set*/ flags = validation; if (has_pcr_info) @@ -213,7 +208,7 @@ METHOD(pa_tnc_attr_t, build, void, flags |= PTS_SIMPLE_COMP_EVID_FLAG_PCR; } - utc_time = chunk_create(utc_time_buf, PTS_SIMPLE_COMP_EVID_MEAS_TIME_SIZE); + utc_time = chunk_create(utc_time_buf, PTS_SIMPLE_COMP_EVID_MEAS_TIME_SIZE); measurement_time_to_utc(measurement_time, &utc_time); writer = bio_writer_create(PTS_SIMPLE_COMP_EVID_SIZE); @@ -229,13 +224,14 @@ METHOD(pa_tnc_attr_t, build, void, writer->write_uint8 (writer, transform); writer->write_uint8 (writer, PTS_SIMPLE_COMP_EVID_RESERVED); writer->write_data (writer, utc_time); - + /* Optional fields */ if (validation == PTS_COMP_EVID_VALIDATION_FAILED || validation == PTS_COMP_EVID_VALIDATION_PASSED) { - writer->write_uint16(writer, policy_uri.len); - writer->write_data (writer, policy_uri); + len = strlen(policy_uri); + writer->write_uint16(writer, len); + writer->write_data (writer, chunk_create(policy_uri, len)); } if (has_pcr_info) { @@ -245,8 +241,8 @@ METHOD(pa_tnc_attr_t, build, void, } writer->write_data(writer, measurement); - - this->value = chunk_clone(writer->get_buf(writer)); + + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -254,7 +250,7 @@ static const int days[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 33 static const int tm_leap_1970 = 477; /** - * Convert Simple Component Evidence UTS string format to time_t + * Convert Simple Component Evidence UTS string format to time_t */ bool measurement_time_from_utc(time_t *measurement_time, chunk_t utc_time) { @@ -318,7 +314,7 @@ METHOD(pa_tnc_attr_t, process, status_t, return FAILED; } reader = bio_reader_create(this->value); - + reader->read_uint8 (reader, &flags); reader->read_uint24(reader, &depth); reader->read_uint24(reader, &vendor_id); @@ -368,7 +364,7 @@ METHOD(pa_tnc_attr_t, process, status_t, } has_validation = TRUE; } - + /* Are optional PCR value fields included? */ if (flags & PTS_SIMPLE_COMP_EVID_FLAG_PCR) { @@ -393,11 +389,11 @@ METHOD(pa_tnc_attr_t, process, status_t, has_pcr_info = TRUE; } - /* Measurement field comes at the very end */ + /* Measurement field comes at the very end */ reader->read_data(reader,reader->remaining(reader), &measurement); reader->destroy(reader); - /* Create Component Functional Name object */ + /* Create Component Functional Name object */ name = pts_comp_func_name_create(vendor_id, comp_name, qualifier); /* Create Component Evidence object */ @@ -409,8 +405,13 @@ METHOD(pa_tnc_attr_t, process, status_t, /* Add options */ if (has_validation) { - policy_uri = chunk_clone(policy_uri); - this->evidence->set_validation(this->evidence, validation, policy_uri); + char buf[BUF_LEN]; + size_t len; + + len = min(policy_uri.len, BUF_LEN-1); + memcpy(buf, policy_uri.ptr, len); + buf[len] = '\0'; + this->evidence->set_validation(this->evidence, validation, buf); } if (has_pcr_info) { @@ -438,7 +439,7 @@ METHOD(pa_tnc_attr_t, destroy, void, { if (ref_put(&this->ref)) { - this->evidence->destroy(this->evidence); + DESTROY_IF(this->evidence); free(this->value.ptr); free(this); } @@ -456,11 +457,10 @@ METHOD(tcg_pts_attr_simple_comp_evid_t, get_comp_evidence, pts_comp_evidence_t*, pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create(pts_comp_evidence_t *evid) { 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, @@ -472,8 +472,7 @@ pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create(pts_comp_evidence_t *evid) }, .get_comp_evidence = _get_comp_evidence, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_SIMPLE_COMP_EVID, + .type = { PEN_TCG, TCG_PTS_SIMPLE_COMP_EVID }, .evidence = evid, .ref = 1, ); @@ -492,7 +491,6 @@ pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create_from_data(chunk_t data) 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, @@ -504,8 +502,7 @@ pa_tnc_attr_t *tcg_pts_attr_simple_comp_evid_create_from_data(chunk_t data) }, .get_comp_evidence = _get_comp_evidence, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_SIMPLE_COMP_EVID, + .type = { PEN_TCG, TCG_PTS_SIMPLE_COMP_EVID }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.h b/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.h index 3a80904c8..494418261 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.h +++ b/src/libpts/tcg/tcg_pts_attr_simple_comp_evid.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_simple_comp_evid tcg_pts_attr_simple_comp_evid - * @{ @ingroup tcg_pts_attr_simple_comp_evid + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_SIMPLE_COMP_EVID_H_ @@ -24,7 +24,7 @@ typedef struct tcg_pts_attr_simple_comp_evid_t tcg_pts_attr_simple_comp_evid_t; #include "tcg_attr.h" -#include "pts/components/pts_comp_evidence.h" +#include "pts/components/pts_comp_evidence.h" #include "pa_tnc/pa_tnc_attr.h" /** @@ -44,12 +44,12 @@ struct tcg_pts_attr_simple_comp_evid_t { * @return Component Evidence */ pts_comp_evidence_t* (*get_comp_evidence)(tcg_pts_attr_simple_comp_evid_t *this); - + }; /** * Creates an tcg_pts_attr_simple_comp_evid_t object - * + * * @param evid Component Evidence */ pa_tnc_attr_t* tcg_pts_attr_simple_comp_evid_create(pts_comp_evidence_t *evid); diff --git a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.c b/src/libpts/tcg/tcg_pts_attr_simple_evid_final.c index 27720d509..baadd943f 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.c +++ b/src/libpts/tcg/tcg_pts_attr_simple_evid_final.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -19,14 +19,14 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_simple_evid_final_t private_tcg_pts_attr_simple_evid_final_t; /** * Simple Evidence Final * see section 3.15.2 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -58,20 +58,15 @@ struct private_tcg_pts_attr_simple_evid_final_t { tcg_pts_attr_simple_evid_final_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ @@ -86,22 +81,22 @@ struct private_tcg_pts_attr_simple_evid_final_t { * Optional Composite Hash Algorithm */ pts_meas_algorithms_t comp_hash_algorithm; - + /** * Optional TPM PCR Composite */ chunk_t pcr_comp; - + /** * Optional TPM Quote Signature */ chunk_t tpm_quote_sig; - + /** * Is Evidence Signature included? */ bool has_evid_sig; - + /** * Optional Evidence Signature */ @@ -113,13 +108,7 @@ struct private_tcg_pts_attr_simple_evid_final_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_simple_evid_final_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_simple_evid_final_t *this) { return this->type; @@ -168,7 +157,11 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; u_int8_t flags; - + + if (this->value.ptr) + { + return; + } flags = this->flags & PTS_SIMPLE_EVID_FINAL_FLAG_MASK; if (this->has_evid_sig) @@ -179,7 +172,7 @@ METHOD(pa_tnc_attr_t, build, void, writer = bio_writer_create(PTS_SIMPLE_EVID_FINAL_SIZE); writer->write_uint8 (writer, flags); writer->write_uint8 (writer, PTS_SIMPLE_EVID_FINAL_RESERVED); - + /** Optional Composite Hash Algorithm field is always present * Field has value of all zeroes if not used. * Implemented adhering the suggestion of Paul Sangster 28.Oct.2011 @@ -200,8 +193,8 @@ METHOD(pa_tnc_attr_t, build, void, { writer->write_data (writer, this->evid_sig); } - - this->value = chunk_clone(writer->get_buf(writer)); + + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -213,7 +206,7 @@ METHOD(pa_tnc_attr_t, process, status_t, u_int16_t algorithm; u_int32_t pcr_comp_len, tpm_quote_sig_len, evid_sig_len; status_t status = FAILED; - + if (this->value.len < PTS_SIMPLE_EVID_FINAL_SIZE) { DBG1(DBG_TNC, "insufficient data for Simple Evidence Final"); @@ -221,7 +214,7 @@ METHOD(pa_tnc_attr_t, process, status_t, return FAILED; } reader = bio_reader_create(this->value); - + reader->read_uint8(reader, &flags); reader->read_uint8(reader, &reserved); @@ -233,10 +226,10 @@ METHOD(pa_tnc_attr_t, process, status_t, * Field has value of all zeroes if not used. * Implemented adhering the suggestion of Paul Sangster 28.Oct.2011 */ - + reader->read_uint16(reader, &algorithm); this->comp_hash_algorithm = algorithm; - + /* Optional Composite Hash Algorithm and TPM PCR Composite fields */ if (this->flags != PTS_SIMPLE_EVID_FINAL_NO) { @@ -253,7 +246,7 @@ METHOD(pa_tnc_attr_t, process, status_t, goto end; } this->pcr_comp = chunk_clone(this->pcr_comp); - + if (!reader->read_uint32(reader, &tpm_quote_sig_len)) { DBG1(DBG_TNC, "insufficient data for PTS Simple Evidence Final " @@ -268,7 +261,7 @@ METHOD(pa_tnc_attr_t, process, status_t, } this->tpm_quote_sig = chunk_clone(this->tpm_quote_sig); } - + /* Optional Evidence Signature field */ if (this->has_evid_sig) { @@ -276,7 +269,7 @@ METHOD(pa_tnc_attr_t, process, status_t, reader->read_data(reader, evid_sig_len, &this->evid_sig); this->evid_sig = chunk_clone(this->evid_sig); } - + reader->destroy(reader); return SUCCESS; @@ -333,7 +326,6 @@ pa_tnc_attr_t *tcg_pts_attr_simple_evid_final_create(u_int8_t flags, 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, @@ -347,8 +339,7 @@ pa_tnc_attr_t *tcg_pts_attr_simple_evid_final_create(u_int8_t flags, .get_evid_sig = _get_evid_sig, .set_evid_sig = _set_evid_sig, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_SIMPLE_EVID_FINAL, + .type = { PEN_TCG, TCG_PTS_SIMPLE_EVID_FINAL }, .flags = flags, .comp_hash_algorithm = comp_hash_algorithm, .pcr_comp = pcr_comp, @@ -370,7 +361,6 @@ pa_tnc_attr_t *tcg_pts_attr_simple_evid_final_create_from_data(chunk_t data) 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, @@ -384,8 +374,7 @@ pa_tnc_attr_t *tcg_pts_attr_simple_evid_final_create_from_data(chunk_t data) .get_evid_sig = _get_evid_sig, .set_evid_sig = _set_evid_sig, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_SIMPLE_EVID_FINAL, + .type = { PEN_TCG, TCG_PTS_SIMPLE_EVID_FINAL }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.h b/src/libpts/tcg/tcg_pts_attr_simple_evid_final.h index 3d98bfce7..6778afbdc 100644 --- a/src/libpts/tcg/tcg_pts_attr_simple_evid_final.h +++ b/src/libpts/tcg/tcg_pts_attr_simple_evid_final.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_simple_evid_final tcg_pts_attr_simple_evid_final - * @{ @ingroup tcg_pts_attr_simple_evid_final + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_SIMPLE_EVID_FINAL_H_ @@ -44,27 +44,29 @@ struct tcg_pts_attr_simple_evid_final_t { * @param comp_hash_algo Optional Composite Hash Algorithm * @param pcr_comp Optional PCR Composite * @param tpm_quote sig Optional TPM Quote Signature - * @return PTS_SIMPLE_EVID_FINAL flags + * @return PTS_SIMPLE_EVID_FINAL flags */ u_int8_t (*get_quote_info)(tcg_pts_attr_simple_evid_final_t *this, pts_meas_algorithms_t *comp_hash_algo, chunk_t *pcr_comp, chunk_t *tpm_quote_sig); - + /** * Get Optional Evidence Signature * - * @evid_sig Optional Evidence Signature + * @param evid_sig Optional Evidence Signature * @return TRUE if Evidence Signature is available */ - bool (*get_evid_sig)(tcg_pts_attr_simple_evid_final_t *this, chunk_t *evid_sig); + bool (*get_evid_sig)(tcg_pts_attr_simple_evid_final_t *this, + chunk_t *evid_sig); /** * Set Optional Evidence Signature * - * @evid_sig Optional Evidence Signature + * @param vid_sig Optional Evidence Signature */ - void (*set_evid_sig)(tcg_pts_attr_simple_evid_final_t *this, chunk_t evid_sig); - + void (*set_evid_sig)(tcg_pts_attr_simple_evid_final_t *this, + chunk_t evid_sig); + }; /** diff --git a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.c b/src/libpts/tcg/tcg_pts_attr_tpm_version_info.c index 944a12cc9..b776cb662 100644 --- a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.c +++ b/src/libpts/tcg/tcg_pts_attr_tpm_version_info.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,7 +18,7 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <debug.h> +#include <utils/debug.h> typedef struct private_tcg_pts_attr_tpm_version_info_t private_tcg_pts_attr_tpm_version_info_t; @@ -49,14 +49,9 @@ struct private_tcg_pts_attr_tpm_version_info_t { tcg_pts_attr_tpm_version_info_t public; /** - * Attribute vendor ID + * Vendor-specific attribute type */ - pen_t vendor_id; - - /** - * Attribute type - */ - u_int32_t type; + pen_type_t type; /** * Attribute value @@ -67,7 +62,7 @@ struct private_tcg_pts_attr_tpm_version_info_t { * Noskip flag */ bool noskip_flag; - + /** * TPM Version Information */ @@ -79,13 +74,7 @@ struct private_tcg_pts_attr_tpm_version_info_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_tpm_version_info_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_tpm_version_info_t *this) { return this->type; @@ -114,10 +103,14 @@ METHOD(pa_tnc_attr_t, build, void, { bio_writer_t *writer; + if (this->value.ptr) + { + return; + } writer = bio_writer_create(PTS_TPM_VER_INFO_SIZE); writer->write_data(writer, this->tpm_version_info); - this->value = chunk_clone(writer->get_buf(writer)); + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -125,7 +118,7 @@ METHOD(pa_tnc_attr_t, process, status_t, private_tcg_pts_attr_tpm_version_info_t *this, u_int32_t *offset) { bio_reader_t *reader; - + if (this->value.len < PTS_TPM_VER_INFO_SIZE) { DBG1(DBG_TNC, "insufficient data for TPM Version Information"); @@ -181,7 +174,6 @@ pa_tnc_attr_t *tcg_pts_attr_tpm_version_info_create(chunk_t tpm_version_info) 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, @@ -194,8 +186,7 @@ pa_tnc_attr_t *tcg_pts_attr_tpm_version_info_create(chunk_t tpm_version_info) .get_tpm_version_info = _get_tpm_version_info, .set_tpm_version_info = _set_tpm_version_info, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_TPM_VERSION_INFO, + .type = { PEN_TCG, TCG_PTS_TPM_VERSION_INFO }, .tpm_version_info = chunk_clone(tpm_version_info), .ref = 1, ); @@ -214,7 +205,6 @@ pa_tnc_attr_t *tcg_pts_attr_tpm_version_info_create_from_data(chunk_t data) 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, @@ -227,8 +217,7 @@ pa_tnc_attr_t *tcg_pts_attr_tpm_version_info_create_from_data(chunk_t data) .get_tpm_version_info = _get_tpm_version_info, .set_tpm_version_info = _set_tpm_version_info, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_TPM_VERSION_INFO, + .type = { PEN_TCG, TCG_PTS_TPM_VERSION_INFO }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.h b/src/libpts/tcg/tcg_pts_attr_tpm_version_info.h index 2c12bb068..4ac18fb9e 100644 --- a/src/libpts/tcg/tcg_pts_attr_tpm_version_info.h +++ b/src/libpts/tcg/tcg_pts_attr_tpm_version_info.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_tpm_version_info tcg_pts_attr_tpm_version_info - * @{ @ingroup tcg_pts_attr_tpm_version_info + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_TPM_VERSION_INFO_H_ @@ -36,7 +36,7 @@ struct tcg_pts_attr_tpm_version_info_t { * Public PA-TNC attribute interface */ pa_tnc_attr_t pa_tnc_attribute; - + /** * Get TPM Version Info * @@ -55,7 +55,7 @@ struct tcg_pts_attr_tpm_version_info_t { /** * Creates an tcg_pts_attr_tpm_version_info_t object - * + * * @param tpm_version_info TPM version info */ pa_tnc_attr_t* tcg_pts_attr_tpm_version_info_create(chunk_t tpm_version_info); diff --git a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.c b/src/libpts/tcg/tcg_pts_attr_unix_file_meta.c index a9f4a115d..f96371b8b 100644 --- a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.c +++ b/src/libpts/tcg/tcg_pts_attr_unix_file_meta.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Sansar Choinyambuu + * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,15 +18,17 @@ #include <pa_tnc/pa_tnc_msg.h> #include <bio/bio_writer.h> #include <bio/bio_reader.h> -#include <utils/linked_list.h> -#include <debug.h> +#include <collections/linked_list.h> +#include <utils/debug.h> + +#include <string.h> typedef struct private_tcg_pts_attr_file_meta_t private_tcg_pts_attr_file_meta_t; /** * Unix-Style File Metadata * see section 3.17.3 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -80,25 +82,20 @@ struct private_tcg_pts_attr_file_meta_t { tcg_pts_attr_file_meta_t public; /** - * Attribute vendor ID - */ - pen_t vendor_id; - - /** - * Attribute type + * Vendor-specific attribute type */ - u_int32_t type; + pen_type_t type; /** * Attribute value */ chunk_t value; - + /** * Noskip flag */ bool noskip_flag; - + /** * PTS File Metadata */ @@ -110,13 +107,7 @@ struct private_tcg_pts_attr_file_meta_t { refcount_t ref; }; -METHOD(pa_tnc_attr_t, get_vendor_id, pen_t, - private_tcg_pts_attr_file_meta_t *this) -{ - return this->vendor_id; -} - -METHOD(pa_tnc_attr_t, get_type, u_int32_t, +METHOD(pa_tnc_attr_t, get_type, pen_type_t, private_tcg_pts_attr_file_meta_t *this) { return this->type; @@ -147,7 +138,11 @@ METHOD(pa_tnc_attr_t, build, void, enumerator_t *enumerator; pts_file_metadata_t *entry; u_int64_t number_of_files; - + + if (this->value.ptr) + { + return; + } number_of_files = this->metadata->get_file_count(this->metadata); writer = bio_writer_create(PTS_FILE_META_SIZE); @@ -170,8 +165,8 @@ METHOD(pa_tnc_attr_t, build, void, strlen(entry->filename))); } enumerator->destroy(enumerator); - - this->value = chunk_clone(writer->get_buf(writer)); + + this->value = writer->extract_buf(writer); writer->destroy(writer); } @@ -186,7 +181,7 @@ METHOD(pa_tnc_attr_t, process, status_t, u_int64_t owner, group; chunk_t filename; status_t status = FAILED; - + if (this->value.len < PTS_FILE_META_SIZE) { DBG1(DBG_TNC, "insufficient data for PTS Unix-Style file metadata header"); @@ -197,7 +192,7 @@ METHOD(pa_tnc_attr_t, process, status_t, reader->read_uint64(reader, &number_of_files); this->metadata = pts_file_meta_create(); - + while (number_of_files--) { if (!reader->read_uint16(reader, &len)) @@ -250,7 +245,7 @@ METHOD(pa_tnc_attr_t, process, status_t, DBG1(DBG_TNC, "insufficient data for filename"); goto end; } - + entry = malloc_thing(pts_file_metadata_t); entry->type = type; entry->filesize = filesize; @@ -259,9 +254,7 @@ METHOD(pa_tnc_attr_t, process, status_t, entry->accessed = accessed; entry->owner = owner; entry->group = group; - entry->filename = malloc(filename.len + 1); - entry->filename[filename.len] = '\0'; - memcpy(entry->filename, filename.ptr, filename.len); + entry->filename = strndup(filename.ptr, filename.len); this->metadata->add(this->metadata, entry); } @@ -284,7 +277,7 @@ METHOD(pa_tnc_attr_t, destroy, void, { if (ref_put(&this->ref)) { - this->metadata->destroy(this->metadata); + DESTROY_IF(this->metadata); free(this->value.ptr); free(this); } @@ -306,7 +299,6 @@ pa_tnc_attr_t *tcg_pts_attr_unix_file_meta_create(pts_file_meta_t *metadata) 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, @@ -318,8 +310,7 @@ pa_tnc_attr_t *tcg_pts_attr_unix_file_meta_create(pts_file_meta_t *metadata) }, .get_metadata = _get_metadata, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_UNIX_FILE_META, + .type = { PEN_TCG, TCG_PTS_UNIX_FILE_META }, .metadata = metadata, .ref = 1, ); @@ -338,7 +329,6 @@ pa_tnc_attr_t *tcg_pts_attr_unix_file_meta_create_from_data(chunk_t data) 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, @@ -350,8 +340,7 @@ pa_tnc_attr_t *tcg_pts_attr_unix_file_meta_create_from_data(chunk_t data) }, .get_metadata = _get_metadata, }, - .vendor_id = PEN_TCG, - .type = TCG_PTS_UNIX_FILE_META, + .type = { PEN_TCG, TCG_PTS_UNIX_FILE_META }, .value = chunk_clone(data), .ref = 1, ); diff --git a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.h b/src/libpts/tcg/tcg_pts_attr_unix_file_meta.h index 8a594eab5..ad9794b45 100644 --- a/src/libpts/tcg/tcg_pts_attr_unix_file_meta.h +++ b/src/libpts/tcg/tcg_pts_attr_unix_file_meta.h @@ -15,7 +15,7 @@ /** * @defgroup tcg_pts_attr_unix_file_meta tcg_pts_attr_unix_file_meta - * @{ @ingroup tcg_pts_attr_unix_file_meta + * @{ @ingroup tcg_attr */ #ifndef TCG_PTS_ATTR_UNIX_FILE_META_H_ @@ -38,19 +38,19 @@ struct tcg_pts_attr_file_meta_t { * Public PA-TNC attribute interface */ pa_tnc_attr_t pa_tnc_attribute; - + /** * Get PTS File Metadata * * @return PTS File Metadata */ pts_file_meta_t* (*get_metadata)(tcg_pts_attr_file_meta_t *this); - + }; /** * Creates an tcg_pts_attr_file_meta_t object - * + * * @param metadata PTS File Metadata */ pa_tnc_attr_t* tcg_pts_attr_unix_file_meta_create(pts_file_meta_t *metadata); |