Defined generic non-nul terminated string PA-TNC attribute

This commit is contained in:
Andreas Steffen
2015-08-18 21:25:38 +02:00
parent 6a11c8a3f3
commit 981653a437
9 changed files with 81 additions and 59 deletions
+1 -1
View File
@@ -37,6 +37,7 @@ libimcv_la_SOURCES = \
imv/imv_session_manager.h imv/imv_session_manager.c \ imv/imv_session_manager.h imv/imv_session_manager.c \
imv/imv_workitem.h imv/imv_workitem.c \ imv/imv_workitem.h imv/imv_workitem.c \
generic/generic_attr_bool.h generic/generic_attr_bool.c \ generic/generic_attr_bool.h generic/generic_attr_bool.c \
generic/generic_attr_string.h generic/generic_attr_string.c \
ietf/ietf_attr.h ietf/ietf_attr.c \ ietf/ietf_attr.h ietf/ietf_attr.c \
ietf/ietf_attr_assess_result.h ietf/ietf_attr_assess_result.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_attr_request.h ietf/ietf_attr_attr_request.c \
@@ -54,7 +55,6 @@ libimcv_la_SOURCES = \
ita/ita_attr_get_settings.h ita/ita_attr_get_settings.c \ ita/ita_attr_get_settings.h ita/ita_attr_get_settings.c \
ita/ita_attr_settings.h ita/ita_attr_settings.c \ ita/ita_attr_settings.h ita/ita_attr_settings.c \
ita/ita_attr_angel.h ita/ita_attr_angel.c \ ita/ita_attr_angel.h ita/ita_attr_angel.c \
ita/ita_attr_device_id.h ita/ita_attr_device_id.c \
os_info/os_info.h os_info/os_info.c \ os_info/os_info.h os_info/os_info.c \
pa_tnc/pa_tnc_attr.h \ pa_tnc/pa_tnc_attr.h \
pa_tnc/pa_tnc_msg.h pa_tnc/pa_tnc_msg.c \ pa_tnc/pa_tnc_msg.h pa_tnc/pa_tnc_msg.c \
+3 -2
View File
@@ -124,14 +124,15 @@ METHOD(pa_tnc_attr_t, process, status_t,
bio_reader_t *reader; bio_reader_t *reader;
u_int32_t status; u_int32_t status;
pa_attr_names = imcv_pa_tnc_attributes->get_names(imcv_pa_tnc_attributes,
this->type.vendor_id);
*offset = 0; *offset = 0;
if (this->value.len < this->length) if (this->value.len < this->length)
{ {
return NEED_MORE; return NEED_MORE;
} }
pa_attr_names = imcv_pa_tnc_attributes->get_names(imcv_pa_tnc_attributes,
this->type.vendor_id);
if (this->value.len != ATTR_BOOL_SIZE) if (this->value.len != ATTR_BOOL_SIZE)
{ {
DBG1(DBG_TNC, "incorrect attribute size for %N/%N", DBG1(DBG_TNC, "incorrect attribute size for %N/%N",
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2013-2014 Andreas Steffen * Copyright (C) 2013-2015 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil * HSR Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -13,24 +13,23 @@
* for more details. * for more details.
*/ */
#include "ita_attr.h" #include "generic_attr_string.h"
#include "ita_attr_device_id.h"
#include <imcv.h>
#include <pen/pen.h> #include <pen/pen.h>
#include <utils/debug.h> #include <utils/debug.h>
typedef struct private_ita_attr_device_id_t private_ita_attr_device_id_t; typedef struct private_generic_attr_string_t private_generic_attr_string_t;
/** /**
* Private data of an ita_attr_device_id_t object. * Private data of an generic_attr_string_t object.
*/ */
struct private_ita_attr_device_id_t { struct private_generic_attr_string_t {
/** /**
* Public members of ita_attr_device_id_t * Public members of generic_attr_string_t
*/ */
ita_attr_device_id_t public; generic_attr_string_t public;
/** /**
* Vendor-specific attribute type * Vendor-specific attribute type
@@ -59,62 +58,76 @@ struct private_ita_attr_device_id_t {
}; };
METHOD(pa_tnc_attr_t, get_type, pen_type_t, METHOD(pa_tnc_attr_t, get_type, pen_type_t,
private_ita_attr_device_id_t *this) private_generic_attr_string_t *this)
{ {
return this->type; return this->type;
} }
METHOD(pa_tnc_attr_t, get_value, chunk_t, METHOD(pa_tnc_attr_t, get_value, chunk_t,
private_ita_attr_device_id_t *this) private_generic_attr_string_t *this)
{ {
return this->value; return this->value;
} }
METHOD(pa_tnc_attr_t, get_noskip_flag, bool, METHOD(pa_tnc_attr_t, get_noskip_flag, bool,
private_ita_attr_device_id_t *this) private_generic_attr_string_t *this)
{ {
return this->noskip_flag; return this->noskip_flag;
} }
METHOD(pa_tnc_attr_t, set_noskip_flag,void, METHOD(pa_tnc_attr_t, set_noskip_flag,void,
private_ita_attr_device_id_t *this, bool noskip) private_generic_attr_string_t *this, bool noskip)
{ {
this->noskip_flag = noskip; this->noskip_flag = noskip;
} }
METHOD(pa_tnc_attr_t, build, void, METHOD(pa_tnc_attr_t, build, void,
private_ita_attr_device_id_t *this) private_generic_attr_string_t *this)
{ {
return; return;
} }
METHOD(pa_tnc_attr_t, process, status_t, METHOD(pa_tnc_attr_t, process, status_t,
private_ita_attr_device_id_t *this, u_int32_t *offset) private_generic_attr_string_t *this, u_int32_t *offset)
{ {
enum_name_t *pa_attr_names;
u_char *pos;
*offset = 0; *offset = 0;
if (this->value.len < this->length) if (this->value.len < this->length)
{ {
return NEED_MORE; return NEED_MORE;
} }
pa_attr_names = imcv_pa_tnc_attributes->get_names(imcv_pa_tnc_attributes,
this->type.vendor_id);
pos = memchr(this->value.ptr, '\0', this->value.len);
if (pos)
{
DBG1(DBG_TNC, "nul termination in %N/%N string attribute",
pen_names, this->type.vendor_id, pa_attr_names, this->type.type);
*offset = pos - this->value.ptr;
return FAILED;
}
return SUCCESS; return SUCCESS;
} }
METHOD(pa_tnc_attr_t, add_segment, void, METHOD(pa_tnc_attr_t, add_segment, void,
private_ita_attr_device_id_t *this, chunk_t segment) private_generic_attr_string_t *this, chunk_t segment)
{ {
this->value = chunk_cat("mc", this->value, segment); this->value = chunk_cat("mc", this->value, segment);
} }
METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*,
private_ita_attr_device_id_t *this) private_generic_attr_string_t *this)
{ {
ref_get(&this->ref); ref_get(&this->ref);
return &this->public.pa_tnc_attribute; return &this->public.pa_tnc_attribute;
} }
METHOD(pa_tnc_attr_t, destroy, void, METHOD(pa_tnc_attr_t, destroy, void,
private_ita_attr_device_id_t *this) private_generic_attr_string_t *this)
{ {
if (ref_put(&this->ref)) if (ref_put(&this->ref))
{ {
@@ -126,9 +139,10 @@ METHOD(pa_tnc_attr_t, destroy, void,
/** /**
* Described in header. * Described in header.
*/ */
pa_tnc_attr_t *ita_attr_device_id_create_from_data(size_t length, chunk_t value) pa_tnc_attr_t *generic_attr_string_create_from_data(size_t length,
chunk_t value, pen_type_t type)
{ {
private_ita_attr_device_id_t *this; private_generic_attr_string_t *this;
INIT(this, INIT(this,
.public = { .public = {
@@ -144,7 +158,7 @@ pa_tnc_attr_t *ita_attr_device_id_create_from_data(size_t length, chunk_t value)
.destroy = _destroy, .destroy = _destroy,
}, },
}, },
.type = { PEN_ITA, ITA_ATTR_DEVICE_ID }, .type = type,
.length = length, .length = length,
.value = chunk_clone(value), .value = chunk_clone(value),
.ref = 1, .ref = 1,
@@ -156,8 +170,8 @@ pa_tnc_attr_t *ita_attr_device_id_create_from_data(size_t length, chunk_t value)
/** /**
* Described in header. * Described in header.
*/ */
pa_tnc_attr_t *ita_attr_device_id_create(chunk_t value) pa_tnc_attr_t *generic_attr_string_create(chunk_t value, pen_type_t type)
{ {
return ita_attr_device_id_create_from_data(value.len, value); return generic_attr_string_create_from_data(value.len, value, type);
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2013-2014 Andreas Steffen * Copyright (C) 2015 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil * HSR Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -14,43 +14,46 @@
*/ */
/** /**
* @defgroup ita_attr_device_id ita_attr_device_id * @defgroup generic_attr_string generic_attr_string
* @{ @ingroup ita_attr * @{ @ingroup generic_attr
*/ */
#ifndef ITA_ATTR_DEVICE_ID_H_ #ifndef GENERIC_ATTR_STRING_H_
#define ITA_ATTR_DEVICE_ID_H_ #define GENERIC_ATTR_STRING_H_
typedef struct ita_attr_device_id_t ita_attr_device_id_t; typedef struct generic_attr_string_t generic_attr_string_t;
#include <pen/pen.h>
#include "pa_tnc/pa_tnc_attr.h" #include "pa_tnc/pa_tnc_attr.h"
/** /**
* Class implementing the ITA Device ID PA-TNC attribute. * Class implementing a generic PA-TNC attribute containing a non-nul
* * terminated string
*/ */
struct ita_attr_device_id_t { struct generic_attr_string_t {
/** /**
* Public PA-TNC attribute interface * Public PA-TNC attribute interface
*/ */
pa_tnc_attr_t pa_tnc_attribute; pa_tnc_attr_t pa_tnc_attribute;
}; };
/** /**
* Creates an ita_attr_device_id_t object * Creates a generic_attr_string_t object
* *
* @param value ITA Device ID attribute value * @param string Non-nul terminated string
* @param type Vendor ID / Attribute Type
*/ */
pa_tnc_attr_t* ita_attr_device_id_create(chunk_t value); pa_tnc_attr_t* generic_attr_string_create(chunk_t string, pen_type_t type);
/** /**
* Creates an ita_attr_device_id_t object from received data * Creates an generic_attr_string_t object from received data
* *
* @param length Total length of attribute value * @param length Total length of attribute value
* @param value Unparsed attribute value (might be a segment) * @param value Unparsed attribute value (might be a segment)
* @param type Vendor ID / Attribute Type
*/ */
pa_tnc_attr_t* ita_attr_device_id_create_from_data(size_t length, chunk_t value); pa_tnc_attr_t* generic_attr_string_create_from_data(size_t length,
chunk_t value, pen_type_t type);
#endif /** ITA_ATTR_DEVICE_ID_H_ @}*/ #endif /** GENERIC_ATTR_STRING_H_ @}*/
+3 -2
View File
@@ -19,7 +19,7 @@
#include "ita/ita_attr_get_settings.h" #include "ita/ita_attr_get_settings.h"
#include "ita/ita_attr_settings.h" #include "ita/ita_attr_settings.h"
#include "ita/ita_attr_angel.h" #include "ita/ita_attr_angel.h"
#include "ita/ita_attr_device_id.h" #include "generic/generic_attr_string.h"
ENUM(ita_attr_names, ITA_ATTR_COMMAND, ITA_ATTR_DEVICE_ID, ENUM(ita_attr_names, ITA_ATTR_COMMAND, ITA_ATTR_DEVICE_ID,
"Command", "Command",
@@ -53,7 +53,8 @@ pa_tnc_attr_t* ita_attr_create_from_data(u_int32_t type, size_t length,
case ITA_ATTR_STOP_ANGEL: case ITA_ATTR_STOP_ANGEL:
return ita_attr_angel_create_from_data(FALSE); return ita_attr_angel_create_from_data(FALSE);
case ITA_ATTR_DEVICE_ID: case ITA_ATTR_DEVICE_ID:
return ita_attr_device_id_create_from_data(length, value); return generic_attr_string_create_from_data(length, value,
pen_type_create(PEN_ITA, type));
default: default:
return NULL; return NULL;
} }
+3 -2
View File
@@ -19,6 +19,7 @@
#include <imc/imc_msg.h> #include <imc/imc_msg.h>
#include <imc/imc_os_info.h> #include <imc/imc_os_info.h>
#include <generic/generic_attr_bool.h> #include <generic/generic_attr_bool.h>
#include <generic/generic_attr_string.h>
#include <ietf/ietf_attr.h> #include <ietf/ietf_attr.h>
#include <ietf/ietf_attr_attr_request.h> #include <ietf/ietf_attr_attr_request.h>
#include <ietf/ietf_attr_installed_packages.h> #include <ietf/ietf_attr_installed_packages.h>
@@ -29,7 +30,6 @@
#include <ita/ita_attr.h> #include <ita/ita_attr.h>
#include <ita/ita_attr_get_settings.h> #include <ita/ita_attr_get_settings.h>
#include <ita/ita_attr_settings.h> #include <ita/ita_attr_settings.h>
#include <ita/ita_attr_device_id.h>
#include <tncif_pa_subtypes.h> #include <tncif_pa_subtypes.h>
@@ -331,7 +331,8 @@ static void add_device_id(imc_msg_t *msg)
} }
DBG1(DBG_IMC, "device ID is %.*s", value.len, value.ptr); DBG1(DBG_IMC, "device ID is %.*s", value.len, value.ptr);
attr = ita_attr_device_id_create(value); attr = generic_attr_string_create(value, pen_type_create(PEN_ITA,
ITA_ATTR_DEVICE_ID));
msg->add_attribute(msg, attr); msg->add_attribute(msg, attr);
free(value.ptr); free(value.ptr);
} }
@@ -27,13 +27,13 @@
#include <imv/imv_msg.h> #include <imv/imv_msg.h>
#include <imv/imv_session.h> #include <imv/imv_session.h>
#include <imv/imv_os_info.h> #include <imv/imv_os_info.h>
#include <generic/generic_attr_string.h>
#include <ietf/ietf_attr.h> #include <ietf/ietf_attr.h>
#include <ietf/ietf_attr_attr_request.h> #include <ietf/ietf_attr_attr_request.h>
#include <ietf/ietf_attr_pa_tnc_error.h> #include <ietf/ietf_attr_pa_tnc_error.h>
#include <ietf/ietf_attr_product_info.h> #include <ietf/ietf_attr_product_info.h>
#include <ietf/ietf_attr_string_version.h> #include <ietf/ietf_attr_string_version.h>
#include <ita/ita_attr.h> #include <ita/ita_attr.h>
#include <ita/ita_attr_device_id.h>
#include <tcg/tcg_attr.h> #include <tcg/tcg_attr.h>
#include <tcg/pts/tcg_pts_attr_meas_algo.h> #include <tcg/pts/tcg_pts_attr_meas_algo.h>
#include <tcg/pts/tcg_pts_attr_proto_caps.h> #include <tcg/pts/tcg_pts_attr_proto_caps.h>
+1 -1
View File
@@ -24,6 +24,7 @@
#include <imv/imv_agent.h> #include <imv/imv_agent.h>
#include <imv/imv_msg.h> #include <imv/imv_msg.h>
#include <generic/generic_attr_bool.h> #include <generic/generic_attr_bool.h>
#include <generic/generic_attr_string.h>
#include <ietf/ietf_attr.h> #include <ietf/ietf_attr.h>
#include <ietf/ietf_attr_attr_request.h> #include <ietf/ietf_attr_attr_request.h>
#include <ietf/ietf_attr_installed_packages.h> #include <ietf/ietf_attr_installed_packages.h>
@@ -36,7 +37,6 @@
#include <ita/ita_attr.h> #include <ita/ita_attr.h>
#include <ita/ita_attr_get_settings.h> #include <ita/ita_attr_get_settings.h>
#include <ita/ita_attr_settings.h> #include <ita/ita_attr_settings.h>
#include <ita/ita_attr_device_id.h>
#include "tcg/seg/tcg_seg_attr_max_size.h" #include "tcg/seg/tcg_seg_attr_max_size.h"
#include "tcg/seg/tcg_seg_attr_seg_env.h" #include "tcg/seg/tcg_seg_attr_seg_env.h"
+13 -11
View File
@@ -83,28 +83,30 @@ pa_tnc_attr_t* pwg_attr_create_from_data(u_int32_t type, size_t length, chunk_t
case PWG_HCD_PSTN_FAX_ENABLED: case PWG_HCD_PSTN_FAX_ENABLED:
return generic_attr_bool_create_from_data(length, value, return generic_attr_bool_create_from_data(length, value,
pen_type_create(PEN_PWG, type)); pen_type_create(PEN_PWG, type));
case PWG_HCD_FIREWALL_SETTING:
return ietf_attr_port_filter_create_from_data(length, value,
pen_type_create(PEN_PWG, type));
case PWG_HCD_ATTRS_NATURAL_LANG: case PWG_HCD_ATTRS_NATURAL_LANG:
case PWG_HCD_MACHINE_TYPE_MODEL: case PWG_HCD_MACHINE_TYPE_MODEL:
case PWG_HCD_VENDOR_NAME: case PWG_HCD_VENDOR_NAME:
case PWG_HCD_VENDOR_SMI_CODE:
case PWG_HCD_TIME_SOURCE:
case PWG_HCD_FIRMWARE_NAME: case PWG_HCD_FIRMWARE_NAME:
case PWG_HCD_FIRMWARE_PATCHES: case PWG_HCD_FIRMWARE_PATCHES:
case PWG_HCD_FIRMWARE_STRING_VERSION: case PWG_HCD_FIRMWARE_STRING_VERSION:
case PWG_HCD_FIRMWARE_VERSION: case PWG_HCD_TIME_SOURCE:
case PWG_HCD_RESIDENT_APP_NAME:
case PWG_HCD_RESIDENT_APP_PATCHES:
case PWG_HCD_RESIDENT_APP_STRING_VERSION:
case PWG_HCD_RESIDENT_APP_VERSION:
case PWG_HCD_USER_APP_NAME: case PWG_HCD_USER_APP_NAME:
case PWG_HCD_USER_APP_PATCHES: case PWG_HCD_USER_APP_PATCHES:
case PWG_HCD_USER_APP_STRING_VERSION: case PWG_HCD_USER_APP_STRING_VERSION:
case PWG_HCD_USER_APP_VERSION: case PWG_HCD_RESIDENT_APP_NAME:
case PWG_HCD_RESIDENT_APP_PATCHES:
case PWG_HCD_RESIDENT_APP_STRING_VERSION:
case PWG_HCD_CERTIFICATION_STATE: case PWG_HCD_CERTIFICATION_STATE:
case PWG_HCD_CONFIGURATION_STATE: case PWG_HCD_CONFIGURATION_STATE:
return generic_attr_string_create_from_data(length, value,
pen_type_create(PEN_PWG, type));
case PWG_HCD_FIREWALL_SETTING:
return ietf_attr_port_filter_create_from_data(length, value,
pen_type_create(PEN_PWG, type));
case PWG_HCD_VENDOR_SMI_CODE:
case PWG_HCD_FIRMWARE_VERSION:
case PWG_HCD_RESIDENT_APP_VERSION:
case PWG_HCD_USER_APP_VERSION:
default: default:
return NULL; return NULL;
} }