tls-peer: Support answering KeyUpdate requests

This commit is contained in:
Tobias Brunner
2021-02-12 11:45:44 +01:00
parent 27360d3407
commit e02f19e3c6
2 changed files with 31 additions and 1 deletions
+1
View File
@@ -358,6 +358,7 @@ static status_t build_handshake(private_tls_fragmentation_t *this)
DBG2(DBG_TLS, "sending TLS %N handshake (%u bytes)", DBG2(DBG_TLS, "sending TLS %N handshake (%u bytes)",
tls_handshake_type_names, type, hs->get_buf(hs).len); tls_handshake_type_names, type, hs->get_buf(hs).len);
if (type != TLS_FINISHED && if (type != TLS_FINISHED &&
type != TLS_KEY_UPDATE &&
!this->handshake->cipherspec_changed(this->handshake, FALSE)) !this->handshake->cipherspec_changed(this->handshake, FALSE))
{ {
hs->destroy(hs); hs->destroy(hs);
+30 -1
View File
@@ -47,6 +47,8 @@ typedef enum {
STATE_ENCRYPTED_EXTENSIONS_RECEIVED, STATE_ENCRYPTED_EXTENSIONS_RECEIVED,
STATE_CERT_VERIFY_RECEIVED, STATE_CERT_VERIFY_RECEIVED,
STATE_FINISHED_SENT_KEY_SWITCHED, STATE_FINISHED_SENT_KEY_SWITCHED,
STATE_KEY_UPDATE_REQUESTED,
STATE_KEY_UPDATE_SENT,
} peer_state_t; } peer_state_t;
@@ -1054,7 +1056,8 @@ static status_t process_key_update(private_tls_peer_t *this,
if (update_requested) if (update_requested)
{ {
DBG1(DBG_TLS, "server requested KeyUpdate, currently not supported"); DBG1(DBG_TLS, "server requested KeyUpdate");
this->state = STATE_KEY_UPDATE_REQUESTED;
} }
return NEED_MORE; return NEED_MORE;
} }
@@ -1657,6 +1660,21 @@ static status_t send_finished(private_tls_peer_t *this,
return NEED_MORE; return NEED_MORE;
} }
/**
* Send KeyUpdate message
*/
static status_t send_key_update(private_tls_peer_t *this,
tls_handshake_type_t *type, bio_writer_t *writer)
{
*type = TLS_KEY_UPDATE;
/* we currently only send this as reply, so we never request an update */
writer->write_uint8(writer, 0);
this->state = STATE_KEY_UPDATE_SENT;
return NEED_MORE;
}
METHOD(tls_handshake_t, build, status_t, METHOD(tls_handshake_t, build, status_t,
private_tls_peer_t *this, tls_handshake_type_t *type, bio_writer_t *writer) private_tls_peer_t *this, tls_handshake_type_t *type, bio_writer_t *writer)
{ {
@@ -1709,6 +1727,17 @@ METHOD(tls_handshake_t, build, status_t,
this->crypto->change_cipher(this->crypto, FALSE); this->crypto->change_cipher(this->crypto, FALSE);
this->state = STATE_FINISHED_SENT_KEY_SWITCHED; this->state = STATE_FINISHED_SENT_KEY_SWITCHED;
return SUCCESS; return SUCCESS;
case STATE_KEY_UPDATE_REQUESTED:
return send_key_update(this, type, writer);
case STATE_KEY_UPDATE_SENT:
if (!this->crypto->update_app_keys(this->crypto, FALSE))
{
this->alert->add(this->alert, TLS_FATAL, TLS_INTERNAL_ERROR);
return NEED_MORE;
}
this->crypto->change_cipher(this->crypto, FALSE);
this->state = STATE_FINISHED_SENT_KEY_SWITCHED;
return SUCCESS;
case STATE_FINISHED_SENT_KEY_SWITCHED: case STATE_FINISHED_SENT_KEY_SWITCHED:
return SUCCESS; return SUCCESS;
default: default: