Started to code a --server mode.
[gnupg.git] / g10 / pkclist.c
index 4c0ffd7..6588802 100644 (file)
@@ -1,4 +1,4 @@
-/* pkclist.c
+/* pkclist.c - create a list of public keys
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
  *               2006 Free Software Foundation, Inc.
  *
 #include <errno.h>
 #include <assert.h>
 
+#include "gpg.h"
 #include "options.h"
 #include "packet.h"
 #include "errors.h"
 #include "keydb.h"
-#include "memory.h"
 #include "util.h"
 #include "main.h"
 #include "trustdb.h"
@@ -73,10 +73,10 @@ do_show_revocation_reason( PKT_signature *sig )
 
        log_info( _("reason for revocation: ") );
        if( text )
-           fputs( text, log_stream() );
+           fputs( text, log_get_stream() );
        else
-           fprintf( log_stream(), "code=%02x", *p );
-       putc( '\n', log_stream() );
+           fprintf( log_get_stream(), "code=%02x", *p );
+       log_printf ("\n");
        n--; p++;
        pp = NULL;
        do {
@@ -88,9 +88,9 @@ do_show_revocation_reason( PKT_signature *sig )
            if( n ) {
                pp = memchr( p, '\n', n );
                nn = pp? pp - p : n;
-               log_info( _("revocation comment: ") );
-               print_string( log_stream(), p, nn, 0 );
-               putc( '\n', log_stream() );
+               log_info ( _("revocation comment: ") );
+               print_string ( log_get_stream(), p, nn, 0 );
+               log_printf ("\n");
                p += nn; n -= nn;
            }
        } while( pp );
@@ -363,7 +363,7 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
 int
 edit_ownertrust (PKT_public_key *pk, int mode )
 {
-  unsigned int trust = 0;  /* Needs to be initialized to avoid gcc warning. */
+  unsigned int trust = 0;
   int no_help = 0;
 
   for(;;)
@@ -613,7 +613,7 @@ check_signatures_trust( PKT_signature *sig )
       log_info(_("         The signature is probably a FORGERY.\n"));
       if (opt.with_fingerprint)
         print_fingerprint (pk, NULL, 1);
-      rc = G10ERR_BAD_SIGN;
+      rc = gpg_error (GPG_ERR_BAD_SIGNATURE);
       break;
 
     case TRUST_MARGINAL:
@@ -703,7 +703,7 @@ default_recipient(void)
 }
 
 static int
