make TNC client authentication type available to IMVs

This commit is contained in:
Andreas Steffen
2013-02-12 20:38:05 +01:00
parent 3e56352815
commit 2a421163bf
10 changed files with 215 additions and 27 deletions
+65 -13
View File
@@ -21,6 +21,8 @@
#include <utils/debug.h>
#include <daemon.h>
#include <tncifimv.h>
/**
* Maximum size of an EAP-TNC message
*/
@@ -43,16 +45,51 @@ struct private_eap_tnc_t {
*/
eap_tnc_t public;
/**
* Outer EAP authentication type
*/
eap_type_t auth_type;
/**
* TLS stack, wrapped by EAP helper
*/
tls_eap_t *tls_eap;
/**
* TNCCS instance running over EAP-TNC
*/
tnccs_t *tnccs;
};
METHOD(eap_method_t, initiate, status_t,
private_eap_tnc_t *this, eap_payload_t **out)
{
chunk_t data;
u_int32_t auth_type;
/* Determine TNC Client Authentication Type */
switch (this->auth_type)
{
case EAP_TLS:
case EAP_TTLS:
case EAP_PEAP:
auth_type = TNC_AUTH_CERT;
break;
case EAP_MD5:
case EAP_MSCHAPV2:
case EAP_GTC:
case EAP_OTP:
auth_type = TNC_AUTH_PASSWORD;
break;
case EAP_SIM:
case EAP_AKA:
auth_type = TNC_AUTH_SIM;
break;
default:
auth_type = TNC_AUTH_UNKNOWN;
}
this->tnccs->set_auth_type(this->tnccs, auth_type);
if (this->tls_eap->initiate(this->tls_eap, &data) == NEED_MORE)
{
@@ -122,6 +159,18 @@ METHOD(eap_method_t, destroy, void,
free(this);
}
METHOD(eap_inner_method_t, get_auth_type, eap_type_t,
private_eap_tnc_t *this)
{
return this->auth_type;
}
METHOD(eap_inner_method_t, set_auth_type, void,
private_eap_tnc_t *this, eap_type_t type)
{
this->auth_type = type;
}
/**
* Generic private constructor
*/
@@ -132,19 +181,22 @@ static eap_tnc_t *eap_tnc_create(identification_t *server,
int max_msg_count;
char* protocol;
tnccs_type_t type;
tnccs_t *tnccs;
INIT(this,
.public = {
.eap_method = {
.initiate = _initiate,
.process = _process,
.get_type = _get_type,
.is_mutual = _is_mutual,
.get_msk = _get_msk,
.get_identifier = _get_identifier,
.set_identifier = _set_identifier,
.destroy = _destroy,
.eap_inner_method = {
.eap_method = {
.initiate = _initiate,
.process = _process,
.get_type = _get_type,
.is_mutual = _is_mutual,
.get_msk = _get_msk,
.get_identifier = _get_identifier,
.set_identifier = _set_identifier,
.destroy = _destroy,
},
.get_auth_type = _get_auth_type,
.set_auth_type = _set_auth_type,
},
},
);
@@ -172,9 +224,9 @@ static eap_tnc_t *eap_tnc_create(identification_t *server,
free(this);
return NULL;
}
tnccs = tnc->tnccs->create_instance(tnc->tnccs, type, is_server,
server, peer, TNC_IFT_EAP_1_1);
this->tls_eap = tls_eap_create(EAP_TNC, &tnccs->tls,
this->tnccs = tnc->tnccs->create_instance(tnc->tnccs, type, is_server,
server, peer, TNC_IFT_EAP_1_1);
this->tls_eap = tls_eap_create(EAP_TNC, &this->tnccs->tls,
EAP_TNC_MAX_MESSAGE_LEN,
max_msg_count, FALSE);
if (!this->tls_eap)
+3 -3
View File
@@ -23,7 +23,7 @@
typedef struct eap_tnc_t eap_tnc_t;
#include <sa/eap/eap_method.h>
#include <sa/eap/eap_inner_method.h>
/**
* Implementation of the eap_method_t interface using EAP-TNC.
@@ -31,9 +31,9 @@ typedef struct eap_tnc_t eap_tnc_t;
struct eap_tnc_t {
/**
* Implemented eap_method_t interface.
* Implemented eap_inner_method_t interface.
*/
eap_method_t eap_method;
eap_inner_method_t eap_inner_method;
};
/**