Merge branch 'eap-constraints'

Introduces basic support for EAP server module authentication constraints. With
EAP-(T)TLS, public key, signature and end entity or CA certificate constraints
can be enforced for connections.

Fixes #762.
This commit is contained in:
Martin Willi
2015-03-03 14:08:55 +01:00
14 changed files with 100 additions and 2 deletions
+5
View File
@@ -22,6 +22,11 @@ strongswan-5.3.0
Windows 7 IKEv2 clients, which announces its services over the tunnel if the
negotiated IPsec policy allows it.
- EAP server methods now can fulfill public key constraints, such as rightcert
or rightca. Additionally, public key and signature constraints can be
specified for EAP methods in the rightauth keyword. Currently the EAP-TLS and
EAP-TTLS methods provide verification details to constraints checking.
- Upgrade of the BLISS post-quantum signature algorithm to the improved BLISS-B
variant. Can be used in conjunction with the SHA256, SHA384 and SHA512 hash
algorithms with SHA512 being the default.
+3 -1
View File
@@ -614,7 +614,9 @@ Alternatively, IANA assigned EAP method numbers are accepted. Vendor specific
EAP methods are defined in the form
.B eap-type-vendor
.RB "(e.g. " eap-7-12345 ).
For
To specify signature and trust chain constraints for EAP-(T)TLS, append a colon
to the EAP method, followed by the key type/size and hash algorithm as discussed
above. For
.B xauth,
an XAuth authentication backend can be specified, such as
.B xauth-generic
+7
View File
@@ -109,6 +109,12 @@ METHOD(eap_method_t, is_mutual, bool,
return TRUE;
}
METHOD(eap_method_t, get_auth, auth_cfg_t*,
private_eap_tls_t *this)
{
return this->tls_eap->get_auth(this->tls_eap);
}
METHOD(eap_method_t, destroy, void,
private_eap_tls_t *this)
{
@@ -138,6 +144,7 @@ static eap_tls_t *eap_tls_create(identification_t *server,
.get_msk = _get_msk,
.get_identifier = _get_identifier,
.set_identifier = _set_identifier,
.get_auth = _get_auth,
.destroy = _destroy,
},
},
@@ -111,6 +111,12 @@ METHOD(eap_method_t, is_mutual, bool,
return TRUE;
}
METHOD(eap_method_t, get_auth, auth_cfg_t*,
private_eap_ttls_t *this)
{
return this->tls_eap->get_auth(this->tls_eap);
}
METHOD(eap_method_t, destroy, void,
private_eap_ttls_t *this)
{
@@ -141,6 +147,7 @@ static eap_ttls_t *eap_ttls_create(identification_t *server,
.get_identifier = _get_identifier,
.set_identifier = _set_identifier,
.get_msk = _get_msk,
.get_auth = _get_auth,
.destroy = _destroy,
},
},
+8 -1
View File
@@ -620,9 +620,16 @@ static auth_cfg_t *build_auth_cfg(private_stroke_config_t *this,
else if (strpfx(auth, "eap"))
{
eap_vendor_type_t *type;
char *pos;
cfg->add(cfg, AUTH_RULE_AUTH_CLASS, AUTH_CLASS_EAP);
/* check for public key constraints for EAP-TLS etc. */
pos = strchr(auth, ':');
if (pos)
{
*pos = 0;
parse_pubkey_constraints(pos + 1, cfg);
}
type = eap_vendor_type_from_string(auth);
if (type)
{
+12
View File
@@ -136,6 +136,18 @@ struct eap_method_t {
*/
void (*set_identifier) (eap_method_t *this, u_int8_t identifier);
/**
* Get authentication details performed by this EAP method.
*
* After EAP completion, the auth data contains additional information
* of the authentication process, used certificates etc.
* This method is optional to implement, but if it is, it must return
* a valid auth_cfg.
*
* @return auth method, internal data
*/
auth_cfg_t* (*get_auth)(eap_method_t *this);
/**
* Destroys a eap_method_t object.
*/
@@ -522,6 +522,13 @@ METHOD(authenticator_t, process_server, status_t,
{
return FAILED;
}
if (this->method->get_auth)
{
auth_cfg_t *auth;
auth = this->ike_sa->get_auth_cfg(this->ike_sa, FALSE);
auth->merge(auth, this->method->get_auth(this->method), FALSE);
}
return NEED_MORE;
}
+7
View File
@@ -415,6 +415,12 @@ METHOD(tls_t, get_eap_msk, chunk_t,
return this->crypto->get_eap_msk(this->crypto);
}
METHOD(tls_t, get_auth, auth_cfg_t*,
private_tls_t *this)
{
return this->handshake->get_auth(this->handshake);
}
METHOD(tls_t, destroy, void,
private_tls_t *this)
{
@@ -465,6 +471,7 @@ tls_t *tls_create(bool is_server, identification_t *server,
.get_purpose = _get_purpose,
.is_complete = _is_complete,
.get_eap_msk = _get_eap_msk,
.get_auth = _get_auth,
.destroy = _destroy,
},
.is_server = is_server,
+7
View File
@@ -251,6 +251,13 @@ struct tls_t {
*/
chunk_t (*get_eap_msk)(tls_t *this);
/**
* Get the authentication details after completing the handshake.
*
* @return authentication details, internal data
*/
auth_cfg_t* (*get_auth)(tls_t *this);
/**
* Destroy a tls_t.
*/
+7
View File
@@ -426,6 +426,12 @@ METHOD(tls_eap_t, set_identifier, void,
this->identifier = identifier;
}
METHOD(tls_eap_t, get_auth, auth_cfg_t*,
private_tls_eap_t *this)
{
return this->tls->get_auth(this->tls);
}
METHOD(tls_eap_t, destroy, void,
private_tls_eap_t *this)
{
@@ -453,6 +459,7 @@ tls_eap_t *tls_eap_create(eap_type_t type, tls_t *tls, size_t frag_size,
.get_msk = _get_msk,
.get_identifier = _get_identifier,
.set_identifier = _set_identifier,
.get_auth = _get_auth,
.destroy = _destroy,
},
.type = type,
+7
View File
@@ -76,6 +76,13 @@ struct tls_eap_t {
*/
void (*set_identifier) (tls_eap_t *this, uint8_t identifier);
/**
* Get the authentication details after completing the handshake.
*
* @return authentication details, internal data
*/
auth_cfg_t* (*get_auth)(tls_eap_t *this);
/**
* Destroy a tls_eap_t.
*/
+7
View File
@@ -97,6 +97,13 @@ struct tls_handshake_t {
*/
identification_t* (*get_server_id)(tls_handshake_t *this);
/**
* Get the peers authentication information after completing the handshake.
*
* @return authentication data, internal data
*/
auth_cfg_t* (*get_auth)(tls_handshake_t *this);
/**
* Destroy a tls_handshake_t.
*/
+8
View File
@@ -324,6 +324,7 @@ static public_key_t *find_public_key(private_tls_peer_t *this)
while (enumerator->enumerate(enumerator, &current, &auth))
{
public = current->get_ref(current);
this->server_auth->merge(this->server_auth, auth, FALSE);
break;
}
enumerator->destroy(enumerator);
@@ -1153,6 +1154,12 @@ METHOD(tls_handshake_t, get_server_id, identification_t*,
return this->server;
}
METHOD(tls_handshake_t, get_auth, auth_cfg_t*,
private_tls_peer_t *this)
{
return this->server_auth;
}
METHOD(tls_handshake_t, destroy, void,
private_tls_peer_t *this)
{
@@ -1186,6 +1193,7 @@ tls_peer_t *tls_peer_create(tls_t *tls, tls_crypto_t *crypto, tls_alert_t *alert
.finished = _finished,
.get_peer_id = _get_peer_id,
.get_server_id = _get_server_id,
.get_auth = _get_auth,
.destroy = _destroy,
},
},
+8
View File
@@ -551,6 +551,7 @@ static status_t process_cert_verify(private_tls_server_t *this,
sig->destroy(sig);
if (verified)
{
this->peer_auth->merge(this->peer_auth, auth, FALSE);
break;
}
DBG1(DBG_TLS, "signature verification failed, trying another key");
@@ -1073,6 +1074,12 @@ METHOD(tls_handshake_t, get_server_id, identification_t*,
return this->server;
}
METHOD(tls_handshake_t, get_auth, auth_cfg_t*,
private_tls_server_t *this)
{
return this->peer_auth;
}
METHOD(tls_handshake_t, destroy, void,
private_tls_server_t *this)
{
@@ -1107,6 +1114,7 @@ tls_server_t *tls_server_create(tls_t *tls,
.finished = _finished,
.get_peer_id = _get_peer_id,
.get_server_id = _get_server_id,
.get_auth = _get_auth,
.destroy = _destroy,
},
},