gpg: Cleanup error code path in case of a bad trustdb.
[gnupg.git] / g10 / encrypt.c
index f529215..d5835d4 100644 (file)
@@ -84,7 +84,7 @@ encrypt_seskey (DEK *dek, DEK **seskey, byte *enckey)
   /* The encrypted session key is prefixed with a one-octet algorithm id.  */
   buf[0] = (*seskey)->algo;
   memcpy( buf + 1, (*seskey)->key, (*seskey)->keylen );
   /* The encrypted session key is prefixed with a one-octet algorithm id.  */
   buf[0] = (*seskey)->algo;
   memcpy( buf + 1, (*seskey)->key, (*seskey)->keylen );
-    
+
   /* We only pass already checked values to the following fucntion,
      thus we consider any failure as fatal.  */
   if (openpgp_cipher_open (&hd, dek->algo, GCRY_CIPHER_MODE_CFB, 1))
   /* We only pass already checked values to the following fucntion,
      thus we consider any failure as fatal.  */
   if (openpgp_cipher_open (&hd, dek->algo, GCRY_CIPHER_MODE_CFB, 1))
@@ -104,8 +104,8 @@ encrypt_seskey (DEK *dek, DEK **seskey, byte *enckey)
 static int
 use_mdc(PK_LIST pk_list,int algo)
 {
 static int
 use_mdc(PK_LIST pk_list,int algo)
 {
-  /* RFC-1991 and 2440 don't have MDC */
-  if(RFC1991 || RFC2440)
+  /* RFC-2440 don't has MDC */
+  if (RFC2440)
     return 0;
 
   /* --force-mdc overrides --disable-mdc */
     return 0;
 
   /* --force-mdc overrides --disable-mdc */
@@ -119,7 +119,7 @@ use_mdc(PK_LIST pk_list,int algo)
 
   if(select_mdc_from_pklist(pk_list))
     return 1;
 
   if(select_mdc_from_pklist(pk_list))
     return 1;
-  
+
   /* The keys don't support MDC, so now we do a bit of a hack - if any
      of the AESes or TWOFISH are in the prefs, we assume that the user
      can handle a MDC.  This is valid for PGP 7, which can handle MDCs
   /* The keys don't support MDC, so now we do a bit of a hack - if any
      of the AESes or TWOFISH are in the prefs, we assume that the user
      can handle a MDC.  This is valid for PGP 7, which can handle MDCs
@@ -174,14 +174,14 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
   compress_filter_context_t zfx;
   text_filter_context_t tfx;
   progress_filter_context_t *pfx;
   compress_filter_context_t zfx;
   text_filter_context_t tfx;
   progress_filter_context_t *pfx;
-  int do_compress = !RFC1991 && default_compress_algo();
+  int do_compress = !!default_compress_algo();
 
   pfx = new_progress_context ();
   memset( &cfx, 0, sizeof cfx);
   memset( &zfx, 0, sizeof zfx);
   memset( &tfx, 0, sizeof tfx);
   init_packet(&pkt);
 
   pfx = new_progress_context ();
   memset( &cfx, 0, sizeof cfx);
   memset( &zfx, 0, sizeof zfx);
   memset( &tfx, 0, sizeof tfx);
   init_packet(&pkt);
-    
+
   /* Prepare iobufs. */
   inp = iobuf_open(filename);
   if (inp)
   /* Prepare iobufs. */
   inp = iobuf_open(filename);
   if (inp)
@@ -195,30 +195,24 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
   if (!inp)
     {
       rc = gpg_error_from_syserror ();
   if (!inp)
     {
       rc = gpg_error_from_syserror ();
-      log_error(_("can't open `%s': %s\n"), filename? filename: "[stdin]",
+      log_error(_("can't open '%s': %s\n"), filename? filename: "[stdin]",
                 strerror(errno) );
       release_progress_context (pfx);
       return rc;
     }
                 strerror(errno) );
       release_progress_context (pfx);
       return rc;
     }
-  
+
   handle_progress (pfx, inp, filename);
   handle_progress (pfx, inp, filename);
-  
+
   if (opt.textmode)
     iobuf_push_filter( inp, text_filter, &tfx );
   if (opt.textmode)
     iobuf_push_filter( inp, text_filter, &tfx );
-  
-  /* Due the the fact that we use don't use an IV to encrypt the
-     session key we can't use the new mode with RFC1991 because it has
-     no S2K salt.  RFC1991 always uses simple S2K. */
-  if ( RFC1991 && use_seskey )
-    use_seskey = 0;
-    
+
   cfx.dek = NULL;
   cfx.dek = NULL;
-  if ( mode ) 
+  if ( mode )
     {
       int canceled;
     {
       int canceled;
-      
+
       s2k = xmalloc_clear( sizeof *s2k );
       s2k = xmalloc_clear( sizeof *s2k );
-      s2k->mode = RFC1991? 0:opt.s2k_mode;
+      s2k->mode = opt.s2k_mode;
       s2k->hash_algo = S2K_DIGEST_ALGO;
       cfx.dek = passphrase_to_dek (NULL, 0,
                                    default_cipher_algo(), s2k, 4,
       s2k->hash_algo = S2K_DIGEST_ALGO;
       cfx.dek = passphrase_to_dek (NULL, 0,
                                    default_cipher_algo(), s2k, 4,
@@ -233,38 +227,38 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
           release_progress_context (pfx);
           return rc;
         }
           release_progress_context (pfx);
           return rc;
         }
-      if (use_seskey && s2k->mode != 1 && s2k->mode != 3) 
+      if (use_seskey && s2k->mode != 1 && s2k->mode != 3)
         {
           use_seskey = 0;
           log_info (_("can't use a symmetric ESK packet "
                       "due to the S2K mode\n"));
         }
         {
           use_seskey = 0;
           log_info (_("can't use a symmetric ESK packet "
                       "due to the S2K mode\n"));
         }
-      
+
       if ( use_seskey )
         {
           DEK *dek = NULL;
       if ( use_seskey )
         {
           DEK *dek = NULL;
-        
+
           seskeylen = openpgp_cipher_get_algo_keylen (default_cipher_algo ());
           encrypt_seskey( cfx.dek, &dek, enckey );
           xfree( cfx.dek ); cfx.dek = dek;
         }
           seskeylen = openpgp_cipher_get_algo_keylen (default_cipher_algo ());
           encrypt_seskey( cfx.dek, &dek, enckey );
           xfree( cfx.dek ); cfx.dek = dek;
         }
-      
+
       if (opt.verbose)
         log_info(_("using cipher %s\n"),
                  openpgp_cipher_algo_name (cfx.dek->algo));
       if (opt.verbose)
         log_info(_("using cipher %s\n"),
                  openpgp_cipher_algo_name (cfx.dek->algo));
-      
+
       cfx.dek->use_mdc=use_mdc(NULL,cfx.dek->algo);
     }
       cfx.dek->use_mdc=use_mdc(NULL,cfx.dek->algo);
     }
-  
+
   if (do_compress && cfx.dek && cfx.dek->use_mdc
       && is_file_compressed(filename, &rc))
     {
       if (opt.verbose)
   if (do_compress && cfx.dek && cfx.dek->use_mdc
       && is_file_compressed(filename, &rc))
     {
       if (opt.verbose)
-        log_info(_("`%s' already compressed\n"), filename);
-      do_compress = 0;        
+        log_info(_("'%s' already compressed\n"), filename);
+      do_compress = 0;
     }
     }
-  
-  if ( rc || (rc = open_outfile (-1, filename, opt.armor? 1:0, &out )))
+
+  if ( rc || (rc = open_outfile (-1, filename, opt.armor? 1:0, 0, &out )))
     {
       iobuf_cancel (inp);
       xfree (cfx.dek);
     {
       iobuf_cancel (inp);
       xfree (cfx.dek);
@@ -272,14 +266,14 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
       release_progress_context (pfx);
       return rc;
     }
       release_progress_context (pfx);
       return rc;
     }
-  
+
   if ( opt.armor )
     {
       afx = new_armor_context ();
       push_armor_filter (afx, out);
     }
 
   if ( opt.armor )
     {
       afx = new_armor_context ();
       push_armor_filter (afx, out);
     }
 
-  if ( s2k && !RFC1991 )
+  if ( s2k )
     {
       PKT_symkey_enc *enc = xmalloc_clear( sizeof *enc + seskeylen + 1 );
       enc->version = 4;
     {
       PKT_symkey_enc *enc = xmalloc_clear( sizeof *enc + seskeylen + 1 );
       enc->version = 4;
@@ -293,10 +287,10 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
       pkt.pkttype = PKT_SYMKEY_ENC;
       pkt.pkt.symkey_enc = enc;
       if ((rc = build_packet( out, &pkt )))
       pkt.pkttype = PKT_SYMKEY_ENC;
       pkt.pkt.symkey_enc = enc;
       if ((rc = build_packet( out, &pkt )))
-        log_error("build symkey packet failed: %s\n", g10_errstr(rc) );
+        log_error("build symkey packet failed: %s\n", gpg_strerror (rc) );
       xfree (enc);
     }
       xfree (enc);
     }
-  
+
   if (!opt.no_literal)
     pt = setup_plaintext_name (filename, inp);
 
   if (!opt.no_literal)
     pt = setup_plaintext_name (filename, inp);
 
@@ -317,7 +311,7 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
 
       if ( !(tmpsize = iobuf_get_filelength(inp, &overflow))
            && !overflow && opt.verbose)
 
       if ( !(tmpsize = iobuf_get_filelength(inp, &overflow))
            && !overflow && opt.verbose)
-        log_info(_("WARNING: `%s' is an empty file\n"), filename );
+        log_info(_("WARNING: '%s' is an 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
       /* 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
@@ -335,7 +329,7 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
       pt->timestamp = make_timestamp();
       pt->mode = opt.textmode? 't' : 'b';
       pt->len = filesize;
       pt->timestamp = make_timestamp();
       pt->mode = opt.textmode? 't' : 'b';
       pt->len = filesize;
-      pt->new_ctb = !pt->len && !RFC1991;
+      pt->new_ctb = !pt->len;
       pt->buf = inp;
       pkt.pkttype = PKT_PLAINTEXT;
       pkt.pkt.plaintext = pt;
       pt->buf = inp;
       pkt.pkttype = PKT_PLAINTEXT;
       pkt.pkt.plaintext = pt;
@@ -347,7 +341,7 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
       pkt.pkttype = 0;
       pkt.pkt.generic = NULL;
     }
       pkt.pkttype = 0;
       pkt.pkt.generic = NULL;
     }
-  
+
   /* Register the cipher filter. */
   if (mode)
     iobuf_push_filter ( out, cipher_filter, &cfx );
   /* Register the cipher filter. */
   if (mode)
     iobuf_push_filter ( out, cipher_filter, &cfx );
@@ -359,14 +353,14 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
         zfx.new_ctb = 1;
       push_compress_filter (out, &zfx, default_compress_algo());
     }
         zfx.new_ctb = 1;
       push_compress_filter (out, &zfx, default_compress_algo());
     }
-  
+
   /* Do the work. */
   if (!opt.no_literal)
     {
       if ( (rc = build_packet( out, &pkt )) )
   /* Do the work. */
   if (!opt.no_literal)
     {
       if ( (rc = build_packet( out, &pkt )) )
-        log_error("build_packet failed: %s\n", g10_errstr(rc) );
+        log_error("build_packet failed: %s\n", gpg_strerror (rc) );
     }
     }
-  else 
+  else
     {
       /* User requested not to create a literal packet, so we copy the
          plain data.  */
     {
       /* User requested not to create a literal packet, so we copy the
          plain data.  */
@@ -380,12 +374,12 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
       }
     wipememory (copy_buffer, 4096); /* burn buffer */
     }
       }
     wipememory (copy_buffer, 4096); /* burn buffer */
     }
-  
+
   /* Finish the stuff.  */
   iobuf_close (inp);
   if (rc)
     iobuf_cancel(out);
   /* Finish the stuff.  */
   iobuf_close (inp);
   if (rc)
     iobuf_cancel(out);
-  else 
+  else
     {
       iobuf_close (out); /* fixme: check returncode */
       if (mode)
     {
       iobuf_close (out); /* fixme: check returncode */
       if (mode)
@@ -425,7 +419,7 @@ setup_symkey (STRING2KEY **symkey_s2k,DEK **symkey_dek)
 
 
 static int
 
 
 static int
-write_symkey_enc (STRING2KEY *symkey_s2k, DEK *symkey_dek, DEK *dek, 
+write_symkey_enc (STRING2KEY *symkey_s2k, DEK *symkey_dek, DEK *dek,
                   iobuf_t out)
 {
   int rc, seskeylen = openpgp_cipher_get_algo_keylen (dek->algo);
                   iobuf_t out)
 {
   int rc, seskeylen = openpgp_cipher_get_algo_keylen (dek->algo);
@@ -447,7 +441,7 @@ write_symkey_enc (STRING2KEY *symkey_s2k, DEK *symkey_dek, DEK *dek,
   pkt.pkt.symkey_enc = enc;
 
   if ((rc=build_packet(out,&pkt)))
   pkt.pkt.symkey_enc = enc;
 
   if ((rc=build_packet(out,&pkt)))
-    log_error("build symkey_enc packet failed: %s\n",g10_errstr(rc));
+    log_error("build symkey_enc packet failed: %s\n",gpg_strerror (rc));
 
   xfree(enc);
   return rc;
 
   xfree(enc);
   return rc;
@@ -459,6 +453,9 @@ write_symkey_enc (STRING2KEY *symkey_s2k, DEK *symkey_dek, DEK *dek,
  * supplied).  Either FILENAME or FILEFD must be given, but not both.
  * The caller may provide a checked list of public keys in
  * PROVIDED_PKS; if not the function builds a list of keys on its own.
  * supplied).  Either FILENAME or FILEFD must be given, but not both.
  * The caller may provide a checked list of public keys in
  * PROVIDED_PKS; if not the function builds a list of keys on its own.
+ *
+ * Note that FILEFD is currently only used by cmd_encrypt in the the
+ * not yet finished server.c.
  */
 int
 encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
  */
 int
 encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
@@ -478,13 +475,13 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
   compress_filter_context_t zfx;
   text_filter_context_t tfx;
   progress_filter_context_t *pfx;
   compress_filter_context_t zfx;
   text_filter_context_t tfx;
   progress_filter_context_t *pfx;
-  PK_LIST pk_list, work_list;
+  PK_LIST pk_list;
   int do_compress;
 
   if (filefd != -1 && filename)
   int do_compress;
 
   if (filefd != -1 && filename)
-    return gpg_error (GPG_ERR_INV_ARG);
+    return gpg_error (GPG_ERR_INV_ARG);  /* Both given.  */
 
 
-  do_compress = opt.compress_algo && !RFC1991;
+  do_compress = !!opt.compress_algo;
 
   pfx = new_progress_context ();
   memset( &cfx, 0, sizeof cfx);
 
   pfx = new_progress_context ();
   memset( &cfx, 0, sizeof cfx);
@@ -492,7 +489,7 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
   memset( &tfx, 0, sizeof tfx);
   init_packet(&pkt);
 
   memset( &tfx, 0, sizeof tfx);
   init_packet(&pkt);
 
-  if (use_symkey 
+  if (use_symkey
       && (rc=setup_symkey(&symkey_s2k,&symkey_dek)))
     {
       release_progress_context (pfx);
       && (rc=setup_symkey(&symkey_s2k,&symkey_dek)))
     {
       release_progress_context (pfx);
@@ -509,22 +506,19 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
           return rc;
         }
     }
           return rc;
         }
     }
-  
-  if(PGP2)
-    {
-      for (work_list=pk_list; work_list; work_list=work_list->next)
-        if (!(is_RSA (work_list->pk->pubkey_algo)
-              && nbits_from_pk (work_list->pk) <= 2048))
-          {
-            log_info(_("you can only encrypt to RSA keys of 2048 bits or "
-                       "less in --pgp2 mode\n"));
-            compliance_failure();
-            break;
-          }
-    }
 
   /* Prepare iobufs. */
 
   /* Prepare iobufs. */
+#ifdef HAVE_W32_SYSTEM
+  if (filefd == -1)
+    inp = iobuf_open_fd_or_name (GNUPG_INVALID_FD, filename, "rb");
+  else
+    {
+      inp = NULL;
+      gpg_err_set_errno (ENOSYS);
+    }
+#else
   inp = iobuf_open_fd_or_name (filefd, filename, "rb");
   inp = iobuf_open_fd_or_name (filefd, filename, "rb");
+#endif
   if (inp)
     iobuf_ioctl (inp, IOBUF_IOCTL_NO_CACHE, 1, NULL);
   if (inp && is_secured_file (iobuf_get_fd (inp)))
   if (inp)
     iobuf_ioctl (inp, IOBUF_IOCTL_NO_CACHE, 1, NULL);
   if (inp && is_secured_file (iobuf_get_fd (inp)))
@@ -544,33 +538,33 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
         strcpy (xname, "[stdin]");
       else
         *xname = 0;
         strcpy (xname, "[stdin]");
       else
         *xname = 0;
-      log_error (_("can't open `%s': %s\n"),
+      log_error (_("can't open '%s': %s\n"),
                  *xname? xname : filename, gpg_strerror (rc) );
       goto leave;
     }
 
   if (opt.verbose)
                  *xname? xname : filename, gpg_strerror (rc) );
       goto leave;
     }
 
   if (opt.verbose)
