aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2006-06-28 17:54:35 +0000
committerDavid Shaw <[email protected]>2006-06-28 17:54:35 +0000
commitcb117d745709bac42b6ff3afa8744c80b4630057 (patch)
tree9bf4717442f9fc206b1f0b1bdcaf7c63a4747abb
parent* sign.c (sign_file): When signing with multiple DSA keys, one being DSA1 (diff)
downloadgnupg-cb117d745709bac42b6ff3afa8744c80b4630057.tar.gz
gnupg-cb117d745709bac42b6ff3afa8744c80b4630057.zip
* 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.
Diffstat (limited to '')
-rw-r--r--g10/ChangeLog5
-rw-r--r--g10/keydb.h9
-rw-r--r--g10/pkclist.c13
-rw-r--r--g10/sign.c14
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 <[email protected]>
+ * 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(hashlen<temp_hashlen)
- hashlen=temp_hashlen;
+ if(hint.digest_length<temp_hashlen)
+ hint.digest_length=temp_hashlen;
}
else if(sk_rover->sk->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;
}
}