From abb8a1ecd22a95d56757c0e90ba064c3877c8dcd Mon Sep 17 00:00:00 2001 From: Andreas Steffen Date: Sun, 17 May 2015 08:41:59 +0200 Subject: [PATCH] Defined generic boolean PA-TNC attribute --- src/libimcv/Makefile.am | 3 +- src/libimcv/generic/generic_attr_bool.c | 247 +++++++++++++++++++++++ src/libimcv/generic/generic_attr_bool.h | 67 ++++++ src/libimcv/ietf/ietf_attr.c | 9 +- src/libimcv/ietf/ietf_attr_default_pwd_enabled.c | 242 ---------------------- src/libimcv/ietf/ietf_attr_default_pwd_enabled.h | 65 ------ src/libimcv/ietf/ietf_attr_fwd_enabled.c | 241 ---------------------- src/libimcv/ietf/ietf_attr_fwd_enabled.h | 66 ------ src/libimcv/plugins/imc_os/imc_os.c | 11 +- src/libimcv/plugins/imv_os/imv_os_agent.c | 11 +- src/libimcv/pwg/pwg_attr.c | 18 +- 11 files changed, 341 insertions(+), 639 deletions(-) create mode 100644 src/libimcv/generic/generic_attr_bool.c create mode 100644 src/libimcv/generic/generic_attr_bool.h delete mode 100644 src/libimcv/ietf/ietf_attr_default_pwd_enabled.c delete mode 100644 src/libimcv/ietf/ietf_attr_default_pwd_enabled.h delete mode 100644 src/libimcv/ietf/ietf_attr_fwd_enabled.c delete mode 100644 src/libimcv/ietf/ietf_attr_fwd_enabled.h diff --git a/src/libimcv/Makefile.am b/src/libimcv/Makefile.am index 6dd5663..d2175a3 100644 --- a/src/libimcv/Makefile.am +++ b/src/libimcv/Makefile.am @@ -36,11 +36,10 @@ libimcv_la_SOURCES = \ imv/imv_session.h imv/imv_session.c \ imv/imv_session_manager.h imv/imv_session_manager.c \ imv/imv_workitem.h imv/imv_workitem.c \ + generic/generic_attr_bool.h generic/generic_attr_bool.c \ ietf/ietf_attr.h ietf/ietf_attr.c \ ietf/ietf_attr_assess_result.h ietf/ietf_attr_assess_result.c \ ietf/ietf_attr_attr_request.h ietf/ietf_attr_attr_request.c \ - ietf/ietf_attr_fwd_enabled.h ietf/ietf_attr_fwd_enabled.c \ - ietf/ietf_attr_default_pwd_enabled.h ietf/ietf_attr_default_pwd_enabled.c \ ietf/ietf_attr_installed_packages.h ietf/ietf_attr_installed_packages.c \ ietf/ietf_attr_numeric_version.h ietf/ietf_attr_numeric_version.c \ ietf/ietf_attr_op_status.h ietf/ietf_attr_op_status.c \ diff --git a/src/libimcv/generic/generic_attr_bool.c b/src/libimcv/generic/generic_attr_bool.c new file mode 100644 index 0000000..589b5e4 --- /dev/null +++ b/src/libimcv/generic/generic_attr_bool.c @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2015 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * 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 "generic_attr_bool.h" + +#include +#include +#include +#include +#include + +typedef struct private_generic_attr_bool_t private_generic_attr_bool_t; + +/** + * Generic PA-TNC attribute containing boolean status value in 32 bit encoding + * + * 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 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Boolean Value | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +#define ATTR_BOOL_SIZE 4 + +/** + * Private data of an generic_attr_bool_t object. + */ +struct private_generic_attr_bool_t { + + /** + * Public members of generic_attr_bool_t + */ + generic_attr_bool_t public; + + /** + * Vendor-specific attribute type + */ + pen_type_t type; + + /** + * Length of attribute value + */ + size_t length; + + /** + * Attribute value or segment + */ + chunk_t value; + + /** + * Noskip flag + */ + bool noskip_flag; + + /** + * Boolean status value + */ + bool status; + + /** + * Reference count + */ + refcount_t ref; +}; + +METHOD(pa_tnc_attr_t, get_type, pen_type_t, + private_generic_attr_bool_t *this) +{ + return this->type; +} + +METHOD(pa_tnc_attr_t, get_value, chunk_t, + private_generic_attr_bool_t *this) +{ + return this->value; +} + +METHOD(pa_tnc_attr_t, get_noskip_flag, bool, + private_generic_attr_bool_t *this) +{ + return this->noskip_flag; +} + +METHOD(pa_tnc_attr_t, set_noskip_flag,void, + private_generic_attr_bool_t *this, bool noskip) +{ + this->noskip_flag = noskip; +} + +METHOD(pa_tnc_attr_t, build, void, + private_generic_attr_bool_t *this) +{ + bio_writer_t *writer; + + if (this->value.ptr) + { + return; + } + writer = bio_writer_create(ATTR_BOOL_SIZE); + writer->write_uint32(writer, this->status); + + this->value = writer->extract_buf(writer); + this->length = this->value.len; + writer->destroy(writer); +} + +METHOD(pa_tnc_attr_t, process, status_t, + private_generic_attr_bool_t *this, u_int32_t *offset) +{ + enum_name_t *pa_attr_names; + bio_reader_t *reader; + u_int32_t status; + + pa_attr_names = imcv_pa_tnc_attributes->get_names(imcv_pa_tnc_attributes, + this->type.vendor_id); + *offset = 0; + + if (this->value.len < this->length) + { + return NEED_MORE; + } + if (this->value.len != ATTR_BOOL_SIZE) + { + DBG1(DBG_TNC, "incorrect attribute size for %N/%N", + pen_names, this->type.vendor_id, pa_attr_names, this->type.type); + return FAILED; + } + reader = bio_reader_create(this->value); + reader->read_uint32(reader, &status); + reader->destroy(reader); + + if (status > 1) + { + DBG1(DBG_TNC, "%N/%N attribute contains invalid non-boolean value %u", + pen_names, this->type.vendor_id, pa_attr_names, this->type.type, + status); + return FAILED; + } + this->status = status; + + return SUCCESS; +} + +METHOD(pa_tnc_attr_t, add_segment, void, + private_generic_attr_bool_t *this, chunk_t segment) +{ + this->value = chunk_cat("mc", this->value, segment); +} + +METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, + private_generic_attr_bool_t *this) +{ + ref_get(&this->ref); + return &this->public.pa_tnc_attribute; +} + +METHOD(pa_tnc_attr_t, destroy, void, + private_generic_attr_bool_t *this) +{ + if (ref_put(&this->ref)) + { + free(this->value.ptr); + free(this); + } +} + +METHOD(generic_attr_bool_t, get_status, bool, + private_generic_attr_bool_t *this) +{ + return this->status; +} + +/** + * Described in header. + */ +pa_tnc_attr_t *generic_attr_bool_create(bool status, pen_type_t type) +{ + private_generic_attr_bool_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .add_segment = _add_segment, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_status = _get_status, + }, + .type = type, + .status = status, + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} + +/** + * Described in header. + */ +pa_tnc_attr_t *generic_attr_bool_create_from_data(size_t length, chunk_t data, + pen_type_t type) +{ + private_generic_attr_bool_t *this; + + INIT(this, + .public = { + .pa_tnc_attribute = { + .get_type = _get_type, + .get_value = _get_value, + .get_noskip_flag = _get_noskip_flag, + .set_noskip_flag = _set_noskip_flag, + .build = _build, + .process = _process, + .add_segment = _add_segment, + .get_ref = _get_ref, + .destroy = _destroy, + }, + .get_status = _get_status, + }, + .type = type, + .length = length, + .value = chunk_clone(data), + .ref = 1, + ); + + return &this->public.pa_tnc_attribute; +} + diff --git a/src/libimcv/generic/generic_attr_bool.h b/src/libimcv/generic/generic_attr_bool.h new file mode 100644 index 0000000..93754bf --- /dev/null +++ b/src/libimcv/generic/generic_attr_bool.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2015 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See . + * + * 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 generic_attr_bool generic_attr_bool + * @{ @ingroup generic_attr + */ + +#ifndef GENERIC_ATTR_BOOL_H_ +#define GENERIC_ATTR_BOOL_H_ + +typedef struct generic_attr_bool_t generic_attr_bool_t; + +#include +#include "pa_tnc/pa_tnc_attr.h" + +/** + * Class implementing a generic PA-TNC attribute containing a boolean status + * value encoded as a 32 bit unsigned integer (0,1) in network order + */ +struct generic_attr_bool_t { + + /** + * Public PA-TNC attribute interface + */ + pa_tnc_attr_t pa_tnc_attribute; + + /** + * Gets boolean value + * + * @return Boolean status value + */ + bool (*get_status)(generic_attr_bool_t *this); + +}; + +/** + * Creates a generic_attr_bool_t object + * + * @param status Boolean status value + * @param type Vendor ID / Attribute Type + */ +pa_tnc_attr_t* generic_attr_bool_create(bool status, pen_type_t type); + +/** + * Creates an generic_attr_bool_t object from received data + * + * @param length Total length of attribute value + * @param value Unparsed attribute value (might be a segment) + * @param type Vendor ID / Attribute Type + */ +pa_tnc_attr_t* generic_attr_bool_create_from_data(size_t length, chunk_t value, + pen_type_t type); + +#endif /** GENERIC_ATTR_BOOL_H_ @}*/ diff --git a/src/libimcv/ietf/ietf_attr.c b/src/libimcv/ietf/ietf_attr.c index 67269af..d0f0439 100644 --- a/src/libimcv/ietf/ietf_attr.c +++ b/src/libimcv/ietf/ietf_attr.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2014 Andreas Steffen + * Copyright (C) 2011-2015 Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -16,8 +16,6 @@ #include "ietf_attr.h" #include "ietf/ietf_attr_assess_result.h" #include "ietf/ietf_attr_attr_request.h" -#include "ietf/ietf_attr_fwd_enabled.h" -#include "ietf/ietf_attr_default_pwd_enabled.h" #include "ietf/ietf_attr_installed_packages.h" #include "ietf/ietf_attr_numeric_version.h" #include "ietf/ietf_attr_op_status.h" @@ -26,6 +24,7 @@ #include "ietf/ietf_attr_product_info.h" #include "ietf/ietf_attr_remediation_instr.h" #include "ietf/ietf_attr_string_version.h" +#include "generic/generic_attr_bool.h" ENUM(ietf_attr_names, IETF_ATTR_TESTING, IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED, @@ -73,9 +72,9 @@ pa_tnc_attr_t* ietf_attr_create_from_data(u_int32_t type, size_t length, case IETF_ATTR_REMEDIATION_INSTRUCTIONS: return ietf_attr_remediation_instr_create_from_data(length, value); case IETF_ATTR_FORWARDING_ENABLED: - return ietf_attr_fwd_enabled_create_from_data(length, value); case IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED: - return ietf_attr_default_pwd_enabled_create_from_data(length, value); + return generic_attr_bool_create_from_data(length, value, + pen_type_create(PEN_IETF, type)); case IETF_ATTR_TESTING: case IETF_ATTR_RESERVED: default: diff --git a/src/libimcv/ietf/ietf_attr_default_pwd_enabled.c b/src/libimcv/ietf/ietf_attr_default_pwd_enabled.c deleted file mode 100644 index ee5864d..0000000 --- a/src/libimcv/ietf/ietf_attr_default_pwd_enabled.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (C) 2012-2014 Andreas Steffen - * HSR Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See . - * - * 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 "ietf_attr_default_pwd_enabled.h" - -#include -#include -#include -#include - -typedef struct private_ietf_attr_default_pwd_enabled_t private_ietf_attr_default_pwd_enabled_t; - -/** - * PA-TNC Factory Default Password Enabled type (see section 4.2.12 of RFC 5792) - * - * 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 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Factory Default Password Enabled | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - -#define DEFAULT_PWD_ENABLED_SIZE 4 - -/** - * Private data of an ietf_attr_default_pwd_enabled_t object. - */ -struct private_ietf_attr_default_pwd_enabled_t { - - /** - * Public members of ietf_attr_default_pwd_enabled_t - */ - ietf_attr_default_pwd_enabled_t public; - - /** - * Vendor-specific attribute type - */ - pen_type_t type; - - /** - * Length of attribute value - */ - size_t length; - - /** - * Attribute value or segment - */ - chunk_t value; - - /** - * Noskip flag - */ - bool noskip_flag; - - /** - * Factory Default Password Enabled status - */ - bool status; - - /** - * Reference count - */ - refcount_t ref; -}; - -METHOD(pa_tnc_attr_t, get_type, pen_type_t, - private_ietf_attr_default_pwd_enabled_t *this) -{ - return this->type; -} - -METHOD(pa_tnc_attr_t, get_value, chunk_t, - private_ietf_attr_default_pwd_enabled_t *this) -{ - return this->value; -} - -METHOD(pa_tnc_attr_t, get_noskip_flag, bool, - private_ietf_attr_default_pwd_enabled_t *this) -{ - return this->noskip_flag; -} - -METHOD(pa_tnc_attr_t, set_noskip_flag,void, - private_ietf_attr_default_pwd_enabled_t *this, bool noskip) -{ - this->noskip_flag = noskip; -} - -METHOD(pa_tnc_attr_t, build, void, - private_ietf_attr_default_pwd_enabled_t *this) -{ - bio_writer_t *writer; - - if (this->value.ptr) - { - return; - } - writer = bio_writer_create(DEFAULT_PWD_ENABLED_SIZE); - writer->write_uint32(writer, this->status); - - this->value = writer->extract_buf(writer); - this->length = this->value.len; - writer->destroy(writer); -} - -METHOD(pa_tnc_attr_t, process, status_t, - private_ietf_attr_default_pwd_enabled_t *this, u_int32_t *offset) -{ - bio_reader_t *reader; - u_int32_t status; - - *offset = 0; - - if (this->value.len < this->length) - { - return NEED_MORE; - } - if (this->value.len != DEFAULT_PWD_ENABLED_SIZE) - { - DBG1(DBG_TNC, "incorrect size for IETF factory default password " - "enabled attribute"); - return FAILED; - } - reader = bio_reader_create(this->value); - reader->read_uint32(reader, &status); - reader->destroy(reader); - - if (status > TRUE) - { - DBG1(DBG_TNC, "IETF factory default password enabled field " - "has unknown value %u", status); - return FAILED; - } - this->status = status; - - return SUCCESS; -} - -METHOD(pa_tnc_attr_t, add_segment, void, - private_ietf_attr_default_pwd_enabled_t *this, chunk_t segment) -{ - this->value = chunk_cat("mc", this->value, segment); -} - -METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, - private_ietf_attr_default_pwd_enabled_t *this) -{ - ref_get(&this->ref); - return &this->public.pa_tnc_attribute; -} - -METHOD(pa_tnc_attr_t, destroy, void, - private_ietf_attr_default_pwd_enabled_t *this) -{ - if (ref_put(&this->ref)) - { - free(this->value.ptr); - free(this); - } -} - -METHOD(ietf_attr_default_pwd_enabled_t, get_status, bool, - private_ietf_attr_default_pwd_enabled_t *this) -{ - return this->status; -} - -/** - * Described in header. - */ -pa_tnc_attr_t *ietf_attr_default_pwd_enabled_create(bool status) -{ - private_ietf_attr_default_pwd_enabled_t *this; - - INIT(this, - .public = { - .pa_tnc_attribute = { - .get_type = _get_type, - .get_value = _get_value, - .get_noskip_flag = _get_noskip_flag, - .set_noskip_flag = _set_noskip_flag, - .build = _build, - .process = _process, - .add_segment = _add_segment, - .get_ref = _get_ref, - .destroy = _destroy, - }, - .get_status = _get_status, - }, - .type = { PEN_IETF, IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED }, - .status = status, - .ref = 1, - ); - - return &this->public.pa_tnc_attribute; -} - -/** - * Described in header. - */ -pa_tnc_attr_t *ietf_attr_default_pwd_enabled_create_from_data(size_t length, - chunk_t data) -{ - private_ietf_attr_default_pwd_enabled_t *this; - - INIT(this, - .public = { - .pa_tnc_attribute = { - .get_type = _get_type, - .get_value = _get_value, - .get_noskip_flag = _get_noskip_flag, - .set_noskip_flag = _set_noskip_flag, - .build = _build, - .process = _process, - .add_segment = _add_segment, - .get_ref = _get_ref, - .destroy = _destroy, - }, - .get_status = _get_status, - }, - .type = { PEN_IETF, IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED }, - .length = length, - .value = chunk_clone(data), - .ref = 1, - ); - - return &this->public.pa_tnc_attribute; -} - diff --git a/src/libimcv/ietf/ietf_attr_default_pwd_enabled.h b/src/libimcv/ietf/ietf_attr_default_pwd_enabled.h deleted file mode 100644 index 3999590..0000000 --- a/src/libimcv/ietf/ietf_attr_default_pwd_enabled.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2012 Andreas Steffen - * HSR Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See . - * - * 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 ietf_attr_default_pwd_enabled ietf_attr_default_pwd_enabled - * @{ @ingroup ietf_attr - */ - -#ifndef IETF_ATTR_PWD_ENABLED_H_ -#define IETF_ATTR_PWD_ENABLED_H_ - -typedef struct ietf_attr_default_pwd_enabled_t ietf_attr_default_pwd_enabled_t; - -#include "ietf_attr.h" -#include "pa_tnc/pa_tnc_attr.h" - -/** - * Class implementing the IETF PA-TNC Factory Default Password Enabled attribute. - * - */ -struct ietf_attr_default_pwd_enabled_t { - - /** - * Public PA-TNC attribute interface - */ - pa_tnc_attr_t pa_tnc_attribute; - - /** - * Gets the Factory Default Password Enabled status - * - * @return Factory Default Password Enabled status - */ - bool (*get_status)(ietf_attr_default_pwd_enabled_t *this); - -}; - -/** - * Creates an ietf_attr_default_pwd_enabled_t object - * - * @param status Factory Default Password Enabled status - */ -pa_tnc_attr_t* ietf_attr_default_pwd_enabled_create(bool status); - -/** - * Creates an ietf_attr_default_pwd_enabled_t object from received data - * - * @param length Total length of attribute value - * @param value Unparsed attribute value (might be a segment) - */ -pa_tnc_attr_t* ietf_attr_default_pwd_enabled_create_from_data(size_t length, - chunk_t value); - -#endif /** IETF_ATTR_PWD_ENABLED_H_ @}*/ diff --git a/src/libimcv/ietf/ietf_attr_fwd_enabled.c b/src/libimcv/ietf/ietf_attr_fwd_enabled.c deleted file mode 100644 index c00a5ef..0000000 --- a/src/libimcv/ietf/ietf_attr_fwd_enabled.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) 2012-2014 Andreas Steffen - * HSR Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See . - * - * 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 "ietf_attr_fwd_enabled.h" - -#include -#include -#include -#include - -typedef struct private_ietf_attr_fwd_enabled_t private_ietf_attr_fwd_enabled_t; - -/** - * PA-TNC Forwarding Enabled type (see section 4.2.11 of RFC 5792) - * - * 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 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Forwarding Enabled | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - -#define FORWARDING_ENABLED_SIZE 4 - -/** - * Private data of an ietf_attr_fwd_enabled_t object. - */ -struct private_ietf_attr_fwd_enabled_t { - - /** - * Public members of ietf_attr_fwd_enabled_t - */ - ietf_attr_fwd_enabled_t public; - - /** - * Vendor-specific attribute type - */ - pen_type_t type; - - /** - * Length of attribute value - */ - size_t length; - - /** - * Attribute value or segment - */ - chunk_t value; - - /** - * Noskip flag - */ - bool noskip_flag; - - /** - * Forwarding Enabled status - */ - os_fwd_status_t fwd_status; - - /** - * Reference count - */ - refcount_t ref; -}; - -METHOD(pa_tnc_attr_t, get_type, pen_type_t, - private_ietf_attr_fwd_enabled_t *this) -{ - return this->type; -} - -METHOD(pa_tnc_attr_t, get_value, chunk_t, - private_ietf_attr_fwd_enabled_t *this) -{ - return this->value; -} - -METHOD(pa_tnc_attr_t, get_noskip_flag, bool, - private_ietf_attr_fwd_enabled_t *this) -{ - return this->noskip_flag; -} - -METHOD(pa_tnc_attr_t, set_noskip_flag,void, - private_ietf_attr_fwd_enabled_t *this, bool noskip) -{ - this->noskip_flag = noskip; -} - -METHOD(pa_tnc_attr_t, build, void, - private_ietf_attr_fwd_enabled_t *this) -{ - bio_writer_t *writer; - - if (this->value.ptr) - { - return; - } - writer = bio_writer_create(FORWARDING_ENABLED_SIZE); - writer->write_uint32(writer, this->fwd_status); - - this->value = writer->extract_buf(writer); - this->length = this->value.len; - writer->destroy(writer); -} - -METHOD(pa_tnc_attr_t, process, status_t, - private_ietf_attr_fwd_enabled_t *this, u_int32_t *offset) -{ - bio_reader_t *reader; - u_int32_t fwd_status; - - *offset = 0; - - if (this->value.len < this->length) - { - return NEED_MORE; - } - if (this->value.len != FORWARDING_ENABLED_SIZE) - { - DBG1(DBG_TNC, "incorrect size for IETF forwarding enabled attribute"); - return FAILED; - } - reader = bio_reader_create(this->value); - reader->read_uint32(reader, &fwd_status); - reader->destroy(reader); - - if (fwd_status > OS_FWD_UNKNOWN) - { - DBG1(DBG_TNC, "IETF forwarding enabled field has unknown value %u", - fwd_status); - return FAILED; - } - this->fwd_status = fwd_status; - - return SUCCESS; -} - -METHOD(pa_tnc_attr_t, add_segment, void, - private_ietf_attr_fwd_enabled_t *this, chunk_t segment) -{ - this->value = chunk_cat("mc", this->value, segment); -} - -METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, - private_ietf_attr_fwd_enabled_t *this) -{ - ref_get(&this->ref); - return &this->public.pa_tnc_attribute; -} - -METHOD(pa_tnc_attr_t, destroy, void, - private_ietf_attr_fwd_enabled_t *this) -{ - if (ref_put(&this->ref)) - { - free(this->value.ptr); - free(this); - } -} - -METHOD(ietf_attr_fwd_enabled_t, get_status, os_fwd_status_t, - private_ietf_attr_fwd_enabled_t *this) -{ - return this->fwd_status; -} - -/** - * Described in header. - */ -pa_tnc_attr_t *ietf_attr_fwd_enabled_create(os_fwd_status_t fwd_status) -{ - private_ietf_attr_fwd_enabled_t *this; - - INIT(this, - .public = { - .pa_tnc_attribute = { - .get_type = _get_type, - .get_value = _get_value, - .get_noskip_flag = _get_noskip_flag, - .set_noskip_flag = _set_noskip_flag, - .build = _build, - .process = _process, - .add_segment = _add_segment, - .get_ref = _get_ref, - .destroy = _destroy, - }, - .get_status = _get_status, - }, - .type = { PEN_IETF, IETF_ATTR_FORWARDING_ENABLED }, - .fwd_status = fwd_status, - .ref = 1, - ); - - return &this->public.pa_tnc_attribute; -} - -/** - * Described in header. - */ -pa_tnc_attr_t *ietf_attr_fwd_enabled_create_from_data(size_t length, - chunk_t data) -{ - private_ietf_attr_fwd_enabled_t *this; - - INIT(this, - .public = { - .pa_tnc_attribute = { - .get_type = _get_type, - .get_value = _get_value, - .get_noskip_flag = _get_noskip_flag, - .set_noskip_flag = _set_noskip_flag, - .build = _build, - .process = _process, - .add_segment = _add_segment, - .get_ref = _get_ref, - .destroy = _destroy, - }, - .get_status = _get_status, - }, - .type = { PEN_IETF, IETF_ATTR_FORWARDING_ENABLED }, - .length = length, - .value = chunk_clone(data), - .ref = 1, - ); - - return &this->public.pa_tnc_attribute; -} - diff --git a/src/libimcv/ietf/ietf_attr_fwd_enabled.h b/src/libimcv/ietf/ietf_attr_fwd_enabled.h deleted file mode 100644 index 3d55436..0000000 --- a/src/libimcv/ietf/ietf_attr_fwd_enabled.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2012-2014 Andreas Steffen - * HSR Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See . - * - * 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 ietf_attr_fwd_enabled ietf_attr_fwd_enabled - * @{ @ingroup ietf_attr - */ - -#ifndef IETF_ATTR_FWD_ENABLED_H_ -#define IETF_ATTR_FWD_ENABLED_H_ - -typedef struct ietf_attr_fwd_enabled_t ietf_attr_fwd_enabled_t; - -#include "ietf_attr.h" -#include "pa_tnc/pa_tnc_attr.h" -#include "os_info/os_info.h" - -/** - * Class implementing the IETF PA-TNC Forwarding Enabled attribute. - * - */ -struct ietf_attr_fwd_enabled_t { - - /** - * Public PA-TNC attribute interface - */ - pa_tnc_attr_t pa_tnc_attribute; - - /** - * Gets the Forwarding Enabled status - * - * @return Forwarding Enabled status - */ - os_fwd_status_t (*get_status)(ietf_attr_fwd_enabled_t *this); - -}; - -/** - * Creates an ietf_attr_fwd_enabled_t object - * - * @param fwd_status Forwarding Enabled status - */ -pa_tnc_attr_t* ietf_attr_fwd_enabled_create(os_fwd_status_t fwd_status); - -/** - * Creates an ietf_attr_fwd_enabled_t object from received data - * - * @param length Total length of attribute value - * @param value Unparsed attribute value (might be a segment) - */ -pa_tnc_attr_t* ietf_attr_fwd_enabled_create_from_data(size_t length, - chunk_t value); - -#endif /** IETF_ATTR_FWD_ENABLED_H_ @}*/ diff --git a/src/libimcv/plugins/imc_os/imc_os.c b/src/libimcv/plugins/imc_os/imc_os.c index 4fe8856..1cb3848 100644 --- a/src/libimcv/plugins/imc_os/imc_os.c +++ b/src/libimcv/plugins/imc_os/imc_os.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2014 Andreas Steffen + * Copyright (C) 2011-2015 Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -18,10 +18,9 @@ #include #include #include +#include #include #include -#include -#include #include #include #include @@ -214,7 +213,8 @@ static void add_fwd_enabled(imc_msg_t *msg) fwd_status = os->get_fwd_status(os); DBG1(DBG_IMC, "IPv4 forwarding is %N", os_fwd_status_names, fwd_status); - attr = ietf_attr_fwd_enabled_create(fwd_status); + attr = generic_attr_bool_create(fwd_status, pen_type_create(PEN_IETF, + IETF_ATTR_FORWARDING_ENABLED)); msg->add_attribute(msg, attr); } @@ -226,7 +226,8 @@ static void add_default_pwd_enabled(imc_msg_t *msg) pa_tnc_attr_t *attr; DBG1(DBG_IMC, "factory default password is disabled"); - attr = ietf_attr_default_pwd_enabled_create(FALSE); + attr = generic_attr_bool_create(FALSE, pen_type_create(PEN_IETF, + IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED)); msg->add_attribute(msg, attr); } diff --git a/src/libimcv/plugins/imv_os/imv_os_agent.c b/src/libimcv/plugins/imv_os/imv_os_agent.c index 5eefb51..41b9d0b 100644 --- a/src/libimcv/plugins/imv_os/imv_os_agent.c +++ b/src/libimcv/plugins/imv_os/imv_os_agent.c @@ -23,10 +23,9 @@ #include #include #include +#include #include #include -#include -#include #include #include #include @@ -270,12 +269,12 @@ static TNC_Result receive_msg(private_imv_os_agent_t *this, imv_state_t *state, } case IETF_ATTR_FORWARDING_ENABLED: { - ietf_attr_fwd_enabled_t *attr_cast; + generic_attr_bool_t *attr_cast; os_fwd_status_t fwd_status; state->set_action_flags(state, IMV_OS_ATTR_FORWARDING_ENABLED); - attr_cast = (ietf_attr_fwd_enabled_t*)attr; + attr_cast = (generic_attr_bool_t*)attr; fwd_status = attr_cast->get_status(attr_cast); DBG1(DBG_IMV, "IPv4 forwarding is %N", os_fwd_status_names, fwd_status); @@ -288,12 +287,12 @@ static TNC_Result receive_msg(private_imv_os_agent_t *this, imv_state_t *state, } case IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED: { - ietf_attr_default_pwd_enabled_t *attr_cast; + generic_attr_bool_t *attr_cast; bool default_pwd_status; state->set_action_flags(state, IMV_OS_ATTR_FACTORY_DEFAULT_PWD_ENABLED); - attr_cast = (ietf_attr_default_pwd_enabled_t*)attr; + attr_cast = (generic_attr_bool_t*)attr; default_pwd_status = attr_cast->get_status(attr_cast); DBG1(DBG_IMV, "factory default password is %sabled", default_pwd_status ? "en":"dis"); diff --git a/src/libimcv/pwg/pwg_attr.c b/src/libimcv/pwg/pwg_attr.c index 5fd887b..9056a28 100644 --- a/src/libimcv/pwg/pwg_attr.c +++ b/src/libimcv/pwg/pwg_attr.c @@ -15,6 +15,8 @@ #include "pwg_attr.h" +#include + ENUM_BEGIN(pwg_attr_names, PWG_HCD_ATTRS_NATURAL_LANG, PWG_HCD_VENDOR_SMI_CODE, "HCD AttributesNaturalLanguage", @@ -72,17 +74,21 @@ pa_tnc_attr_t* pwg_attr_create_from_data(u_int32_t type, size_t length, chunk_t { switch (type) { + case PWG_HCD_DEFAULT_PWD_ENABLED: + case PWG_HCD_FORWARDING_ENABLED: + case PWG_HCD_USER_APP_ENABLED: + case PWG_HCD_USER_APP_PERSIST_ENABLED: + case PWG_HCD_PSTN_FAX_ENABLED: + return generic_attr_bool_create_from_data(length, value, + pen_type_create(PEN_PWG, type)); case PWG_HCD_ATTRS_NATURAL_LANG: case PWG_HCD_MACHINE_TYPE_MODEL: case PWG_HCD_VENDOR_NAME: case PWG_HCD_VENDOR_SMI_CODE: - case PWG_HCD_DEFAULT_PWD_ENABLED: case PWG_HCD_FIREWALL_SETTING: - case PWG_HCD_FORWARDING_ENABLED: - case PWG_HCD_PSTN_FAX_ENABLED: case PWG_HCD_TIME_SOURCE: - case PWG_HCD_FIRMWARE_NAME: - case PWG_HCD_FIRMWARE_PATCHES: + case PWG_HCD_FIRMWARE_NAME: + case PWG_HCD_FIRMWARE_PATCHES: case PWG_HCD_FIRMWARE_STRING_VERSION: case PWG_HCD_FIRMWARE_VERSION: case PWG_HCD_RESIDENT_APP_NAME: @@ -93,8 +99,6 @@ pa_tnc_attr_t* pwg_attr_create_from_data(u_int32_t type, size_t length, chunk_t case PWG_HCD_USER_APP_PATCHES: case PWG_HCD_USER_APP_STRING_VERSION: case PWG_HCD_USER_APP_VERSION: - case PWG_HCD_USER_APP_ENABLE: - case PWG_HCD_USER_APP_PERSIST_ENABLED: case PWG_HCD_CERTIFICATION_STATE: case PWG_HCD_CONFIGURATION_STATE: default: -- 2.7.4