-    log_info (_("reading from `%s'\n"), iobuf_get_fname_nonnull (inp));
+    log_info (_("reading from '%s'\n"), iobuf_get_fname_nonnull (inp));
 
   handle_progress (pfx, inp, filename);
 
   if (opt.textmode)
     iobuf_push_filter (inp, text_filter, &tfx);
 
 
   handle_progress (pfx, inp, filename);
 
   if (opt.textmode)
     iobuf_push_filter (inp, text_filter, &tfx);
 
-  rc = open_outfile (outputfd, filename, opt.armor? 1:0, &out);
+  rc = open_outfile (outputfd, filename, opt.armor? 1:0, 0, &out);
   if (rc)
     goto leave;
   if (rc)
     goto leave;
-  
+
   if (opt.armor)
     {
       afx = new_armor_context ();
       push_armor_filter (afx, out);
     }
   if (opt.armor)
     {
       afx = new_armor_context ();
       push_armor_filter (afx, out);
     }
-  
+
   /* Create a session key. */
   cfx.dek = xmalloc_secure_clear (sizeof *cfx.dek);
   if (!opt.def_cipher_algo)
   /* Create a session key. */
   cfx.dek = xmalloc_secure_clear (sizeof *cfx.dek);
   if (!opt.def_cipher_algo)
