diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-09-20 16:07:39 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-11-14 15:00:32 +0100 |
commit | cbb9dfb6d2cc772cf3c997940966558a80e65721 (patch) | |
tree | d283e0225d0404a31e61f71e7f9546d6264e1c86 | |
parent | 0bbdca1f3ede4dfee22229b34bbc4c2c0ebbef64 (diff) | |
download | gnutls-cbb9dfb6d2cc772cf3c997940966558a80e65721.tar.gz |
handshake: send encrypted extensions handshake message
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r-- | lib/handshake-tls13.c | 2 | ||||
-rw-r--r-- | lib/tls13/encrypted_extensions.c | 36 | ||||
-rw-r--r-- | lib/tls13/encrypted_extensions.h | 1 |
3 files changed, 38 insertions, 1 deletions
diff --git a/lib/handshake-tls13.c b/lib/handshake-tls13.c index 4cce3d631d..90528c4c00 100644 --- a/lib/handshake-tls13.c +++ b/lib/handshake-tls13.c @@ -202,7 +202,7 @@ int _gnutls13_handshake_server(gnutls_session_t session) IMED_RET("generate session keys", ret, 0); /* fall through */ case STATE101: - abort(); + ret = _gnutls13_send_encrypted_extensions(session, AGAIN(STATE101)); STATE = STATE101; IMED_RET("send encrypted extensions", ret, 0); /* fall through */ diff --git a/lib/tls13/encrypted_extensions.c b/lib/tls13/encrypted_extensions.c index 05673f8e85..df0cc6edbb 100644 --- a/lib/tls13/encrypted_extensions.c +++ b/lib/tls13/encrypted_extensions.c @@ -24,6 +24,7 @@ #include "errors.h" #include "hello_ext.h" #include "handshake.h" +#include "mbuffers.h" #include "tls13/encrypted_extensions.h" int _gnutls13_recv_encrypted_extensions(gnutls_session_t session) @@ -45,3 +46,38 @@ int _gnutls13_recv_encrypted_extensions(gnutls_session_t session) return 0; } + +int _gnutls13_send_encrypted_extensions(gnutls_session_t session, unsigned again) +{ + int ret; + mbuffer_st *bufel = NULL; + gnutls_buffer_st buf; + + if (again == 0) { + _gnutls_buffer_init(&buf); + + ret = _gnutls_gen_hello_extensions(session, &buf, GNUTLS_EXT_FLAG_EE, GNUTLS_EXT_ANY); + if (ret < 0) + return gnutls_assert_val(ret); + + bufel = _gnutls_handshake_alloc(session, buf.length); + if (bufel == NULL) + return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); + + _mbuffer_set_udata_size(bufel, 0); + ret = _mbuffer_append_data(bufel, buf.data, buf.length); + if (ret < 0) { + gnutls_assert(); + goto cleanup; + } + + _gnutls_buffer_clear(&buf); + } + + return _gnutls_send_handshake(session, bufel, GNUTLS_HANDSHAKE_ENCRYPTED_EXTENSIONS); + + cleanup: + _gnutls_buffer_clear(&buf); + _mbuffer_xfree(&bufel); + return ret; +} diff --git a/lib/tls13/encrypted_extensions.h b/lib/tls13/encrypted_extensions.h index 3add0611a0..88aebdc5f4 100644 --- a/lib/tls13/encrypted_extensions.h +++ b/lib/tls13/encrypted_extensions.h @@ -21,3 +21,4 @@ */ int _gnutls13_recv_encrypted_extensions(gnutls_session_t session); +int _gnutls13_send_encrypted_extensions(gnutls_session_t session, unsigned again); |