From: Nikos Mavrogiannopoulos Date: Sun, 19 May 2013 08:16:03 +0000 (+0200) Subject: gnutls_session_set_id() was added X-Git-Tag: gnutls_3_2_1~44 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e24ccb37eb21499e83986b9eb6f2cdda4facd31f;p=thirdparty%2Fgnutls.git gnutls_session_set_id() was added --- diff --git a/NEWS b/NEWS index 02d318f26a..1ccd989e88 100644 --- a/NEWS +++ b/NEWS @@ -8,7 +8,7 @@ See the end for copying conditions. and patch by Tim Kosse. ** API and ABI modifications: -No changes since last version. +gnutls_session_set_id: Added * Version 3.2.0 (released 2013-05-10) diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c index 4c96acfeab..f24abfaa5d 100644 --- a/lib/gnutls_handshake.c +++ b/lib/gnutls_handshake.c @@ -1580,7 +1580,7 @@ _gnutls_client_check_if_resuming (gnutls_session_t session, _gnutls_bin2hex (session_id, session_id_len, buf, sizeof (buf), NULL)); - if (session_id_len > 0 && + if (session->internals.resumption_requested != 0 && session_id_len > 0 && session->internals.resumed_security_parameters.session_id_size == session_id_len && memcmp (session_id, @@ -1872,7 +1872,8 @@ _gnutls_send_client_hello (gnutls_session_t session, int again) /* if we are resuming a session then we set the * version number to the previously established. */ - if (session_id_len == 0) + if (session->internals.resumption_requested == 0 && + session->internals.premaster_set == 0) { if (rehandshake) /* already negotiated version thus version_max == negotiated version */ hver = session->security_parameters.version; diff --git a/lib/gnutls_session.c b/lib/gnutls_session.c index 5955c053b5..f7d8113473 100644 --- a/lib/gnutls_session.c +++ b/lib/gnutls_session.c @@ -221,6 +221,8 @@ gnutls_session_set_data (gnutls_session_t session, gnutls_assert (); return ret; } + + session->internals.resumption_requested = 1; return 0; } diff --git a/lib/gnutls_ui.c b/lib/gnutls_ui.c index c103e4ca87..0c5ce193ba 100644 --- a/lib/gnutls_ui.c +++ b/lib/gnutls_ui.c @@ -869,3 +869,35 @@ gnutls_session_get_desc (gnutls_session_t session) return desc; } + +/** + * gnutls_session_set_id: + * @session: is a #gnutls_session_t structure. + * @sid: the session identifier + * + * This function sets the session ID to be used in a client hello. + * This is a function intended for exceptional uses. Do not use this + * function unless you are implementing a custom protocol. + * + * To set session resumption parameters use gnutls_session_set_data() instead. + * + * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise + * an error code is returned. + **/ +int +gnutls_session_set_id (gnutls_session_t session, + const gnutls_datum_t * sid) +{ + if (session->security_parameters.entity == GNUTLS_SERVER || + sid->size > TLS_MAX_SESSION_ID_SIZE) + return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST); + + memset (&session->internals.resumed_security_parameters, 0, + sizeof (session->internals.resumed_security_parameters)); + + session->internals.resumed_security_parameters.session_id_size = sid->size; + memcpy(session->internals.resumed_security_parameters.session_id, + sid->data, sid->size); + + return 0; +} diff --git a/lib/includes/gnutls/gnutls.h.in b/lib/includes/gnutls/gnutls.h.in index 5cb6f7ea84..1d3769799e 100644 --- a/lib/includes/gnutls/gnutls.h.in +++ b/lib/includes/gnutls/gnutls.h.in @@ -1122,6 +1122,9 @@ gnutls_ecc_curve_t gnutls_ecc_curve_get(gnutls_session_t session); size_t * session_id_size); int gnutls_session_get_id2 (gnutls_session_t session, gnutls_datum_t *session_id); + int gnutls_session_set_id (gnutls_session_t session, + const gnutls_datum_t * sid); + int gnutls_session_channel_binding (gnutls_session_t session, gnutls_channel_binding_t cbtype, gnutls_datum_t * cb); diff --git a/lib/libgnutls.map b/lib/libgnutls.map index f2eb6bbb9f..3a32de6f1f 100644 --- a/lib/libgnutls.map +++ b/lib/libgnutls.map @@ -910,6 +910,7 @@ GNUTLS_3_1_0 { gnutls_certificate_set_x509_key_file2; gnutls_alpn_get_selected_protocol; gnutls_alpn_set_protocols; + gnutls_session_set_id; } GNUTLS_3_0_0; GNUTLS_PRIVATE {