aboutsummaryrefslogtreecommitdiffstats
path: root/g10/pkclist.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/pkclist.c')
-rw-r--r--g10/pkclist.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/g10/pkclist.c b/g10/pkclist.c
index 9c8315540..5154b19b1 100644
--- a/g10/pkclist.c
+++ b/g10/pkclist.c
@@ -1266,7 +1266,6 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype,
u32 bits[8];
const prefitem_t *prefs;
int result=-1,i;
- unsigned int best=-1;
u16 scores[256];
if( !pk_list )
@@ -1403,10 +1402,31 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype,
if(result==-1)
{
+ unsigned int best=-1;
+
/* At this point, we have not selected an algorithm due to a
special request or via personal prefs. Pick the highest
ranked algorithm (i.e. the one with the lowest score). */
+ if(preftype==PREFTYPE_HASH && scores[DIGEST_ALGO_MD5])
+ {
+ /* "If you are building an authentication system, the recipient
+ may specify a preferred signing algorithm. However, the
+ signer would be foolish to use a weak algorithm simply
+ because the recipient requests it." (RFC4880:14). If any
+ other hash algorithm is available, pretend that MD5 isn't.
+ Note that if the user intentionally chose MD5 by putting it
+ in their personal prefs, then we do what the user said (as we
+ never reach this code). */
+
+ for(i=DIGEST_ALGO_MD5+1;i<256;i++)
+ if(scores[i])
+ {
+ scores[DIGEST_ALGO_MD5]=0;
+ break;
+ }
+ }
+
for(i=0;i<256;i++)
{
/* Note the '<' here. This means in case of a tie, we will
@@ -1424,18 +1444,6 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype,
result=i;
}
}
-
- /* "If you are building an authentication system, the recipient
- may specify a preferred signing algorithm. However, the
- signer would be foolish to use a weak algorithm simply
- because the recipient requests it." (RFC4880:14). If we
- settle on MD5, and SHA1 is also available, use SHA1 instead.
- Note that if the user intentionally chose MD5 by putting it
- in their personal prefs, then we do what the user said (as we
- never reach this code). */
- if(preftype==PREFTYPE_HASH && result==DIGEST_ALGO_MD5
- && (bits[0] & (1<<DIGEST_ALGO_SHA1)))
- result=DIGEST_ALGO_SHA1;
}
return result;