* tdbio.h, tdbio.c (tdbio_read_record, tdbio_write_record): Store trust
[gnupg.git] / g10 / sign.c
index 047dd13..5242052 100644 (file)
@@ -332,14 +332,38 @@ complete_sig( PKT_signature *sig, PKT_secret_key *sk, MD_HANDLE md )
 static int
 hash_for(int pubkey_algo, int packet_version )
 {
-    if( opt.def_digest_algo )
-       return opt.def_digest_algo;
-    if( recipient_digest_algo )
-        return recipient_digest_algo;
-    if( pubkey_algo == PUBKEY_ALGO_DSA )
-       return DIGEST_ALGO_SHA1;
-    if( pubkey_algo == PUBKEY_ALGO_RSA && packet_version < 4 )
-       return DIGEST_ALGO_MD5;
+  if( opt.def_digest_algo )
+    return opt.def_digest_algo;
+  else if( recipient_digest_algo )
+    return recipient_digest_algo;
+  else if(opt.pgp2 && pubkey_algo == PUBKEY_ALGO_RSA && packet_version < 4 )
+    {
+      /* Old-style PGP only understands MD5 */
+      return DIGEST_ALGO_MD5;
+    }
+  else if( pubkey_algo == PUBKEY_ALGO_DSA )
+    {
+      /* We need a 160-bit hash for DSA, so we can't just take the first
+        in the pref list */
+
+      if(opt.personal_digest_prefs)
+       {
+         prefitem_t *prefs;
+
+         for(prefs=opt.personal_digest_prefs;prefs->type;prefs++)
+           if(md_digest_length(prefs->value)==20)
+             return prefs->value;
+       }
+
+      return DIGEST_ALGO_SHA1;
+    }
+  else if( opt.personal_digest_prefs )
+    {
+      /* It's not DSA, so we can use whatever the first hash algorithm
+        is in the pref list */
+      return opt.personal_digest_prefs[0].value;
+    }
+  else
     return DEFAULT_DIGEST_ALGO;
 }
 
@@ -751,7 +775,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
  
            if((compr_algo=
                select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1)
-             compr_algo=DEFAULT_COMPRESS_ALGO;
+             compr_algo=default_compress_algo();
          }
        else if(!opt.expert &&
                select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
@@ -1024,7 +1048,7 @@ sign_symencrypt_file (const char *fname, STRLIST locusr)
     s2k->mode = opt.rfc1991? 0:opt.s2k_mode;
     s2k->hash_algo = opt.s2k_digest_algo;
 
-    algo = opt.def_cipher_algo ? opt.def_cipher_algo : opt.s2k_cipher_algo;
+    algo = default_cipher_algo();
     if (!opt.quiet || !opt.batch)
         log_info (_("%s encryption will be used\n"),
                    cipher_algo_to_string(algo) );
@@ -1075,19 +1099,10 @@ sign_symencrypt_file (const char *fname, STRLIST locusr)
     iobuf_push_filter( out, cipher_filter, &cfx );
 
     /* Push the Zip filter */
-    if (opt.compress)
+    if (opt.compress && default_compress_algo())
       {
-       int compr_algo=opt.def_compress_algo;
-
-       /* Default */
-        if(compr_algo==-1)
-         compr_algo=DEFAULT_COMPRESS_ALGO;
-
-       if (compr_algo)
-         {
-           zfx.algo = compr_algo;
-           iobuf_push_filter( out, compress_filter, &zfx );
-         }
+       zfx.algo = default_compress_algo();
+       iobuf_push_filter( out, compress_filter, &zfx );
       }
 
     /* Write the one-pass signature packets */