* packet.h, main.h, sig-check.c (signature_check2, check_key_signature2,
[gnupg.git] / g10 / sign.c
index 4463f66..73286fc 100644 (file)
@@ -1,5 +1,6 @@
 /* sign.c - sign data
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2003 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 
 
 #ifdef HAVE_DOSISH_SYSTEM
-  #define LF "\r\n"
-  void __stdcall Sleep(ulong);
-  #define sleep(a)  Sleep((a)*1000)
+#define LF "\r\n"
+void __stdcall Sleep(ulong);
+#define sleep(a)  Sleep((a)*1000)
 #else
-  #define LF "\n"
+#define LF "\n"
 #endif
 
 static int recipient_digest_algo=0;
@@ -122,8 +123,8 @@ mk_notation_and_policy( PKT_signature *sig,
        m_free(buf);
     }
 
-    if(opt.show_notation)
-      show_notation(sig,0);
+    if(opt.list_options&LIST_SHOW_NOTATION)
+      show_notation(sig,0,0);
 
     /* set policy URL */
     if( IS_SIG(sig) && opt.sig_policy_url )
@@ -160,8 +161,8 @@ mk_notation_and_policy( PKT_signature *sig,
        m_free(s);
       }
 
-    if(opt.show_policy_url)
-      show_policy_url(sig,0);
+    if(opt.list_options&LIST_SHOW_POLICY)
+      show_policy_url(sig,0,0);
 }
 
 
@@ -309,8 +310,10 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig,
     else {
        if( opt.verbose ) {
            char *ustr = get_user_id_string_printable (sig->keyid);
-           log_info(_("%s signature from: \"%s\"\n"),
-                     pubkey_algo_to_string(sk->pubkey_algo), ustr );
+           log_info(_("%s/%s signature from: \"%s\"\n"),
+                    pubkey_algo_to_string(sk->pubkey_algo),
+                    digest_algo_to_string(sig->digest_algo),
+                    ustr );
            m_free(ustr);
        }
     }
@@ -336,7 +339,7 @@ hash_for(int pubkey_algo, int packet_version )
     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 )
+  else if(PGP2 && pubkey_algo == PUBKEY_ALGO_RSA && packet_version < 4 )
     {
       /* Old-style PGP only understands MD5 */
       return DIGEST_ALGO_MD5;
@@ -481,7 +484,7 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
     }
 
     /* try to calculate the length of the data */
-    if (fname) {
+    if (fname && *fname && !(*fname=='-' && !fname[1])) {
         if( !(filesize = iobuf_get_filelength(inp)) )
             log_info (_("WARNING: `%s' is an empty file\n"), fname);
 
@@ -508,7 +511,7 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
         pt->timestamp = make_timestamp ();
         pt->mode = ptmode;
         pt->len = filesize;
-        pt->new_ctb = !pt->len && !opt.rfc1991;
+        pt->new_ctb = !pt->len && !RFC1991;
         pt->buf = inp;
         init_packet(&pkt);
         pkt.pkttype = PKT_PLAINTEXT;
@@ -559,7 +562,7 @@ write_signature_packets (SK_LIST sk_list, IOBUF out, MD_HANDLE hash,
 
        /* build the signature packet */
        sig = m_alloc_clear (sizeof *sig);
-       if(opt.force_v3_sigs || opt.rfc1991)
+       if(opt.force_v3_sigs || RFC1991)
          sig->version=3;
        else if(duration || opt.sig_policy_url || opt.sig_notation_data)
          sig->version=4;
@@ -658,18 +661,17 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
     if( fname && filenames->next && (!detached || encryptflag) )
        log_bug("multiple files can only be detached signed");
 
-    if(opt.ask_sig_expire && !opt.force_v3_sigs && !opt.batch && !opt.rfc1991)
+    if(opt.ask_sig_expire && !opt.force_v3_sigs && !opt.batch && !RFC1991)
       duration=ask_expire_interval(1);
 
     if( (rc=build_sk_list( locusr, &sk_list, 1, PUBKEY_USAGE_SIG )) )
        goto leave;
 
-    if(opt.pgp2 && !only_old_style(sk_list))
+    if(PGP2 && !only_old_style(sk_list))
       {
        log_info(_("you can only detach-sign with PGP 2.x style keys "
                   "while in --pgp2 mode\n"));
-       log_info(_("this message may not be usable by %s\n"),"PGP 2.x");
-       opt.pgp2=0;
+       compliance_failure();
       }
 
     if(encryptflag && (rc=build_pk_list( remusr, &pk_list, PUBKEY_USAGE_ENC )))
@@ -742,7 +744,8 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
                hashlen=20;
 
            if((algo=
-               select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1,&hashlen))>0)
+               select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1,
+                                      hashlen?&hashlen:NULL))>0)
              recipient_digest_algo=algo;
          }
       }
@@ -755,7 +758,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
     if( !multifile )
        iobuf_push_filter( inp, md_filter, &mfx );
 
