aboutsummaryrefslogtreecommitdiffstats
path: root/src/libtls/tls_server.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-02-28 11:39:55 +0100
committerMartin Willi <martin@revosec.ch>2013-02-28 16:46:08 +0100
commit2de481e32b95c558b96237c25a15bf2baa375e93 (patch)
treeab8ddcd59c677b5426c9e826ced48f540c061d9b /src/libtls/tls_server.c
parent2ae0c9e6181421fc589798c64276a6310f13f1a2 (diff)
downloadstrongswan-2de481e32b95c558b96237c25a15bf2baa375e93.tar.bz2
strongswan-2de481e32b95c558b96237c25a15bf2baa375e93.tar.xz
Delegate tls_t.get_{peer,server}_id to handshake layer
This allows to get updated peer identities if the peer can't authenticate, or does when it is optional.
Diffstat (limited to 'src/libtls/tls_server.c')
-rw-r--r--src/libtls/tls_server.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/libtls/tls_server.c b/src/libtls/tls_server.c
index ec42b67fc..a85a00c4a 100644
--- a/src/libtls/tls_server.c
+++ b/src/libtls/tls_server.c
@@ -367,6 +367,11 @@ static status_t process_certificate(private_tls_server_t *this,
DBG1(DBG_TLS, "received TLS peer certificate '%Y'",
cert->get_subject(cert));
first = FALSE;
+ if (this->peer == NULL)
+ { /* apply identity to authenticate */
+ this->peer = cert->get_subject(cert);
+ this->peer = this->peer->clone(this->peer);
+ }
}
else
{
@@ -1045,11 +1050,25 @@ METHOD(tls_handshake_t, finished, bool,
return this->state == STATE_FINISHED_SENT;
}
+METHOD(tls_handshake_t, get_peer_id, identification_t*,
+ private_tls_server_t *this)
+{
+ return this->peer;
+}
+
+METHOD(tls_handshake_t, get_server_id, identification_t*,
+ private_tls_server_t *this)
+{
+ return this->server;
+}
+
METHOD(tls_handshake_t, destroy, void,
private_tls_server_t *this)
{
DESTROY_IF(this->private);
DESTROY_IF(this->dh);
+ DESTROY_IF(this->peer);
+ this->server->destroy(this->server);
this->peer_auth->destroy(this->peer_auth);
this->server_auth->destroy(this->server_auth);
free(this->hashsig.ptr);
@@ -1075,14 +1094,16 @@ tls_server_t *tls_server_create(tls_t *tls,
.cipherspec_changed = _cipherspec_changed,
.change_cipherspec = _change_cipherspec,
.finished = _finished,
+ .get_peer_id = _get_peer_id,
+ .get_server_id = _get_server_id,
.destroy = _destroy,
},
},
.tls = tls,
.crypto = crypto,
.alert = alert,
- .server = server,
- .peer = peer,
+ .server = server->clone(server),
+ .peer = peer ? peer->clone(peer) : NULL,
.state = STATE_INIT,
.peer_auth = auth_cfg_create(),
.server_auth = auth_cfg_create(),