-    { 
+    {
       /* Try to get it from the prefs.  */
       cfx.dek->algo = select_algo_from_prefs (pk_list, PREFTYPE_SYM, -1, NULL);
       /* The only way select_algo_from_prefs can fail here is when
       /* Try to get it from the prefs.  */
       cfx.dek->algo = select_algo_from_prefs (pk_list, PREFTYPE_SYM, -1, NULL);
       /* The only way select_algo_from_prefs can fail here is when
@@ -582,13 +576,6 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
       if (cfx.dek->algo == -1)
         {
           cfx.dek->algo = CIPHER_ALGO_3DES;
       if (cfx.dek->algo == -1)
         {
           cfx.dek->algo = CIPHER_ALGO_3DES;
-          
-          if (PGP2)
-            {
-              log_info(_("unable to use the IDEA cipher for all of the keys "
-                         "you are encrypting to.\n"));
-              compliance_failure();
-            }
         }
 
       /* In case 3DES has been selected, print a warning if any key
         }
 
       /* In case 3DES has been selected, print a warning if any key
@@ -610,12 +597,12 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
                    openpgp_cipher_algo_name (opt.def_cipher_algo),
                    opt.def_cipher_algo);
         }
                    openpgp_cipher_algo_name (opt.def_cipher_algo),
                    opt.def_cipher_algo);
         }
-      
+
       cfx.dek->algo = opt.def_cipher_algo;
     }
       cfx.dek->algo = opt.def_cipher_algo;
     }
-  
+
   cfx.dek->use_mdc = use_mdc (pk_list,cfx.dek->algo);
   cfx.dek->use_mdc = use_mdc (pk_list,cfx.dek->algo);
-  
+
   /* Only do the is-file-already-compressed check if we are using a
      MDC.  This forces compressed files to be re-compressed if we do
      not have a MDC to give some protection against chosen ciphertext
   /* Only do the is-file-already-compressed check if we are using a
      MDC.  This forces compressed files to be re-compressed if we do
      not have a MDC to give some protection against chosen ciphertext
@@ -624,8 +611,8 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
   if (do_compress && cfx.dek->use_mdc && is_file_compressed(filename, &rc2))
     {
       if (opt.verbose)
   if (do_compress && cfx.dek->use_mdc && is_file_compressed(filename, &rc2))
     {
       if (opt.verbose)
-        log_info(_("`%s' already compressed\n"), filename);
-      do_compress = 0;        
+        log_info(_("'%s' already compressed\n"), filename);
+      do_compress = 0;
     }
   if (rc2)
     {
     }
   if (rc2)
     {
@@ -634,9 +621,9 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
     }
 
   make_session_key (cfx.dek);
     }
 
   make_session_key (cfx.dek);
-  if (DBG_CIPHER)
+  if (DBG_CRYPTO)
     log_printhex ("DEK is: ", cfx.dek->key, cfx.dek->keylen );
     log_printhex ("DEK is: ", cfx.dek->key, cfx.dek->keylen );
-  
+
   rc = write_pubkey_enc_from_list (pk_list, cfx.dek, out);
   if (rc)
     goto leave;
   rc = write_pubkey_enc_from_list (pk_list, cfx.dek, out);
   if (rc)
     goto leave;
@@ -647,19 +634,20 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
      secret key needed to decrypt.  */
   if(use_symkey && (rc = write_symkey_enc(symkey_s2k,symkey_dek,cfx.dek,out)))
     goto leave;
      secret key needed to decrypt.  */
   if(use_symkey && (rc = write_symkey_enc(symkey_s2k,symkey_dek,cfx.dek,out)))
     goto leave;
-  
+
   if (!opt.no_literal)
     pt = setup_plaintext_name (filename, inp);
   if (!opt.no_literal)
     pt = setup_plaintext_name (filename, inp);
-  
-  if (filefd != -1
-      && !iobuf_is_pipe_filename (filename) && *filename && !opt.textmode )
+
+  /* Get the size of the file if possible, i.e., if it is a real file.  */
+  if (filename && *filename
+      && !iobuf_is_pipe_filename (filename) && !opt.textmode )
     {
       off_t tmpsize;
       int overflow;
     {
       off_t tmpsize;
       int overflow;
-      
+
       if ( !(tmpsize = iobuf_get_filelength(inp, &overflow))
            && !overflow && opt.verbose)
       if ( !(tmpsize = iobuf_get_filelength(inp, &overflow))
            && !overflow && opt.verbose)
-        log_info(_("WARNING: `%s' is an empty file\n"), filename );
+        log_info(_("WARNING: '%s' is an 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
       /* 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
@@ -672,12 +660,12 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
   else
     filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
 
   else
     filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
 
-  if (!opt.no_literal) 
+  if (!opt.no_literal)
     {
       pt->timestamp = make_timestamp();
       pt->mode = opt.textmode ? 't' : 'b';
       pt->len = filesize;
     {
       pt->timestamp = make_timestamp();
       pt->mode = opt.textmode ? 't' : 'b';
       pt->len = filesize;
-      pt->new_ctb = !pt->len && !RFC1991;
+      pt->new_ctb = !pt->len;
       pt->buf = inp;
       pkt.pkttype = PKT_PLAINTEXT;
       pkt.pkt.plaintext = pt;
       pt->buf = inp;
       pkt.pkttype = PKT_PLAINTEXT;
       pkt.pkt.plaintext = pt;
@@ -693,7 +681,7 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
   if (do_compress)
     {
       int compr_algo = opt.compress_algo;
   if (do_compress)
     {
       int compr_algo = opt.compress_algo;
-      
+
       if (compr_algo == -1)
         {
           compr_algo = select_algo_from_prefs (pk_list, PREFTYPE_ZIP, -1, NULL);
       if (compr_algo == -1)
         {
           compr_algo = select_algo_from_prefs (pk_list, PREFTYPE_ZIP, -1, NULL);
@@ -702,7 +690,7 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
           /* Theoretically impossible to get here since uncompressed
              is implicit.  */
         }
           /* Theoretically impossible to get here since uncompressed
              is implicit.  */
         }
-      else if (!opt.expert 
+      else if (!opt.expert
                && select_algo_from_prefs(pk_list, PREFTYPE_ZIP,
                                          compr_algo, NULL) != compr_algo)
         {
                && select_algo_from_prefs(pk_list, PREFTYPE_ZIP,
                                          compr_algo, NULL) != compr_algo)
         {
@@ -710,7 +698,7 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
                       " violates recipient preferences\n"),
                     compress_algo_to_string(compr_algo), compr_algo);
         }
                       " violates recipient preferences\n"),
                     compress_algo_to_string(compr_algo), compr_algo);
         }