-    if( detached && !encryptflag && !opt.rfc1991 )
+    if( detached && !encryptflag && !RFC1991 )
        afx.what = 2;
 
     if( opt.armor && !outfile  )
@@ -785,9 +788,9 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
                select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1)
              compr_algo=default_compress_algo();
          }
-       else if(!opt.expert &&
-               select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
-                                      compr_algo,NULL)!=compr_algo)
+       else if(!opt.expert && pk_list
+               && select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
+                                         compr_algo,NULL)!=compr_algo)
          log_info(_("forcing compression algorithm %s (%d) "
                     "violates recipient preferences\n"),
                   compress_algo_to_string(compr_algo),compr_algo);
@@ -801,7 +804,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
       }
 
     /* Write the one-pass signature packets if needed */
-    if (!detached && !opt.rfc1991) {
+    if (!detached && !RFC1991) {
         rc = write_onepass_sig_packets (sk_list, out,
                                         opt.textmode && !outfile ? 0x01:0x00);
         if (rc)
@@ -895,14 +898,14 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
     int rc = 0;
     SK_LIST sk_list = NULL;
     SK_LIST sk_rover = NULL;
-    int old_style = opt.rfc1991;
+    int old_style = RFC1991;
     int only_md5 = 0;
     u32 duration=0;
 
     memset( &afx, 0, sizeof afx);
     init_packet( &pkt );
 
-    if(opt.ask_sig_expire && !opt.force_v3_sigs && !opt.batch && !opt.rfc1991)
+    if(opt.ask_sig_expire && !opt.force_v3_sigs && !opt.batch && !RFC1991)
       duration=ask_expire_interval(1);
 
     if( (rc=build_sk_list( locusr, &sk_list, 1, PUBKEY_USAGE_SIG )) )
@@ -911,12 +914,11 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
     if( !old_style && !duration )
        old_style = only_old_style( sk_list );
 
-    if(!old_style && opt.pgp2)
+    if(PGP2 && !only_old_style(sk_list))
       {
        log_info(_("you can only clearsign with PGP 2.x style keys "
                   "while in --pgp2 mode\n"));
-       log_info(_("this message may not be usable by %s\n"),"PGP 2.x");
-       opt.pgp2=0;
+       compliance_failure();
       }
 
     /* prepare iobufs */
@@ -1043,7 +1045,7 @@ sign_symencrypt_file (const char *fname, STRLIST locusr)
     memset( &cfx, 0, sizeof cfx);
     init_packet( &pkt );
 
-    if(opt.ask_sig_expire && !opt.force_v3_sigs && !opt.batch && !opt.rfc1991)
+    if(opt.ask_sig_expire && !opt.force_v3_sigs && !opt.batch && !RFC1991)
       duration=ask_expire_interval(1);
 
     rc = build_sk_list (locusr, &sk_list, 1, PUBKEY_USAGE_SIG);
@@ -1062,7 +1064,7 @@ sign_symencrypt_file (const char *fname, STRLIST locusr)
 
     /* prepare key */
     s2k = m_alloc_clear( sizeof *s2k );
-    s2k->mode = opt.rfc1991? 0:opt.s2k_mode;
+    s2k->mode = RFC1991? 0:opt.s2k_mode;
     s2k->hash_algo = opt.s2k_digest_algo;
 
     algo = default_cipher_algo();
@@ -1100,7 +1102,7 @@ sign_symencrypt_file (const char *fname, STRLIST locusr)
 
     /* Write the symmetric key packet */
     /*(current filters: armor)*/
-    if (!opt.rfc1991) {
+    if (!RFC1991) {
        PKT_symkey_enc *enc = m_alloc_clear( sizeof *enc );
        enc->version = 4;
        enc->cipher_algo = cfx.dek->algo;
@@ -1124,7 +1126,7 @@ sign_symencrypt_file (const char *fname, STRLIST locusr)
 
     /* Write the one-pass signature packets */
     /*(current filters: zip - encrypt - armor)*/
-    if (!opt.rfc1991) {
+    if (!RFC1991) {
         rc = write_onepass_sig_packets (sk_list, out,
                                         opt.textmode? 0x01:0x00);
         if (rc)
@@ -1249,12 +1251,15 @@ make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
     sig->sig_class = sigclass;
     if( sig->version >= 4 )
        build_sig_subpkt_from_sig( sig );
+    mk_notation_and_policy( sig, pk, sk );
 
+    /* Crucial that the call to mksubpkt comes LAST before the calls
+       to finalize the sig as that makes it possible for the mksubpkt
+       function to get a reliable pointer to the subpacket area. */
     if( sig->version >= 4 && mksubpkt )
        rc = (*mksubpkt)( sig, opaque );
 
     if( !rc ) {
-       mk_notation_and_policy( sig, pk, sk );
         hash_sigversion_to_magic (md, sig);
        md_final(md);