-expand_id(const char *id,STRLIST *into,unsigned int flags)
+expand_id(const char *id,strlist_t *into,unsigned int flags)
 {
   struct groupitem *groups;
   int count=0;
@@ -713,7 +713,7 @@ expand_id(const char *id,STRLIST *into,unsigned int flags)
       /* need strcasecmp() here, as this should be localized */
       if(strcasecmp(groups->name,id)==0)
        {
-         STRLIST each,sl;
+         strlist_t each,sl;
 
          /* this maintains the current utf8-ness */
          for(each=groups->values;each;each=each->next)
@@ -732,10 +732,10 @@ expand_id(const char *id,STRLIST *into,unsigned int flags)
 
 /* For simplicity, and to avoid potential loops, we only expand once -
    you can't make an alias that points to an alias. */
-static STRLIST
-expand_group(STRLIST input)
+static strlist_t
+expand_group(strlist_t input)
 {
-  STRLIST sl,output=NULL,rover;
+  strlist_t sl,output=NULL,rover;
 
   for(rover=input;rover;rover=rover->next)
     if(expand_id(rover->d,&output,rover->flags)==0)
@@ -771,13 +771,13 @@ expand_group(STRLIST input)
    not changed.
  */
 int
-build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
+build_pk_list( strlist_t rcpts, PK_LIST *ret_pk_list, unsigned int use )
 {
   PK_LIST pk_list = NULL;
   PKT_public_key *pk=NULL;
   int rc=0;
   int any_recipients=0;
-  STRLIST rov,remusr;
+  strlist_t rov,remusr;
   char *def_rec = NULL;
 
   /* Try to expand groups if any have been defined. */
@@ -824,7 +824,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
                                             rov->d, strlen (rov->d), -1);
               goto fail;
             }
-          else if ( !(rc=check_pubkey_algo2 (pk->pubkey_algo, use )) ) 
+          else if ( !(rc=openpgp_pk_test_algo2 (pk->pubkey_algo, use)) ) 
             {
               /* Skip the actual key if the key is already present
                * in the list.  Add it to our list if not. */
@@ -875,7 +875,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
     { 
       int have_def_rec;
       char *answer = NULL;
-      STRLIST backlog = NULL;
+      strlist_t backlog = NULL;
 
       if (pk_list)
         any_recipients = 1;
@@ -897,7 +897,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
           else if (backlog) 
             {
               /* This is part of our trick to expand and display groups. */
-              answer = pop_strlist (&backlog);
+              answer = strlist_pop (&backlog);
             }
           else
             {
@@ -958,7 +958,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
           rc = get_pubkey_byname( pk, answer, NULL, NULL, 0 );
           if (rc)
             tty_printf(_("No such user ID.\n"));
-          else if ( !(rc=check_pubkey_algo2(pk->pubkey_algo, use)) ) 
+          else if ( !(rc=openpgp_pk_test_algo2 (pk->pubkey_algo, use)) ) 
             {
               if ( have_def_rec )
                 {
@@ -1032,7 +1032,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
       rc = get_pubkey_byname (pk, def_rec, NULL, NULL, 1);
       if (rc)
         log_error(_("unknown default recipient \"%s\"\n"), def_rec );
-      else if ( !(rc=check_pubkey_algo2(pk->pubkey_algo, use)) ) 
+      else if ( !(rc=openpgp_pk_test_algo2(pk->pubkey_algo, use)) ) 
         {
           /* Mark any_recipients here since the default recipient
              would have been used if it wasn't already there.  It
@@ -1079,7 +1079,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
                                             -1);
               goto fail;
             }
-          else if ( !(rc=check_pubkey_algo2(pk->pubkey_algo, use )) ) 
+          else if ( !(rc=openpgp_pk_test_algo2(pk->pubkey_algo, use )) ) 
             {
               /* Key found and usable.  Check validity. */
               int trustlevel;
@@ -1186,7 +1186,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
    preference list, so I'm including it. -dms */
 
 int
-algo_available( preftype_t preftype, int algo, const union pref_hint *hint )
+algo_available( preftype_t preftype, int algo, const union pref_hint *hint)
 {
   if( preftype == PREFTYPE_SYM )
     {
@@ -1206,22 +1206,22 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint )
 
       /* PGP8 supports all the ciphers we do.. */
 
-      return algo && !check_cipher_algo( algo );
+      return algo && !openpgp_cipher_test_algo ( algo );
     }
   else if( preftype == PREFTYPE_HASH )
     {
-      if(hint && hint->digest_length)
+      if (hint && hint->digest_length)
        {
-         if(hint->digest_length!=20 || opt.flags.dsa2)
+         if (hint->digest_length!=20 || opt.flags.dsa2)
            {
              /* If --enable-dsa2 is set or the hash isn't 160 bits
                 (which implies DSA2), then we'll accept a hash that
                 is larger than we need.  Otherwise we won't accept
                 any hash that isn't exactly the right size. */
-             if(hint->digest_length > md_digest_length(algo))
+             if (hint->digest_length > gcry_md_get_algo_dlen (algo))
                return 0;
            }
-         else if(hint->digest_length != md_digest_length(algo))
+         else if (hint->digest_length != gcry_md_get_algo_dlen (algo))
            return 0;
        }
 
@@ -1237,7 +1237,7 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint )
                  && algo != DIGEST_ALGO_SHA256))
        return 0;
 
-      return algo && !check_digest_algo( algo );
+      return algo && !openpgp_md_test_algo (algo);
     }
   else if( preftype == PREFTYPE_ZIP )
     {
@@ -1259,8 +1259,8 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint )
  * Return -1 if we could not find an algorithm.
  */
 int
-select_algo_from_prefs(PK_LIST pk_list, int preftype,
-                      int request, const union pref_hint *hint)
+select_algo_from_prefs(PK_LIST pk_list, int preftype, int request,
+                       const union pref_hint *hint)
 {
     PK_LIST pkr;
     u32 bits[8];
@@ -1328,9 +1328,10 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype,
        }
 
 #if 0
-       log_debug("pref mask=%08lX%08lX%08lX%08lX%08lX%08lX%08lX%08lX\n",
+       log_debug("pref mask=%08lX%08lX%08lX%08lX%08lX%08lX%08lX%08lX (%s)\n",
               (ulong)mask[7], (ulong)mask[6], (ulong)mask[5], (ulong)mask[4],
-            (ulong)mask[3], (ulong)mask[2], (ulong)mask[1], (ulong)mask[0]);
+               (ulong)mask[3], (ulong)mask[2], (ulong)mask[1], (ulong)mask[0],
+               keystr_from_pk (pkr->pk));
 #endif
        for(i=0; i < 8; i++ )
            bits[i] &= mask[i];
@@ -1423,26 +1424,73 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype,
 }
 
 /*
- * Select the MDC flag from the pk_list.  We can only use MDC if all recipients
- * support this feature 
+ * Select the MDC flag from the pk_list.  We can only use MDC if all
+ * recipients support this feature.
  */
 int
 select_mdc_from_pklist (PK_LIST pk_list)
 {
-    PK_LIST pkr;
+  PK_LIST pkr;
 
-    if( !pk_list )
-       return 0;
+  if ( !pk_list )
+    return 0;
+  
+  for (pkr = pk_list; pkr; pkr = pkr->next) 
+    {
+      int mdc;
+      
+      if (pkr->pk->user_id) /* selected by user ID */
+        mdc = pkr->pk->user_id->flags.mdc;
+      else
+        mdc = pkr->pk->mdc_feature;
+      if (!mdc)
+        return 0;  /* At least one recipient does not support it. */
+    }
+  return 1; /* Can be used. */
+}
 
-    for (pkr = pk_list; pkr; pkr = pkr->next) {
-        int mdc;
 
-        if (pkr->pk->user_id) /* selected by user ID */
-            mdc = pkr->pk->user_id->flags.mdc;
-        else
-            mdc = pkr->pk->mdc_feature;
-        if (!mdc)
-            return 0; /* at least one recipient does not support it */
+/* Print a warning for all keys in PK_LIST missing the MDC feature. */
+void
+warn_missing_mdc_from_pklist (PK_LIST pk_list)
+{
+  PK_LIST pkr;
+  
+  for (pkr = pk_list; pkr; pkr = pkr->next) 
+    {
+      int mdc;
+
+      if (pkr->pk->user_id) /* selected by user ID */
+        mdc = pkr->pk->user_id->flags.mdc;
+      else
+        mdc = pkr->pk->mdc_feature;
+      if (!mdc)
+        log_info (_("Note: key %s has no %s feature\n"),
+                  keystr_from_pk (pkr->pk), "MDC");
+    }
+}
+
+void
+warn_missing_aes_from_pklist (PK_LIST pk_list)
+{
+  PK_LIST pkr;
+  for (pkr = pk_list; pkr; pkr = pkr->next) 
+    {
+      const prefitem_t *prefs;
+      int i;
+      int gotit = 0;
+
+      prefs = pkr->pk->user_id? pkr->pk->user_id->prefs : pkr->pk->prefs;
+      if (prefs)
+        {
+          for (i=0; !gotit && prefs[i].type; i++ )
+            if (prefs[i].type == PREFTYPE_SYM 
+                && prefs[i].value == CIPHER_ALGO_AES)
+              gotit++;
+       }
+      if (!gotit)
+        log_info (_("Note: key %s has no preference for %s\n"),
+                  keystr_from_pk (pkr->pk), "AES");
     }
-    return 1; /* can be used */
 }