Added total length parameter in PA-TNC attribute constructor
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2012 Andreas Steffen
|
||||
* Copyright (C) 2011-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -47,34 +47,35 @@ ENUM(ietf_attr_names, IETF_ATTR_TESTING, IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED,
|
||||
/**
|
||||
* See header
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_create_from_data(u_int32_t type, chunk_t value)
|
||||
pa_tnc_attr_t* ietf_attr_create_from_data(u_int32_t type, size_t length,
|
||||
chunk_t value)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case IETF_ATTR_ATTRIBUTE_REQUEST:
|
||||
return ietf_attr_attr_request_create_from_data(value);
|
||||
return ietf_attr_attr_request_create_from_data(length, value);
|
||||
case IETF_ATTR_PRODUCT_INFORMATION:
|
||||
return ietf_attr_product_info_create_from_data(value);
|
||||
return ietf_attr_product_info_create_from_data(length, value);
|
||||
case IETF_ATTR_NUMERIC_VERSION:
|
||||
return ietf_attr_numeric_version_create_from_data(value);
|
||||
return ietf_attr_numeric_version_create_from_data(length, value);
|
||||
case IETF_ATTR_STRING_VERSION:
|
||||
return ietf_attr_string_version_create_from_data(value);
|
||||
return ietf_attr_string_version_create_from_data(length, value);
|
||||
case IETF_ATTR_OPERATIONAL_STATUS:
|
||||
return ietf_attr_op_status_create_from_data(value);
|
||||
return ietf_attr_op_status_create_from_data(length, value);
|
||||
case IETF_ATTR_PORT_FILTER:
|
||||
return ietf_attr_port_filter_create_from_data(value);
|
||||
return ietf_attr_port_filter_create_from_data(length, value);
|
||||
case IETF_ATTR_INSTALLED_PACKAGES:
|
||||
return ietf_attr_installed_packages_create_from_data(value);
|
||||
return ietf_attr_installed_packages_create_from_data(length, value);
|
||||
case IETF_ATTR_PA_TNC_ERROR:
|
||||
return ietf_attr_pa_tnc_error_create_from_data(value);
|
||||
return ietf_attr_pa_tnc_error_create_from_data(length, value);
|
||||
case IETF_ATTR_ASSESSMENT_RESULT:
|
||||
return ietf_attr_assess_result_create_from_data(value);
|
||||
return ietf_attr_assess_result_create_from_data(length, value);
|
||||
case IETF_ATTR_REMEDIATION_INSTRUCTIONS:
|
||||
return ietf_attr_remediation_instr_create_from_data(value);
|
||||
return ietf_attr_remediation_instr_create_from_data(length, value);
|
||||
case IETF_ATTR_FORWARDING_ENABLED:
|
||||
return ietf_attr_fwd_enabled_create_from_data(value);
|
||||
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(value);
|
||||
return ietf_attr_default_pwd_enabled_create_from_data(length, value);
|
||||
case IETF_ATTR_TESTING:
|
||||
case IETF_ATTR_RESERVED:
|
||||
default:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Andreas Steffen
|
||||
* Copyright (C) 2011-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -56,8 +56,10 @@ extern enum_name_t *ietf_attr_names;
|
||||
* Create an IETF PA-TNC attribute from data
|
||||
*
|
||||
* @param type attribute type
|
||||
* @param value attribute value
|
||||
* @param length attribute length
|
||||
* @param value attribute value or segment
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_create_from_data(u_int32_t type, chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_create_from_data(u_int32_t type, size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -50,7 +50,12 @@ struct private_ietf_attr_assess_result_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -107,6 +112,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer = bio_writer_create(ASSESS_RESULT_SIZE);
|
||||
writer->write_uint32(writer, this->result);
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -115,10 +121,15 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
{
|
||||
bio_reader_t *reader;
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len < ASSESS_RESULT_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "insufficient data for IETF assessment result");
|
||||
*offset = 0;
|
||||
return FAILED;
|
||||
}
|
||||
reader = bio_reader_create(this->value);
|
||||
@@ -183,7 +194,8 @@ pa_tnc_attr_t *ietf_attr_assess_result_create(u_int32_t result)
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_assess_result_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_assess_result_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_assess_result_t *this;
|
||||
|
||||
@@ -202,6 +214,7 @@ pa_tnc_attr_t *ietf_attr_assess_result_create_from_data(chunk_t data)
|
||||
.get_result = _get_result,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_ASSESSMENT_RESULT },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ref = 1,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -56,8 +56,10 @@ pa_tnc_attr_t* ietf_attr_assess_result_create(u_int32_t result);
|
||||
/**
|
||||
* Creates an ietf_attr_assess_result_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_assess_result_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_assess_result_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_ASSESS_RESULT_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -59,7 +59,12 @@ struct private_ietf_attr_attr_request_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -126,6 +131,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -150,11 +156,17 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
u_int8_t reserved;
|
||||
int count;
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
|
||||
count = this->value.len / ATTR_REQUEST_ENTRY_SIZE;
|
||||
if (this->value.len != ATTR_REQUEST_ENTRY_SIZE * count)
|
||||
{
|
||||
DBG1(DBG_TNC, "incorrect attribute length for IETF attribute request");
|
||||
*offset = 0;
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
@@ -246,7 +258,8 @@ pa_tnc_attr_t *ietf_attr_attr_request_create(pen_t vendor_id, u_int32_t type)
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_attr_request_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_attr_request_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_attr_request_t *this;
|
||||
|
||||
@@ -266,6 +279,7 @@ pa_tnc_attr_t *ietf_attr_attr_request_create_from_data(chunk_t data)
|
||||
.create_enumerator = _create_enumerator,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_ATTRIBUTE_REQUEST },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.list = linked_list_create(),
|
||||
.ref = 1,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -62,10 +62,10 @@ struct ietf_attr_attr_request_t {
|
||||
pa_tnc_attr_t* ietf_attr_attr_request_create(pen_t vendor_id, u_int32_t type);
|
||||
|
||||
/**
|
||||
* Creates an ietf_attr_attr_request_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_attr_request_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_attr_request_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_ATTR_REQUEST_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -50,7 +50,12 @@ struct private_ietf_attr_default_pwd_enabled_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -107,6 +112,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer->write_uint32(writer, this->status);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -118,6 +124,10 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
|
||||
*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 "
|
||||
@@ -194,7 +204,8 @@ pa_tnc_attr_t *ietf_attr_default_pwd_enabled_create(bool status)
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_default_pwd_enabled_create_from_data(chunk_t data)
|
||||
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;
|
||||
|
||||
@@ -213,6 +224,7 @@ pa_tnc_attr_t *ietf_attr_default_pwd_enabled_create_from_data(chunk_t data)
|
||||
.get_status = _get_status,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_FACTORY_DEFAULT_PWD_ENABLED },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ref = 1,
|
||||
);
|
||||
|
||||
@@ -56,8 +56,10 @@ 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 value unparsed attribute value
|
||||
* @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(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_default_pwd_enabled_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_PWD_ENABLED_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -50,7 +50,12 @@ struct private_ietf_attr_fwd_enabled_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -107,6 +112,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer->write_uint32(writer, this->fwd_status);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -118,6 +124,10 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
|
||||
*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");
|
||||
@@ -193,7 +203,8 @@ pa_tnc_attr_t *ietf_attr_fwd_enabled_create(os_fwd_status_t fwd_status)
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_fwd_enabled_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_fwd_enabled_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_fwd_enabled_t *this;
|
||||
|
||||
@@ -212,6 +223,7 @@ pa_tnc_attr_t *ietf_attr_fwd_enabled_create_from_data(chunk_t data)
|
||||
.get_status = _get_status,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_FORWARDING_ENABLED },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ref = 1,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-14 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -57,8 +57,10 @@ 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 value unparsed attribute value
|
||||
* @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(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_fwd_enabled_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_FWD_ENABLED_H_ @}*/
|
||||
|
||||
@@ -57,7 +57,12 @@ struct private_ietf_attr_installed_packages_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -143,6 +148,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -158,6 +164,10 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len < IETF_INSTALLED_PACKAGES_MIN_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "insufficient data for IETF installed packages");
|
||||
@@ -300,9 +310,11 @@ pa_tnc_attr_t *ietf_attr_installed_packages_create(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* Described in header.
|
||||
* Described in header. .length = length,
|
||||
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_installed_packages_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_installed_packages_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_installed_packages_t *this;
|
||||
|
||||
@@ -322,6 +334,7 @@ pa_tnc_attr_t *ietf_attr_installed_packages_create_from_data(chunk_t data)
|
||||
.create_enumerator = _create_enumerator,
|
||||
},
|
||||
.type = {PEN_IETF, IETF_ATTR_INSTALLED_PACKAGES },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.packages = linked_list_create(),
|
||||
.ref = 1,
|
||||
|
||||
@@ -67,8 +67,10 @@ pa_tnc_attr_t* ietf_attr_installed_packages_create(void);
|
||||
/**
|
||||
* Creates an ietf_attr_installed_packages_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_installed_packages_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_installed_packages_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_INSTALLED_PACKAGES_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -56,7 +56,12 @@ struct private_ietf_attr_numeric_version_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -138,6 +143,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer->write_uint16(writer, this->service_pack_minor);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -146,10 +152,15 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
{
|
||||
bio_reader_t *reader;
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len < NUMERIC_VERSION_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "insufficient data for IETF numeric version");
|
||||
*offset = 0;
|
||||
return FAILED;
|
||||
}
|
||||
reader = bio_reader_create(this->value);
|
||||
@@ -253,7 +264,8 @@ pa_tnc_attr_t *ietf_attr_numeric_version_create(u_int32_t major, u_int32_t minor
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_numeric_version_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_numeric_version_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_numeric_version_t *this;
|
||||
|
||||
@@ -274,6 +286,7 @@ pa_tnc_attr_t *ietf_attr_numeric_version_create_from_data(chunk_t data)
|
||||
.get_service_pack = _get_service_pack,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_NUMERIC_VERSION },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ref = 1,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-14 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -77,8 +77,10 @@ pa_tnc_attr_t* ietf_attr_numeric_version_create(u_int32_t major, u_int32_t minor
|
||||
/**
|
||||
* Creates an ietf_attr_numeric_version_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_numeric_version_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_numeric_version_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_NUMERIC_VERSION_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -76,7 +76,12 @@ struct private_ietf_attr_op_status_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -154,6 +159,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer->write_data (writer, chunk_create(last_use, 20));
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -167,6 +173,10 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len != OP_STATUS_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "incorrect size for IETF operational status");
|
||||
@@ -284,7 +294,7 @@ pa_tnc_attr_t *ietf_attr_op_status_create(u_int8_t status, u_int8_t result,
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_op_status_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_op_status_create_from_data(size_t length, chunk_t data)
|
||||
{
|
||||
private_ietf_attr_op_status_t *this;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-14 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -100,8 +100,10 @@ pa_tnc_attr_t* ietf_attr_op_status_create(u_int8_t status, u_int8_t result,
|
||||
/**
|
||||
* Creates an ietf_attr_op_status_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_op_status_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_op_status_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_OP_STATUS_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2012 Andreas Steffen
|
||||
* Copyright (C) 2011-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -113,7 +113,12 @@ struct private_ietf_attr_pa_tnc_error_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -214,6 +219,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
}
|
||||
}
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -224,10 +230,15 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
uint8_t reserved;
|
||||
uint32_t vendor_id, type;
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len < PA_ERROR_HEADER_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "insufficient data for PA-TNC error header");
|
||||
*offset = 0;
|
||||
return FAILED;
|
||||
}
|
||||
reader = bio_reader_create(this->value);
|
||||
@@ -417,11 +428,13 @@ pa_tnc_attr_t *ietf_attr_pa_tnc_error_create_with_offset(pen_type_t error_code,
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_pa_tnc_error_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_pa_tnc_error_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_pa_tnc_error_t *this;
|
||||
|
||||
this = create_generic();
|
||||
this->length = length;
|
||||
this->value = chunk_clone(data);
|
||||
|
||||
return &this->public.pa_tnc_attribute;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2012 Andreas Steffen
|
||||
* Copyright (C) 2011-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -120,8 +120,10 @@ pa_tnc_attr_t* ietf_attr_pa_tnc_error_create_with_offset(pen_type_t error_code,
|
||||
/**
|
||||
* Creates an ietf_attr_pa_tnc_error_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_pa_tnc_error_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_pa_tnc_error_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_PA_TNC_ERROR_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Andreas Steffen, HSR Hochschule fuer Technik Rapperswil
|
||||
* Copyright (C) 2011-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
|
||||
@@ -63,7 +64,12 @@ struct private_ietf_attr_port_filter_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -131,6 +137,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -141,11 +148,16 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
port_entry_t *entry;
|
||||
u_int8_t blocked;
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len % PORT_FILTER_ENTRY_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "ietf port filter attribute value is not a multiple of %d",
|
||||
PORT_FILTER_ENTRY_SIZE);
|
||||
*offset = 0;
|
||||
return FAILED;
|
||||
}
|
||||
reader = bio_reader_create(this->value);
|
||||
@@ -248,7 +260,8 @@ pa_tnc_attr_t *ietf_attr_port_filter_create(void)
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_port_filter_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_port_filter_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_port_filter_t *this;
|
||||
|
||||
@@ -268,6 +281,7 @@ pa_tnc_attr_t *ietf_attr_port_filter_create_from_data(chunk_t data)
|
||||
.create_port_enumerator = _create_port_enumerator,
|
||||
},
|
||||
.type = {PEN_IETF, IETF_ATTR_PORT_FILTER },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ports = linked_list_create(),
|
||||
.ref = 1,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Andreas Steffen
|
||||
* Copyright (C) 2011-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -67,8 +67,10 @@ pa_tnc_attr_t* ietf_attr_port_filter_create(void);
|
||||
/**
|
||||
* Creates an ietf_attr_port_filter_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_port_filter_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_port_filter_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_PORT_FILTER_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Andreas Steffen, HSR Hochschule fuer Technik Rapperswil
|
||||
* Copyright (C) 2011-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
|
||||
@@ -51,7 +52,12 @@ struct private_ietf_attr_product_info_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -120,6 +126,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer->write_data (writer, this->product_name);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -129,10 +136,15 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
bio_reader_t *reader;
|
||||
chunk_t product_name;
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len < PRODUCT_INFO_MIN_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "insufficient data for IETF product information");
|
||||
*offset = 0;
|
||||
return FAILED;
|
||||
}
|
||||
reader = bio_reader_create(this->value);
|
||||
@@ -220,7 +232,8 @@ pa_tnc_attr_t *ietf_attr_product_info_create(pen_t vendor_id, u_int16_t id,
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_product_info_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_product_info_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_product_info_t *this;
|
||||
|
||||
@@ -239,6 +252,7 @@ pa_tnc_attr_t *ietf_attr_product_info_create_from_data(chunk_t data)
|
||||
.get_info = _get_info,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_PRODUCT_INFORMATION },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ref = 1,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Andreas Steffen
|
||||
* Copyright (C) 2011-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -60,8 +60,10 @@ pa_tnc_attr_t* ietf_attr_product_info_create(pen_t vendor_id, u_int16_t id,
|
||||
/**
|
||||
* Creates an ietf_attr_product_info_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_product_info_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_product_info_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_PRODUCT_INFO_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -79,7 +79,12 @@ struct private_ietf_attr_remediation_instr_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -155,6 +160,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer->write_data (writer, this->parameters);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -168,6 +174,10 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len < REMEDIATION_INSTR_MIN_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "insufficient data for IETF remediation instructions");
|
||||
@@ -328,7 +338,8 @@ pa_tnc_attr_t *ietf_attr_remediation_instr_create_from_string(chunk_t string,
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_remediation_instr_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_remediation_instr_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_remediation_instr_t *this;
|
||||
|
||||
@@ -350,6 +361,7 @@ pa_tnc_attr_t *ietf_attr_remediation_instr_create_from_data(chunk_t data)
|
||||
.get_string = _get_string,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_REMEDIATION_INSTRUCTIONS },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ref = 1,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -102,8 +102,10 @@ pa_tnc_attr_t* ietf_attr_remediation_instr_create_from_string(chunk_t string,
|
||||
/**
|
||||
* Creates an ietf_attr_remediation_instr_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_remediation_instr_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_remediation_instr_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_REMEDIATION_INSTR_H_ @}*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -54,7 +54,12 @@ struct private_ietf_attr_string_version_t {
|
||||
pen_type_t type;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* Length of attribute value
|
||||
*/
|
||||
size_t length;
|
||||
|
||||
/**
|
||||
* Attribute value or segment
|
||||
*/
|
||||
chunk_t value;
|
||||
|
||||
@@ -124,6 +129,7 @@ METHOD(pa_tnc_attr_t, build, void,
|
||||
writer->write_data8(writer, this->config);
|
||||
|
||||
this->value = writer->extract_buf(writer);
|
||||
this->length = this->value.len;
|
||||
writer->destroy(writer);
|
||||
}
|
||||
|
||||
@@ -137,6 +143,10 @@ METHOD(pa_tnc_attr_t, process, status_t,
|
||||
|
||||
*offset = 0;
|
||||
|
||||
if (this->value.len < this->length)
|
||||
{
|
||||
return NEED_MORE;
|
||||
}
|
||||
if (this->value.len < STRING_VERSION_MIN_SIZE)
|
||||
{
|
||||
DBG1(DBG_TNC, "insufficient data for IETF string version");
|
||||
@@ -272,7 +282,8 @@ pa_tnc_attr_t *ietf_attr_string_version_create(chunk_t version, chunk_t build,
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
pa_tnc_attr_t *ietf_attr_string_version_create_from_data(chunk_t data)
|
||||
pa_tnc_attr_t *ietf_attr_string_version_create_from_data(size_t length,
|
||||
chunk_t data)
|
||||
{
|
||||
private_ietf_attr_string_version_t *this;
|
||||
|
||||
@@ -291,6 +302,7 @@ pa_tnc_attr_t *ietf_attr_string_version_create_from_data(chunk_t data)
|
||||
.get_version = _get_version,
|
||||
},
|
||||
.type = { PEN_IETF, IETF_ATTR_STRING_VERSION },
|
||||
.length = length,
|
||||
.value = chunk_clone(data),
|
||||
.ref = 1,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Andreas Steffen
|
||||
* Copyright (C) 2012-2014 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -60,8 +60,10 @@ pa_tnc_attr_t* ietf_attr_string_version_create(chunk_t version, chunk_t build,
|
||||
/**
|
||||
* Creates an ietf_attr_string_version_t object from received data
|
||||
*
|
||||
* @param value unparsed attribute value
|
||||
* @param length Total length of attribute value
|
||||
* @param value Unparsed attribute value (might be a segment)
|
||||
*/
|
||||
pa_tnc_attr_t* ietf_attr_string_version_create_from_data(chunk_t value);
|
||||
pa_tnc_attr_t* ietf_attr_string_version_create_from_data(size_t length,
|
||||
chunk_t value);
|
||||
|
||||
#endif /** IETF_ATTR_STRING_VERSION_H_ @}*/
|
||||
|
||||
Reference in New Issue
Block a user