diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-02-18 11:57:29 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-02-18 11:57:29 +0100 |
commit | 8f177e5e8fc4ea89d3611be2a70832147dba5e82 (patch) | |
tree | ca353c7c3d8195d5531cb512f6b13e8903f88a2f | |
parent | 2d3c1568f4440d5b83c47b05bfbf0064643aa50b (diff) | |
download | gnutls-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.c | 20 |
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); |