diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2015-07-10 21:17:48 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2015-07-10 21:20:41 +0200 |
commit | 1280e9640effbe10a8a967ade194fb9bb70b8a47 (patch) | |
tree | 8fe544ac034cf0287215676c8594943d0b068790 | |
parent | 04de1df263a1d62f91af688d1d375b764a4ac10b (diff) | |
download | gnutls-1280e9640effbe10a8a967ade194fb9bb70b8a47.tar.gz |
PSK: set the hint in DHE-PSK and ECDHE-PSK ciphersuites
-rw-r--r-- | lib/auth/dhe_psk.c | 84 |
1 files changed, 74 insertions, 10 deletions
diff --git a/lib/auth/dhe_psk.c b/lib/auth/dhe_psk.c index 3755a99559..d517b35be0 100644 --- a/lib/auth/dhe_psk.c +++ b/lib/auth/dhe_psk.c @@ -189,6 +189,7 @@ gen_dhe_psk_server_kx(gnutls_session_t session, gnutls_buffer_st * data) int ret; gnutls_dh_params_t dh_params; gnutls_psk_server_credentials_t cred; + gnutls_datum_t hint = {NULL, 0}; cred = (gnutls_psk_server_credentials_t) _gnutls_get_cred(session, GNUTLS_CRD_PSK); @@ -218,7 +219,12 @@ gen_dhe_psk_server_kx(gnutls_session_t session, gnutls_buffer_st * data) _gnutls_dh_set_group(session, g, p); - ret = _gnutls_buffer_append_prefix(data, 16, 0); + if (cred->hint) { + hint.data = (uint8_t *) cred->hint; + hint.size = strlen(cred->hint); + } + + ret = _gnutls_buffer_append_data_prefix(data, 16, hint.data, hint.size); if (ret < 0) return gnutls_assert_val(ret); @@ -238,6 +244,8 @@ static int gen_ecdhe_psk_server_kx(gnutls_session_t session, gnutls_buffer_st * data) { int ret; + gnutls_psk_server_credentials_t cred; + gnutls_datum_t hint = {NULL, 0}; if ((ret = _gnutls_auth_info_set(session, GNUTLS_CRD_PSK, @@ -246,7 +254,20 @@ gen_ecdhe_psk_server_kx(gnutls_session_t session, gnutls_buffer_st * data) return ret; } - ret = _gnutls_buffer_append_prefix(data, 16, 0); + cred = (gnutls_psk_server_credentials_t) + _gnutls_get_cred(session, GNUTLS_CRD_PSK); + + if (cred == NULL) { + gnutls_assert(); + return GNUTLS_E_INSUFFICIENT_CREDENTIALS; + } + + if (cred->hint) { + hint.data = (uint8_t *) cred->hint; + hint.size = strlen(cred->hint); + } + + ret = _gnutls_buffer_append_data_prefix(data, 16, hint.data, hint.size); if (ret < 0) return gnutls_assert_val(ret); @@ -410,13 +431,37 @@ proc_ecdhe_psk_client_kx(gnutls_session_t session, uint8_t * data, return ret; } +static int copy_hint(gnutls_session_t session, gnutls_datum_t *hint) +{ + psk_auth_info_t info; + + /* copy the hint to the auth info structures + */ + info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK); + if (info == NULL) { + gnutls_assert(); + return GNUTLS_E_INTERNAL_ERROR; + } + + if (hint->size > MAX_USERNAME_SIZE) { + gnutls_assert(); + return GNUTLS_E_ILLEGAL_SRP_USERNAME; + } + + memcpy(info->hint, hint->data, hint->size); + info->hint[hint->size] = 0; + + return 0; +} + static int proc_dhe_psk_server_kx(gnutls_session_t session, uint8_t * data, size_t _data_size) { - int ret, psk_size; + int ret; ssize_t data_size = _data_size; + gnutls_datum_t hint; /* set auth_info */ if ((ret = @@ -427,9 +472,12 @@ proc_dhe_psk_server_kx(gnutls_session_t session, uint8_t * data, } DECR_LEN(data_size, 2); - psk_size = _gnutls_read_uint16(data); - DECR_LEN(data_size, psk_size); - data += 2 + psk_size; + + hint.size = _gnutls_read_uint16(&data[0]); + hint.data = &data[2]; + + DECR_LEN(data_size, hint.size); + data += 2 + hint.size; ret = _gnutls_proc_dh_common_server_kx(session, data, data_size); if (ret < 0) { @@ -437,6 +485,12 @@ proc_dhe_psk_server_kx(gnutls_session_t session, uint8_t * data, return ret; } + ret = copy_hint(session, &hint); + if (ret < 0) { + gnutls_assert(); + return ret; + } + return 0; } @@ -445,8 +499,9 @@ proc_ecdhe_psk_server_kx(gnutls_session_t session, uint8_t * data, size_t _data_size) { - int ret, psk_size; + int ret; ssize_t data_size = _data_size; + gnutls_datum_t hint; /* set auth_info */ if ((ret = @@ -457,9 +512,12 @@ proc_ecdhe_psk_server_kx(gnutls_session_t session, uint8_t * data, } DECR_LEN(data_size, 2); - psk_size = _gnutls_read_uint16(data); - DECR_LEN(data_size, psk_size); - data += 2 + psk_size; + + hint.size = _gnutls_read_uint16(&data[0]); + hint.data = &data[2]; + + DECR_LEN(data_size, hint.size); + data += 2 + hint.size; ret = _gnutls_proc_ecdh_common_server_kx(session, data, data_size); if (ret < 0) { @@ -467,6 +525,12 @@ proc_ecdhe_psk_server_kx(gnutls_session_t session, uint8_t * data, return ret; } + ret = copy_hint(session, &hint); + if (ret < 0) { + gnutls_assert(); + return ret; + } + return 0; } |