refactored TNC framework

This commit is contained in:
Andreas Steffen
2011-10-25 01:10:16 +02:00
parent c008d2cc46
commit f0a8bf47f7
52 changed files with 971 additions and 605 deletions
+4 -1
View File
@@ -6,12 +6,15 @@ INCLUDES = \
-I$(top_srcdir)/src/libtncif \
-I$(top_srcdir)/src/libtnccs
AM_CFLAGS = -DUSE_TNC -rdynamic
AM_CFLAGS = -rdynamic
if MONOLITHIC
noinst_LTLIBRARIES = libstrongswan-tnc-imc.la
else
plugin_LTLIBRARIES = libstrongswan-tnc-imc.la
libstrongswan_tnc_imc_la_LIBADD = \
$(top_builddir)/src/libtncif/libtncif.la \
$(top_builddir)/src/libtnccs/libtnccs.la
endif
libstrongswan_tnc_imc_la_SOURCES = \
+1 -1
View File
@@ -22,7 +22,7 @@
#ifndef TNC_IMC_H_
#define TNC_IMC_H_
#include <imc/imc.h>
#include <tnc/imc/imc.h>
/**
* Create an Integrity Measurement Collector.
@@ -13,10 +13,11 @@
* for more details.
*/
#include <imc/imc_manager.h>
#include <tnc/tnc.h>
#include <tnc/imc/imc_manager.h>
#include <tnc/tnccs/tnccs_manager.h>
#include <debug.h>
#include <daemon.h>
#define TNC_IMVID_ANY 0xffff
@@ -28,15 +29,14 @@ TNC_Result TNC_TNCC_ReportMessageTypes(TNC_IMCID imc_id,
TNC_MessageTypeList supported_types,
TNC_UInt32 type_count)
{
imc_manager_t *imcs = lib->get(lib, "imc-manager");
if (!imcs->is_registered(imcs, imc_id))
if (!tnc->imcs->is_registered(tnc->imcs, imc_id))
{
DBG1(DBG_TNC, "ignoring ReportMessageTypes() from unregistered IMC %u",
imc_id);
return TNC_RESULT_INVALID_PARAMETER;
}
return imcs->set_message_types(imcs, imc_id, supported_types, type_count);
return tnc->imcs->set_message_types(tnc->imcs, imc_id, supported_types,
type_count);
}
/**
@@ -46,16 +46,14 @@ TNC_Result TNC_TNCC_RequestHandshakeRetry(TNC_IMCID imc_id,
TNC_ConnectionID connection_id,
TNC_RetryReason reason)
{
imc_manager_t *imcs = lib->get(lib, "imc-manager");
if (!imcs->is_registered(imcs, imc_id))
if (!tnc->imcs->is_registered(tnc->imcs, imc_id))
{
DBG1(DBG_TNC, "ignoring RequestHandshakeRetry() from unregistered IMC %u",
imc_id);
return TNC_RESULT_INVALID_PARAMETER;
}
return charon->tnccs->request_handshake_retry(charon->tnccs, TRUE, imc_id,
connection_id, reason);
return tnc->tnccs->request_handshake_retry(tnc->tnccs, TRUE, imc_id,
connection_id, reason);
}
/**
@@ -67,16 +65,14 @@ TNC_Result TNC_TNCC_SendMessage(TNC_IMCID imc_id,
TNC_UInt32 msg_len,
TNC_MessageType msg_type)
{
imc_manager_t *imcs = lib->get(lib, "imc-manager");
if (!imcs->is_registered(imcs, imc_id))
if (!tnc->imcs->is_registered(tnc->imcs, imc_id))
{
DBG1(DBG_TNC, "ignoring SendMessage() from unregistered IMC %u",
imc_id);
return TNC_RESULT_INVALID_PARAMETER;
}
return charon->tnccs->send_message(charon->tnccs, imc_id, TNC_IMVID_ANY,
connection_id, msg, msg_len, msg_type);
return tnc->tnccs->send_message(tnc->tnccs, imc_id, TNC_IMVID_ANY,
connection_id, msg, msg_len, msg_type);
}
/**
+129 -2
View File
@@ -14,12 +14,20 @@
*/
#include "tnc_imc_manager.h"
#include "tnc_imc.h"
#include <tncifimc.h>
#include <debug.h>
#include <library.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <utils/linked_list.h>
#include <utils/lexparser.h>
#include <debug.h>
typedef struct private_tnc_imc_manager_t private_tnc_imc_manager_t;
@@ -93,6 +101,124 @@ METHOD(imc_manager_t, remove_, imc_t*,
return removed_imc;
}
METHOD(imc_manager_t, load_all, bool,
private_tnc_imc_manager_t *this, char *filename)
{
int fd, line_nr = 0;
chunk_t src, line;
struct stat sb;
void *addr;
DBG1(DBG_TNC, "loading IMCs from '%s'", filename);
fd = open(filename, O_RDONLY);
if (fd == -1)
{
DBG1(DBG_TNC, "opening configuration file '%s' failed: %s", filename,
strerror(errno));
return FALSE;
}
if (fstat(fd, &sb) == -1)
{
DBG1(DBG_LIB, "getting file size of '%s' failed: %s", filename,
strerror(errno));
close(fd);
return FALSE;
}
addr = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED)
{
DBG1(DBG_LIB, "mapping '%s' failed: %s", filename, strerror(errno));
close(fd);
return FALSE;
}
src = chunk_create(addr, sb.st_size);
while (fetchline(&src, &line))
{
char *name, *path;
chunk_t token;
imc_t *imc;
line_nr++;
/* skip comments or empty lines */
if (*line.ptr == '#' || !eat_whitespace(&line))
{
continue;
}
/* determine keyword */
if (!extract_token(&token, ' ', &line))
{
DBG1(DBG_TNC, "line %d: keyword must be followed by a space",
line_nr);
return FALSE;
}
/* only interested in IMCs */
if (!match("IMC", &token))
{
continue;
}
/* advance to the IMC name and extract it */
if (!extract_token(&token, '"', &line) ||
!extract_token(&token, '"', &line))
{
DBG1(DBG_TNC, "line %d: IMC name must be set in double quotes",
line_nr);
return FALSE;
}
/* copy the IMC name */
name = malloc(token.len + 1);
memcpy(name, token.ptr, token.len);
name[token.len] = '\0';
/* advance to the IMC path and extract it */
if (!eat_whitespace(&line))
{
DBG1(DBG_TNC, "line %d: IMC path is missing", line_nr);
free(name);
return FALSE;
}
if (!extract_token(&token, ' ', &line))
{
token = line;
}
/* copy the IMC path */
path = malloc(token.len + 1);
memcpy(path, token.ptr, token.len);
path[token.len] = '\0';
/* load and register IMC instance */
imc = tnc_imc_create(name, path);
if (!imc)
{
free(name);
free(path);
return FALSE;
}
if (!add(this, imc))
{
if (imc->terminate &&
imc->terminate(imc->get_id(imc)) != TNC_RESULT_SUCCESS)
{
DBG1(DBG_TNC, "IMC \"%s\" not terminated successfully",
imc->get_name(imc));
}
imc->destroy(imc);
return FALSE;
}
DBG1(DBG_TNC, "IMC %u \"%s\" loaded from '%s'", imc->get_id(imc),
name, path);
}
munmap(addr, sb.st_size);
close(fd);
return TRUE;
}
METHOD(imc_manager_t, is_registered, bool,
private_tnc_imc_manager_t *this, TNC_IMCID id)
{
@@ -250,6 +376,7 @@ imc_manager_t* tnc_imc_manager_create(void)
.public = {
.add = _add,
.remove = _remove_, /* avoid name conflict with stdio.h */
.load_all = _load_all,
.is_registered = _is_registered,
.get_preferred_language = _get_preferred_language,
.notify_connection_change = _notify_connection_change,
@@ -22,7 +22,7 @@
#ifndef TNC_IMC_MANAGER_H_
#define TNC_IMC_MANAGER_H_
#include <imc/imc_manager.h>
#include <tnc/imc/imc_manager.h>
/**
* Create an IMC manager instance.
+5 -152
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2010 Andreas Steffen
* Copyright (C) 2010-2011 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -15,17 +15,8 @@
#include "tnc_imc_plugin.h"
#include "tnc_imc_manager.h"
#include "tnc_imc.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <utils/lexparser.h>
#include <debug.h>
#include <tnc/tnc.h>
typedef struct private_tnc_imc_plugin_t private_tnc_imc_plugin_t;
@@ -38,133 +29,8 @@ struct private_tnc_imc_plugin_t {
* Public interface.
*/
tnc_imc_plugin_t public;
/**
* TNC IMC manager controlling Integrity Measurement Collectors
*/
imc_manager_t *imcs;
};
/**
* load IMCs from a configuration file
*/
static bool load_imcs(private_tnc_imc_plugin_t *this, char *filename)
{
int fd, line_nr = 0;
chunk_t src, line;
struct stat sb;
void *addr;
DBG1(DBG_TNC, "loading IMCs from '%s'", filename);
fd = open(filename, O_RDONLY);
if (fd == -1)
{
DBG1(DBG_TNC, "opening configuration file '%s' failed: %s", filename,
strerror(errno));
return FALSE;
}
if (fstat(fd, &sb) == -1)
{
DBG1(DBG_LIB, "getting file size of '%s' failed: %s", filename,
strerror(errno));
close(fd);
return FALSE;
}
addr = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED)
{
DBG1(DBG_LIB, "mapping '%s' failed: %s", filename, strerror(errno));
close(fd);
return FALSE;
}
src = chunk_create(addr, sb.st_size);
while (fetchline(&src, &line))
{
char *name, *path;
chunk_t token;
imc_t *imc;
line_nr++;
/* skip comments or empty lines */
if (*line.ptr == '#' || !eat_whitespace(&line))
{
continue;
}
/* determine keyword */
if (!extract_token(&token, ' ', &line))
{
DBG1(DBG_TNC, "line %d: keyword must be followed by a space",
line_nr);
return FALSE;
}
/* only interested in IMCs */
if (!match("IMC", &token))
{
continue;
}
/* advance to the IMC name and extract it */
if (!extract_token(&token, '"', &line) ||
!extract_token(&token, '"', &line))
{
DBG1(DBG_TNC, "line %d: IMC name must be set in double quotes",
line_nr);
return FALSE;
}
/* copy the IMC name */
name = malloc(token.len + 1);
memcpy(name, token.ptr, token.len);
name[token.len] = '\0';
/* advance to the IMC path and extract it */
if (!eat_whitespace(&line))
{
DBG1(DBG_TNC, "line %d: IMC path is missing", line_nr);
free(name);
return FALSE;
}
if (!extract_token(&token, ' ', &line))
{
token = line;
}
/* copy the IMC path */
path = malloc(token.len + 1);
memcpy(path, token.ptr, token.len);
path[token.len] = '\0';
/* load and register IMC instance */
imc = tnc_imc_create(name, path);
if (!imc)
{
free(name);
free(path);
return FALSE;
}
if (!this->imcs->add(this->imcs, imc))
{
if (imc->terminate &&
imc->terminate(imc->get_id(imc)) != TNC_RESULT_SUCCESS)
{
DBG1(DBG_TNC, "IMC \"%s\" not terminated successfully",
imc->get_name(imc));
}
imc->destroy(imc);
return FALSE;
}
DBG1(DBG_TNC, "IMC %u \"%s\" loaded from '%s'", imc->get_id(imc),
name, path);
}
munmap(addr, sb.st_size);
close(fd);
return TRUE;
}
METHOD(plugin_t, get_name, char*,
private_tnc_imc_plugin_t *this)
{
@@ -175,7 +41,9 @@ METHOD(plugin_t, get_features, int,
private_tnc_imc_plugin_t *this, plugin_feature_t *features[])
{
static plugin_feature_t f[] = {
PLUGIN_PROVIDE(CUSTOM, "imc-manager"),
PLUGIN_CALLBACK(tnc_manager_register, tnc_imc_manager_create),
PLUGIN_PROVIDE(CUSTOM, "imc-manager"),
PLUGIN_DEPENDS(CUSTOM, "tnccs-manager"),
};
*features = f;
return countof(f);
@@ -184,8 +52,6 @@ METHOD(plugin_t, get_features, int,
METHOD(plugin_t, destroy, void,
private_tnc_imc_plugin_t *this)
{
lib->set(lib, "imc-manager", NULL);
this->imcs->destroy(this->imcs);
free(this);
}
@@ -195,7 +61,6 @@ METHOD(plugin_t, destroy, void,
plugin_t *tnc_imc_plugin_create(void)
{
private_tnc_imc_plugin_t *this;
char *tnc_config;
INIT(this,
.public = {
@@ -205,20 +70,8 @@ plugin_t *tnc_imc_plugin_create(void)
.destroy = _destroy,
},
},
.imcs = tnc_imc_manager_create(),
);
lib->set(lib, "imc-manager", this->imcs);
/* Load IMCs and abort if not all instances initalize successfully */
tnc_config = lib->settings->get_str(lib->settings,
"charon.plugins.tnc-imc.tnc_config", "/etc/tnc_config");
if (!load_imcs(this, tnc_config))
{
destroy(this);
return NULL;
}
return &this->public.plugin;
}