1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-11-04 20:38:50 +01:00

* 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.
This commit is contained in:
David Shaw 2006-06-28 17:54:35 +00:00
parent 2a31983ef8
commit cb117d7457
4 changed files with 27 additions and 14 deletions

View File

@ -1,5 +1,10 @@
2006-06-28 David Shaw <dshaw@jabberwocky.com> 2006-06-28 David Shaw <dshaw@jabberwocky.com>
* 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 * sign.c (sign_file): When signing with multiple DSA keys, one
being DSA1 and one being DSA2 and encrypting at the same time, if 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 the recipient preferences give a hash that can work with the DSA2

View File

@ -177,9 +177,14 @@ void show_revocation_reason( PKT_public_key *pk, int mode );
int check_signatures_trust( PKT_signature *sig ); int check_signatures_trust( PKT_signature *sig );
void release_pk_list( PK_LIST pk_list ); void release_pk_list( PK_LIST pk_list );
int build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use ); 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 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); int select_mdc_from_pklist (PK_LIST pk_list);
/*-- skclist.c --*/ /*-- skclist.c --*/

View File

@ -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 */ preference list, so I'm including it. -dms */
int 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 ) if( preftype == PREFTYPE_SYM )
{ {
@ -1210,18 +1210,18 @@ algo_available( preftype_t preftype, int algo, void *hint )
} }
else if( preftype == PREFTYPE_HASH ) 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 /* If --enable-dsa2 is set or the hash isn't 160 bits
(which implies DSA2), then we'll accept a hash that (which implies DSA2), then we'll accept a hash that
is larger than we need. Otherwise we won't accept is larger than we need. Otherwise we won't accept
any hash that isn't exactly the right size. */ 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; return 0;
} }
else if(((*(int *)hint) != md_digest_length(algo))) else if(hint->digest_length != md_digest_length(algo))
return 0; return 0;
} }
@ -1259,7 +1259,8 @@ algo_available( preftype_t preftype, int algo, void *hint )
* Return -1 if we could not find an algorithm. * Return -1 if we could not find an algorithm.
*/ */
int 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; PK_LIST pkr;
u32 bits[8]; u32 bits[8];

View File

@ -866,7 +866,10 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
} }
else 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 /* Of course, if the recipient asks for something
unreasonable (like the wrong hash for a DSA key) then 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 /* Pick a hash that is large enough for our
largest q */ largest q */
if(hashlen<temp_hashlen) if(hint.digest_length<temp_hashlen)
hashlen=temp_hashlen; hint.digest_length=temp_hashlen;
} }
else if(sk_rover->sk->is_protected else if(sk_rover->sk->is_protected
&& sk_rover->sk->protect.s2k.mode==1002) && 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 single hash for all signatures. All this may well have
to change as the cards add algorithms. */ to change as the cards add algorithms. */
if(!smartcard || (smartcard && hashlen==20)) if(!smartcard || (smartcard && hint.digest_length==20))
if((algo= if((algo=
select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1, select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1,&hint))>0)
hashlen?&hashlen:NULL))>0)
recipient_digest_algo=algo; recipient_digest_algo=algo;
} }
} }