summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2011-02-18 11:57:29 +0100
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-02-18 11:57:29 +0100
commit8f177e5e8fc4ea89d3611be2a70832147dba5e82 (patch)
treeca353c7c3d8195d5531cb512f6b13e8903f88a2f
parent2d3c1568f4440d5b83c47b05bfbf0064643aa50b (diff)
downloadgnutls-8f177e5e8fc4ea89d3611be2a70832147dba5e82.tar.gz
DSA keys in TLS 1.x, x<2 and SSL 3.0 use SHA-1 as hash. That is we reverted to previous gnutls behavior. That violates DSS but all implementations handle it like that.
-rw-r--r--lib/gnutls_sig.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/lib/gnutls_sig.c b/lib/gnutls_sig.c
index 63a209c07d..5b07e473b0 100644
--- a/lib/gnutls_sig.c
+++ b/lib/gnutls_sig.c
@@ -56,7 +56,8 @@ sign_tls_hash (gnutls_session_t session, gnutls_digest_algorithm_t hash_algo,
#define MAX_SIG_SIZE 19 + MAX_HASH_SIZE
static int
-get_hash_algo(gnutls_session_t session, gnutls_cert* cert,
+get_hash_algo(gnutls_session_t session, int version,
+ gnutls_cert* cert,
gnutls_sign_algorithm_t sign_algo,
gnutls_digest_algorithm_t *hash_algo)
{
@@ -64,11 +65,16 @@ int ret;
if (cert->subject_pk_algorithm == GNUTLS_PK_DSA)
{ /* override */
- *hash_algo = _gnutls_dsa_q_to_hash (cert->params[1]);
+ if (!_gnutls_version_has_selectable_sighash (version))
+ *hash_algo = GNUTLS_DIG_SHA1;
+ else
+ {
+ *hash_algo = _gnutls_dsa_q_to_hash (cert->params[1]);
- ret = _gnutls_session_sign_algo_requested(session, _gnutls_x509_pk_to_sign (GNUTLS_PK_DSA, *hash_algo));
- if (ret < 0)
- return gnutls_assert_val(ret);
+ ret = _gnutls_session_sign_algo_requested(session, _gnutls_x509_pk_to_sign (GNUTLS_PK_DSA, *hash_algo));
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+ }
}
else
{
@@ -105,7 +111,7 @@ _gnutls_handshake_sign_data (gnutls_session_t session, gnutls_cert * cert,
return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
}
- ret = get_hash_algo(session, cert, *sign_algo, &hash_algo);
+ ret = get_hash_algo(session, ver, cert, *sign_algo, &hash_algo);
if (ret < 0)
return gnutls_assert_val(ret);
@@ -384,7 +390,7 @@ _gnutls_handshake_verify_data (gnutls_session_t session, gnutls_cert * cert,
_gnutls_hash (&td_md5, params->data, params->size);
}
- ret = get_hash_algo(session, cert, algo, &hash_algo);
+ ret = get_hash_algo(session, ver, cert, algo, &hash_algo);
if (ret < 0)
return gnutls_assert_val(ret);