implemented PB-TNC message parsing checks
This commit is contained in:
@@ -13,15 +13,16 @@ endif
|
|||||||
|
|
||||||
libstrongswan_tnccs_20_la_SOURCES = \
|
libstrongswan_tnccs_20_la_SOURCES = \
|
||||||
tnccs_20_plugin.h tnccs_20_plugin.c tnccs_20.h tnccs_20.c \
|
tnccs_20_plugin.h tnccs_20_plugin.c tnccs_20.h tnccs_20.c \
|
||||||
tnccs_20_types.h tnccs_20_types.c \
|
|
||||||
batch/pb_tnc_batch.h batch/pb_tnc_batch.c \
|
batch/pb_tnc_batch.h batch/pb_tnc_batch.c \
|
||||||
messages/pb_tnc_message.h messages/pb_tnc_message.c \
|
messages/pb_tnc_msg.h messages/pb_tnc_msg.c \
|
||||||
messages/pb_pa_message.h messages/pb_pa_message.c \
|
messages/pb_experimental_msg.h messages/pb_experimental_msg.c \
|
||||||
messages/pb_assessment_result_message.h messages/pb_assessment_result_message.c \
|
messages/pb_pa_msg.h messages/pb_pa_msg.c \
|
||||||
messages/pb_access_recommendation_message.h messages/pb_access_recommendation_message.c \
|
messages/pb_assessment_result_msg.h messages/pb_assessment_result_msg.c \
|
||||||
messages/pb_error_message.h messages/pb_error_message.c \
|
messages/pb_access_recommendation_msg.h messages/pb_access_recommendation_msg.c \
|
||||||
messages/pb_language_preference_message.h messages/pb_language_preference_message.c \
|
messages/pb_error_msg.h messages/pb_error_msg.c \
|
||||||
messages/pb_reason_string_message.h messages/pb_reason_string_message.c \
|
messages/pb_language_preference_msg.h messages/pb_language_preference_msg.c \
|
||||||
|
messages/pb_reason_string_msg.h messages/pb_reason_string_msg.c \
|
||||||
|
messages/pb_remediation_parameters_msg.h messages/pb_remediation_parameters_msg.c \
|
||||||
state_machine/pb_tnc_state_machine.h state_machine/pb_tnc_state_machine.c
|
state_machine/pb_tnc_state_machine.h state_machine/pb_tnc_state_machine.c
|
||||||
|
|
||||||
libstrongswan_tnccs_20_la_LDFLAGS = -module -avoid-version
|
libstrongswan_tnccs_20_la_LDFLAGS = -module -avoid-version
|
||||||
|
|||||||
@@ -14,9 +14,8 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tnccs_20_types.h"
|
|
||||||
#include "pb_tnc_batch.h"
|
#include "pb_tnc_batch.h"
|
||||||
#include "messages/pb_error_message.h"
|
#include "messages/pb_error_msg.h"
|
||||||
#include "state_machine/pb_tnc_state_machine.h"
|
#include "state_machine/pb_tnc_state_machine.h"
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
@@ -80,7 +79,7 @@ typedef struct private_pb_tnc_batch_t private_pb_tnc_batch_t;
|
|||||||
*/
|
*/
|
||||||
struct private_pb_tnc_batch_t {
|
struct private_pb_tnc_batch_t {
|
||||||
/**
|
/**
|
||||||
* Public pb_pa_message_t interface.
|
* Public pb_pa_msg_t interface.
|
||||||
*/
|
*/
|
||||||
pb_tnc_batch_t public;
|
pb_tnc_batch_t public;
|
||||||
|
|
||||||
@@ -112,7 +111,7 @@ struct private_pb_tnc_batch_t {
|
|||||||
/**
|
/**
|
||||||
* Offset into encoding (used for error reporting)
|
* Offset into encoding (used for error reporting)
|
||||||
*/
|
*/
|
||||||
size_t offset;
|
u_int32_t offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(pb_tnc_batch_t, get_type, pb_tnc_batch_type_t,
|
METHOD(pb_tnc_batch_t, get_type, pb_tnc_batch_type_t,
|
||||||
@@ -127,8 +126,8 @@ METHOD(pb_tnc_batch_t, get_encoding, chunk_t,
|
|||||||
return this->encoding;
|
return this->encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_batch_t, add_message, void,
|
METHOD(pb_tnc_batch_t, add_msg, void,
|
||||||
private_pb_tnc_batch_t *this, pb_tnc_message_t* msg)
|
private_pb_tnc_batch_t *this, pb_tnc_msg_t* msg)
|
||||||
{
|
{
|
||||||
DBG2(DBG_TNC, "adding %N Message", pb_tnc_msg_type_names,
|
DBG2(DBG_TNC, "adding %N Message", pb_tnc_msg_type_names,
|
||||||
msg->get_type(msg));
|
msg->get_type(msg));
|
||||||
@@ -139,11 +138,10 @@ METHOD(pb_tnc_batch_t, build, void,
|
|||||||
private_pb_tnc_batch_t *this)
|
private_pb_tnc_batch_t *this)
|
||||||
{
|
{
|
||||||
u_int32_t batch_len, msg_len;
|
u_int32_t batch_len, msg_len;
|
||||||
u_int8_t flags = PB_TNC_FLAG_NONE;
|
|
||||||
chunk_t msg_value;
|
chunk_t msg_value;
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
pb_tnc_msg_type_t msg_type;
|
pb_tnc_msg_type_t msg_type;
|
||||||
pb_tnc_message_t *msg;
|
pb_tnc_msg_t *msg;
|
||||||
tls_writer_t *writer;
|
tls_writer_t *writer;
|
||||||
|
|
||||||
/* compute total PB-TNC batch size by summing over all messages */
|
/* compute total PB-TNC batch size by summing over all messages */
|
||||||
@@ -169,24 +167,16 @@ METHOD(pb_tnc_batch_t, build, void,
|
|||||||
enumerator = this->messages->create_enumerator(this->messages);
|
enumerator = this->messages->create_enumerator(this->messages);
|
||||||
while (enumerator->enumerate(enumerator, &msg))
|
while (enumerator->enumerate(enumerator, &msg))
|
||||||
{
|
{
|
||||||
|
u_int8_t flags = PB_TNC_FLAG_NONE;
|
||||||
|
|
||||||
/* build PB-TNC message */
|
/* build PB-TNC message */
|
||||||
msg_value = msg->get_encoding(msg);
|
msg_value = msg->get_encoding(msg);
|
||||||
msg_len = PB_TNC_HEADER_SIZE + msg_value.len;
|
msg_len = PB_TNC_HEADER_SIZE + msg_value.len;
|
||||||
msg_type = msg->get_type(msg);
|
msg_type = msg->get_type(msg);
|
||||||
switch (msg_type)
|
if (pb_tnc_msg_infos[msg_type].has_noskip_flag)
|
||||||
{
|
{
|
||||||
case PB_MSG_PA:
|
flags |= PB_TNC_FLAG_NOSKIP;
|
||||||
case PB_MSG_ASSESSMENT_RESULT:
|
}
|
||||||
case PB_MSG_ERROR:
|
|
||||||
flags |= PB_TNC_FLAG_NOSKIP;
|
|
||||||
break;
|
|
||||||
case PB_MSG_EXPERIMENTAL:
|
|
||||||
case PB_MSG_ACCESS_RECOMMENDATION:
|
|
||||||
case PB_MSG_REMEDIATION_PARAMETERS:
|
|
||||||
case PB_MSG_LANGUAGE_PREFERENCE:
|
|
||||||
case PB_MSG_REASON_STRING:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
writer->write_uint8 (writer, flags);
|
writer->write_uint8 (writer, flags);
|
||||||
writer->write_uint24(writer, IETF_VENDOR_ID);
|
writer->write_uint24(writer, IETF_VENDOR_ID);
|
||||||
writer->write_uint32(writer, msg_type);
|
writer->write_uint32(writer, msg_type);
|
||||||
@@ -203,8 +193,8 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
|
|||||||
pb_tnc_state_machine_t *state_machine)
|
pb_tnc_state_machine_t *state_machine)
|
||||||
{
|
{
|
||||||
tls_reader_t *reader;
|
tls_reader_t *reader;
|
||||||
pb_tnc_message_t *msg;
|
pb_tnc_msg_t *msg;
|
||||||
pb_error_message_t *err_msg;
|
pb_error_msg_t *err_msg;
|
||||||
u_int8_t version, flags, reserved, type;
|
u_int8_t version, flags, reserved, type;
|
||||||
u_int32_t batch_len;
|
u_int32_t batch_len;
|
||||||
bool directionality;
|
bool directionality;
|
||||||
@@ -213,10 +203,8 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
|
|||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "%u bytes insufficient to parse PB-TNC batch header",
|
DBG1(DBG_TNC, "%u bytes insufficient to parse PB-TNC batch header",
|
||||||
this->encoding.len);
|
this->encoding.len);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, 0);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, 0);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,9 +220,9 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
|
|||||||
if (version != PB_TNC_VERSION)
|
if (version != PB_TNC_VERSION)
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "unsupported TNCCS Batch Version 0x%01x", version);
|
DBG1(DBG_TNC, "unsupported TNCCS Batch Version 0x%01x", version);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_VERSION_NOT_SUPPORTED);
|
PB_ERROR_VERSION_NOT_SUPPORTED);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
err_msg = (pb_error_msg_t*)msg;
|
||||||
err_msg->set_bad_version(err_msg, version);
|
err_msg->set_bad_version(err_msg, version);
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
@@ -245,10 +233,8 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
|
|||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "wrong Directionality: Batch is from a PB %s",
|
DBG1(DBG_TNC, "wrong Directionality: Batch is from a PB %s",
|
||||||
directionality ? "Server" : "Client");
|
directionality ? "Server" : "Client");
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, 1);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, 1);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,10 +243,8 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
|
|||||||
if (this->type > PB_BATCH_ROOF)
|
if (this->type > PB_BATCH_ROOF)
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "unknown PB-TNC Batch Type: %d", this->type);
|
DBG1(DBG_TNC, "unknown PB-TNC Batch Type: %d", this->type);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, 3);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, 3);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,8 +252,8 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
|
|||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "unexpected PB-TNC Batch Type: %N",
|
DBG1(DBG_TNC, "unexpected PB-TNC Batch Type: %N",
|
||||||
pb_tnc_batch_type_names, this->type);
|
pb_tnc_batch_type_names, this->type);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_UNEXPECTED_BATCH_TYPE);
|
PB_ERROR_UNEXPECTED_BATCH_TYPE);
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,10 +262,8 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
|
|||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "%u bytes of data is not equal to batch length of %u bytes",
|
DBG1(DBG_TNC, "%u bytes of data is not equal to batch length of %u bytes",
|
||||||
this->encoding.len, batch_len);
|
this->encoding.len, batch_len);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, 4);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, 4);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,14 +275,14 @@ fatal:
|
|||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static status_t process_tnc_message(private_pb_tnc_batch_t *this)
|
static status_t process_tnc_msg(private_pb_tnc_batch_t *this)
|
||||||
{
|
{
|
||||||
tls_reader_t *reader;
|
tls_reader_t *reader;
|
||||||
pb_tnc_message_t *pb_tnc_msg, *msg;
|
pb_tnc_msg_t *pb_tnc_msg, *msg;
|
||||||
pb_error_message_t *err_msg;
|
|
||||||
u_int8_t flags;
|
u_int8_t flags;
|
||||||
u_int32_t vendor_id, msg_type, msg_len;
|
u_int32_t vendor_id, msg_type, msg_len, offset;
|
||||||
chunk_t data, msg_value;
|
chunk_t data, msg_value;
|
||||||
|
bool noskip_flag;
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
data = chunk_skip(this->encoding, this->offset);
|
data = chunk_skip(this->encoding, this->offset);
|
||||||
@@ -309,10 +291,8 @@ static status_t process_tnc_message(private_pb_tnc_batch_t *this)
|
|||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "%u bytes insufficient to parse PB-TNC message header",
|
DBG1(DBG_TNC, "%u bytes insufficient to parse PB-TNC message header",
|
||||||
data.len);
|
data.len);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, this->offset);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, this->offset);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -323,33 +303,21 @@ static status_t process_tnc_message(private_pb_tnc_batch_t *this)
|
|||||||
reader->read_uint32(reader, &msg_len);
|
reader->read_uint32(reader, &msg_len);
|
||||||
reader->destroy(reader);
|
reader->destroy(reader);
|
||||||
|
|
||||||
if (msg_len < PB_TNC_HEADER_SIZE)
|
noskip_flag = (flags & PB_TNC_FLAG_NOSKIP) != PB_TNC_FLAG_NONE;
|
||||||
{
|
|
||||||
DBG1(DBG_TNC, "%u bytes too small for PB-TNC message length", msg_len);
|
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, this->offset + 8);
|
|
||||||
goto fatal;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg_len > data.len)
|
if (msg_len > data.len)
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "%u bytes insufficient to parse PB-TNC message", data.len);
|
DBG1(DBG_TNC, "%u bytes insufficient to parse PB-TNC message", data.len);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, this->offset + 8);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, this->offset + 8);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vendor_id == RESERVED_VENDOR_ID)
|
if (vendor_id == RESERVED_VENDOR_ID)
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "Vendor ID 0x%06x is reserved", RESERVED_VENDOR_ID);
|
DBG1(DBG_TNC, "Vendor ID 0x%06x is reserved", RESERVED_VENDOR_ID);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, this->offset + 1);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, this->offset + 1);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -358,23 +326,29 @@ static status_t process_tnc_message(private_pb_tnc_batch_t *this)
|
|||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "PB-TNC Message Type 0x%08x is reserved",
|
DBG1(DBG_TNC, "PB-TNC Message Type 0x%08x is reserved",
|
||||||
PB_TNC_RESERVED_MSG_TYPE);
|
PB_TNC_RESERVED_MSG_TYPE);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, this->offset + 4);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, this->offset + 4);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (vendor_id != IETF_VENDOR_ID || msg_type > PB_MSG_ROOF)
|
if (vendor_id != IETF_VENDOR_ID || msg_type > PB_MSG_ROOF)
|
||||||
{
|
{
|
||||||
if (flags & PB_TNC_FLAG_NOSKIP)
|
if (msg_len < PB_TNC_HEADER_SIZE)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "%u bytes too small for PB-TNC message length",
|
||||||
|
msg_len);
|
||||||
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
|
PB_ERROR_INVALID_PARAMETER, this->offset + 8);
|
||||||
|
goto fatal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noskip_flag)
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "reject PB-TNC Message (Vendor ID 0x%06x / "
|
DBG1(DBG_TNC, "reject PB-TNC Message (Vendor ID 0x%06x / "
|
||||||
"Type 0x%08x)", vendor_id, msg_type);
|
"Type 0x%08x)", vendor_id, msg_type);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_UNSUPPORTED_MANDATORY_MESSAGE);
|
PB_ERROR_UNSUPPORTED_MANDATORY_MSG, this->offset);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, this->offset);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -385,20 +359,42 @@ static status_t process_tnc_message(private_pb_tnc_batch_t *this)
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pb_tnc_msg_infos[msg_type].has_noskip_flag != TRUE_OR_FALSE &&
|
||||||
|
pb_tnc_msg_infos[msg_type].has_noskip_flag != noskip_flag)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "%N Message must%s have NOSKIP flag set",
|
||||||
|
pb_tnc_msg_type_names, msg_type,
|
||||||
|
pb_tnc_msg_infos[msg_type].has_noskip_flag ? "" : " not");
|
||||||
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
|
PB_ERROR_INVALID_PARAMETER, this->offset);
|
||||||
|
goto fatal;
|
||||||
|
}
|
||||||
|
|
||||||
if ((msg_type == PB_MSG_ASSESSMENT_RESULT ||
|
if (msg_len < pb_tnc_msg_infos[msg_type].min_size ||
|
||||||
msg_type == PB_MSG_ACCESS_RECOMMENDATION ||
|
(pb_tnc_msg_infos[msg_type].exact_size &&
|
||||||
msg_type == PB_MSG_REMEDIATION_PARAMETERS) &&
|
msg_len != pb_tnc_msg_infos[msg_type].min_size))
|
||||||
this->type != PB_BATCH_RESULT)
|
{
|
||||||
|
DBG1(DBG_TNC, "%N Message length must be %s %u bytes but is %u bytes",
|
||||||
|
pb_tnc_msg_type_names, msg_type,
|
||||||
|
pb_tnc_msg_infos[msg_type].exact_size ? "exactly" : "at least",
|
||||||
|
pb_tnc_msg_infos[msg_type].min_size, msg_len);
|
||||||
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
|
PB_ERROR_INVALID_PARAMETER, this->offset);
|
||||||
|
goto fatal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pb_tnc_msg_infos[msg_type].in_result_batch &&
|
||||||
|
this->type != PB_BATCH_RESULT)
|
||||||
{
|
{
|
||||||
if (this->is_server)
|
if (this->is_server)
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC,"reject %N Message received from a PB-TNC Client",
|
DBG1(DBG_TNC,"reject %N Message received from a PB-TNC Client",
|
||||||
pb_tnc_msg_type_names, msg_type);
|
pb_tnc_msg_type_names, msg_type);
|
||||||
msg = pb_error_message_create(TRUE, IETF_VENDOR_ID,
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
PB_ERROR_INVALID_PARAMETER);
|
PB_ERROR_INVALID_PARAMETER, this->offset);
|
||||||
err_msg = (pb_error_message_t*)msg;
|
|
||||||
err_msg->set_offset(err_msg, this->offset);
|
|
||||||
goto fatal;
|
goto fatal;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -415,9 +411,15 @@ static status_t process_tnc_message(private_pb_tnc_batch_t *this)
|
|||||||
data.len = msg_len;
|
data.len = msg_len;
|
||||||
DBG3(DBG_TNC, "%B", &data);
|
DBG3(DBG_TNC, "%B", &data);
|
||||||
msg_value = chunk_skip(data, PB_TNC_HEADER_SIZE);
|
msg_value = chunk_skip(data, PB_TNC_HEADER_SIZE);
|
||||||
pb_tnc_msg = pb_tnc_message_create(msg_type, msg_value);
|
pb_tnc_msg = pb_tnc_msg_create_from_data(msg_type, msg_value);
|
||||||
|
|
||||||
status = pb_tnc_msg->process(pb_tnc_msg);
|
status = pb_tnc_msg->process(pb_tnc_msg, &offset);
|
||||||
|
if (status == FAILED || status == VERIFY_ERROR)
|
||||||
|
{
|
||||||
|
msg = pb_error_msg_create_with_offset(TRUE, IETF_VENDOR_ID,
|
||||||
|
PB_ERROR_INVALID_PARAMETER, this->offset);
|
||||||
|
this->errors->insert_last(this->errors, msg);
|
||||||
|
}
|
||||||
if (status == FAILED)
|
if (status == FAILED)
|
||||||
{
|
{
|
||||||
pb_tnc_msg->destroy(pb_tnc_msg);
|
pb_tnc_msg->destroy(pb_tnc_msg);
|
||||||
@@ -425,7 +427,7 @@ static status_t process_tnc_message(private_pb_tnc_batch_t *this)
|
|||||||
}
|
}
|
||||||
this->messages->insert_last(this->messages, pb_tnc_msg);
|
this->messages->insert_last(this->messages, pb_tnc_msg);
|
||||||
this->offset += msg_len;
|
this->offset += msg_len;
|
||||||
return SUCCESS;
|
return status;
|
||||||
|
|
||||||
fatal:
|
fatal:
|
||||||
this->errors->insert_last(this->errors, msg);
|
this->errors->insert_last(this->errors, msg);
|
||||||
@@ -446,7 +448,7 @@ METHOD(pb_tnc_batch_t, process, status_t,
|
|||||||
this->type);
|
this->type);
|
||||||
while (this->offset < this->encoding.len)
|
while (this->offset < this->encoding.len)
|
||||||
{
|
{
|
||||||
switch (process_tnc_message(this))
|
switch (process_tnc_msg(this))
|
||||||
{
|
{
|
||||||
case FAILED:
|
case FAILED:
|
||||||
return FAILED;
|
return FAILED;
|
||||||
@@ -477,9 +479,9 @@ METHOD(pb_tnc_batch_t, destroy, void,
|
|||||||
private_pb_tnc_batch_t *this)
|
private_pb_tnc_batch_t *this)
|
||||||
{
|
{
|
||||||
this->messages->destroy_offset(this->messages,
|
this->messages->destroy_offset(this->messages,
|
||||||
offsetof(pb_tnc_message_t, destroy));
|
offsetof(pb_tnc_msg_t, destroy));
|
||||||
this->errors->destroy_offset(this->errors,
|
this->errors->destroy_offset(this->errors,
|
||||||
offsetof(pb_tnc_message_t, destroy));
|
offsetof(pb_tnc_msg_t, destroy));
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
@@ -495,7 +497,7 @@ pb_tnc_batch_t* pb_tnc_batch_create(bool is_server, pb_tnc_batch_type_t type)
|
|||||||
.public = {
|
.public = {
|
||||||
.get_type = _get_type,
|
.get_type = _get_type,
|
||||||
.get_encoding = _get_encoding,
|
.get_encoding = _get_encoding,
|
||||||
.add_message = _add_message,
|
.add_msg = _add_msg,
|
||||||
.build = _build,
|
.build = _build,
|
||||||
.process = _process,
|
.process = _process,
|
||||||
.create_msg_enumerator = _create_msg_enumerator,
|
.create_msg_enumerator = _create_msg_enumerator,
|
||||||
@@ -524,7 +526,7 @@ pb_tnc_batch_t* pb_tnc_batch_create_from_data(bool is_server, chunk_t data)
|
|||||||
.public = {
|
.public = {
|
||||||
.get_type = _get_type,
|
.get_type = _get_type,
|
||||||
.get_encoding = _get_encoding,
|
.get_encoding = _get_encoding,
|
||||||
.add_message = _add_message,
|
.add_msg = _add_msg,
|
||||||
.build = _build,
|
.build = _build,
|
||||||
.process = _process,
|
.process = _process,
|
||||||
.create_msg_enumerator = _create_msg_enumerator,
|
.create_msg_enumerator = _create_msg_enumerator,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
typedef enum pb_tnc_batch_type_t pb_tnc_batch_type_t;
|
typedef enum pb_tnc_batch_type_t pb_tnc_batch_type_t;
|
||||||
typedef struct pb_tnc_batch_t pb_tnc_batch_t;
|
typedef struct pb_tnc_batch_t pb_tnc_batch_t;
|
||||||
|
|
||||||
#include "messages/pb_tnc_message.h"
|
#include "messages/pb_tnc_msg.h"
|
||||||
#include "state_machine/pb_tnc_state_machine.h"
|
#include "state_machine/pb_tnc_state_machine.h"
|
||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
@@ -71,7 +71,7 @@ struct pb_tnc_batch_t {
|
|||||||
*
|
*
|
||||||
* @param msg PB-TNC message to be addedd
|
* @param msg PB-TNC message to be addedd
|
||||||
*/
|
*/
|
||||||
void (*add_message)(pb_tnc_batch_t *this, pb_tnc_message_t* msg);
|
void (*add_msg)(pb_tnc_batch_t *this, pb_tnc_msg_t* msg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the PB-TNC Batch
|
* Build the PB-TNC Batch
|
||||||
|
|||||||
+40
-34
@@ -13,13 +13,19 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_access_recommendation_message.h"
|
#include "pb_access_recommendation_msg.h"
|
||||||
|
|
||||||
#include <tls_writer.h>
|
#include <tls_writer.h>
|
||||||
#include <tls_reader.h>
|
#include <tls_reader.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
typedef struct private_pb_access_recommendation_message_t private_pb_access_recommendation_message_t;
|
ENUM(pb_access_recommendation_code_names, PB_REC_ACCESS_ALLOWED, PB_REC_QUARANTINED,
|
||||||
|
"Access Allowed",
|
||||||
|
"Access Denied",
|
||||||
|
"Quarantined"
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct private_pb_access_recommendation_msg_t private_pb_access_recommendation_msg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-Access-Recommendation message (see section 4.7 of RFC 5793)
|
* PB-Access-Recommendation message (see section 4.7 of RFC 5793)
|
||||||
@@ -32,17 +38,16 @@ typedef struct private_pb_access_recommendation_message_t private_pb_access_reco
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define ACCESS_RECOMMENDATION_RESERVED 0x0000
|
#define ACCESS_RECOMMENDATION_RESERVED 0x0000
|
||||||
#define ACCESS_RECOMMENDATION_MESSAGE_SIZE 4
|
#define ACCESS_RECOMMENDATION_MSG_SIZE 4
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data of a private_pb_access_recommendation_message_t object.
|
* Private data of a private_pb_access_recommendation_msg_t object.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct private_pb_access_recommendation_message_t {
|
struct private_pb_access_recommendation_msg_t {
|
||||||
/**
|
/**
|
||||||
* Public pb_access_recommendation_message_t interface.
|
* Public pb_access_recommendation_msg_t interface.
|
||||||
*/
|
*/
|
||||||
pb_access_recommendation_message_t public;
|
pb_access_recommendation_msg_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC message type
|
* PB-TNC message type
|
||||||
@@ -60,25 +65,25 @@ struct private_pb_access_recommendation_message_t {
|
|||||||
chunk_t encoding;
|
chunk_t encoding;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_type, pb_tnc_msg_type_t,
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
private_pb_access_recommendation_message_t *this)
|
private_pb_access_recommendation_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->type;
|
return this->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_encoding, chunk_t,
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
private_pb_access_recommendation_message_t *this)
|
private_pb_access_recommendation_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->encoding;
|
return this->encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, build, void,
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
private_pb_access_recommendation_message_t *this)
|
private_pb_access_recommendation_msg_t *this)
|
||||||
{
|
{
|
||||||
tls_writer_t *writer;
|
tls_writer_t *writer;
|
||||||
|
|
||||||
/* build message */
|
/* build message */
|
||||||
writer = tls_writer_create(ACCESS_RECOMMENDATION_MESSAGE_SIZE);
|
writer = tls_writer_create(ACCESS_RECOMMENDATION_MSG_SIZE);
|
||||||
writer->write_uint16(writer, ACCESS_RECOMMENDATION_RESERVED);
|
writer->write_uint16(writer, ACCESS_RECOMMENDATION_RESERVED);
|
||||||
writer->write_uint16(writer, this->recommendation);
|
writer->write_uint16(writer, this->recommendation);
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
@@ -87,38 +92,39 @@ METHOD(pb_tnc_message_t, build, void,
|
|||||||
writer->destroy(writer);
|
writer->destroy(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, process, status_t,
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
private_pb_access_recommendation_message_t *this)
|
private_pb_access_recommendation_msg_t *this, u_int32_t *offset)
|
||||||
{
|
{
|
||||||
tls_reader_t *reader;
|
tls_reader_t *reader;
|
||||||
u_int16_t reserved;
|
u_int16_t reserved;
|
||||||
|
|
||||||
if (this->encoding.len < ACCESS_RECOMMENDATION_MESSAGE_SIZE)
|
|
||||||
{
|
|
||||||
DBG1(DBG_TNC,"%N message is shorter than message size of %u bytes",
|
|
||||||
pb_tnc_msg_type_names, PB_MSG_ACCESS_RECOMMENDATION,
|
|
||||||
ACCESS_RECOMMENDATION_MESSAGE_SIZE);
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process message */
|
/* process message */
|
||||||
reader = tls_reader_create(this->encoding);
|
reader = tls_reader_create(this->encoding);
|
||||||
reader->read_uint16(reader, &reserved);
|
reader->read_uint16(reader, &reserved);
|
||||||
reader->read_uint16(reader, &this->recommendation);
|
reader->read_uint16(reader, &this->recommendation);
|
||||||
|
|
||||||
reader->destroy(reader);
|
reader->destroy(reader);
|
||||||
|
|
||||||
|
if (this->recommendation < PB_REC_ACCESS_ALLOWED ||
|
||||||
|
this->recommendation > PB_REC_QUARANTINED)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "invalid access recommendation code (%u)",
|
||||||
|
this->recommendation);
|
||||||
|
*offset = 2;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, destroy, void,
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
private_pb_access_recommendation_message_t *this)
|
private_pb_access_recommendation_msg_t *this)
|
||||||
{
|
{
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_access_recommendation_message_t, get_access_recommendation, u_int16_t,
|
METHOD(pb_access_recommendation_msg_t, get_access_recommendation, u_int16_t,
|
||||||
private_pb_access_recommendation_message_t *this)
|
private_pb_access_recommendation_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->recommendation;
|
return this->recommendation;
|
||||||
}
|
}
|
||||||
@@ -126,9 +132,9 @@ METHOD(pb_access_recommendation_message_t, get_access_recommendation, u_int16_t,
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_access_recommendation_message_create_from_data(chunk_t data)
|
pb_tnc_msg_t *pb_access_recommendation_msg_create_from_data(chunk_t data)
|
||||||
{
|
{
|
||||||
private_pb_access_recommendation_message_t *this;
|
private_pb_access_recommendation_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -151,9 +157,9 @@ pb_tnc_message_t *pb_access_recommendation_message_create_from_data(chunk_t data
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_access_recommendation_message_create(u_int16_t recommendation)
|
pb_tnc_msg_t *pb_access_recommendation_msg_create(u_int16_t recommendation)
|
||||||
{
|
{
|
||||||
private_pb_access_recommendation_message_t *this;
|
private_pb_access_recommendation_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
+27
-11
@@ -14,33 +14,49 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup pb_access_recommendation_message pb_access_recommendation_message
|
* @defgroup pb_access_recommendation_msg pb_access_recommendation_msg
|
||||||
* @{ @ingroup tnccs_20
|
* @{ @ingroup tnccs_20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PB_ACCESS_RECOMMENDATION_MESSAGE_H_
|
#ifndef PB_ACCESS_RECOMMENDATION_MSG_H_
|
||||||
#define PB_ACCESS_RECOMMENDATION_MESSAGE_H_
|
#define PB_ACCESS_RECOMMENDATION_MSG_H_
|
||||||
|
|
||||||
#include "pb_tnc_message.h"
|
typedef enum pb_access_recommendation_code_t pb_access_recommendation_code_t;
|
||||||
|
typedef struct pb_access_recommendation_msg_t pb_access_recommendation_msg_t;
|
||||||
|
|
||||||
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PB Access Recommendation Codes as defined in section 4.7 of RFC 5793
|
||||||
|
*/
|
||||||
|
enum pb_access_recommendation_code_t {
|
||||||
|
PB_REC_ACCESS_ALLOWED = 1,
|
||||||
|
PB_REC_ACCESS_DENIED = 2,
|
||||||
|
PB_REC_QUARANTINED = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum name for pb_access_recommendation_code_t.
|
||||||
|
*/
|
||||||
|
extern enum_name_t *pb_access_recommendation_code_names;
|
||||||
|
|
||||||
typedef struct pb_access_recommendation_message_t pb_access_recommendation_message_t;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Classs representing the PB-Access-Recommendation message type.
|
* Classs representing the PB-Access-Recommendation message type.
|
||||||
*/
|
*/
|
||||||
struct pb_access_recommendation_message_t {
|
struct pb_access_recommendation_msg_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Message interface
|
* PB-TNC Message interface
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t pb_interface;
|
pb_tnc_msg_t pb_interface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get PB Access Recommendation
|
* Get PB Access Recommendation
|
||||||
*
|
*
|
||||||
* @return PB Access Recommendation
|
* @return PB Access Recommendation
|
||||||
*/
|
*/
|
||||||
u_int16_t (*get_access_recommendation)(pb_access_recommendation_message_t *this);
|
u_int16_t (*get_access_recommendation)(pb_access_recommendation_msg_t *this);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,13 +64,13 @@ struct pb_access_recommendation_message_t {
|
|||||||
*
|
*
|
||||||
* @param access_recommendation Access Recommendation code
|
* @param access_recommendation Access Recommendation code
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_access_recommendation_message_create(u_int16_t recommendation);
|
pb_tnc_msg_t* pb_access_recommendation_msg_create(u_int16_t recommendation);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an unprocessed PB-Access-Recommendation message from raw data
|
* Create an unprocessed PB-Access-Recommendation message from raw data
|
||||||
*
|
*
|
||||||
* @param data PB-Access-Recommendation message data
|
* @param data PB-Access-Recommendation message data
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_access_recommendation_message_create_from_data(chunk_t data);
|
pb_tnc_msg_t* pb_access_recommendation_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
#endif /** PB_PA_MESSAGE_H_ @}*/
|
#endif /** PB_PA_MSG_H_ @}*/
|
||||||
+35
-33
@@ -13,13 +13,14 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_assessment_result_message.h"
|
#include "pb_assessment_result_msg.h"
|
||||||
|
|
||||||
#include <tls_writer.h>
|
#include <tls_writer.h>
|
||||||
#include <tls_reader.h>
|
#include <tls_reader.h>
|
||||||
|
#include <tnc/tncifimv.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
typedef struct private_pb_assessment_result_message_t private_pb_assessment_result_message_t;
|
typedef struct private_pb_assessment_result_msg_t private_pb_assessment_result_msg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-Assessment-Result message (see section 4.6 of RFC 5793)
|
* PB-Assessment-Result message (see section 4.6 of RFC 5793)
|
||||||
@@ -31,17 +32,17 @@ typedef struct private_pb_assessment_result_message_t private_pb_assessment_resu
|
|||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ASSESSMENT_RESULT_MESSAGE_SIZE 4
|
#define ASSESSMENT_RESULT_MSG_SIZE 4
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data of a pb_assessment_result_message_t object.
|
* Private data of a pb_assessment_result_msg_t object.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct private_pb_assessment_result_message_t {
|
struct private_pb_assessment_result_msg_t {
|
||||||
/**
|
/**
|
||||||
* Public pb_assessment_result_message_t interface.
|
* Public pb_assessment_result_msg_t interface.
|
||||||
*/
|
*/
|
||||||
pb_assessment_result_message_t public;
|
pb_assessment_result_msg_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC message type
|
* PB-TNC message type
|
||||||
@@ -59,25 +60,25 @@ struct private_pb_assessment_result_message_t {
|
|||||||
chunk_t encoding;
|
chunk_t encoding;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_type, pb_tnc_msg_type_t,
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
private_pb_assessment_result_message_t *this)
|
private_pb_assessment_result_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->type;
|
return this->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_encoding, chunk_t,
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
private_pb_assessment_result_message_t *this)
|
private_pb_assessment_result_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->encoding;
|
return this->encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, build, void,
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
private_pb_assessment_result_message_t *this)
|
private_pb_assessment_result_msg_t *this)
|
||||||
{
|
{
|
||||||
tls_writer_t *writer;
|
tls_writer_t *writer;
|
||||||
|
|
||||||
/* build message */
|
/* build message */
|
||||||
writer = tls_writer_create(ASSESSMENT_RESULT_MESSAGE_SIZE);
|
writer = tls_writer_create(ASSESSMENT_RESULT_MSG_SIZE);
|
||||||
writer->write_uint32(writer, this->assessment_result);
|
writer->write_uint32(writer, this->assessment_result);
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
this->encoding = writer->get_buf(writer);
|
this->encoding = writer->get_buf(writer);
|
||||||
@@ -85,36 +86,37 @@ METHOD(pb_tnc_message_t, build, void,
|
|||||||
writer->destroy(writer);
|
writer->destroy(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, process, status_t,
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
private_pb_assessment_result_message_t *this)
|
private_pb_assessment_result_msg_t *this, u_int32_t *offset)
|
||||||
{
|
{
|
||||||
tls_reader_t *reader;
|
tls_reader_t *reader;
|
||||||
|
|
||||||
if (this->encoding.len < ASSESSMENT_RESULT_MESSAGE_SIZE)
|
|
||||||
{
|
|
||||||
DBG1(DBG_TNC,"%N message is shorter than message size of %u bytes",
|
|
||||||
pb_tnc_msg_type_names, PB_MSG_ASSESSMENT_RESULT,
|
|
||||||
ASSESSMENT_RESULT_MESSAGE_SIZE);
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process message */
|
/* process message */
|
||||||
reader = tls_reader_create(this->encoding);
|
reader = tls_reader_create(this->encoding);
|
||||||
reader->read_uint32(reader, &this->assessment_result);
|
reader->read_uint32(reader, &this->assessment_result);
|
||||||
|
|
||||||
reader->destroy(reader);
|
reader->destroy(reader);
|
||||||
|
|
||||||
|
if (this->assessment_result < TNC_IMV_EVALUATION_RESULT_COMPLIANT ||
|
||||||
|
this->assessment_result > TNC_IMV_EVALUATION_RESULT_DONT_KNOW)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "invalid assessment result (%u)",
|
||||||
|
this->assessment_result);
|
||||||
|
*offset = 0;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, destroy, void,
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
private_pb_assessment_result_message_t *this)
|
private_pb_assessment_result_msg_t *this)
|
||||||
{
|
{
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_assessment_result_message_t, get_assessment_result, u_int32_t,
|
METHOD(pb_assessment_result_msg_t, get_assessment_result, u_int32_t,
|
||||||
private_pb_assessment_result_message_t *this)
|
private_pb_assessment_result_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->assessment_result;
|
return this->assessment_result;
|
||||||
}
|
}
|
||||||
@@ -122,9 +124,9 @@ METHOD(pb_assessment_result_message_t, get_assessment_result, u_int32_t,
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_assessment_result_message_create_from_data(chunk_t data)
|
pb_tnc_msg_t *pb_assessment_result_msg_create_from_data(chunk_t data)
|
||||||
{
|
{
|
||||||
private_pb_assessment_result_message_t *this;
|
private_pb_assessment_result_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -147,9 +149,9 @@ pb_tnc_message_t *pb_assessment_result_message_create_from_data(chunk_t data)
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_assessment_result_message_create(u_int32_t assessment_result)
|
pb_tnc_msg_t *pb_assessment_result_msg_create(u_int32_t assessment_result)
|
||||||
{
|
{
|
||||||
private_pb_assessment_result_message_t *this;
|
private_pb_assessment_result_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
+11
-11
@@ -14,33 +14,33 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup pb_assessment_result_message pb_assessment_result_message
|
* @defgroup pb_assessment_result_msg pb_assessment_result_msg
|
||||||
* @{ @ingroup tnccs_20
|
* @{ @ingroup tnccs_20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PB_ASSESSMENT_RESULT_MESSAGE_H_
|
#ifndef PB_ASSESSMENT_RESULT_MSG_H_
|
||||||
#define PB_ASSESSMENT_RESULT_MESSAGE_H_
|
#define PB_ASSESSMENT_RESULT_MSG_H_
|
||||||
|
|
||||||
#include "pb_tnc_message.h"
|
typedef struct pb_assessment_result_msg_t pb_assessment_result_msg_t;
|
||||||
|
|
||||||
typedef struct pb_assessment_result_message_t pb_assessment_result_message_t;
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Classs representing the PB-Assessment-Result message type.
|
* Classs representing the PB-Assessment-Result message type.
|
||||||
*/
|
*/
|
||||||
struct pb_assessment_result_message_t {
|
struct pb_assessment_result_msg_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Message interface
|
* PB-TNC Message interface
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t pb_interface;
|
pb_tnc_msg_t pb_interface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get PB Assessment result
|
* Get PB Assessment result
|
||||||
*
|
*
|
||||||
* @return PB Assessment result
|
* @return PB Assessment result
|
||||||
*/
|
*/
|
||||||
u_int32_t (*get_assessment_result)(pb_assessment_result_message_t *this);
|
u_int32_t (*get_assessment_result)(pb_assessment_result_msg_t *this);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,13 +48,13 @@ struct pb_assessment_result_message_t {
|
|||||||
*
|
*
|
||||||
* @param assessment_result Assessment result code
|
* @param assessment_result Assessment result code
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_assessment_result_message_create(u_int32_t assessment_result);
|
pb_tnc_msg_t* pb_assessment_result_msg_create(u_int32_t assessment_result);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an unprocessed PB-Assessment-Result message from raw data
|
* Create an unprocessed PB-Assessment-Result message from raw data
|
||||||
*
|
*
|
||||||
* @param data PB-Assessment-Result message data
|
* @param data PB-Assessment-Result message data
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_assessment_result_message_create_from_data(chunk_t data);
|
pb_tnc_msg_t* pb_assessment_result_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
#endif /** PB_PA_MESSAGE_H_ @}*/
|
#endif /** PB_PA_MSG_H_ @}*/
|
||||||
+72
-44
@@ -13,8 +13,7 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_error_message.h"
|
#include "pb_error_msg.h"
|
||||||
#include "../tnccs_20_types.h"
|
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <tls_writer.h>
|
#include <tls_writer.h>
|
||||||
@@ -30,7 +29,7 @@ ENUM(pb_tnc_error_code_names, PB_ERROR_UNEXPECTED_BATCH_TYPE,
|
|||||||
"Version Not Supported"
|
"Version Not Supported"
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef struct private_pb_error_message_t private_pb_error_message_t;
|
typedef struct private_pb_error_msg_t private_pb_error_msg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-Error message (see section 4.9 of RFC 5793)
|
* PB-Error message (see section 4.9 of RFC 5793)
|
||||||
@@ -52,14 +51,14 @@ typedef struct private_pb_error_message_t private_pb_error_message_t;
|
|||||||
#define ERROR_HEADER_SIZE 8
|
#define ERROR_HEADER_SIZE 8
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data of a pb_error_message_t object.
|
* Private data of a pb_error_msg_t object.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct private_pb_error_message_t {
|
struct private_pb_error_msg_t {
|
||||||
/**
|
/**
|
||||||
* Public pb_error_message_t interface.
|
* Public pb_error_msg_t interface.
|
||||||
*/
|
*/
|
||||||
pb_error_message_t public;
|
pb_error_msg_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC message type
|
* PB-TNC message type
|
||||||
@@ -102,20 +101,20 @@ struct private_pb_error_message_t {
|
|||||||
refcount_t ref;
|
refcount_t ref;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_type, pb_tnc_msg_type_t,
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->type;
|
return this->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_encoding, chunk_t,
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->encoding;
|
return this->encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, build, void,
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
tls_writer_t *writer;
|
tls_writer_t *writer;
|
||||||
|
|
||||||
@@ -148,8 +147,8 @@ METHOD(pb_tnc_message_t, build, void,
|
|||||||
writer->destroy(writer);
|
writer->destroy(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, process, status_t,
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this, u_int32_t *offset)
|
||||||
{
|
{
|
||||||
u_int8_t flags, max_version, min_version;
|
u_int8_t flags, max_version, min_version;
|
||||||
u_int16_t reserved;
|
u_int16_t reserved;
|
||||||
@@ -188,15 +187,15 @@ METHOD(pb_tnc_message_t, process, status_t,
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_ref, pb_tnc_message_t*,
|
METHOD(pb_tnc_msg_t, get_ref, pb_tnc_msg_t*,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
ref_get(&this->ref);
|
ref_get(&this->ref);
|
||||||
return &this->public.pb_interface;
|
return &this->public.pb_interface;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, destroy, void,
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
if (ref_put(&this->ref))
|
if (ref_put(&this->ref))
|
||||||
{
|
{
|
||||||
@@ -205,44 +204,38 @@ METHOD(pb_tnc_message_t, destroy, void,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_error_message_t, get_fatal_flag, bool,
|
METHOD(pb_error_msg_t, get_fatal_flag, bool,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->fatal;
|
return this->fatal;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_error_message_t, get_vendor_id, u_int32_t,
|
METHOD(pb_error_msg_t, get_vendor_id, u_int32_t,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->vendor_id;
|
return this->vendor_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_error_message_t, get_error_code, u_int16_t,
|
METHOD(pb_error_msg_t, get_error_code, u_int16_t,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->error_code;
|
return this->error_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_error_message_t, get_offset, u_int32_t,
|
METHOD(pb_error_msg_t, get_offset, u_int32_t,
|
||||||
private_pb_error_message_t *this)
|
private_pb_error_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->error_offset;
|
return this->error_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_error_message_t, set_offset, void,
|
METHOD(pb_error_msg_t, get_bad_version, u_int8_t,
|
||||||
private_pb_error_message_t *this, u_int32_t offset)
|
private_pb_error_msg_t *this)
|
||||||
{
|
|
||||||
this->error_offset = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
METHOD(pb_error_message_t, get_bad_version, u_int8_t,
|
|
||||||
private_pb_error_message_t *this)
|
|
||||||
{
|
{
|
||||||
return this->bad_version;
|
return this->bad_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_error_message_t, set_bad_version, void,
|
METHOD(pb_error_msg_t, set_bad_version, void,
|
||||||
private_pb_error_message_t *this, u_int8_t version)
|
private_pb_error_msg_t *this, u_int8_t version)
|
||||||
{
|
{
|
||||||
this->bad_version = version;
|
this->bad_version = version;
|
||||||
}
|
}
|
||||||
@@ -250,10 +243,10 @@ METHOD(pb_error_message_t, set_bad_version, void,
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_error_message_create(bool fatal, u_int32_t vendor_id,
|
pb_tnc_msg_t* pb_error_msg_create(bool fatal, u_int32_t vendor_id,
|
||||||
pb_tnc_error_code_t error_code)
|
pb_tnc_error_code_t error_code)
|
||||||
{
|
{
|
||||||
private_pb_error_message_t *this;
|
private_pb_error_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -269,7 +262,6 @@ pb_tnc_message_t* pb_error_message_create(bool fatal, u_int32_t vendor_id,
|
|||||||
.get_vendor_id = _get_vendor_id,
|
.get_vendor_id = _get_vendor_id,
|
||||||
.get_error_code = _get_error_code,
|
.get_error_code = _get_error_code,
|
||||||
.get_offset = _get_offset,
|
.get_offset = _get_offset,
|
||||||
.set_offset = _set_offset,
|
|
||||||
.get_bad_version = _get_bad_version,
|
.get_bad_version = _get_bad_version,
|
||||||
.set_bad_version = _set_bad_version,
|
.set_bad_version = _set_bad_version,
|
||||||
},
|
},
|
||||||
@@ -286,9 +278,46 @@ pb_tnc_message_t* pb_error_message_create(bool fatal, u_int32_t vendor_id,
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_error_message_create_from_data(chunk_t data)
|
pb_tnc_msg_t* pb_error_msg_create_with_offset(bool fatal, u_int32_t vendor_id,
|
||||||
|
pb_tnc_error_code_t error_code,
|
||||||
|
u_int32_t error_offset)
|
||||||
{
|
{
|
||||||
private_pb_error_message_t *this;
|
private_pb_error_msg_t *this;
|
||||||
|
|
||||||
|
INIT(this,
|
||||||
|
.public = {
|
||||||
|
.pb_interface = {
|
||||||
|
.get_type = _get_type,
|
||||||
|
.get_encoding = _get_encoding,
|
||||||
|
.build = _build,
|
||||||
|
.process = _process,
|
||||||
|
.get_ref = _get_ref,
|
||||||
|
.destroy = _destroy,
|
||||||
|
},
|
||||||
|
.get_fatal_flag = _get_fatal_flag,
|
||||||
|
.get_vendor_id = _get_vendor_id,
|
||||||
|
.get_error_code = _get_error_code,
|
||||||
|
.get_offset = _get_offset,
|
||||||
|
.get_bad_version = _get_bad_version,
|
||||||
|
.set_bad_version = _set_bad_version,
|
||||||
|
},
|
||||||
|
.type = PB_MSG_ERROR,
|
||||||
|
.ref = 1,
|
||||||
|
.fatal = fatal,
|
||||||
|
.vendor_id = vendor_id,
|
||||||
|
.error_code = error_code,
|
||||||
|
.error_offset = error_offset,
|
||||||
|
);
|
||||||
|
|
||||||
|
return &this->public.pb_interface;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t *pb_error_msg_create_from_data(chunk_t data)
|
||||||
|
{
|
||||||
|
private_pb_error_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -304,7 +333,6 @@ pb_tnc_message_t *pb_error_message_create_from_data(chunk_t data)
|
|||||||
.get_vendor_id = _get_vendor_id,
|
.get_vendor_id = _get_vendor_id,
|
||||||
.get_error_code = _get_error_code,
|
.get_error_code = _get_error_code,
|
||||||
.get_offset = _get_offset,
|
.get_offset = _get_offset,
|
||||||
.set_offset = _set_offset,
|
|
||||||
.get_bad_version = _get_bad_version,
|
.get_bad_version = _get_bad_version,
|
||||||
.set_bad_version = _set_bad_version,
|
.set_bad_version = _set_bad_version,
|
||||||
},
|
},
|
||||||
+36
-30
@@ -14,27 +14,27 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup pb_error_message pb_error_message
|
* @defgroup pb_error_msg pb_error_msg
|
||||||
* @{ @ingroup tnccs_20
|
* @{ @ingroup tnccs_20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PB_ERROR_MESSAGE_H_
|
#ifndef PB_ERROR_MSG_H_
|
||||||
#define PB_ERROR_MESSAGE_H_
|
#define PB_ERROR_MSG_H_
|
||||||
|
|
||||||
#include "pb_tnc_message.h"
|
|
||||||
|
|
||||||
typedef enum pb_tnc_error_code_t pb_tnc_error_code_t;
|
typedef enum pb_tnc_error_code_t pb_tnc_error_code_t;
|
||||||
typedef struct pb_error_message_t pb_error_message_t;
|
typedef struct pb_error_msg_t pb_error_msg_t;
|
||||||
|
|
||||||
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Error Codes as defined in section 4.9.1 of RFC 5793
|
* PB-TNC Error Codes as defined in section 4.9.1 of RFC 5793
|
||||||
*/
|
*/
|
||||||
enum pb_tnc_error_code_t {
|
enum pb_tnc_error_code_t {
|
||||||
PB_ERROR_UNEXPECTED_BATCH_TYPE = 0,
|
PB_ERROR_UNEXPECTED_BATCH_TYPE = 0,
|
||||||
PB_ERROR_INVALID_PARAMETER = 1,
|
PB_ERROR_INVALID_PARAMETER = 1,
|
||||||
PB_ERROR_LOCAL_ERROR = 2,
|
PB_ERROR_LOCAL_ERROR = 2,
|
||||||
PB_ERROR_UNSUPPORTED_MANDATORY_MESSAGE = 3,
|
PB_ERROR_UNSUPPORTED_MANDATORY_MSG = 3,
|
||||||
PB_ERROR_VERSION_NOT_SUPPORTED = 4
|
PB_ERROR_VERSION_NOT_SUPPORTED = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -45,61 +45,54 @@ extern enum_name_t *pb_tnc_error_code_names;
|
|||||||
/**
|
/**
|
||||||
* Classs representing the PB-Error message type.
|
* Classs representing the PB-Error message type.
|
||||||
*/
|
*/
|
||||||
struct pb_error_message_t {
|
struct pb_error_msg_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Message interface
|
* PB-TNC Message interface
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t pb_interface;
|
pb_tnc_msg_t pb_interface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the fatal flag
|
* Get the fatal flag
|
||||||
*
|
*
|
||||||
* @return fatal flag
|
* @return fatal flag
|
||||||
*/
|
*/
|
||||||
bool (*get_fatal_flag)(pb_error_message_t *this);
|
bool (*get_fatal_flag)(pb_error_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get PB Error code Vendor ID
|
* Get PB Error code Vendor ID
|
||||||
*
|
*
|
||||||
* @return PB Error Code Vendor ID
|
* @return PB Error Code Vendor ID
|
||||||
*/
|
*/
|
||||||
u_int32_t (*get_vendor_id)(pb_error_message_t *this);
|
u_int32_t (*get_vendor_id)(pb_error_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get PB Error Code
|
* Get PB Error Code
|
||||||
*
|
*
|
||||||
* @return PB Error Code
|
* @return PB Error Code
|
||||||
*/
|
*/
|
||||||
u_int16_t (*get_error_code)(pb_error_message_t *this);
|
u_int16_t (*get_error_code)(pb_error_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the PB Error Offset
|
* Get the PB Error Offset
|
||||||
*
|
*
|
||||||
* @return PB Error Offset
|
* @return PB Error Offset
|
||||||
*/
|
*/
|
||||||
u_int32_t (*get_offset)(pb_error_message_t *this);
|
u_int32_t (*get_offset)(pb_error_msg_t *this);
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the PB Error Offset
|
|
||||||
*
|
|
||||||
* @param offset PB Error Offset
|
|
||||||
*/
|
|
||||||
void (*set_offset)(pb_error_message_t *this, u_int32_t offset);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the PB Bad Version
|
* Get the PB Bad Version
|
||||||
*
|
*
|
||||||
* @return PB Bad Version
|
* @return PB Bad Version
|
||||||
*/
|
*/
|
||||||
u_int8_t (*get_bad_version)(pb_error_message_t *this);
|
u_int8_t (*get_bad_version)(pb_error_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the PB Bad Version
|
* Set the PB Bad Version
|
||||||
*
|
*
|
||||||
* @param version PB Bad Version
|
* @param version PB Bad Version
|
||||||
*/
|
*/
|
||||||
void (*set_bad_version)(pb_error_message_t *this, u_int8_t version);
|
void (*set_bad_version)(pb_error_msg_t *this, u_int8_t version);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -109,13 +102,26 @@ struct pb_error_message_t {
|
|||||||
* @param vendor_id Error Code Vendor ID
|
* @param vendor_id Error Code Vendor ID
|
||||||
* @param error_code Error Code
|
* @param error_code Error Code
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_error_message_create(bool fatal, u_int32_t vendor_id,
|
pb_tnc_msg_t* pb_error_msg_create(bool fatal, u_int32_t vendor_id,
|
||||||
pb_tnc_error_code_t error_code);
|
pb_tnc_error_code_t error_code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a PB-Error message from parameters with offset field
|
||||||
|
*
|
||||||
|
* @param fatal fatal flag
|
||||||
|
* @param vendor_id Error Code Vendor ID
|
||||||
|
* @param error_code Error Code
|
||||||
|
* @param error_offset Error Offset
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t* pb_error_msg_create_with_offset(bool fatal, u_int32_t vendor_id,
|
||||||
|
pb_tnc_error_code_t error_code,
|
||||||
|
u_int32_t error_offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an unprocessed PB-Error message from raw data
|
* Create an unprocessed PB-Error message from raw data
|
||||||
*
|
*
|
||||||
* @param data PB-Error message data
|
* @param data PB-Error message data
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_error_message_create_from_data(chunk_t data);
|
pb_tnc_msg_t* pb_error_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
#endif /** PB_PA_MESSAGE_H_ @}*/
|
#endif /** PB_PA_MSG_H_ @}*/
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 <http://www.fsf.org/copyleft/gpl.txt>.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pb_experimental_msg.h"
|
||||||
|
|
||||||
|
typedef struct private_pb_experimental_msg_t private_pb_experimental_msg_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private data of a private_pb_experimental_msg_t object.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct private_pb_experimental_msg_t {
|
||||||
|
/**
|
||||||
|
* Public pb_experimental_msg_t interface.
|
||||||
|
*/
|
||||||
|
pb_experimental_msg_t public;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PB-TNC message type
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_type_t type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoded message
|
||||||
|
*/
|
||||||
|
chunk_t encoding;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
|
private_pb_experimental_msg_t *this)
|
||||||
|
{
|
||||||
|
return this->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
|
private_pb_experimental_msg_t *this)
|
||||||
|
{
|
||||||
|
return this->encoding;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
|
private_pb_experimental_msg_t *this)
|
||||||
|
{
|
||||||
|
/* nothing to do since message contents equal encoding */
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
|
private_pb_experimental_msg_t *this, size_t *offset)
|
||||||
|
{
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
|
private_pb_experimental_msg_t *this)
|
||||||
|
{
|
||||||
|
free(this->encoding.ptr);
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t *pb_experimental_msg_create_from_data(chunk_t data)
|
||||||
|
{
|
||||||
|
private_pb_experimental_msg_t *this;
|
||||||
|
|
||||||
|
INIT(this,
|
||||||
|
.public = {
|
||||||
|
.pb_interface = {
|
||||||
|
.get_type = _get_type,
|
||||||
|
.get_encoding = _get_encoding,
|
||||||
|
.build = _build,
|
||||||
|
.process = _process,
|
||||||
|
.destroy = _destroy,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.type = PB_MSG_EXPERIMENTAL,
|
||||||
|
.encoding = chunk_clone(data),
|
||||||
|
);
|
||||||
|
|
||||||
|
return &this->public.pb_interface;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t *pb_experimental_msg_create(chunk_t body)
|
||||||
|
{
|
||||||
|
return pb_experimental_msg_create_from_data(body);
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 Sansar Choinyambuu
|
||||||
|
* HSR Hochschule fuer Technik Rapperswil
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup pb_experimental_msg pb_experimental_msg
|
||||||
|
* @{ @ingroup tnccs_20
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PB_EXPERIMENTAL_MSG_H_
|
||||||
|
#define PB_EXPERIMENTAL_MSG_H_
|
||||||
|
|
||||||
|
typedef struct pb_experimental_msg_t pb_experimental_msg_t;
|
||||||
|
|
||||||
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classs representing the PB-Experimental message type.
|
||||||
|
*/
|
||||||
|
struct pb_experimental_msg_t {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PB-TNC Message interface
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t pb_interface;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a PB-Experimental message from parameters
|
||||||
|
*
|
||||||
|
* @param body message body
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t* pb_experimental_msg_create(chunk_t body);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an unprocessed PB-Experimental message from raw data
|
||||||
|
*
|
||||||
|
* @param data PB-Experimental message data
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t* pb_experimental_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
|
#endif /** PB_EXPERIMENTAL_MSG_H_ @}*/
|
||||||
+36
-25
@@ -13,13 +13,13 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_language_preference_message.h"
|
#include "pb_language_preference_msg.h"
|
||||||
|
|
||||||
#include <tls_writer.h>
|
#include <tls_writer.h>
|
||||||
#include <tls_reader.h>
|
#include <tls_reader.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
typedef struct private_pb_language_preference_message_t private_pb_language_preference_message_t;
|
typedef struct private_pb_language_preference_msg_t private_pb_language_preference_msg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-Language-Preference message (see section 4.10 of RFC 5793)
|
* PB-Language-Preference message (see section 4.10 of RFC 5793)
|
||||||
@@ -35,14 +35,14 @@ typedef struct private_pb_language_preference_message_t private_pb_language_pref
|
|||||||
#define PB_LANG_PREFIX_LEN strlen(PB_LANG_PREFIX)
|
#define PB_LANG_PREFIX_LEN strlen(PB_LANG_PREFIX)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data of a private_pb_language_preference_message_t object.
|
* Private data of a private_pb_language_preference_msg_t object.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct private_pb_language_preference_message_t {
|
struct private_pb_language_preference_msg_t {
|
||||||
/**
|
/**
|
||||||
* Public pb_access_recommendation_message_t interface.
|
* Public pb_access_recommendation_msg_t interface.
|
||||||
*/
|
*/
|
||||||
pb_language_preference_message_t public;
|
pb_language_preference_msg_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC message type
|
* PB-TNC message type
|
||||||
@@ -60,28 +60,28 @@ struct private_pb_language_preference_message_t {
|
|||||||
chunk_t encoding;
|
chunk_t encoding;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_type, pb_tnc_msg_type_t,
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
private_pb_language_preference_message_t *this)
|
private_pb_language_preference_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->type;
|
return this->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_encoding, chunk_t,
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
private_pb_language_preference_message_t *this)
|
private_pb_language_preference_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->encoding;
|
return this->encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, build, void,
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
private_pb_language_preference_message_t *this)
|
private_pb_language_preference_msg_t *this)
|
||||||
{
|
{
|
||||||
this->encoding = chunk_cat("cc",
|
this->encoding = chunk_cat("cc",
|
||||||
chunk_create(PB_LANG_PREFIX, PB_LANG_PREFIX_LEN),
|
chunk_create(PB_LANG_PREFIX, PB_LANG_PREFIX_LEN),
|
||||||
this->language_preference);
|
this->language_preference);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, process, status_t,
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
private_pb_language_preference_message_t *this)
|
private_pb_language_preference_msg_t *this, u_int32_t *offset)
|
||||||
{
|
{
|
||||||
chunk_t lang;
|
chunk_t lang;
|
||||||
|
|
||||||
@@ -90,25 +90,36 @@ METHOD(pb_tnc_message_t, process, status_t,
|
|||||||
{
|
{
|
||||||
lang = chunk_skip(this->encoding, PB_LANG_PREFIX_LEN);
|
lang = chunk_skip(this->encoding, PB_LANG_PREFIX_LEN);
|
||||||
this->language_preference = lang.len ? chunk_clone(lang) : chunk_empty;
|
this->language_preference = lang.len ? chunk_clone(lang) : chunk_empty;
|
||||||
return SUCCESS;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* TODO generate non-fatal PB-TNC error msg */
|
DBG1(DBG_TNC, "language preference must be preceded by '%s'",
|
||||||
return VERIFY_ERROR;
|
PB_LANG_PREFIX);
|
||||||
|
*offset = 0;
|
||||||
|
return FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->language_preference.len &&
|
||||||
|
this->language_preference.ptr[this->language_preference.len-1] == '\0')
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "language preference must not be null terminated");
|
||||||
|
*offset = PB_LANG_PREFIX_LEN + this->language_preference.len - 1;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, destroy, void,
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
private_pb_language_preference_message_t *this)
|
private_pb_language_preference_msg_t *this)
|
||||||
{
|
{
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
free(this->language_preference.ptr);
|
free(this->language_preference.ptr);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_language_preference_message_t, get_language_preference, chunk_t,
|
METHOD(pb_language_preference_msg_t, get_language_preference, chunk_t,
|
||||||
private_pb_language_preference_message_t *this)
|
private_pb_language_preference_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->language_preference;
|
return this->language_preference;
|
||||||
}
|
}
|
||||||
@@ -116,9 +127,9 @@ METHOD(pb_language_preference_message_t, get_language_preference, chunk_t,
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_language_preference_message_create_from_data(chunk_t data)
|
pb_tnc_msg_t *pb_language_preference_msg_create_from_data(chunk_t data)
|
||||||
{
|
{
|
||||||
private_pb_language_preference_message_t *this;
|
private_pb_language_preference_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -141,9 +152,9 @@ pb_tnc_message_t *pb_language_preference_message_create_from_data(chunk_t data)
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_language_preference_message_create(chunk_t language_preference)
|
pb_tnc_msg_t *pb_language_preference_msg_create(chunk_t language_preference)
|
||||||
{
|
{
|
||||||
private_pb_language_preference_message_t *this;
|
private_pb_language_preference_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
+11
-11
@@ -14,33 +14,33 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup pb_language_preference_message pb_language_preference_message
|
* @defgroup pb_language_preference_msg pb_language_preference_msg
|
||||||
* @{ @ingroup tnccs_20
|
* @{ @ingroup tnccs_20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PB_LANGUAGE_PREFERENCE_MESSAGE_H_
|
#ifndef PB_LANGUAGE_PREFERENCE_MSG_H_
|
||||||
#define PB_LANGUAGE_PREFERENCE_MESSAGE_H_
|
#define PB_LANGUAGE_PREFERENCE_MSG_H_
|
||||||
|
|
||||||
#include "pb_tnc_message.h"
|
typedef struct pb_language_preference_msg_t pb_language_preference_msg_t;
|
||||||
|
|
||||||
typedef struct pb_language_preference_message_t pb_language_preference_message_t;
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Classs representing the PB-Language-Preference message type.
|
* Classs representing the PB-Language-Preference message type.
|
||||||
*/
|
*/
|
||||||
struct pb_language_preference_message_t {
|
struct pb_language_preference_msg_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Message interface
|
* PB-TNC Message interface
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t pb_interface;
|
pb_tnc_msg_t pb_interface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get PB Language Preference
|
* Get PB Language Preference
|
||||||
*
|
*
|
||||||
* @return Language preference
|
* @return Language preference
|
||||||
*/
|
*/
|
||||||
chunk_t (*get_language_preference)(pb_language_preference_message_t *this);
|
chunk_t (*get_language_preference)(pb_language_preference_msg_t *this);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,13 +48,13 @@ struct pb_language_preference_message_t {
|
|||||||
*
|
*
|
||||||
* @param language_preference Preferred language(s)
|
* @param language_preference Preferred language(s)
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_language_preference_message_create(chunk_t language_preference);
|
pb_tnc_msg_t* pb_language_preference_msg_create(chunk_t language_preference);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an unprocessed PB-Language-Preference message from raw data
|
* Create an unprocessed PB-Language-Preference message from raw data
|
||||||
*
|
*
|
||||||
* @param data PB-Language-Preference message data
|
* @param data PB-Language-Preference message data
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_language_preference_message_create_from_data(chunk_t data);
|
pb_tnc_msg_t* pb_language_preference_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
#endif /** PB_PA_MESSAGE_H_ @}*/
|
#endif /** PB_PA_MSG_H_ @}*/
|
||||||
+65
-46
@@ -15,13 +15,26 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_pa_message.h"
|
#include "pb_pa_msg.h"
|
||||||
|
|
||||||
#include <tls_writer.h>
|
#include <tls_writer.h>
|
||||||
#include <tls_reader.h>
|
#include <tls_reader.h>
|
||||||
|
#include <tnc/tnccs/tnccs.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
typedef struct private_pb_pa_message_t private_pb_pa_message_t;
|
ENUM(pa_tnc_subtype_names, PA_SUBTYPE_TESTING, PA_SUBTYPE_NEA_CLIENT,
|
||||||
|
"Testing",
|
||||||
|
"Operating System",
|
||||||
|
"Anti-Virus",
|
||||||
|
"Anti-Spyware",
|
||||||
|
"Anti-Malware",
|
||||||
|
"Firewall",
|
||||||
|
"IDPS",
|
||||||
|
"VPN",
|
||||||
|
"NEA Client"
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct private_pb_pa_msg_t private_pb_pa_msg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-PA message
|
* PB-PA message
|
||||||
@@ -39,20 +52,20 @@ typedef struct private_pb_pa_message_t private_pb_pa_message_t;
|
|||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PA_FLAG_NONE 0x00
|
#define PA_FLAG_NONE 0x00
|
||||||
#define PA_FLAG_EXCL (1<<7)
|
#define PA_FLAG_EXCL (1<<7)
|
||||||
|
#define PA_RESERVED_SUBTYPE 0xffffffff
|
||||||
|
|
||||||
#define PB_PA_HEADER_SIZE 12
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data of a pb_pa_message_t object.
|
* Private data of a pb_pa_msg_t object.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct private_pb_pa_message_t {
|
struct private_pb_pa_msg_t {
|
||||||
/**
|
/**
|
||||||
* Public pb_pa_message_t interface.
|
* Public pb_pa_msg_t interface.
|
||||||
*/
|
*/
|
||||||
pb_pa_message_t public;
|
pb_pa_msg_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC message type
|
* PB-TNC message type
|
||||||
@@ -95,26 +108,26 @@ struct private_pb_pa_message_t {
|
|||||||
chunk_t encoding;
|
chunk_t encoding;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_type, pb_tnc_msg_type_t,
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->type;
|
return this->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_encoding, chunk_t,
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->encoding;
|
return this->encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, build, void,
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
chunk_t msg_header;
|
chunk_t msg_header;
|
||||||
tls_writer_t *writer;
|
tls_writer_t *writer;
|
||||||
|
|
||||||
/* build message header */
|
/* build message header */
|
||||||
writer = tls_writer_create(PB_PA_HEADER_SIZE);
|
writer = tls_writer_create(64);
|
||||||
writer->write_uint8 (writer, this->excl ? PA_FLAG_EXCL : PA_FLAG_NONE);
|
writer->write_uint8 (writer, this->excl ? PA_FLAG_EXCL : PA_FLAG_NONE);
|
||||||
writer->write_uint24(writer, this->vendor_id);
|
writer->write_uint24(writer, this->vendor_id);
|
||||||
writer->write_uint32(writer, this->subtype);
|
writer->write_uint32(writer, this->subtype);
|
||||||
@@ -128,20 +141,13 @@ METHOD(pb_tnc_message_t, build, void,
|
|||||||
writer->destroy(writer);
|
writer->destroy(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, process, status_t,
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this, u_int32_t *offset)
|
||||||
{
|
{
|
||||||
u_int8_t flags;
|
u_int8_t flags;
|
||||||
size_t msg_body_len;
|
size_t msg_body_len;
|
||||||
tls_reader_t *reader;
|
tls_reader_t *reader;
|
||||||
|
|
||||||
if (this->encoding.len < PB_PA_HEADER_SIZE)
|
|
||||||
{
|
|
||||||
DBG1(DBG_TNC,"%N message is shorter than header size of %u bytes",
|
|
||||||
pb_tnc_msg_type_names, PB_MSG_PA, PB_PA_HEADER_SIZE);
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process message header */
|
/* process message header */
|
||||||
reader = tls_reader_create(this->encoding);
|
reader = tls_reader_create(this->encoding);
|
||||||
reader->read_uint8 (reader, &flags);
|
reader->read_uint8 (reader, &flags);
|
||||||
@@ -159,50 +165,64 @@ METHOD(pb_tnc_message_t, process, status_t,
|
|||||||
this->msg_body = chunk_clone(this->msg_body);
|
this->msg_body = chunk_clone(this->msg_body);
|
||||||
}
|
}
|
||||||
reader->destroy(reader);
|
reader->destroy(reader);
|
||||||
|
|
||||||
|
if (this->vendor_id == RESERVED_VENDOR_ID)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "Vendor ID 0x%06x is reserved", RESERVED_VENDOR_ID);
|
||||||
|
*offset = 1;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->subtype == PA_RESERVED_SUBTYPE)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "PA Subtype 0x%08x is reserved", PA_RESERVED_SUBTYPE);
|
||||||
|
*offset = 4;
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, destroy, void,
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
free(this->msg_body.ptr);
|
free(this->msg_body.ptr);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_pa_message_t, get_vendor_id, u_int32_t,
|
METHOD(pb_pa_msg_t, get_vendor_id, u_int32_t,
|
||||||
private_pb_pa_message_t *this, u_int32_t *subtype)
|
private_pb_pa_msg_t *this, u_int32_t *subtype)
|
||||||
{
|
{
|
||||||
*subtype = this->subtype;
|
*subtype = this->subtype;
|
||||||
return this->vendor_id;
|
return this->vendor_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_pa_message_t, get_collector_id, u_int16_t,
|
METHOD(pb_pa_msg_t, get_collector_id, u_int16_t,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->collector_id;
|
return this->collector_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_pa_message_t, get_validator_id, u_int16_t,
|
METHOD(pb_pa_msg_t, get_validator_id, u_int16_t,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->validator_id;
|
return this->validator_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_pa_message_t, get_body, chunk_t,
|
METHOD(pb_pa_msg_t, get_body, chunk_t,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->msg_body;
|
return this->msg_body;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_pa_message_t, get_exclusive_flag, bool,
|
METHOD(pb_pa_msg_t, get_exclusive_flag, bool,
|
||||||
private_pb_pa_message_t *this)
|
private_pb_pa_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->excl;
|
return this->excl;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_pa_message_t, set_exclusive_flag, void,
|
METHOD(pb_pa_msg_t, set_exclusive_flag, void,
|
||||||
private_pb_pa_message_t *this, bool excl)
|
private_pb_pa_msg_t *this, bool excl)
|
||||||
{
|
{
|
||||||
this->excl = excl;
|
this->excl = excl;
|
||||||
}
|
}
|
||||||
@@ -210,9 +230,9 @@ METHOD(pb_pa_message_t, set_exclusive_flag, void,
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_pa_message_create_from_data(chunk_t data)
|
pb_tnc_msg_t *pb_pa_msg_create_from_data(chunk_t data)
|
||||||
{
|
{
|
||||||
private_pb_pa_message_t *this;
|
private_pb_pa_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -239,12 +259,11 @@ pb_tnc_message_t *pb_pa_message_create_from_data(chunk_t data)
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_pa_message_create(u_int32_t vendor_id, u_int32_t subtype,
|
pb_tnc_msg_t *pb_pa_msg_create(u_int32_t vendor_id, u_int32_t subtype,
|
||||||
u_int16_t collector_id,
|
u_int16_t collector_id, u_int16_t validator_id,
|
||||||
u_int16_t validator_id,
|
chunk_t msg_body)
|
||||||
chunk_t msg_body)
|
|
||||||
{
|
{
|
||||||
private_pb_pa_message_t *this;
|
private_pb_pa_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
+39
-19
@@ -14,26 +14,47 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup pb_pa_message pb_pa_message
|
* @defgroup pb_pa_msg pb_pa_msg
|
||||||
* @{ @ingroup tnccs_20
|
* @{ @ingroup tnccs_20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PB_PA_MESSAGE_H_
|
#ifndef PB_PA_MSG_H_
|
||||||
#define PB_PA_MESSAGE_H_
|
#define PB_PA_MSG_H_
|
||||||
|
|
||||||
#include "pb_tnc_message.h"
|
typedef enum pa_tnc_subtype_t pa_tnc_subtype_t;
|
||||||
|
typedef struct pb_pa_msg_t pb_pa_msg_t;
|
||||||
|
|
||||||
typedef struct pb_pa_message_t pb_pa_message_t;
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PA-TNC Subtypes as defined in section 3.5 of RFC 5792
|
||||||
|
*/
|
||||||
|
enum pa_tnc_subtype_t {
|
||||||
|
PA_SUBTYPE_TESTING = 0,
|
||||||
|
PA_SUBTYPE_OPERATING_SYSTEM = 1,
|
||||||
|
PA_SUBTYPE_ANTI_VIRUS = 2,
|
||||||
|
PA_SUBTYPE_ANTI_SPYWARE = 3,
|
||||||
|
PA_SUBTYPE_ANTI_MALWARE = 4,
|
||||||
|
PA_SUBTYPE_FIREWALL = 5,
|
||||||
|
PA_SUBTYPE_IDPS = 6,
|
||||||
|
PA_SUBTYPE_VPN = 7,
|
||||||
|
PA_SUBTYPE_NEA_CLIENT = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum name for pa_tnc_subtype_t.
|
||||||
|
*/
|
||||||
|
extern enum_name_t *pa_tnc_subtype_names;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Classs representing the PB-PA message type.
|
* Classs representing the PB-PA message type.
|
||||||
*/
|
*/
|
||||||
struct pb_pa_message_t {
|
struct pb_pa_msg_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Message interface
|
* PB-TNC Message interface
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t pb_interface;
|
pb_tnc_msg_t pb_interface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get PA Message Vendor ID and Subtype
|
* Get PA Message Vendor ID and Subtype
|
||||||
@@ -41,42 +62,42 @@ struct pb_pa_message_t {
|
|||||||
* @param subtype PA Subtype
|
* @param subtype PA Subtype
|
||||||
* @return PA Message Vendor ID
|
* @return PA Message Vendor ID
|
||||||
*/
|
*/
|
||||||
u_int32_t (*get_vendor_id)(pb_pa_message_t *this, u_int32_t *subtype);
|
u_int32_t (*get_vendor_id)(pb_pa_msg_t *this, u_int32_t *subtype);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Posture Collector ID
|
* Get Posture Collector ID
|
||||||
*
|
*
|
||||||
* @return Posture Collector ID
|
* @return Posture Collector ID
|
||||||
*/
|
*/
|
||||||
u_int16_t (*get_collector_id)(pb_pa_message_t *this);
|
u_int16_t (*get_collector_id)(pb_pa_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Posture Validator ID
|
* Get Posture Validator ID
|
||||||
*
|
*
|
||||||
* @return Posture Validator ID
|
* @return Posture Validator ID
|
||||||
*/
|
*/
|
||||||
u_int16_t (*get_validator_id)(pb_pa_message_t *this);
|
u_int16_t (*get_validator_id)(pb_pa_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the PA Message Body
|
* Get the PA Message Body
|
||||||
*
|
*
|
||||||
* @return PA Message Body
|
* @return PA Message Body
|
||||||
*/
|
*/
|
||||||
chunk_t (*get_body)(pb_pa_message_t *this);
|
chunk_t (*get_body)(pb_pa_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the exclusive flag
|
* Get the exclusive flag
|
||||||
*
|
*
|
||||||
* @return exclusive flag
|
* @return exclusive flag
|
||||||
*/
|
*/
|
||||||
bool (*get_exclusive_flag)(pb_pa_message_t *this);
|
bool (*get_exclusive_flag)(pb_pa_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the exclusive flag
|
* Set the exclusive flag
|
||||||
*
|
*
|
||||||
* @param excl vexclusive flag
|
* @param excl vexclusive flag
|
||||||
*/
|
*/
|
||||||
void (*set_exclusive_flag)(pb_pa_message_t *this, bool excl);
|
void (*set_exclusive_flag)(pb_pa_msg_t *this, bool excl);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -88,16 +109,15 @@ struct pb_pa_message_t {
|
|||||||
* @param validator_id Posture Validator ID
|
* @param validator_id Posture Validator ID
|
||||||
* @param msg_body PA Message Body
|
* @param msg_body PA Message Body
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_pa_message_create(u_int32_t vendor_id, u_int32_t subtype,
|
pb_tnc_msg_t *pb_pa_msg_create(u_int32_t vendor_id, u_int32_t subtype,
|
||||||
u_int16_t collector_id,
|
u_int16_t collector_id, u_int16_t validator_id,
|
||||||
u_int16_t validator_id,
|
chunk_t msg_body);
|
||||||
chunk_t msg_body);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an unprocessed PB-PA message from raw data
|
* Create an unprocessed PB-PA message from raw data
|
||||||
*
|
*
|
||||||
* @param data PB-PA message data
|
* @param data PB-PA message data
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_pa_message_create_from_data(chunk_t data);
|
pb_tnc_msg_t* pb_pa_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
#endif /** PB_PA_MESSAGE_H_ @}*/
|
#endif /** PB_PA_MSG_H_ @}*/
|
||||||
+52
-44
@@ -13,13 +13,13 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_reason_string_message.h"
|
#include "pb_reason_string_msg.h"
|
||||||
|
|
||||||
#include <tls_writer.h>
|
#include <tls_writer.h>
|
||||||
#include <tls_reader.h>
|
#include <tls_reader.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
typedef struct private_pb_reason_string_message_t private_pb_reason_string_message_t;
|
typedef struct private_pb_reason_string_msg_t private_pb_reason_string_msg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-Language-Preference message (see section 4.11 of RFC 5793)
|
* PB-Language-Preference message (see section 4.11 of RFC 5793)
|
||||||
@@ -35,17 +35,15 @@ typedef struct private_pb_reason_string_message_t private_pb_reason_string_messa
|
|||||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define REASON_STRING_HEADER_SIZE 5
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data of a private_pb_reason_string_message_t object.
|
* Private data of a private_pb_reason_string_msg_t object.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct private_pb_reason_string_message_t {
|
struct private_pb_reason_string_msg_t {
|
||||||
/**
|
/**
|
||||||
* Public pb_reason_string_message_t interface.
|
* Public pb_reason_string_msg_t interface.
|
||||||
*/
|
*/
|
||||||
pb_reason_string_message_t public;
|
pb_reason_string_msg_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC message type
|
* PB-TNC message type
|
||||||
@@ -68,30 +66,27 @@ struct private_pb_reason_string_message_t {
|
|||||||
chunk_t encoding;
|
chunk_t encoding;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_type, pb_tnc_msg_type_t,
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
private_pb_reason_string_message_t *this)
|
private_pb_reason_string_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->type;
|
return this->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, get_encoding, chunk_t,
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
private_pb_reason_string_message_t *this)
|
private_pb_reason_string_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->encoding;
|
return this->encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, build, void,
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
private_pb_reason_string_message_t *this)
|
private_pb_reason_string_msg_t *this)
|
||||||
{
|
{
|
||||||
tls_writer_t *writer;
|
tls_writer_t *writer;
|
||||||
|
|
||||||
/* build message */
|
/* build message */
|
||||||
writer = tls_writer_create(REASON_STRING_HEADER_SIZE);
|
writer = tls_writer_create(64);
|
||||||
writer->write_uint32(writer, this->reason_string.len);
|
writer->write_data32(writer, this->reason_string);
|
||||||
writer->write_data(writer, this->reason_string);
|
writer->write_data8 (writer, this->language_code);
|
||||||
|
|
||||||
writer->write_uint8(writer, this->language_code.len);
|
|
||||||
writer->write_data(writer, this->language_code);
|
|
||||||
|
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
this->encoding = writer->get_buf(writer);
|
this->encoding = writer->get_buf(writer);
|
||||||
@@ -99,41 +94,54 @@ METHOD(pb_tnc_message_t, build, void,
|
|||||||
writer->destroy(writer);
|
writer->destroy(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, process, status_t,
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
private_pb_reason_string_message_t *this)
|
private_pb_reason_string_msg_t *this, u_int32_t *offset)
|
||||||
{
|
{
|
||||||
tls_reader_t *reader;
|
tls_reader_t *reader;
|
||||||
|
|
||||||
if (this->encoding.len < REASON_STRING_HEADER_SIZE)
|
|
||||||
{
|
|
||||||
DBG1(DBG_TNC,"%N message is shorter than header size of %u bytes",
|
|
||||||
pb_tnc_msg_type_names, PB_MSG_REASON_STRING,
|
|
||||||
REASON_STRING_HEADER_SIZE);
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process message */
|
/* process message */
|
||||||
reader = tls_reader_create(this->encoding);
|
reader = tls_reader_create(this->encoding);
|
||||||
if (!reader->read_data32(reader, &this->reason_string))
|
if (!reader->read_data32(reader, &this->reason_string))
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "Could not parse reason string");
|
DBG1(DBG_TNC, "could not parse reason string");
|
||||||
|
reader->destroy(reader);
|
||||||
|
*offset = 0;
|
||||||
return FAILED;
|
return FAILED;
|
||||||
};
|
};
|
||||||
this->reason_string = chunk_clone(this->reason_string);
|
this->reason_string = chunk_clone(this->reason_string);
|
||||||
|
|
||||||
|
if (this->reason_string.len &&
|
||||||
|
this->reason_string.ptr[this->reason_string.len-1] == '\0')
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "reason string must not be null terminated");
|
||||||
|
reader->destroy(reader);
|
||||||
|
*offset = 3 + this->reason_string.len;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
if (!reader->read_data8(reader, &this->language_code))
|
if (!reader->read_data8(reader, &this->language_code))
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "Could not parse language code");
|
DBG1(DBG_TNC, "could not parse language code");
|
||||||
|
reader->destroy(reader);
|
||||||
|
*offset = 4 + this->reason_string.len;
|
||||||
return FAILED;
|
return FAILED;
|
||||||
};
|
};
|
||||||
this->language_code = chunk_clone(this->language_code);
|
this->language_code = chunk_clone(this->language_code);
|
||||||
|
|
||||||
reader->destroy(reader);
|
reader->destroy(reader);
|
||||||
|
|
||||||
|
if (this->language_code.len &&
|
||||||
|
this->language_code.ptr[this->language_code.len-1] == '\0')
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "language code must not be null terminated");
|
||||||
|
*offset = 4 + this->reason_string.len + this->language_code.len;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_tnc_message_t, destroy, void,
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
private_pb_reason_string_message_t *this)
|
private_pb_reason_string_msg_t *this)
|
||||||
{
|
{
|
||||||
free(this->encoding.ptr);
|
free(this->encoding.ptr);
|
||||||
free(this->reason_string.ptr);
|
free(this->reason_string.ptr);
|
||||||
@@ -141,14 +149,14 @@ METHOD(pb_tnc_message_t, destroy, void,
|
|||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_reason_string_message_t, get_reason_string, chunk_t,
|
METHOD(pb_reason_string_msg_t, get_reason_string, chunk_t,
|
||||||
private_pb_reason_string_message_t *this)
|
private_pb_reason_string_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->reason_string;
|
return this->reason_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(pb_reason_string_message_t, get_language_code, chunk_t,
|
METHOD(pb_reason_string_msg_t, get_language_code, chunk_t,
|
||||||
private_pb_reason_string_message_t *this)
|
private_pb_reason_string_msg_t *this)
|
||||||
{
|
{
|
||||||
return this->language_code;
|
return this->language_code;
|
||||||
}
|
}
|
||||||
@@ -156,9 +164,9 @@ METHOD(pb_reason_string_message_t, get_language_code, chunk_t,
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_reason_string_message_create_from_data(chunk_t data)
|
pb_tnc_msg_t *pb_reason_string_msg_create_from_data(chunk_t data)
|
||||||
{
|
{
|
||||||
private_pb_reason_string_message_t *this;
|
private_pb_reason_string_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -182,10 +190,10 @@ pb_tnc_message_t *pb_reason_string_message_create_from_data(chunk_t data)
|
|||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t *pb_reason_string_message_create(chunk_t reason_string,
|
pb_tnc_msg_t *pb_reason_string_msg_create(chunk_t reason_string,
|
||||||
chunk_t language_code)
|
chunk_t language_code)
|
||||||
{
|
{
|
||||||
private_pb_reason_string_message_t *this;
|
private_pb_reason_string_msg_t *this;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
+13
-13
@@ -14,40 +14,40 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup pb_reason_string_message pb_reason_string_message
|
* @defgroup pb_reason_string_msg pb_reason_string_msg
|
||||||
* @{ @ingroup tnccs_20
|
* @{ @ingroup tnccs_20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PB_REASON_STRING_MESSAGE_H_
|
#ifndef PB_REASON_STRING_MSG_H_
|
||||||
#define PB_REASON_STRING_MESSAGE_H_
|
#define PB_REASON_STRING_MSG_H_
|
||||||
|
|
||||||
#include "pb_tnc_message.h"
|
typedef struct pb_reason_string_msg_t pb_reason_string_msg_t;
|
||||||
|
|
||||||
typedef struct pb_reason_string_message_t pb_reason_string_message_t;
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Classs representing the PB-Reason-String message type.
|
* Classs representing the PB-Reason-String message type.
|
||||||
*/
|
*/
|
||||||
struct pb_reason_string_message_t {
|
struct pb_reason_string_msg_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Message interface
|
* PB-TNC Message interface
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t pb_interface;
|
pb_tnc_msg_t pb_interface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Reason String
|
* Get Reason String
|
||||||
*
|
*
|
||||||
* @return Reason string
|
* @return Reason string
|
||||||
*/
|
*/
|
||||||
chunk_t (*get_reason_string)(pb_reason_string_message_t *this);
|
chunk_t (*get_reason_string)(pb_reason_string_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Reason String Language Code
|
* Get Reason String Language Code
|
||||||
*
|
*
|
||||||
* @return Language code
|
* @return Language code
|
||||||
*/
|
*/
|
||||||
chunk_t (*get_language_code)(pb_reason_string_message_t *this);
|
chunk_t (*get_language_code)(pb_reason_string_msg_t *this);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,14 +56,14 @@ struct pb_reason_string_message_t {
|
|||||||
* @param reason_string Reason string
|
* @param reason_string Reason string
|
||||||
* @param language_code Language code
|
* @param language_code Language code
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_reason_string_message_create(chunk_t reason_string,
|
pb_tnc_msg_t* pb_reason_string_msg_create(chunk_t reason_string,
|
||||||
chunk_t language_code);
|
chunk_t language_code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an unprocessed PB-Reason-String message from raw data
|
* Create an unprocessed PB-Reason-String message from raw data
|
||||||
*
|
*
|
||||||
* @param data PB-Reason-String message data
|
* @param data PB-Reason-String message data
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_reason_string_message_create_from_data(chunk_t data);
|
pb_tnc_msg_t* pb_reason_string_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
#endif /** PB_PA_MESSAGE_H_ @}*/
|
#endif /** PB_PA_MSG_H_ @}*/
|
||||||
@@ -0,0 +1,259 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 <http://www.fsf.org/copyleft/gpl.txt>.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pb_remediation_parameters_msg.h"
|
||||||
|
|
||||||
|
#include <tls_writer.h>
|
||||||
|
#include <tls_reader.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
ENUM(pb_tnc_remed_param_type_names, PB_REMEDIATION_URI, PB_REMEDIATION_STRING,
|
||||||
|
"Remediation-URI",
|
||||||
|
"Remediation-String"
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct private_pb_remediation_parameters_msg_t private_pb_remediation_parameters_msg_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PB-Remediation-Parameters message (see section 4.8 of RFC 5793)
|
||||||
|
*
|
||||||
|
* 0 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
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Reserved | Remediation Parameters Vendor ID |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Remediation Parameters Type |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Remediation Parameters (Variable Length) |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
*
|
||||||
|
* 0 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
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Remediation String Length |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Remediation String (Variable Length) |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Lang Code Len | Remediation String Lang Code (Variable Len) |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private data of a private_pb_remediation_parameters_msg_t object.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct private_pb_remediation_parameters_msg_t {
|
||||||
|
/**
|
||||||
|
* Public pb_remediation_parameters_msg_t interface.
|
||||||
|
*/
|
||||||
|
pb_remediation_parameters_msg_t public;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PB-TNC message type
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_type_t type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remediation Parameters Vendor ID
|
||||||
|
*/
|
||||||
|
u_int32_t vendor_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remediation Parameters Type
|
||||||
|
*/
|
||||||
|
u_int32_t parameters_type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remediation Parameters string
|
||||||
|
*/
|
||||||
|
chunk_t remediation_string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Language code
|
||||||
|
*/
|
||||||
|
chunk_t language_code;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoded message
|
||||||
|
*/
|
||||||
|
chunk_t encoding;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t,
|
||||||
|
private_pb_remediation_parameters_msg_t *this)
|
||||||
|
{
|
||||||
|
return this->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
|
||||||
|
private_pb_remediation_parameters_msg_t *this)
|
||||||
|
{
|
||||||
|
return this->encoding;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, build, void,
|
||||||
|
private_pb_remediation_parameters_msg_t *this)
|
||||||
|
{
|
||||||
|
tls_writer_t *writer;
|
||||||
|
|
||||||
|
/* build message */
|
||||||
|
writer = tls_writer_create(64);
|
||||||
|
writer->write_uint32(writer, this->vendor_id);
|
||||||
|
writer->write_uint32(writer, this->parameters_type);
|
||||||
|
writer->write_data32(writer, this->remediation_string);
|
||||||
|
writer->write_data8 (writer, this->language_code);
|
||||||
|
|
||||||
|
free(this->encoding.ptr);
|
||||||
|
this->encoding = writer->get_buf(writer);
|
||||||
|
this->encoding = chunk_clone(this->encoding);
|
||||||
|
writer->destroy(writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, process, status_t,
|
||||||
|
private_pb_remediation_parameters_msg_t *this, size_t *offset)
|
||||||
|
{
|
||||||
|
tls_reader_t *reader;
|
||||||
|
|
||||||
|
/* process message */
|
||||||
|
reader = tls_reader_create(this->encoding);
|
||||||
|
reader->read_uint32(reader, &this->vendor_id);
|
||||||
|
reader->read_uint32(reader, &this->parameters_type);
|
||||||
|
|
||||||
|
if (!reader->read_data32(reader, &this->remediation_string))
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "could not parse remediation string");
|
||||||
|
reader->destroy(reader);
|
||||||
|
*offset = 8;
|
||||||
|
return FAILED;
|
||||||
|
};
|
||||||
|
this->remediation_string = chunk_clone(this->remediation_string);
|
||||||
|
|
||||||
|
if (this->remediation_string.len &&
|
||||||
|
this->remediation_string.ptr[this->remediation_string.len-1] == '\0')
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "remediation string must not be null terminated");
|
||||||
|
reader->destroy(reader);
|
||||||
|
*offset = 11 + this->remediation_string.len;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!reader->read_data8(reader, &this->language_code))
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "could not parse language code");
|
||||||
|
reader->destroy(reader);
|
||||||
|
*offset = 12 + this->remediation_string.len;
|
||||||
|
return FAILED;
|
||||||
|
};
|
||||||
|
this->language_code = chunk_clone(this->language_code);
|
||||||
|
reader->destroy(reader);
|
||||||
|
|
||||||
|
if (this->language_code.len &&
|
||||||
|
this->language_code.ptr[this->language_code.len-1] == '\0')
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "language code must not be null terminated");
|
||||||
|
*offset = 12 + this->remediation_string.len + this->language_code.len;
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_tnc_msg_t, destroy, void,
|
||||||
|
private_pb_remediation_parameters_msg_t *this)
|
||||||
|
{
|
||||||
|
free(this->encoding.ptr);
|
||||||
|
free(this->remediation_string.ptr);
|
||||||
|
free(this->language_code.ptr);
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_remediation_parameters_msg_t, get_vendor_id, u_int32_t,
|
||||||
|
private_pb_remediation_parameters_msg_t *this, u_int32_t *type)
|
||||||
|
{
|
||||||
|
*type = this->parameters_type;
|
||||||
|
return this->vendor_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_remediation_parameters_msg_t, get_remediation_string, chunk_t,
|
||||||
|
private_pb_remediation_parameters_msg_t *this)
|
||||||
|
{
|
||||||
|
return this->remediation_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(pb_remediation_parameters_msg_t, get_language_code, chunk_t,
|
||||||
|
private_pb_remediation_parameters_msg_t *this)
|
||||||
|
{
|
||||||
|
return this->language_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t *pb_remediation_parameters_msg_create_from_data(chunk_t data)
|
||||||
|
{
|
||||||
|
private_pb_remediation_parameters_msg_t *this;
|
||||||
|
|
||||||
|
INIT(this,
|
||||||
|
.public = {
|
||||||
|
.pb_interface = {
|
||||||
|
.get_type = _get_type,
|
||||||
|
.get_encoding = _get_encoding,
|
||||||
|
.build = _build,
|
||||||
|
.process = _process,
|
||||||
|
.destroy = _destroy,
|
||||||
|
},
|
||||||
|
.get_vendor_id = _get_vendor_id,
|
||||||
|
.get_remediation_string = _get_remediation_string,
|
||||||
|
.get_language_code = _get_language_code,
|
||||||
|
},
|
||||||
|
.type = PB_MSG_REASON_STRING,
|
||||||
|
.encoding = chunk_clone(data),
|
||||||
|
);
|
||||||
|
|
||||||
|
return &this->public.pb_interface;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t* pb_remediation_parameters_msg_create(u_int32_t vendor_id,
|
||||||
|
u_int32_t type,
|
||||||
|
chunk_t remediation_string,
|
||||||
|
chunk_t language_code)
|
||||||
|
{
|
||||||
|
private_pb_remediation_parameters_msg_t *this;
|
||||||
|
|
||||||
|
INIT(this,
|
||||||
|
.public = {
|
||||||
|
.pb_interface = {
|
||||||
|
.get_type = _get_type,
|
||||||
|
.get_encoding = _get_encoding,
|
||||||
|
.build = _build,
|
||||||
|
.process = _process,
|
||||||
|
.destroy = _destroy,
|
||||||
|
},
|
||||||
|
.get_vendor_id = _get_vendor_id,
|
||||||
|
.get_remediation_string = _get_remediation_string,
|
||||||
|
.get_language_code = _get_language_code,
|
||||||
|
},
|
||||||
|
.type = PB_MSG_REASON_STRING,
|
||||||
|
.vendor_id = vendor_id,
|
||||||
|
.parameters_type = type,
|
||||||
|
.remediation_string = chunk_clone(remediation_string),
|
||||||
|
.language_code = chunk_clone(language_code),
|
||||||
|
);
|
||||||
|
|
||||||
|
return &this->public.pb_interface;
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 <http://www.fsf.org/copyleft/gpl.txt>.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup pb_remediation_parameters_msg pb_remediation_parameters_msg
|
||||||
|
* @{ @ingroup tnccs_20
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PB_REMEDIATION_PARAMETERS_MSG_H_
|
||||||
|
#define PB_REMEDIATION_PARAMETERS_MSG_H_
|
||||||
|
|
||||||
|
typedef enum pb_tnc_remed_param_type_t pb_tnc_remed_param_type_t;
|
||||||
|
typedef struct pb_remediation_parameters_msg_t pb_remediation_parameters_msg_t;
|
||||||
|
|
||||||
|
#include "pb_tnc_msg.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PB-TNC Remediation Parameter Types as defined in section 4.8.1 of RFC 5793
|
||||||
|
*/
|
||||||
|
enum pb_tnc_remed_param_type_t {
|
||||||
|
PB_REMEDIATION_URI = 1,
|
||||||
|
PB_REMEDIATION_STRING = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum name for pb_tnc_remed_param_type_t.
|
||||||
|
*/
|
||||||
|
extern enum_name_t *pb_tnc_remed_param_type_names;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classs representing the PB-Remediation-Parameters message type.
|
||||||
|
*/
|
||||||
|
struct pb_remediation_parameters_msg_t {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PB-TNC Message interface
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t pb_interface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Remediation Parameters Vendor ID and Type
|
||||||
|
*
|
||||||
|
* @param type Remediation Parameters Type
|
||||||
|
* @return Remediation Parameters Vendor ID
|
||||||
|
*/
|
||||||
|
u_int32_t (*get_vendor_id)(pb_remediation_parameters_msg_t *this,
|
||||||
|
u_int32_t *type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Remediation String
|
||||||
|
*
|
||||||
|
* @return Remediation String
|
||||||
|
*/
|
||||||
|
chunk_t (*get_remediation_string)(pb_remediation_parameters_msg_t *this);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Reason String Language Code
|
||||||
|
*
|
||||||
|
* @return Language Code
|
||||||
|
*/
|
||||||
|
chunk_t (*get_language_code)(pb_remediation_parameters_msg_t *this);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a PB-Remediation-Parameters message from parameters
|
||||||
|
*
|
||||||
|
* @param vendor_id Remediation Parameters Vendor ID
|
||||||
|
* @param type Remediation Parameters Type
|
||||||
|
* @param remediation_string Remediation String
|
||||||
|
* @param language_code Language Code
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t* pb_remediation_parameters_msg_create(u_int32_t vendor_id,
|
||||||
|
u_int32_t type,
|
||||||
|
chunk_t remediation_string,
|
||||||
|
chunk_t language_code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an unprocessed PB-Remediation-Parameters message from raw data
|
||||||
|
*
|
||||||
|
* @param data PB-Remediation-Parameters message data
|
||||||
|
*/
|
||||||
|
pb_tnc_msg_t* pb_remediation_parameters_msg_create_from_data(chunk_t data);
|
||||||
|
|
||||||
|
#endif /** PB_PA_MSG_H_ @}*/
|
||||||
+29
-16
@@ -13,13 +13,15 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_tnc_message.h"
|
#include "pb_tnc_msg.h"
|
||||||
#include "pb_pa_message.h"
|
#include "pb_experimental_msg.h"
|
||||||
#include "pb_error_message.h"
|
#include "pb_pa_msg.h"
|
||||||
#include "pb_language_preference_message.h"
|
#include "pb_error_msg.h"
|
||||||
#include "pb_assessment_result_message.h"
|
#include "pb_language_preference_msg.h"
|
||||||
#include "pb_access_recommendation_message.h"
|
#include "pb_assessment_result_msg.h"
|
||||||
#include "pb_reason_string_message.h"
|
#include "pb_access_recommendation_msg.h"
|
||||||
|
#include "pb_remediation_parameters_msg.h"
|
||||||
|
#include "pb_reason_string_msg.h"
|
||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
|
|
||||||
@@ -34,29 +36,40 @@ ENUM(pb_tnc_msg_type_names, PB_MSG_EXPERIMENTAL, PB_MSG_REASON_STRING,
|
|||||||
"PB-Reason-String"
|
"PB-Reason-String"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
pb_tnc_msg_info_t pb_tnc_msg_infos[] = {
|
||||||
|
{ 12, FALSE, FALSE, TRUE_OR_FALSE },
|
||||||
|
{ 24, FALSE, FALSE, TRUE },
|
||||||
|
{ 16, TRUE, TRUE, TRUE },
|
||||||
|
{ 16, TRUE, TRUE, FALSE },
|
||||||
|
{ 20, FALSE, TRUE, FALSE },
|
||||||
|
{ 20, FALSE, FALSE, TRUE },
|
||||||
|
{ 12, FALSE, FALSE, FALSE },
|
||||||
|
{ 17, FALSE, TRUE, FALSE },
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See header
|
* See header
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_tnc_message_create(pb_tnc_msg_type_t type, chunk_t value)
|
pb_tnc_msg_t* pb_tnc_msg_create_from_data(pb_tnc_msg_type_t type, chunk_t value)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case PB_MSG_PA:
|
case PB_MSG_PA:
|
||||||
return pb_pa_message_create_from_data(value);
|
return pb_pa_msg_create_from_data(value);
|
||||||
case PB_MSG_ERROR:
|
case PB_MSG_ERROR:
|
||||||
return pb_error_message_create_from_data(value);
|
return pb_error_msg_create_from_data(value);
|
||||||
case PB_MSG_EXPERIMENTAL:
|
case PB_MSG_EXPERIMENTAL:
|
||||||
return NULL;
|
return pb_experimental_msg_create_from_data(value);
|
||||||
case PB_MSG_LANGUAGE_PREFERENCE:
|
case PB_MSG_LANGUAGE_PREFERENCE:
|
||||||
return pb_language_preference_message_create_from_data(value);
|
return pb_language_preference_msg_create_from_data(value);
|
||||||
case PB_MSG_ASSESSMENT_RESULT:
|
case PB_MSG_ASSESSMENT_RESULT:
|
||||||
return pb_assessment_result_message_create_from_data(value);
|
return pb_assessment_result_msg_create_from_data(value);
|
||||||
case PB_MSG_ACCESS_RECOMMENDATION:
|
case PB_MSG_ACCESS_RECOMMENDATION:
|
||||||
return pb_access_recommendation_message_create_from_data(value);
|
return pb_access_recommendation_msg_create_from_data(value);
|
||||||
case PB_MSG_REMEDIATION_PARAMETERS:
|
case PB_MSG_REMEDIATION_PARAMETERS:
|
||||||
return NULL;
|
return pb_remediation_parameters_msg_create_from_data(value);
|
||||||
case PB_MSG_REASON_STRING:
|
case PB_MSG_REASON_STRING:
|
||||||
return pb_reason_string_message_create_from_data(value);
|
return pb_reason_string_msg_create_from_data(value);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
+36
-17
@@ -14,17 +14,20 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup pb_tnc_message pb_tnc_message
|
* @defgroup pb_tnc_msg pb_tnc_msg
|
||||||
* @{ @ingroup tnccs_20
|
* @{ @ingroup tnccs_20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PB_TNC_MESSAGE_H_
|
#ifndef PB_TNC_MSG_H_
|
||||||
#define PB_TNC_MESSAGE_H_
|
#define PB_TNC_MSG_H_
|
||||||
|
|
||||||
#include <library.h>
|
|
||||||
#include <tnccs_20_types.h>
|
|
||||||
|
|
||||||
typedef enum pb_tnc_msg_type_t pb_tnc_msg_type_t;
|
typedef enum pb_tnc_msg_type_t pb_tnc_msg_type_t;
|
||||||
|
typedef struct pb_tnc_msg_info_t pb_tnc_msg_info_t;
|
||||||
|
typedef struct pb_tnc_msg_t pb_tnc_msg_t;
|
||||||
|
|
||||||
|
#include <library.h>
|
||||||
|
|
||||||
|
#define PB_TNC_VERSION 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PB-TNC Message Types as defined in section 4.3 of RFC 5793
|
* PB-TNC Message Types as defined in section 4.3 of RFC 5793
|
||||||
@@ -46,7 +49,22 @@ enum pb_tnc_msg_type_t {
|
|||||||
*/
|
*/
|
||||||
extern enum_name_t *pb_tnc_msg_type_names;
|
extern enum_name_t *pb_tnc_msg_type_names;
|
||||||
|
|
||||||
typedef struct pb_tnc_message_t pb_tnc_message_t;
|
/**
|
||||||
|
* Information entry describing a PB-TNC Message Type
|
||||||
|
*/
|
||||||
|
struct pb_tnc_msg_info_t {
|
||||||
|
u_int32_t min_size;
|
||||||
|
bool exact_size;
|
||||||
|
bool in_result_batch;
|
||||||
|
bool has_noskip_flag;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TRUE_OR_FALSE 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information on PB-TNC Message Types
|
||||||
|
*/
|
||||||
|
extern pb_tnc_msg_info_t pb_tnc_msg_infos[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic interface for all PB-TNC message types.
|
* Generic interface for all PB-TNC message types.
|
||||||
@@ -54,45 +72,46 @@ typedef struct pb_tnc_message_t pb_tnc_message_t;
|
|||||||
* To handle all messages in a generic way, this interface
|
* To handle all messages in a generic way, this interface
|
||||||
* must be implemented by each message type.
|
* must be implemented by each message type.
|
||||||
*/
|
*/
|
||||||
struct pb_tnc_message_t {
|
struct pb_tnc_msg_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the PB-TNC Message Type
|
* Get the PB-TNC Message Type
|
||||||
*
|
*
|
||||||
* @return PB-TNC Message Type
|
* @return PB-TNC Message Type
|
||||||
*/
|
*/
|
||||||
pb_tnc_msg_type_t (*get_type)(pb_tnc_message_t *this);
|
pb_tnc_msg_type_t (*get_type)(pb_tnc_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the encoding of the PB-TNC Message Value
|
* Get the encoding of the PB-TNC Message Value
|
||||||
*
|
*
|
||||||
* @return encoded PB-TNC Message Value
|
* @return encoded PB-TNC Message Value
|
||||||
*/
|
*/
|
||||||
chunk_t (*get_encoding)(pb_tnc_message_t *this);
|
chunk_t (*get_encoding)(pb_tnc_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the PB-TNC Message Value
|
* Build the PB-TNC Message Value
|
||||||
*/
|
*/
|
||||||
void (*build)(pb_tnc_message_t *this);
|
void (*build)(pb_tnc_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the PB-TNC Message Value
|
* Process the PB-TNC Message Value
|
||||||
*
|
*
|
||||||
|
* @param relative offset where an error occurred
|
||||||
* @return return processing status
|
* @return return processing status
|
||||||
*/
|
*/
|
||||||
status_t (*process)(pb_tnc_message_t *this);
|
status_t (*process)(pb_tnc_msg_t *this, u_int32_t *offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a new reference to the message.
|
* Get a new reference to the message.
|
||||||
*
|
*
|
||||||
* @return this, with an increased refcount
|
* @return this, with an increased refcount
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* (*get_ref)(pb_tnc_message_t *this);
|
pb_tnc_msg_t* (*get_ref)(pb_tnc_msg_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroys a pb_tnc_message_t object.
|
* Destroys a pb_tnc_msg_t object.
|
||||||
*/
|
*/
|
||||||
void (*destroy)(pb_tnc_message_t *this);
|
void (*destroy)(pb_tnc_msg_t *this);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -104,6 +123,6 @@ struct pb_tnc_message_t {
|
|||||||
* @param type PB-TNC message type
|
* @param type PB-TNC message type
|
||||||
* @param value PB-TNC message value
|
* @param value PB-TNC message value
|
||||||
*/
|
*/
|
||||||
pb_tnc_message_t* pb_tnc_message_create(pb_tnc_msg_type_t type, chunk_t value);
|
pb_tnc_msg_t* pb_tnc_msg_create_from_data(pb_tnc_msg_type_t type, chunk_t value);
|
||||||
|
|
||||||
#endif /** PB_TNC_MESSAGE_H_ @}*/
|
#endif /** PB_TNC_MSG_H_ @}*/
|
||||||
@@ -14,13 +14,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pb_tnc_state_machine.h"
|
#include "pb_tnc_state_machine.h"
|
||||||
#include "messages/pb_error_message.h"
|
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <utils/linked_list.h>
|
|
||||||
#include <tls_writer.h>
|
|
||||||
#include <tls_reader.h>
|
|
||||||
#include <tnc/tnccs/tnccs.h>
|
|
||||||
|
|
||||||
ENUM(pb_tnc_state_names, PB_STATE_INIT, PB_STATE_END,
|
ENUM(pb_tnc_state_names, PB_STATE_INIT, PB_STATE_END,
|
||||||
"Init",
|
"Init",
|
||||||
|
|||||||
@@ -15,15 +15,15 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tnccs_20.h"
|
#include "tnccs_20.h"
|
||||||
#include "tnccs_20_types.h"
|
|
||||||
#include "batch/pb_tnc_batch.h"
|
#include "batch/pb_tnc_batch.h"
|
||||||
#include "messages/pb_tnc_message.h"
|
#include "messages/pb_tnc_msg.h"
|
||||||
#include "messages/pb_pa_message.h"
|
#include "messages/pb_pa_msg.h"
|
||||||
#include "messages/pb_error_message.h"
|
#include "messages/pb_error_msg.h"
|
||||||
#include "messages/pb_assessment_result_message.h"
|
#include "messages/pb_assessment_result_msg.h"
|
||||||
#include "messages/pb_access_recommendation_message.h"
|
#include "messages/pb_access_recommendation_msg.h"
|
||||||
#include "messages/pb_reason_string_message.h"
|
#include "messages/pb_remediation_parameters_msg.h"
|
||||||
#include "messages/pb_language_preference_message.h"
|
#include "messages/pb_reason_string_msg.h"
|
||||||
|
#include "messages/pb_language_preference_msg.h"
|
||||||
#include "state_machine/pb_tnc_state_machine.h"
|
#include "state_machine/pb_tnc_state_machine.h"
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
@@ -70,6 +70,11 @@ struct private_tnccs_20_t {
|
|||||||
*/
|
*/
|
||||||
mutex_t *mutex;
|
mutex_t *mutex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag set while processingn
|
||||||
|
*/
|
||||||
|
bool fatal_error;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag set by IMC/IMV RequestHandshakeRetry() function
|
* Flag set by IMC/IMV RequestHandshakeRetry() function
|
||||||
*/
|
*/
|
||||||
@@ -81,7 +86,7 @@ struct private_tnccs_20_t {
|
|||||||
recommendations_t *recs;
|
recommendations_t *recs;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(tnccs_t, send_message, void,
|
METHOD(tnccs_t, send_msg, void,
|
||||||
private_tnccs_20_t* this, TNC_IMCID imc_id, TNC_IMVID imv_id,
|
private_tnccs_20_t* this, TNC_IMCID imc_id, TNC_IMVID imv_id,
|
||||||
TNC_BufferReference msg,
|
TNC_BufferReference msg,
|
||||||
TNC_UInt32 msg_len,
|
TNC_UInt32 msg_len,
|
||||||
@@ -89,13 +94,13 @@ METHOD(tnccs_t, send_message, void,
|
|||||||
{
|
{
|
||||||
TNC_MessageSubtype msg_sub_type;
|
TNC_MessageSubtype msg_sub_type;
|
||||||
TNC_VendorID msg_vendor_id;
|
TNC_VendorID msg_vendor_id;
|
||||||
pb_tnc_message_t *pb_tnc_msg;
|
pb_tnc_msg_t *pb_tnc_msg;
|
||||||
pb_tnc_batch_type_t batch_type;
|
pb_tnc_batch_type_t batch_type;
|
||||||
|
|
||||||
msg_sub_type = msg_type & TNC_SUBTYPE_ANY;
|
msg_sub_type = msg_type & TNC_SUBTYPE_ANY;
|
||||||
msg_vendor_id = (msg_type >> 8) & TNC_VENDORID_ANY;
|
msg_vendor_id = (msg_type >> 8) & TNC_VENDORID_ANY;
|
||||||
|
|
||||||
pb_tnc_msg = pb_pa_message_create(msg_vendor_id, msg_sub_type, imc_id, imv_id,
|
pb_tnc_msg = pb_pa_msg_create(msg_vendor_id, msg_sub_type, imc_id, imv_id,
|
||||||
chunk_create(msg, msg_len));
|
chunk_create(msg, msg_len));
|
||||||
|
|
||||||
/* adding PA message to SDATA or CDATA batch only */
|
/* adding PA message to SDATA or CDATA batch only */
|
||||||
@@ -107,7 +112,7 @@ METHOD(tnccs_t, send_message, void,
|
|||||||
}
|
}
|
||||||
if (this->batch->get_type(this->batch) == batch_type)
|
if (this->batch->get_type(this->batch) == batch_type)
|
||||||
{
|
{
|
||||||
this->batch->add_message(this->batch, pb_tnc_msg);
|
this->batch->add_msg(this->batch, pb_tnc_msg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -119,21 +124,21 @@ METHOD(tnccs_t, send_message, void,
|
|||||||
/**
|
/**
|
||||||
* Handle a single PB-TNC message according to its type
|
* Handle a single PB-TNC message according to its type
|
||||||
*/
|
*/
|
||||||
static void handle_message(private_tnccs_20_t *this, pb_tnc_message_t *msg)
|
static void handle_msg(private_tnccs_20_t *this, pb_tnc_msg_t *msg)
|
||||||
{
|
{
|
||||||
switch (msg->get_type(msg))
|
switch (msg->get_type(msg))
|
||||||
{
|
{
|
||||||
case PB_MSG_EXPERIMENTAL:
|
case PB_MSG_EXPERIMENTAL:
|
||||||
/* for experiments */
|
/* nothing to do */
|
||||||
break;
|
break;
|
||||||
case PB_MSG_PA:
|
case PB_MSG_PA:
|
||||||
{
|
{
|
||||||
pb_pa_message_t *pa_msg;
|
pb_pa_msg_t *pa_msg;
|
||||||
TNC_MessageType msg_type;
|
TNC_MessageType msg_type;
|
||||||
u_int32_t vendor_id, subtype;
|
u_int32_t vendor_id, subtype;
|
||||||
chunk_t msg_body;
|
chunk_t msg_body;
|
||||||
|
|
||||||
pa_msg = (pb_pa_message_t*)msg;
|
pa_msg = (pb_pa_msg_t*)msg;
|
||||||
vendor_id = pa_msg->get_vendor_id(pa_msg, &subtype);
|
vendor_id = pa_msg->get_vendor_id(pa_msg, &subtype);
|
||||||
msg_type = (vendor_id << 8) | (subtype & 0xff);
|
msg_type = (vendor_id << 8) | (subtype & 0xff);
|
||||||
msg_body = pa_msg->get_body(pa_msg);
|
msg_body = pa_msg->get_body(pa_msg);
|
||||||
@@ -154,10 +159,10 @@ static void handle_message(private_tnccs_20_t *this, pb_tnc_message_t *msg)
|
|||||||
}
|
}
|
||||||
case PB_MSG_ASSESSMENT_RESULT:
|
case PB_MSG_ASSESSMENT_RESULT:
|
||||||
{
|
{
|
||||||
pb_assessment_result_message_t *assess_msg;
|
pb_assessment_result_msg_t *assess_msg;
|
||||||
u_int32_t result;
|
u_int32_t result;
|
||||||
|
|
||||||
assess_msg = (pb_assessment_result_message_t*)msg;
|
assess_msg = (pb_assessment_result_msg_t*)msg;
|
||||||
result = assess_msg->get_assessment_result(assess_msg);
|
result = assess_msg->get_assessment_result(assess_msg);
|
||||||
DBG1(DBG_TNC, "assessment result is '%N'",
|
DBG1(DBG_TNC, "assessment result is '%N'",
|
||||||
evaluation_result_names, result);
|
evaluation_result_names, result);
|
||||||
@@ -165,13 +170,13 @@ static void handle_message(private_tnccs_20_t *this, pb_tnc_message_t *msg)
|
|||||||
}
|
}
|
||||||
case PB_MSG_ACCESS_RECOMMENDATION:
|
case PB_MSG_ACCESS_RECOMMENDATION:
|
||||||
{
|
{
|
||||||
pb_access_recommendation_message_t *rec_msg;
|
pb_access_recommendation_msg_t *rec_msg;
|
||||||
u_int16_t rec;
|
pb_access_recommendation_code_t rec;
|
||||||
|
|
||||||
rec_msg = (pb_access_recommendation_message_t*)msg;
|
rec_msg = (pb_access_recommendation_msg_t*)msg;
|
||||||
rec = rec_msg->get_access_recommendation(rec_msg);
|
rec = rec_msg->get_access_recommendation(rec_msg);
|
||||||
DBG1(DBG_TNC, "access recommendation is '%N'",
|
DBG1(DBG_TNC, "access recommendation is '%N'",
|
||||||
action_recommendation_names, rec);
|
pb_access_recommendation_code_names, rec);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PB_MSG_REMEDIATION_PARAMETERS:
|
case PB_MSG_REMEDIATION_PARAMETERS:
|
||||||
@@ -181,22 +186,27 @@ static void handle_message(private_tnccs_20_t *this, pb_tnc_message_t *msg)
|
|||||||
}
|
}
|
||||||
case PB_MSG_ERROR:
|
case PB_MSG_ERROR:
|
||||||
{
|
{
|
||||||
pb_error_message_t *err_msg;
|
pb_error_msg_t *err_msg;
|
||||||
bool fatal;
|
bool fatal;
|
||||||
u_int32_t vendor_id;
|
u_int32_t vendor_id;
|
||||||
u_int16_t error_code;
|
u_int16_t error_code;
|
||||||
|
|
||||||
err_msg = (pb_error_message_t*)msg;
|
err_msg = (pb_error_msg_t*)msg;
|
||||||
fatal = err_msg->get_fatal_flag(err_msg);
|
fatal = err_msg->get_fatal_flag(err_msg);
|
||||||
vendor_id = err_msg->get_vendor_id(err_msg);
|
vendor_id = err_msg->get_vendor_id(err_msg);
|
||||||
error_code = err_msg->get_error_code(err_msg);
|
error_code = err_msg->get_error_code(err_msg);
|
||||||
|
|
||||||
|
if (fatal)
|
||||||
|
{
|
||||||
|
this->fatal_error = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (vendor_id == IETF_VENDOR_ID)
|
if (vendor_id == IETF_VENDOR_ID)
|
||||||
{
|
{
|
||||||
switch (error_code)
|
switch (error_code)
|
||||||
{
|
{
|
||||||
case PB_ERROR_INVALID_PARAMETER:
|
case PB_ERROR_INVALID_PARAMETER:
|
||||||
case PB_ERROR_UNSUPPORTED_MANDATORY_MESSAGE:
|
case PB_ERROR_UNSUPPORTED_MANDATORY_MSG:
|
||||||
DBG1(DBG_TNC, "received %s PB-TNC Error '%N' "
|
DBG1(DBG_TNC, "received %s PB-TNC Error '%N' "
|
||||||
"(offset %u bytes)",
|
"(offset %u bytes)",
|
||||||
fatal ? "fatal" : "non-fatal",
|
fatal ? "fatal" : "non-fatal",
|
||||||
@@ -230,10 +240,10 @@ static void handle_message(private_tnccs_20_t *this, pb_tnc_message_t *msg)
|
|||||||
}
|
}
|
||||||
case PB_MSG_LANGUAGE_PREFERENCE:
|
case PB_MSG_LANGUAGE_PREFERENCE:
|
||||||
{
|
{
|
||||||
pb_language_preference_message_t *lang_msg;
|
pb_language_preference_msg_t *lang_msg;
|
||||||
chunk_t lang;
|
chunk_t lang;
|
||||||
|
|
||||||
lang_msg = (pb_language_preference_message_t*)msg;
|
lang_msg = (pb_language_preference_msg_t*)msg;
|
||||||
lang = lang_msg->get_language_preference(lang_msg);
|
lang = lang_msg->get_language_preference(lang_msg);
|
||||||
|
|
||||||
DBG2(DBG_TNC, "setting language preference to '%.*s'",
|
DBG2(DBG_TNC, "setting language preference to '%.*s'",
|
||||||
@@ -243,10 +253,10 @@ static void handle_message(private_tnccs_20_t *this, pb_tnc_message_t *msg)
|
|||||||
}
|
}
|
||||||
case PB_MSG_REASON_STRING:
|
case PB_MSG_REASON_STRING:
|
||||||
{
|
{
|
||||||
pb_reason_string_message_t *reason_msg;
|
pb_reason_string_msg_t *reason_msg;
|
||||||
chunk_t reason_string, language_code;
|
chunk_t reason_string, language_code;
|
||||||
|
|
||||||
reason_msg = (pb_reason_string_message_t*)msg;
|
reason_msg = (pb_reason_string_msg_t*)msg;
|
||||||
reason_string = reason_msg->get_reason_string(reason_msg);
|
reason_string = reason_msg->get_reason_string(reason_msg);
|
||||||
language_code = reason_msg->get_language_code(reason_msg);
|
language_code = reason_msg->get_language_code(reason_msg);
|
||||||
DBG2(DBG_TNC, "reason string is '%.*s", reason_string.len,
|
DBG2(DBG_TNC, "reason string is '%.*s", reason_string.len,
|
||||||
@@ -280,14 +290,14 @@ METHOD(tls_t, process, status_t,
|
|||||||
{
|
{
|
||||||
chunk_t data;
|
chunk_t data;
|
||||||
pb_tnc_batch_t *batch;
|
pb_tnc_batch_t *batch;
|
||||||
pb_tnc_message_t *msg;
|
pb_tnc_msg_t *msg;
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
if (this->is_server && !this->connection_id)
|
if (this->is_server && !this->connection_id)
|
||||||
{
|
{
|
||||||
this->connection_id = charon->tnccs->create_connection(charon->tnccs,
|
this->connection_id = charon->tnccs->create_connection(charon->tnccs,
|
||||||
(tnccs_t*)this, _send_message,
|
(tnccs_t*)this, _send_msg,
|
||||||
&this->request_handshake_retry, &this->recs);
|
&this->request_handshake_retry, &this->recs);
|
||||||
if (!this->connection_id)
|
if (!this->connection_id)
|
||||||
{
|
{
|
||||||
@@ -307,7 +317,7 @@ METHOD(tls_t, process, status_t,
|
|||||||
if (status != FAILED)
|
if (status != FAILED)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
pb_tnc_message_t *msg;
|
pb_tnc_msg_t *msg;
|
||||||
pb_tnc_batch_type_t batch_type;
|
pb_tnc_batch_type_t batch_type;
|
||||||
bool empty = TRUE;
|
bool empty = TRUE;
|
||||||
|
|
||||||
@@ -331,7 +341,7 @@ METHOD(tls_t, process, status_t,
|
|||||||
enumerator = batch->create_msg_enumerator(batch);
|
enumerator = batch->create_msg_enumerator(batch);
|
||||||
while (enumerator->enumerate(enumerator, &msg))
|
while (enumerator->enumerate(enumerator, &msg))
|
||||||
{
|
{
|
||||||
handle_message(this, msg);
|
handle_msg(this, msg);
|
||||||
empty = FALSE;
|
empty = FALSE;
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
@@ -340,7 +350,16 @@ METHOD(tls_t, process, status_t,
|
|||||||
if (this->is_server && batch_type == PB_BATCH_CLOSE && empty)
|
if (this->is_server && batch_type == PB_BATCH_CLOSE && empty)
|
||||||
{
|
{
|
||||||
batch->destroy(batch);
|
batch->destroy(batch);
|
||||||
return SUCCESS;
|
if (this->fatal_error)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "a fatal PB-TNC Error occurred, "
|
||||||
|
"terminating connection");
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->is_server)
|
if (this->is_server)
|
||||||
@@ -356,6 +375,7 @@ METHOD(tls_t, process, status_t,
|
|||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
case FAILED:
|
case FAILED:
|
||||||
|
this->fatal_error = TRUE;
|
||||||
this->mutex->lock(this->mutex);
|
this->mutex->lock(this->mutex);
|
||||||
if (this->batch)
|
if (this->batch)
|
||||||
{
|
{
|
||||||
@@ -371,7 +391,7 @@ METHOD(tls_t, process, status_t,
|
|||||||
while (enumerator->enumerate(enumerator, &msg))
|
while (enumerator->enumerate(enumerator, &msg))
|
||||||
{
|
{
|
||||||
this->mutex->lock(this->mutex);
|
this->mutex->lock(this->mutex);
|
||||||
this->batch->add_message(this->batch, msg->get_ref(msg));
|
this->batch->add_msg(this->batch, msg->get_ref(msg));
|
||||||
this->mutex->unlock(this->mutex);
|
this->mutex->unlock(this->mutex);
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
@@ -395,7 +415,7 @@ static void check_and_build_recommendation(private_tnccs_20_t *this)
|
|||||||
TNC_IMVID id;
|
TNC_IMVID id;
|
||||||
chunk_t reason, language;
|
chunk_t reason, language;
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
pb_tnc_message_t *msg;
|
pb_tnc_msg_t *msg;
|
||||||
|
|
||||||
if (!this->recs->have_recommendation(this->recs, &rec, &eval))
|
if (!this->recs->have_recommendation(this->recs, &rec, &eval))
|
||||||
{
|
{
|
||||||
@@ -405,17 +425,21 @@ static void check_and_build_recommendation(private_tnccs_20_t *this)
|
|||||||
{
|
{
|
||||||
this->batch = pb_tnc_batch_create(this->is_server, PB_BATCH_RESULT);
|
this->batch = pb_tnc_batch_create(this->is_server, PB_BATCH_RESULT);
|
||||||
|
|
||||||
msg = pb_assessment_result_message_create(eval);
|
msg = pb_assessment_result_msg_create(eval);
|
||||||
this->batch->add_message(this->batch, msg);
|
this->batch->add_msg(this->batch, msg);
|
||||||
|
|
||||||
msg = pb_access_recommendation_message_create(rec);
|
/**
|
||||||
this->batch->add_message(this->batch, msg);
|
* IMV Action Recommendation and PB Access Recommendation codes
|
||||||
|
* are shifted by one.
|
||||||
|
*/
|
||||||
|
msg = pb_access_recommendation_msg_create(rec + 1);
|
||||||
|
this->batch->add_msg(this->batch, msg);
|
||||||
|
|
||||||
enumerator = this->recs->create_reason_enumerator(this->recs);
|
enumerator = this->recs->create_reason_enumerator(this->recs);
|
||||||
while (enumerator->enumerate(enumerator, &id, &reason, &language))
|
while (enumerator->enumerate(enumerator, &id, &reason, &language))
|
||||||
{
|
{
|
||||||
msg = pb_reason_string_message_create(reason, language);
|
msg = pb_reason_string_msg_create(reason, language);
|
||||||
this->batch->add_message(this->batch, msg);
|
this->batch->add_msg(this->batch, msg);
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
}
|
}
|
||||||
@@ -429,11 +453,11 @@ METHOD(tls_t, build, status_t,
|
|||||||
/* Initialize the connection */
|
/* Initialize the connection */
|
||||||
if (!this->is_server && !this->connection_id)
|
if (!this->is_server && !this->connection_id)
|
||||||
{
|
{
|
||||||
pb_tnc_message_t *msg;
|
pb_tnc_msg_t *msg;
|
||||||
char *pref_lang;
|
char *pref_lang;
|
||||||
|
|
||||||
this->connection_id = charon->tnccs->create_connection(charon->tnccs,
|
this->connection_id = charon->tnccs->create_connection(charon->tnccs,
|
||||||
(tnccs_t*)this, _send_message,
|
(tnccs_t*)this, _send_msg,
|
||||||
&this->request_handshake_retry, NULL);
|
&this->request_handshake_retry, NULL);
|
||||||
if (!this->connection_id)
|
if (!this->connection_id)
|
||||||
{
|
{
|
||||||
@@ -442,11 +466,11 @@ METHOD(tls_t, build, status_t,
|
|||||||
|
|
||||||
/* Create PB-TNC Language Preference Message */
|
/* Create PB-TNC Language Preference Message */
|
||||||
pref_lang = charon->imcs->get_preferred_language(charon->imcs);
|
pref_lang = charon->imcs->get_preferred_language(charon->imcs);
|
||||||
msg = pb_language_preference_message_create(chunk_create(pref_lang,
|
msg = pb_language_preference_msg_create(chunk_create(pref_lang,
|
||||||
strlen(pref_lang)));
|
strlen(pref_lang)));
|
||||||
this->mutex->lock(this->mutex);
|
this->mutex->lock(this->mutex);
|
||||||
this->batch = pb_tnc_batch_create(this->is_server, PB_BATCH_CDATA);
|
this->batch = pb_tnc_batch_create(this->is_server, PB_BATCH_CDATA);
|
||||||
this->batch->add_message(this->batch, msg);
|
this->batch->add_msg(this->batch, msg);
|
||||||
this->mutex->unlock(this->mutex);
|
this->mutex->unlock(this->mutex);
|
||||||
|
|
||||||
charon->imcs->notify_connection_change(charon->imcs,
|
charon->imcs->notify_connection_change(charon->imcs,
|
||||||
@@ -456,6 +480,13 @@ METHOD(tls_t, build, status_t,
|
|||||||
charon->imcs->begin_handshake(charon->imcs, this->connection_id);
|
charon->imcs->begin_handshake(charon->imcs, this->connection_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->is_server && this->fatal_error &&
|
||||||
|
this->state_machine->get_state(this->state_machine) == PB_STATE_END)
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "a fatal PB-TNC Error occurred, terminating connection");
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
/* Do not allow any asynchronous IMCs or IMVs to add additional messages */
|
/* Do not allow any asynchronous IMCs or IMVs to add additional messages */
|
||||||
this->mutex->lock(this->mutex);
|
this->mutex->lock(this->mutex);
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Sansar Choinynambuu
|
|
||||||
* HSR Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation; either version 2 of the License, or (at your
|
|
||||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tnccs_20_types.h"
|
|
||||||
|
|
||||||
ENUM(pb_tnc_remed_param_type_names, PB_REMEDIATION_URI, PB_REMEDIATION_STRING,
|
|
||||||
"Remediation-URI",
|
|
||||||
"Remediation-String"
|
|
||||||
);
|
|
||||||
|
|
||||||
ENUM(pa_tnc_subtype_names, PA_SUBTYPE_TESTING, PA_SUBTYPE_NEA_CLIENT,
|
|
||||||
"Testing",
|
|
||||||
"Operating System",
|
|
||||||
"Anti-Virus",
|
|
||||||
"Anti-Spyware",
|
|
||||||
"Anti-Malware",
|
|
||||||
"Firewall",
|
|
||||||
"IDPS",
|
|
||||||
"VPN",
|
|
||||||
"NEA Client"
|
|
||||||
);
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 Sansar Choinynambuu
|
|
||||||
* HSR Hochschule fuer Technik Rapperswil
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation; either version 2 of the License, or (at your
|
|
||||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup tnccs_20_types_h tnccs_20
|
|
||||||
* @{ @ingroup tnccs_20
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TNCCS_20_TYPES_H_
|
|
||||||
#define TNCCS_20_TYPES_H_
|
|
||||||
|
|
||||||
#define PB_TNC_VERSION 2
|
|
||||||
|
|
||||||
#include <library.h>
|
|
||||||
|
|
||||||
typedef enum pb_tnc_remed_param_type_t pb_tnc_remed_param_type_t;
|
|
||||||
typedef enum pa_tnc_subtype_t pa_tnc_subtype_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PB-TNC Remediation Parameter Types as defined in section 4.8.1 of RFC 5793
|
|
||||||
*/
|
|
||||||
enum pb_tnc_remed_param_type_t {
|
|
||||||
PB_REMEDIATION_URI = 1,
|
|
||||||
PB_REMEDIATION_STRING = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* enum name for pb_tnc_remed_param_type_t.
|
|
||||||
*/
|
|
||||||
extern enum_name_t *pb_tnc_remed_param_type_names;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PA-TNC Subtypes as defined in section 3.5 of RFC 5792
|
|
||||||
*/
|
|
||||||
enum pa_tnc_subtype_t {
|
|
||||||
PA_SUBTYPE_TESTING = 0,
|
|
||||||
PA_SUBTYPE_OPERATING_SYSTEM = 1,
|
|
||||||
PA_SUBTYPE_ANTI_VIRUS = 2,
|
|
||||||
PA_SUBTYPE_ANTI_SPYWARE = 3,
|
|
||||||
PA_SUBTYPE_ANTI_MALWARE = 4,
|
|
||||||
PA_SUBTYPE_FIREWALL = 5,
|
|
||||||
PA_SUBTYPE_IDPS = 6,
|
|
||||||
PA_SUBTYPE_VPN = 7,
|
|
||||||
PA_SUBTYPE_NEA_CLIENT = 8
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* enum name for pa_tnc_subtype_t.
|
|
||||||
*/
|
|
||||||
extern enum_name_t *pa_tnc_subtype_names;
|
|
||||||
|
|
||||||
#endif /** TNCCS_20_TYPES_H_ @}*/
|
|
||||||
Reference in New Issue
Block a user