From: Nikos Mavrogiannopoulos Date: Wed, 3 Mar 2010 10:50:50 +0000 (+0100) Subject: Avoid sending alerts during handshake. Alerts might be interrupted and return X-Git-Tag: gnutls_2_9_10~60 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=67ff3f2cedabcf1a831129466360280cd571ab85;p=thirdparty%2Fgnutls.git Avoid sending alerts during handshake. Alerts might be interrupted and return a non-fatal error which will propagate and in many cases it shouldn't. Avoid sending no renegotiation alert when a client connects to an unsafe server. Thanks to Tomas Hoger for the report. --- diff --git a/lib/gnutls_alert.c b/lib/gnutls_alert.c index f4c52875c5..71aae45f5c 100644 --- a/lib/gnutls_alert.c +++ b/lib/gnutls_alert.c @@ -181,6 +181,10 @@ gnutls_error_to_alert (int err, int *level) ret = GNUTLS_A_ILLEGAL_PARAMETER; _level = GNUTLS_AL_FATAL; break; + case GNUTLS_E_UNKNOWN_SRP_USERNAME: + ret = GNUTLS_A_UNKNOWN_PSK_IDENTITY; + _level = GNUTLS_AL_FATAL; + break; case GNUTLS_E_ASN1_ELEMENT_NOT_FOUND: case GNUTLS_E_ASN1_IDENTIFIER_NOT_FOUND: case GNUTLS_E_ASN1_DER_ERROR: @@ -215,6 +219,7 @@ gnutls_error_to_alert (int err, int *level) _level = GNUTLS_AL_FATAL; break; case GNUTLS_E_REHANDSHAKE: + case GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED: ret = GNUTLS_A_NO_RENEGOTIATION; _level = GNUTLS_AL_WARNING; break; diff --git a/lib/gnutls_errors.c b/lib/gnutls_errors.c index 69d92ad2de..21f40b1cc1 100644 --- a/lib/gnutls_errors.c +++ b/lib/gnutls_errors.c @@ -223,9 +223,13 @@ static const gnutls_error_entry error_algorithms[] = { GNUTLS_E_OPENPGP_SUBKEY_ERROR, 1), ERROR_ENTRY (N_("Safe renegotiation failed."), GNUTLS_E_SAFE_RENEGOTIATION_FAILED, 1), + ERROR_ENTRY (N_("Unsafe renegotiation denied."), + GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED, 1), ERROR_ENTRY (N_("The SRP username supplied is illegal."), GNUTLS_E_ILLEGAL_SRP_USERNAME, 1), + ERROR_ENTRY (N_("The SRP username supplied is unknown."), + GNUTLS_E_UNKNOWN_SRP_USERNAME, 1), ERROR_ENTRY (N_("The OpenPGP fingerprint is not supported."), GNUTLS_E_OPENPGP_FINGERPRINT_UNSUPPORTED, 1), diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c index 4e2952a405..2ed4f5cae4 100644 --- a/lib/gnutls_handshake.c +++ b/lib/gnutls_handshake.c @@ -2248,15 +2248,7 @@ _gnutls_send_server_hello (gnutls_session_t session, int again) * alert and abort. */ gnutls_assert (); - ret = gnutls_alert_send (session, GNUTLS_AL_FATAL, - GNUTLS_A_UNKNOWN_PSK_IDENTITY); - if (ret < 0) - { - gnutls_assert (); - return ret; - } - - return GNUTLS_E_ILLEGAL_SRP_USERNAME; + return GNUTLS_E_UNKNOWN_SRP_USERNAME; } } #endif @@ -2435,22 +2427,16 @@ _gnutls_recv_hello (gnutls_session_t session, opaque * data, int datalen) { if (session->internals.priorities.unsafe_renegotiation != 0) { - _gnutls_handshake_log ("Allowing unsafe renegotiation!\n"); + _gnutls_handshake_log ("Allowing unsafe (re)negotiation!\n"); } else { gnutls_assert(); - _gnutls_handshake_log ("Denying unsafe renegotiation.\n"); - ret = gnutls_alert_send (session, GNUTLS_AL_WARNING, - GNUTLS_A_NO_RENEGOTIATION); - - if (ret < 0) - { - gnutls_assert (); - return ret; - } - - return GNUTLS_E_SAFE_RENEGOTIATION_FAILED; + _gnutls_handshake_log ("Denying unsafe (re)negotiation.\n"); + if (session->security_parameters.entity == GNUTLS_SERVER) + return GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED; /* send no renegotiation alert */ + else + return GNUTLS_E_SAFE_RENEGOTIATION_FAILED; } } else diff --git a/lib/includes/gnutls/gnutls.h.in b/lib/includes/gnutls/gnutls.h.in index c3b6262320..8f3d828b08 100644 --- a/lib/includes/gnutls/gnutls.h.in +++ b/lib/includes/gnutls/gnutls.h.in @@ -1685,6 +1685,8 @@ extern "C" { #define GNUTLS_E_UNKNOWN_ALGORITHM -105 #define GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM -106 #define GNUTLS_E_SAFE_RENEGOTIATION_FAILED -107 +#define GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED -108 +#define GNUTLS_E_UNKNOWN_SRP_USERNAME -109 #define GNUTLS_E_BASE64_ENCODING_ERROR -201 #define GNUTLS_E_INCOMPATIBLE_GCRYPT_LIBRARY -202 /* obsolete */