From e37c2e184448f64e285f925ab9636b5f21be99f7 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Fri, 13 Nov 2020 15:43:30 +0100 Subject: gpg: Fix the encrypt+sign hash algo preference selection for ECDSA. * g10/keydb.h (pref_hint): Change from union to struct and add field 'exact'. Adjust callers. * g10/pkclist.c (algo_available): Take care of the exact hint. * g10/sign.c (sign_file): Rework the hash detection from recipient prefs. -- This fixes a encrypt+sign case like: One recipient key has SHA512 as highest ranked hash preference but the the signing key is a 256 bit curve. Because we don't want to use a truncated hash with ECDSA, we need to have an exact match - this is in particular important for smartcard which check that the hash matches the curves. Signed-off-by: Werner Koch Ported-from-stable: aeed0b93ff660fe271d8f98f8d5ce60aa5bf3ebe --- g10/keydb.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'g10/keydb.h') diff --git a/g10/keydb.h b/g10/keydb.h index 5ef837be8..ed58b9443 100644 --- a/g10/keydb.h +++ b/g10/keydb.h @@ -134,9 +134,10 @@ struct pubkey_find_info { /* Helper type for preference functions. */ -union pref_hint +struct pref_hint { - int digest_length; + int digest_length; /* We want at least this digest length. */ + int exact; /* We need to use exactly this length. */ }; @@ -276,9 +277,9 @@ gpg_error_t find_and_check_key (ctrl_t ctrl, pk_list_t *pk_list_addr); int algo_available( preftype_t preftype, int algo, - const union pref_hint *hint ); + const struct pref_hint *hint ); int select_algo_from_prefs( PK_LIST pk_list, int preftype, - int request, const union pref_hint *hint); + int request, const struct pref_hint *hint); int select_mdc_from_pklist (PK_LIST pk_list); aead_algo_t select_aead_from_pklist (pk_list_t pk_list); void warn_missing_aead_from_pklist (PK_LIST pk_list); -- cgit v1.2.3