summaryrefslogtreecommitdiff
path: root/src/libimcv/imc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libimcv/imc')
-rw-r--r--src/libimcv/imc/imc_msg.c30
-rw-r--r--src/libimcv/imc/imc_os_info.c11
-rw-r--r--src/libimcv/imc/imc_os_info.h9
3 files changed, 40 insertions, 10 deletions
diff --git a/src/libimcv/imc/imc_msg.c b/src/libimcv/imc/imc_msg.c
index 83337cf7b..9e12e29f1 100644
--- a/src/libimcv/imc/imc_msg.c
+++ b/src/libimcv/imc/imc_msg.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2014 Andreas Steffen
+ * Copyright (C) 2012-2015 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -108,6 +108,7 @@ METHOD(imc_msg_t, send_, TNC_Result,
pa_tnc_attr_t *attr;
TNC_UInt32 msg_flags;
TNC_MessageType msg_type;
+ size_t max_msg_len, min_seg_attr_len, space_left;
bool attr_added, oversize;
chunk_t msg;
seg_contract_t *contract;
@@ -120,23 +121,37 @@ METHOD(imc_msg_t, send_, TNC_Result,
contract = contracts->get_contract(contracts, this->msg_type,
FALSE, this->dst_id);
+ /* Retrieve maximum allowed PA-TNC message size if set */
+ max_msg_len = this->state->get_max_msg_len(this->state);
+
+ /* Minimum size needed for Segmentation Envelope Attribute */
+ min_seg_attr_len = PA_TNC_ATTR_HEADER_SIZE + TCG_SEG_ATTR_SEG_ENV_HEADER +
+ PA_TNC_ATTR_HEADER_SIZE;
+
while (this->attr_list->get_count(this->attr_list))
{
- pa_tnc_msg = pa_tnc_msg_create(this->state->get_max_msg_len(this->state));
+ pa_tnc_msg = pa_tnc_msg_create(max_msg_len);
attr_added = FALSE;
enumerator = this->attr_list->create_enumerator(this->attr_list);
while (enumerator->enumerate(enumerator, &attr))
{
+ space_left = pa_tnc_msg->get_space(pa_tnc_msg);
+
if (contract && contract->check_size(contract, attr, &oversize))
{
if (oversize)
{
- /* TODO generate SWID error msg */
+ /* TODO handle oversized attributes */
+ }
+ else if (max_msg_len == 0 || space_left >= min_seg_attr_len)
+ {
+ attr = contract->first_segment(contract, attr, space_left);
}
else
{
- attr = contract->first_segment(contract, attr);
+ /* segment attribute in next iteration */
+ break;
}
}
if (pa_tnc_msg->add_attribute(pa_tnc_msg, attr))
@@ -147,11 +162,12 @@ METHOD(imc_msg_t, send_, TNC_Result,
{
if (attr_added)
{
+ /* there might be space for attribute in next iteration */
break;
}
else
{
- DBG1(DBG_IMC, "PA-TNC attribute too large to send, deleted");
+ DBG1(DBG_IMV, "PA-TNC attribute too large to send, deleted");
attr->destroy(attr);
}
}
@@ -341,9 +357,7 @@ METHOD(imc_msg_t, receive, TNC_Result,
my_max_seg_size = this->state->get_max_msg_len(this->state)
- PA_TNC_HEADER_SIZE
- PA_TNC_ATTR_HEADER_SIZE
- - TCG_SEG_ATTR_SEG_ENV_HEADER
- - PA_TNC_ATTR_HEADER_SIZE
- - TCG_SEG_ATTR_MAX_SIZE_SIZE;
+ - TCG_SEG_ATTR_SEG_ENV_HEADER;
/* If segmentation is possible select lower segment size */
if (max_seg_size != SEG_CONTRACT_NO_FRAGMENTATION &&
diff --git a/src/libimcv/imc/imc_os_info.c b/src/libimcv/imc/imc_os_info.c
index 47697f1a3..0a094eb23 100644
--- a/src/libimcv/imc/imc_os_info.c
+++ b/src/libimcv/imc/imc_os_info.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2014 Andreas Steffen
+ * Copyright (C) 2012-2015 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -90,6 +90,14 @@ METHOD(imc_os_info_t, get_version, chunk_t,
return this->version;
}
+METHOD(imc_os_info_t, get_default_pwd_status, bool,
+ private_imc_os_info_t *this)
+{
+ /* As an option the default password status can be configured manually */
+ return lib->settings->get_bool(lib->settings,
+ "%s.imcv.os_info.default_password_enabled", FALSE, lib->ns);
+}
+
#ifdef WIN32
METHOD(imc_os_info_t, get_fwd_status, os_fwd_status_t,
@@ -618,6 +626,7 @@ imc_os_info_t *imc_os_info_create(void)
.get_numeric_version = _get_numeric_version,
.get_version = _get_version,
.get_fwd_status = _get_fwd_status,
+ .get_default_pwd_status = _get_default_pwd_status,
.get_uptime = _get_uptime,
.get_setting = _get_setting,
.create_package_enumerator = _create_package_enumerator,
diff --git a/src/libimcv/imc/imc_os_info.h b/src/libimcv/imc/imc_os_info.h
index 6bb0e960c..ef7fb6d43 100644
--- a/src/libimcv/imc/imc_os_info.h
+++ b/src/libimcv/imc/imc_os_info.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2014 Andreas Steffen
+ * Copyright (C) 2012-2015 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -72,6 +72,13 @@ struct imc_os_info_t {
os_fwd_status_t (*get_fwd_status)(imc_os_info_t *this);
/**
+ * Get the default password status
+ *
+ * @return TRUE if enabled, FALSE otherwise
+ */
+ bool (*get_default_pwd_status)(imc_os_info_t *this);
+
+ /**
* Get the OS uptime in seconds
*
* @return OS uptime