[g10]
[gnupg.git] / g10 / mainproc.c
index 52c0092..31d3385 100644 (file)
@@ -1,12 +1,12 @@
 /* mainproc.c - handle packets
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
- *               2005, 2006 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+ *               2008, 2009 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -102,6 +100,12 @@ static void list_node( CTX c, KBNODE node );
 static void proc_tree( CTX c, KBNODE node );
 static int literals_seen;
 
+void
+reset_literals_seen(void)
+{
+  literals_seen=0;
+}
+
 static void
 release_list( CTX c )
 {
@@ -229,7 +233,7 @@ symkey_decrypt_seskey( DEK *dek, byte *seskey, size_t slen )
       return G10ERR_BAD_KEY;
     }
 
-  if (gcry_cipher_open (&hd, dek->algo, GCRY_CIPHER_MODE_CFB, 1))
+  if (openpgp_cipher_open (&hd, dek->algo, GCRY_CIPHER_MODE_CFB, 1))
       BUG ();
   if (gcry_cipher_setkey ( hd, dek->key, dek->keylen ))
     BUG ();
@@ -270,9 +274,9 @@ proc_symkey_enc( CTX c, PACKET *pkt )
     else if(!c->dek)
       {
         int algo = enc->cipher_algo;
-       const char *s = gcry_cipher_algo_name (algo);
+       const char *s = openpgp_cipher_algo_name (algo);
 
-       if (!gcry_cipher_test_algo (algo))
+       if (!openpgp_cipher_test_algo (algo))
          {
            if(!opt.quiet)
              {
@@ -307,7 +311,7 @@ proc_symkey_enc( CTX c, PACKET *pkt )
          }
        else
          {
-           c->dek = passphrase_to_dek (NULL, 0, algo, &enc->s2k, 0,
+           c->dek = passphrase_to_dek (NULL, 0, algo, &enc->s2k, 3,
                                         NULL, NULL);
            if(c->dek)
              {
@@ -373,10 +377,16 @@ proc_pubkey_enc( CTX c, PACKET *pkt )
        }
     }
     else if( is_ELGAMAL(enc->pubkey_algo)
-       || enc->pubkey_algo == PUBKEY_ALGO_DSA
-       || is_RSA(enc->pubkey_algo)  ) {
-      /* FIXME:  strore this all in a list and process it later */
-
+             || enc->pubkey_algo == PUBKEY_ALGO_DSA
+             || is_RSA(enc->pubkey_algo)
+             || enc->pubkey_algo == PUBKEY_ALGO_ELGAMAL) {
+      /* Note that we also allow type 20 Elgamal keys for decryption.
+         There are still a couple of those keys in active use as a
+         subkey.  */
+
+      /* FIXME: Store this all in a list and process it later so that
+         we can prioritize what key to use.  This gives a better user
+         experience if wildcard keyids are used.  */
        if ( !c->dek && ((!enc->keyid[0] && !enc->keyid[1])
                           || opt.try_all_secrets
                          || !seckey_available( enc->keyid )) ) {
@@ -459,8 +469,8 @@ print_pkenc_list( struct kidlist_item *list, int failed )
        if( list->reason == G10ERR_NO_SECKEY ) {
            if( is_status_enabled() ) {
                char buf[20];
-               sprintf(buf,"%08lX%08lX", (ulong)list->kid[0],
-                                         (ulong)list->kid[1] );
+               snprintf (buf, sizeof buf, "%08lX%08lX",
+                          (ulong)list->kid[0], (ulong)list->kid[1]);
                write_status_text( STATUS_NO_SECKEY, buf );
            }
        }
@@ -514,8 +524,8 @@ proc_encrypted( CTX c, PACKET *pkt )
            algo = opt.def_cipher_algo;
            if ( algo )
              log_info (_("assuming %s encrypted data\n"),
-                        gcry_cipher_algo_name (algo));
-           else if ( gcry_cipher_test_algo (CIPHER_ALGO_IDEA) )
+                        openpgp_cipher_algo_name (algo));
+           else if ( openpgp_cipher_test_algo (CIPHER_ALGO_IDEA) )
              {
                algo = opt.def_cipher_algo;
                if (!algo)
@@ -523,7 +533,7 @@ proc_encrypted( CTX c, PACKET *pkt )
                idea_cipher_warn(1);
                log_info (_("IDEA cipher unavailable, "
                            "optimistically attempting to use %s instead\n"),
-                         gcry_cipher_algo_name (algo));
+                         openpgp_cipher_algo_name (algo));
              }
            else
              {
@@ -538,7 +548,7 @@ proc_encrypted( CTX c, PACKET *pkt )
                log_info (_("assuming %s encrypted data\n"), "IDEA");
              }
 
-           c->dek = passphrase_to_dek ( NULL, 0, algo, s2k, 0, NULL, NULL );
+           c->dek = passphrase_to_dek ( NULL, 0, algo, s2k, 3, NULL, NULL );
            if (c->dek)
              c->dek->algo_info_printed = 1;
          }
@@ -1816,7 +1826,8 @@ check_sig_and_print( CTX c, KBNODE node )
 
                    if(opt.verify_options&VERIFY_SHOW_PHOTOS)
                      show_photos(un->pkt->pkt.user_id->attribs,
-                                 un->pkt->pkt.user_id->numattribs,pk,NULL);
+                                 un->pkt->pkt.user_id->numattribs,
+                                 pk,NULL,un->pkt->pkt.user_id);
                  }
 
                p=utf8_to_native(un->pkt->pkt.user_id->name,