make TNC client authentication type available to IMVs
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user