* keydb.h, getkey.c (key_byname): Flag to enable or disable including
[gnupg.git] / g10 / encode.c
index 6727c08..e705a6f 100644 (file)
@@ -192,11 +192,9 @@ encode_simple( const char *filename, int mode, int compat )
     if( mode ) {
        s2k = m_alloc_clear( sizeof *s2k );
        s2k->mode = opt.rfc1991? 0:opt.s2k_mode;
     if( mode ) {
        s2k = m_alloc_clear( sizeof *s2k );
        s2k->mode = opt.rfc1991? 0:opt.s2k_mode;
-       s2k->hash_algo = opt.def_digest_algo ? opt.def_digest_algo
-                                            : opt.s2k_digest_algo;
+       s2k->hash_algo = opt.s2k_digest_algo;
        cfx.dek = passphrase_to_dek( NULL, 0,
        cfx.dek = passphrase_to_dek( NULL, 0,
-                  opt.def_cipher_algo ? opt.def_cipher_algo
-                                     : opt.s2k_cipher_algo , s2k, 2, NULL );
+                                    default_cipher_algo(), s2k, 2, NULL );
        if( !cfx.dek || !cfx.dek->keylen ) {
            rc = G10ERR_PASSPHRASE;
            m_free(cfx.dek);
        if( !cfx.dek || !cfx.dek->keylen ) {
            rc = G10ERR_PASSPHRASE;
            m_free(cfx.dek);
@@ -212,9 +210,7 @@ encode_simple( const char *filename, int mode, int compat )
         }
 
         if ( !compat ) {            
         }
 
         if ( !compat ) {            
-            seskeylen = cipher_get_keylen( opt.def_cipher_algo ?
-                                           opt.def_cipher_algo:
-                                           opt.s2k_cipher_algo ) / 8;
+            seskeylen = cipher_get_keylen( default_cipher_algo() ) / 8;
             encode_sesskey( cfx.dek, &dek, enckey );
             m_free( cfx.dek ); cfx.dek = dek;
         }
             encode_sesskey( cfx.dek, &dek, enckey );
             m_free( cfx.dek ); cfx.dek = dek;
         }
@@ -292,13 +288,18 @@ encode_simple( const char *filename, int mode, int compat )
        messages. */
 
     if( filename && !opt.textmode ) {
        messages. */
 
     if( filename && !opt.textmode ) {
-       if( !(filesize = iobuf_get_filelength(inp)) )
-           log_info(_("%s: WARNING: empty file\n"), filename );
-        /* we can't yet encode the length of very large files,
-         * so we switch to partial lengthn encoding in this case */
-        if ( filesize >= IOBUF_FILELENGTH_LIMIT )
-            filesize = 0;
-
+        off_t tmpsize;
+
+       if ( !(tmpsize = iobuf_get_filelength(inp)) )
+          log_info(_("%s: WARNING: empty file\n"), filename );
+        /* We can't encode the length of very large files because
+           OpenPGP uses only 32 bit for file sizes.  So if the the
+           size of a file is larger than 2^32 minus some bytes for
+           packet headers, we switch to partial length encoding. */
+        if ( tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536) )
+          filesize = tmpsize;
+        else
+          filesize = 0;
     }
     else
        filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
     }
     else
        filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
@@ -328,9 +329,7 @@ encode_simple( const char *filename, int mode, int compat )
       {
         if (cfx.dek && cfx.dek->use_mdc)
           zfx.new_ctb = 1;
       {
         if (cfx.dek && cfx.dek->use_mdc)
           zfx.new_ctb = 1;
-       zfx.algo=opt.def_compress_algo;
-       if(zfx.algo==-1)
-         zfx.algo=DEFAULT_COMPRESS_ALGO;
+       zfx.algo=default_compress_algo();
        iobuf_push_filter( out, compress_filter, &zfx );
       }
 
        iobuf_push_filter( out, compress_filter, &zfx );
       }
 
@@ -519,12 +518,18 @@ encode_crypt( const char *filename, STRLIST remusr )
     }
 
     if( filename && !opt.textmode ) {
     }
 
     if( filename && !opt.textmode ) {
-       if( !(filesize = iobuf_get_filelength(inp)) )
-           log_info(_("%s: WARNING: empty file\n"), filename );
-        /* we can't yet encode the length of very large files,
-         * so we switch to partial length encoding in this case */
-        if ( filesize >= IOBUF_FILELENGTH_LIMIT )
-            filesize = 0;
+        off_t tmpsize;
+
+       if ( !(tmpsize = iobuf_get_filelength(inp)) )
+          log_info(_("%s: WARNING: empty file\n"), filename );
+        /* We can't encode the length of very large files because
+           OpenPGP uses only 32 bit for file sizes.  So if the the
+           size of a file is larger than 2^32 minus some bytes for
+           packet headers, we switch to partial length encoding. */
+        if ( tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536) )
+          filesize = tmpsize;
+        else
+          filesize = 0;
     }
     else
        filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
     }
     else
        filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
@@ -554,6 +559,8 @@ encode_crypt( const char *filename, STRLIST remusr )
            if((compr_algo=
                select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1)
              compr_algo=DEFAULT_COMPRESS_ALGO;
            if((compr_algo=
                select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1)
              compr_algo=DEFAULT_COMPRESS_ALGO;
+           /* Theoretically impossible to get here since uncompressed
+              is implicit. */
          }
        else if(!opt.expert &&
                select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
          }
        else if(!opt.expert &&
                select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
@@ -699,18 +706,18 @@ write_pubkey_enc_from_list( PK_LIST pk_list, DEK *dek, IOBUF out )
        enc = m_alloc_clear( sizeof *enc );
        enc->pubkey_algo = pk->pubkey_algo;
        keyid_from_pk( pk, enc->keyid );
        enc = m_alloc_clear( sizeof *enc );
        enc->pubkey_algo = pk->pubkey_algo;
        keyid_from_pk( pk, enc->keyid );
-       enc->throw_keyid = opt.throw_keyid;
+       enc->throw_keyid = (opt.throw_keyid || (pk_list->flags&1));
 
 
-       if(opt.throw_keyid && (opt.pgp2 || opt.pgp6 || opt.pgp7))
+       if(opt.throw_keyid && (opt.pgp2 || opt.pgp6 || opt.pgp7 || opt.pgp8))
          {
            log_info(_("you may not use %s while in %s mode\n"),
                     "--throw-keyid",
          {
            log_info(_("you may not use %s while in %s mode\n"),
                     "--throw-keyid",
-                    opt.pgp2?"--pgp2":opt.pgp6?"--pgp6":"--pgp7");
+                    opt.pgp2?"--pgp2":opt.pgp6?"--pgp6":opt.pgp7?"--pgp7":"--pgp8");
 
            log_info(_("this message may not be usable by %s\n"),
 
            log_info(_("this message may not be usable by %s\n"),
-                    opt.pgp2?"PGP 2.x":opt.pgp6?"PGP 6.x":"PGP 7.x");
+                    opt.pgp2?"PGP 2.x":opt.pgp6?"PGP 6.x":opt.pgp7?"PGP 7.x":"PGP 8.x");
 
 
-           opt.pgp2=opt.pgp6=opt.pgp7=0;
+           opt.pgp2=opt.pgp6=opt.pgp7=opt.pgp8=0;
          }
 
        /* Okay, what's going on: We have the session key somewhere in
          }
 
        /* Okay, what's going on: We have the session key somewhere in