-      
+
       /* Algo 0 means no compression. */
       if (compr_algo)
         {
       /* Algo 0 means no compression. */
       if (compr_algo)
         {
@@ -719,12 +707,12 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
           push_compress_filter (out,&zfx,compr_algo);
         }
     }
           push_compress_filter (out,&zfx,compr_algo);
         }
     }
-  
+
   /* Do the work. */
   if (!opt.no_literal)
     {
       if ((rc = build_packet( out, &pkt )))
   /* Do the work. */
   if (!opt.no_literal)
     {
       if ((rc = build_packet( out, &pkt )))
-        log_error ("build_packet failed: %s\n", g10_errstr(rc));
+        log_error ("build_packet failed: %s\n", gpg_strerror (rc));
     }
   else
     {
     }
   else
     {
@@ -750,7 +738,7 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
   iobuf_close (inp);
   if (rc)
     iobuf_cancel (out);
   iobuf_close (inp);
   if (rc)
     iobuf_cancel (out);
-  else 
+  else
     {
       iobuf_close (out); /* fixme: check returncode */
       write_status (STATUS_END_ENCRYPTION);
     {
       iobuf_close (out); /* fixme: check returncode */
       write_status (STATUS_END_ENCRYPTION);
@@ -779,7 +767,7 @@ encrypt_filter (void *opaque, int control,
   size_t size = *ret_len;
   encrypt_filter_context_t *efx = opaque;
   int rc = 0;
   size_t size = *ret_len;
   encrypt_filter_context_t *efx = opaque;
   int rc = 0;
-  
+
   if (control == IOBUFCTRL_UNDERFLOW) /* decrypt */
     {
       BUG(); /* not used */
   if (control == IOBUFCTRL_UNDERFLOW) /* decrypt */
     {
       BUG(); /* not used */
@@ -789,19 +777,19 @@ encrypt_filter (void *opaque, int control,
       if ( !efx->header_okay )
         {
           efx->cfx.dek = xmalloc_secure_clear ( sizeof *efx->cfx.dek );
       if ( !efx->header_okay )
         {
           efx->cfx.dek = xmalloc_secure_clear ( sizeof *efx->cfx.dek );
-          if ( !opt.def_cipher_algo  ) 
+          if ( !opt.def_cipher_algo  )
             {
               /* Try to get it from the prefs. */
               efx->cfx.dek->algo =
                 select_algo_from_prefs (efx->pk_list, PREFTYPE_SYM, -1, NULL);
             {
               /* Try to get it from the prefs. */
               efx->cfx.dek->algo =
                 select_algo_from_prefs (efx->pk_list, PREFTYPE_SYM, -1, NULL);
-              if (efx->cfx.dek->algo == -1 ) 
+              if (efx->cfx.dek->algo == -1 )
                 {
                   /* Because 3DES is implicitly in the prefs, this can
                      only happen if we do not have any public keys in
                      the list.  */
                   efx->cfx.dek->algo = DEFAULT_CIPHER_ALGO;
                 }
                 {
                   /* Because 3DES is implicitly in the prefs, this can
                      only happen if we do not have any public keys in
                      the list.  */
                   efx->cfx.dek->algo = DEFAULT_CIPHER_ALGO;
                 }
-              
+
               /* In case 3DES has been selected, print a warning if
                  any key does not have a preference for AES.  This
                  should help to indentify why encrypting to several
               /* In case 3DES has been selected, print a warning if
                  any key does not have a preference for AES.  This
                  should help to indentify why encrypting to several
@@ -810,7 +798,7 @@ encrypt_filter (void *opaque, int control,
                   && efx->cfx.dek->algo == CIPHER_ALGO_3DES)
                 warn_missing_aes_from_pklist (efx->pk_list);
            }
                   && efx->cfx.dek->algo == CIPHER_ALGO_3DES)
                 warn_missing_aes_from_pklist (efx->pk_list);
            }
-          else 
+          else
             {
              if (!opt.expert
                   && select_algo_from_prefs (efx->pk_list,PREFTYPE_SYM,
             {
              if (!opt.expert
                   && select_algo_from_prefs (efx->pk_list,PREFTYPE_SYM,
@@ -820,14 +808,14 @@ encrypt_filter (void *opaque, int control,
                           "violates recipient preferences\n"),
                         openpgp_cipher_algo_name (opt.def_cipher_algo),
                         opt.def_cipher_algo);
                           "violates recipient preferences\n"),
                         openpgp_cipher_algo_name (opt.def_cipher_algo),
                         opt.def_cipher_algo);
-              
+
              efx->cfx.dek->algo = opt.def_cipher_algo;
            }
              efx->cfx.dek->algo = opt.def_cipher_algo;
            }
-          
+
           efx->cfx.dek->use_mdc = use_mdc (efx->pk_list,efx->cfx.dek->algo);
           efx->cfx.dek->use_mdc = use_mdc (efx->pk_list,efx->cfx.dek->algo);
-          
+
           make_session_key ( efx->cfx.dek );
           make_session_key ( efx->cfx.dek );
-          if (DBG_CIPHER)
+          if (DBG_CRYPTO)
             log_printhex ("DEK is: ", efx->cfx.dek->key, efx->cfx.dek->keylen);
 
           rc = write_pubkey_enc_from_list (efx->pk_list, efx->cfx.dek, a);
             log_printhex ("DEK is: ", efx->cfx.dek->key, efx->cfx.dek->keylen);
 
           rc = write_pubkey_enc_from_list (efx->pk_list, efx->cfx.dek, a);
@@ -841,13 +829,13 @@ encrypt_filter (void *opaque, int control,
                if(rc)
                  return rc;
              }
                if(rc)
                  return rc;
              }
-            
+
            iobuf_push_filter (a, cipher_filter, &efx->cfx);
            iobuf_push_filter (a, cipher_filter, &efx->cfx);
-            
+
            efx->header_okay = 1;
        }
       rc = iobuf_write (a, buf, size);
            efx->header_okay = 1;
        }
       rc = iobuf_write (a, buf, size);
-      
+
     }
   else if (control == IOBUFCTRL_FREE)
     {
     }
   else if (control == IOBUFCTRL_FREE)
     {
@@ -876,27 +864,22 @@ write_pubkey_enc_from_list (PK_LIST pk_list, DEK *dek, iobuf_t out)
   for ( ; pk_list; pk_list = pk_list->next )
     {
       gcry_mpi_t frame;
   for ( ; pk_list; pk_list = pk_list->next )
     {
       gcry_mpi_t frame;
-      byte fp[MAX_FINGERPRINT_LEN]; 
-      size_t fpn;
 
       pk = pk_list->pk;
 
       pk = pk_list->pk;
-      
+
       print_pubkey_algo_note ( pk->pubkey_algo );
       enc = xmalloc_clear ( sizeof *enc );
       enc->pubkey_algo = pk->pubkey_algo;
       keyid_from_pk( pk, enc->keyid );
       print_pubkey_algo_note ( pk->pubkey_algo );
       enc = xmalloc_clear ( sizeof *enc );
       enc->pubkey_algo = pk->pubkey_algo;
       keyid_from_pk( pk, enc->keyid );
-      enc->throw_keyid = (opt.throw_keyid || (pk_list->flags&1));
+      enc->throw_keyid = (opt.throw_keyids || (pk_list->flags&1));
 
 
-      if (opt.throw_keyid && (PGP2 || PGP6 || PGP7 || PGP8))
+      if (opt.throw_keyids && (PGP6 || PGP7 || PGP8))
         {
           log_info(_("you may not use %s while in %s mode\n"),
         {
           log_info(_("you may not use %s while in %s mode\n"),
-                   "--throw-keyid",compliance_option_string());
+                   "--throw-keyids",compliance_option_string());
           compliance_failure();
         }
 
           compliance_failure();
         }
 
-      fingerprint_from_pk (pk, fp, &fpn);
-      assert (fpn == 20);
-
       /* Okay, what's going on: We have the session key somewhere in
        * the structure DEK and want to encode this session key in an
        * integer value of n bits. pubkey_nbits gives us the number of
       /* Okay, what's going on: We have the session key somewhere in
        * the structure DEK and want to encode this session key in an
        * integer value of n bits. pubkey_nbits gives us the number of
@@ -909,9 +892,9 @@ write_pubkey_enc_from_list (PK_LIST pk_list, DEK *dek, iobuf_t out)
        * for Elgamal).  We don't need frame anymore because we have
        * everything now in enc->data which is the passed to
        * build_packet().  */
        * for Elgamal).  We don't need frame anymore because we have
        * everything now in enc->data which is the passed to
        * build_packet().  */
-      frame = encode_session_key (pk->pubkey_algo, dek, 
+      frame = encode_session_key (pk->pubkey_algo, dek,
                                   pubkey_nbits (pk->pubkey_algo, pk->pkey));
                                   pubkey_nbits (pk->pubkey_algo, pk->pkey));
-      rc = pk_encrypt (pk->pubkey_algo, enc->data, frame, fp, pk->pkey);
+      rc = pk_encrypt (pk->pubkey_algo, enc->data, frame, pk, pk->pkey);
       gcry_mpi_release (frame);
       if (rc)
         log_error ("pubkey_encrypt failed: %s\n", gpg_strerror (rc) );
       gcry_mpi_release (frame);
       if (rc)
         log_error ("pubkey_encrypt failed: %s\n", gpg_strerror (rc) );
@@ -921,7 +904,7 @@ write_pubkey_enc_from_list (PK_LIST pk_list, DEK *dek, iobuf_t out)
             {
               char *ustr = get_user_id_string_native (enc->keyid);
               log_info (_("%s/%s encrypted for: \"%s\"\n"),
             {
               char *ustr = get_user_id_string_native (enc->keyid);
               log_info (_("%s/%s encrypted for: \"%s\"\n"),
-                        gcry_pk_algo_name (enc->pubkey_algo),
+                        openpgp_pk_algo_name (enc->pubkey_algo),
                         openpgp_cipher_algo_name (dek->algo),
                         ustr );
               xfree (ustr);
                         openpgp_cipher_algo_name (dek->algo),
                         ustr );
               xfree (ustr);
@@ -932,8 +915,8 @@ write_pubkey_enc_from_list (PK_LIST pk_list, DEK *dek, iobuf_t out)
           pkt.pkt.pubkey_enc = enc;
           rc = build_packet (out, &pkt);
           if (rc)
           pkt.pkt.pubkey_enc = enc;
           rc = build_packet (out, &pkt);
           if (rc)
-            log_error ("build_packet(pubkey_enc) failed: %s\n", 
-                       g10_errstr (rc));
+            log_error ("build_packet(pubkey_enc) failed: %s\n",
+                       gpg_strerror (rc));
        }
       free_pubkey_enc(enc);
       if (rc)
        }
       free_pubkey_enc(enc);
       if (rc)
@@ -951,9 +934,9 @@ encrypt_crypt_files (ctrl_t ctrl, int nfiles, char **files, strlist_t remusr)
   if (opt.outfile)
     {
       log_error(_("--output doesn't work for this command\n"));
   if (opt.outfile)
     {
       log_error(_("--output doesn't work for this command\n"));
-      return;        
+      return;
     }
     }
-    
+
   if (!nfiles)
     {
       char line[2048];
   if (!nfiles)
     {
       char line[2048];
@@ -970,8 +953,8 @@ encrypt_crypt_files (ctrl_t ctrl, int nfiles, char **files, strlist_t remusr)
           print_file_status(STATUS_FILE_START, line, 2);
           rc = encrypt_crypt (ctrl, -1, line, remusr, 0, NULL, -1);
           if (rc)
           print_file_status(STATUS_FILE_START, line, 2);
           rc = encrypt_crypt (ctrl, -1, line, remusr, 0, NULL, -1);
           if (rc)
-            log_error ("encryption of `%s' failed: %s\n",
-                       print_fname_stdin(line), g10_errstr(rc) );
+            log_error ("encryption of '%s' failed: %s\n",
+                       print_fname_stdin(line), gpg_strerror (rc) );
           write_status( STATUS_FILE_DONE );
         }
     }
           write_status( STATUS_FILE_DONE );
         }
     }
@@ -981,8 +964,8 @@ encrypt_crypt_files (ctrl_t ctrl, int nfiles, char **files, strlist_t remusr)
         {
           print_file_status(STATUS_FILE_START, *files, 2);
           if ( (rc = encrypt_crypt (ctrl, -1, *files, remusr, 0, NULL, -1)) )
         {
           print_file_status(STATUS_FILE_START, *files, 2);
           if ( (rc = encrypt_crypt (ctrl, -1, *files, remusr, 0, NULL, -1)) )
-            log_error("encryption of `%s' failed: %s\n",
-                      print_fname_stdin(*files), g10_errstr(rc) );
+            log_error("encryption of '%s' failed: %s\n",
+                      print_fname_stdin(*files), gpg_strerror (rc) );
           write_status( STATUS_FILE_DONE );
           files++;
         }
           write_status( STATUS_FILE_DONE );
           files++;
         }