From cb117d745709bac42b6ff3afa8744c80b4630057 Mon Sep 17 00:00:00 2001 From: David Shaw Date: Wed, 28 Jun 2006 17:54:35 +0000 Subject: [PATCH] * keydb.h, pkclist.c (select_algo_from_prefs, algo_available): Pass a union for preference hints rather than doing void * games. * sign.c (sign_file): Use it here. --- g10/ChangeLog | 5 +++++ g10/keydb.h | 9 +++++++-- g10/pkclist.c | 13 +++++++------ g10/sign.c | 14 ++++++++------ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/g10/ChangeLog b/g10/ChangeLog index 239e244f6..dface5ef2 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,5 +1,10 @@ 2006-06-28 David Shaw + * keydb.h, pkclist.c (select_algo_from_prefs, algo_available): + Pass a union for preference hints rather than doing void * games. + + * sign.c (sign_file): Use it here. + * sign.c (sign_file): When signing with multiple DSA keys, one being DSA1 and one being DSA2 and encrypting at the same time, if the recipient preferences give a hash that can work with the DSA2 diff --git a/g10/keydb.h b/g10/keydb.h index aed87c2a0..b58838108 100644 --- a/g10/keydb.h +++ b/g10/keydb.h @@ -177,9 +177,14 @@ void show_revocation_reason( PKT_public_key *pk, int mode ); int check_signatures_trust( PKT_signature *sig ); void release_pk_list( PK_LIST pk_list ); int build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use ); -int algo_available( preftype_t preftype, int algo, void *hint ); +union pref_hint +{ + int digest_length; +}; +int algo_available( preftype_t preftype, int algo, + const union pref_hint *hint ); int select_algo_from_prefs( PK_LIST pk_list, int preftype, - int request, void *hint ); + int request, const union pref_hint *hint ); int select_mdc_from_pklist (PK_LIST pk_list); /*-- skclist.c --*/ diff --git a/g10/pkclist.c b/g10/pkclist.c index 763368b6a..cae60b209 100644 --- a/g10/pkclist.c +++ b/g10/pkclist.c @@ -1186,7 +1186,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use ) preference list, so I'm including it. -dms */ int -algo_available( preftype_t preftype, int algo, void *hint ) +algo_available( preftype_t preftype, int algo, const union pref_hint *hint ) { if( preftype == PREFTYPE_SYM ) { @@ -1210,18 +1210,18 @@ algo_available( preftype_t preftype, int algo, void *hint ) } else if( preftype == PREFTYPE_HASH ) { - if(hint) + if(hint && hint->digest_length) { - if((*(int *)hint)!=20 || opt.flags.dsa2) + if(hint->digest_length!=20 || opt.flags.dsa2) { /* If --enable-dsa2 is set or the hash isn't 160 bits (which implies DSA2), then we'll accept a hash that is larger than we need. Otherwise we won't accept any hash that isn't exactly the right size. */ - if((*(int *)hint) > md_digest_length(algo)) + if(hint->digest_length > md_digest_length(algo)) return 0; } - else if(((*(int *)hint) != md_digest_length(algo))) + else if(hint->digest_length != md_digest_length(algo)) return 0; } @@ -1259,7 +1259,8 @@ algo_available( preftype_t preftype, int algo, void *hint ) * Return -1 if we could not find an algorithm. */ int -select_algo_from_prefs(PK_LIST pk_list, int preftype, int request, void *hint) +select_algo_from_prefs(PK_LIST pk_list, int preftype, + int request, const union pref_hint *hint) { PK_LIST pkr; u32 bits[8]; diff --git a/g10/sign.c b/g10/sign.c index 830fa7495..82076d78d 100644 --- a/g10/sign.c +++ b/g10/sign.c @@ -866,7 +866,10 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, } else { - int hashlen=0,algo,smartcard=0; + union pref_hint hint; + int algo,smartcard=0; + + hint.digest_length=0; /* Of course, if the recipient asks for something unreasonable (like the wrong hash for a DSA key) then @@ -894,8 +897,8 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, /* Pick a hash that is large enough for our largest q */ - if(hashlensk->is_protected && sk_rover->sk->protect.s2k.mode==1002) @@ -909,10 +912,9 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, single hash for all signatures. All this may well have to change as the cards add algorithms. */ - if(!smartcard || (smartcard && hashlen==20)) + if(!smartcard || (smartcard && hint.digest_length==20)) if((algo= - select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1, - hashlen?&hashlen:NULL))>0) + select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1,&hint))>0) recipient_digest_algo=algo; } }