LCOV - code coverage report
Current view: top level - g10 - getkey.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1024 1625 63.0 %
Date: 2016-12-01 18:37:21 Functions: 46 56 82.1 %

          Line data    Source code
       1             : /* getkey.c -  Get a key from the database
       2             :  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
       3             :  *               2007, 2008, 2010  Free Software Foundation, Inc.
       4             :  * Copyright (C) 2015, 2016 g10 Code GmbH
       5             :  *
       6             :  * This file is part of GnuPG.
       7             :  *
       8             :  * GnuPG is free software; you can redistribute it and/or modify
       9             :  * it under the terms of the GNU General Public License as published by
      10             :  * the Free Software Foundation; either version 3 of the License, or
      11             :  * (at your option) any later version.
      12             :  *
      13             :  * GnuPG is distributed in the hope that it will be useful,
      14             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      15             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16             :  * GNU General Public License for more details.
      17             :  *
      18             :  * You should have received a copy of the GNU General Public License
      19             :  * along with this program; if not, see <https://www.gnu.org/licenses/>.
      20             :  */
      21             : 
      22             : #include <config.h>
      23             : #include <stdio.h>
      24             : #include <stdlib.h>
      25             : #include <string.h>
      26             : #include <ctype.h>
      27             : 
      28             : #include "gpg.h"
      29             : #include "util.h"
      30             : #include "packet.h"
      31             : #include "iobuf.h"
      32             : #include "keydb.h"
      33             : #include "options.h"
      34             : #include "main.h"
      35             : #include "trustdb.h"
      36             : #include "i18n.h"
      37             : #include "keyserver-internal.h"
      38             : #include "call-agent.h"
      39             : #include "host2net.h"
      40             : #include "mbox-util.h"
      41             : #include "status.h"
      42             : 
      43             : #define MAX_PK_CACHE_ENTRIES   PK_UID_CACHE_SIZE
      44             : #define MAX_UID_CACHE_ENTRIES  PK_UID_CACHE_SIZE
      45             : 
      46             : #if MAX_PK_CACHE_ENTRIES < 2
      47             : #error We need the cache for key creation
      48             : #endif
      49             : 
      50             : /* Flags values returned by the lookup code.  Note that the values are
      51             :  * directly used by the KEY_CONSIDERED status line.  */
      52             : #define LOOKUP_NOT_SELECTED        (1<<0)
      53             : #define LOOKUP_ALL_SUBKEYS_EXPIRED (1<<1)  /* or revoked */
      54             : 
      55             : 
      56             : /* A context object used by the lookup functions.  */
      57             : struct getkey_ctx_s
      58             : {
      59             :   /* Part of the search criteria: whether the search is an exact
      60             :      search or not.  A search that is exact requires that a key or
      61             :      subkey meet all of the specified criteria.  A search that is not
      62             :      exact allows selecting a different key or subkey from the
      63             :      keyblock that matched the critera.  Further, an exact search
      64             :      returns the key or subkey that matched whereas a non-exact search
      65             :      typically returns the primary key.  See finish_lookup for
      66             :      details.  */
      67             :   int exact;
      68             : 
      69             :   /* Part of the search criteria: Whether the caller only wants keys
      70             :      with an available secret key.  This is used by getkey_next to get
      71             :      the next result with the same initial criteria.  */
      72             :   int want_secret;
      73             : 
      74             :   /* Part of the search criteria: The type of the requested key.  A
      75             :      mask of PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT.
      76             :      If non-zero, then for a key to match, it must implement one of
      77             :      the required uses.  */
      78             :   int req_usage;
      79             : 
      80             :   /* The database handle.  */
      81             :   KEYDB_HANDLE kr_handle;
      82             : 
      83             :   /* Whether we should call xfree() on the context when the context is
      84             :      released using getkey_end()).  */
      85             :   int not_allocated;
      86             : 
      87             :   /* This variable is used as backing store for strings which have
      88             :      their address used in ITEMS.  */
      89             :   strlist_t extra_list;
      90             : 
      91             :   /* Part of the search criteria: The low-level search specification
      92             :      as passed to keydb_search.  */
      93             :   int nitems;
      94             :   /* This must be the last element in the structure.  When we allocate
      95             :      the structure, we allocate it so that ITEMS can hold NITEMS.  */
      96             :   KEYDB_SEARCH_DESC items[1];
      97             : };
      98             : 
      99             : #if 0
     100             : static struct
     101             : {
     102             :   int any;
     103             :   int okay_count;
     104             :   int nokey_count;
     105             :   int error_count;
     106             : } lkup_stats[21];
     107             : #endif
     108             : 
     109             : typedef struct keyid_list
     110             : {
     111             :   struct keyid_list *next;
     112             :   char fpr[MAX_FINGERPRINT_LEN];
     113             :   u32 keyid[2];
     114             : } *keyid_list_t;
     115             : 
     116             : 
     117             : #if MAX_PK_CACHE_ENTRIES
     118             : typedef struct pk_cache_entry
     119             : {
     120             :   struct pk_cache_entry *next;
     121             :   u32 keyid[2];
     122             :   PKT_public_key *pk;
     123             : } *pk_cache_entry_t;
     124             : static pk_cache_entry_t pk_cache;
     125             : static int pk_cache_entries;    /* Number of entries in pk cache.  */
     126             : static int pk_cache_disabled;
     127             : #endif
     128             : 
     129             : #if MAX_UID_CACHE_ENTRIES < 5
     130             : #error we really need the userid cache
     131             : #endif
     132             : typedef struct user_id_db
     133             : {
     134             :   struct user_id_db *next;
     135             :   keyid_list_t keyids;
     136             :   int len;
     137             :   char name[1];
     138             : } *user_id_db_t;
     139             : static user_id_db_t user_id_db;
     140             : static int uid_cache_entries;   /* Number of entries in uid cache. */
     141             : 
     142             : static void merge_selfsigs (kbnode_t keyblock);
     143             : static int lookup (getkey_ctx_t ctx,
     144             :                    kbnode_t *ret_keyblock, kbnode_t *ret_found_key,
     145             :                    int want_secret);
     146             : static kbnode_t finish_lookup (kbnode_t keyblock,
     147             :                                unsigned int req_usage, int want_exact,
     148             :                                unsigned int *r_flags);
     149             : static void print_status_key_considered (kbnode_t keyblock, unsigned int flags);
     150             : 
     151             : 
     152             : #if 0
     153             : static void
     154             : print_stats ()
     155             : {
     156             :   int i;
     157             :   for (i = 0; i < DIM (lkup_stats); i++)
     158             :     {
     159             :       if (lkup_stats[i].any)
     160             :         es_fprintf (es_stderr,
     161             :                  "lookup stats: mode=%-2d  ok=%-6d  nokey=%-6d  err=%-6d\n",
     162             :                  i,
     163             :                  lkup_stats[i].okay_count,
     164             :                  lkup_stats[i].nokey_count, lkup_stats[i].error_count);
     165             :     }
     166             : }
     167             : #endif
     168             : 
     169             : 
     170             : /* Cache a copy of a public key in the public key cache.  PK is not
     171             :  * cached if caching is disabled (via getkey_disable_caches), if
     172             :  * PK->FLAGS.DONT_CACHE is set, we don't know how to derive a key id
     173             :  * from the public key (e.g., unsupported algorithm), or a key with
     174             :  * the key id is already in the cache.
     175             :  *
     176             :  * The public key packet is copied into the cache using
     177             :  * copy_public_key.  Thus, any secret parts are not copied, for
     178             :  * instance.
     179             :  *
     180             :  * This cache is filled by get_pubkey and is read by get_pubkey and
     181             :  * get_pubkey_fast.  */
     182             : void
     183         715 : cache_public_key (PKT_public_key * pk)
     184             : {
     185             : #if MAX_PK_CACHE_ENTRIES
     186             :   pk_cache_entry_t ce, ce2;
     187             :   u32 keyid[2];
     188             : 
     189         715 :   if (pk_cache_disabled)
     190           5 :     return;
     191             : 
     192         715 :   if (pk->flags.dont_cache)
     193           0 :     return;
     194             : 
     195         715 :   if (is_ELGAMAL (pk->pubkey_algo)
     196         475 :       || pk->pubkey_algo == PUBKEY_ALGO_DSA
     197         137 :       || pk->pubkey_algo == PUBKEY_ALGO_ECDSA
     198          89 :       || pk->pubkey_algo == PUBKEY_ALGO_EDDSA
     199          87 :       || pk->pubkey_algo == PUBKEY_ALGO_ECDH
     200          63 :       || is_RSA (pk->pubkey_algo))
     201             :     {
     202         715 :       keyid_from_pk (pk, keyid);
     203             :     }
     204             :   else
     205           0 :     return; /* Don't know how to get the keyid.  */
     206             : 
     207         753 :   for (ce = pk_cache; ce; ce = ce->next)
     208          43 :     if (ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1])
     209             :       {
     210           5 :         if (DBG_CACHE)
     211           0 :           log_debug ("cache_public_key: already in cache\n");
     212           5 :         return;
     213             :       }
     214             : 
     215         710 :   if (pk_cache_entries >= MAX_PK_CACHE_ENTRIES)
     216             :     {
     217             :       int n;
     218             : 
     219             :       /* Remove the last 50% of the entries.  */
     220           0 :       for (ce = pk_cache, n = 0; ce && n < pk_cache_entries/2; n++)
     221           0 :         ce = ce->next;
     222           0 :       if (ce && ce != pk_cache && ce->next)
     223             :         {
     224           0 :           ce2 = ce->next;
     225           0 :           ce->next = NULL;
     226           0 :           ce = ce2;
     227           0 :           for (; ce; ce = ce2)
     228             :             {
     229           0 :               ce2 = ce->next;
     230           0 :               free_public_key (ce->pk);
     231           0 :               xfree (ce);
     232           0 :               pk_cache_entries--;
     233             :             }
     234             :         }
     235           0 :       log_assert (pk_cache_entries < MAX_PK_CACHE_ENTRIES);
     236             :     }
     237         710 :   pk_cache_entries++;
     238         710 :   ce = xmalloc (sizeof *ce);
     239         710 :   ce->next = pk_cache;
     240         710 :   pk_cache = ce;
     241         710 :   ce->pk = copy_public_key (NULL, pk);
     242         710 :   ce->keyid[0] = keyid[0];
     243         710 :   ce->keyid[1] = keyid[1];
     244             : #endif
     245             : }
     246             : 
     247             : 
     248             : /* Return a const utf-8 string with the text "[User ID not found]".
     249             :    This function is required so that we don't need to switch gettext's
     250             :    encoding temporary.  */
     251             : static const char *
     252           5 : user_id_not_found_utf8 (void)
     253             : {
     254             :   static char *text;
     255             : 
     256           5 :   if (!text)
     257           3 :     text = native_to_utf8 (_("[User ID not found]"));
     258           5 :   return text;
     259             : }
     260             : 
     261             : 
     262             : 
     263             : /* Return the user ID from the given keyblock.
     264             :  * We use the primary uid flag which has been set by the merge_selfsigs
     265             :  * function.  The returned value is only valid as long as the given
     266             :  * keyblock is not changed.  */
     267             : static const char *
     268        1195 : get_primary_uid (KBNODE keyblock, size_t * uidlen)
     269             : {
     270             :   KBNODE k;
     271             :   const char *s;
     272             : 
     273        3253 :   for (k = keyblock; k; k = k->next)
     274             :     {
     275        3253 :       if (k->pkt->pkttype == PKT_USER_ID
     276        1599 :           && !k->pkt->pkt.user_id->attrib_data
     277        1599 :           && k->pkt->pkt.user_id->is_primary)
     278             :         {
     279        1195 :           *uidlen = k->pkt->pkt.user_id->len;
     280        1195 :           return k->pkt->pkt.user_id->name;
     281             :         }
     282             :     }
     283           0 :   s = user_id_not_found_utf8 ();
     284           0 :   *uidlen = strlen (s);
     285           0 :   return s;
     286             : }
     287             : 
     288             : 
     289             : static void
     290        1326 : release_keyid_list (keyid_list_t k)
     291             : {
     292        2652 :   while (k)
     293             :     {
     294           0 :       keyid_list_t k2 = k->next;
     295           0 :       xfree (k);
     296           0 :       k = k2;
     297             :     }
     298        1326 : }
     299             : 
     300             : /****************
     301             :  * Store the association of keyid and userid
     302             :  * Feed only public keys to this function.
     303             :  */
     304             : static void
     305        2521 : cache_user_id (KBNODE keyblock)
     306             : {
     307             :   user_id_db_t r;
     308             :   const char *uid;
     309             :   size_t uidlen;
     310        2521 :   keyid_list_t keyids = NULL;
     311             :   KBNODE k;
     312             : 
     313        9683 :   for (k = keyblock; k; k = k->next)
     314             :     {
     315        8488 :       if (k->pkt->pkttype == PKT_PUBLIC_KEY
     316        5967 :           || k->pkt->pkttype == PKT_PUBLIC_SUBKEY)
     317             :         {
     318        3796 :           keyid_list_t a = xmalloc_clear (sizeof *a);
     319             :           /* Hmmm: For a long list of keyids it might be an advantage
     320             :            * to append the keys.  */
     321        3796 :           fingerprint_from_pk (k->pkt->pkt.public_key, a->fpr, NULL);
     322        3796 :           keyid_from_pk (k->pkt->pkt.public_key, a->keyid);
     323             :           /* First check for duplicates.  */
     324        6405 :           for (r = user_id_db; r; r = r->next)
     325             :             {
     326             :               keyid_list_t b;
     327             : 
     328       10306 :               for (b = r->keyids; b; b = b->next)
     329             :                 {
     330        7697 :                   if (!memcmp (b->fpr, a->fpr, MAX_FINGERPRINT_LEN))
     331             :                     {
     332        1326 :                       if (DBG_CACHE)
     333           0 :                         log_debug ("cache_user_id: already in cache\n");
     334        1326 :                       release_keyid_list (keyids);
     335        1326 :                       xfree (a);
     336        1326 :                       return;
     337             :                     }
     338             :                 }
     339             :             }
     340             :           /* Now put it into the cache.  */
     341        2470 :           a->next = keyids;
     342        2470 :           keyids = a;
     343             :         }
     344             :     }
     345        1195 :   if (!keyids)
     346           0 :     BUG (); /* No key no fun.  */
     347             : 
     348             : 
     349        1195 :   uid = get_primary_uid (keyblock, &uidlen);
     350             : 
     351        1195 :   if (uid_cache_entries >= MAX_UID_CACHE_ENTRIES)
     352             :     {
     353             :       /* fixme: use another algorithm to free some cache slots */
     354           0 :       r = user_id_db;
     355           0 :       user_id_db = r->next;
     356           0 :       release_keyid_list (r->keyids);
     357           0 :       xfree (r);
     358           0 :       uid_cache_entries--;
     359             :     }
     360        1195 :   r = xmalloc (sizeof *r + uidlen - 1);
     361        1195 :   r->keyids = keyids;
     362        1195 :   r->len = uidlen;
     363        1195 :   memcpy (r->name, uid, r->len);
     364        1195 :   r->next = user_id_db;
     365        1195 :   user_id_db = r;
     366        1195 :   uid_cache_entries++;
     367             : }
     368             : 
     369             : 
     370             : /* Disable and drop the public key cache (which is filled by
     371             :    cache_public_key and get_pubkey).  Note: there is currently no way
     372             :    to reenable this cache.  */
     373             : void
     374         122 : getkey_disable_caches ()
     375             : {
     376             : #if MAX_PK_CACHE_ENTRIES
     377             :   {
     378             :     pk_cache_entry_t ce, ce2;
     379             : 
     380         122 :     for (ce = pk_cache; ce; ce = ce2)
     381             :       {
     382           0 :         ce2 = ce->next;
     383           0 :         free_public_key (ce->pk);
     384           0 :         xfree (ce);
     385             :       }
     386         122 :     pk_cache_disabled = 1;
     387         122 :     pk_cache_entries = 0;
     388         122 :     pk_cache = NULL;
     389             :   }
     390             : #endif
     391             :   /* fixme: disable user id cache ? */
     392         122 : }
     393             : 
     394             : 
     395             : void
     396           0 : pubkey_free (pubkey_t key)
     397             : {
     398           0 :   if (key)
     399             :     {
     400           0 :       xfree (key->pk);
     401           0 :       release_kbnode (key->keyblock);
     402           0 :       xfree (key);
     403             :     }
     404           0 : }
     405             : 
     406             : void
     407           0 : pubkeys_free (pubkey_t keys)
     408             : {
     409           0 :   while (keys)
     410             :     {
     411           0 :       pubkey_t next = keys->next;
     412           0 :       pubkey_free (keys);
     413           0 :       keys = next;
     414             :     }
     415           0 : }
     416             : 
     417             : /* Returns all keys that match the search specfication SEARCH_TERMS.
     418             : 
     419             :    This function also checks for and warns about duplicate entries in
     420             :    the keydb, which can occur if the user has configured multiple
     421             :    keyrings or keyboxes or if a keyring or keybox was corrupted.
     422             : 
     423             :    Note: SEARCH_TERMS will not be expanded (i.e., it may not be a
     424             :    group).
     425             : 
     426             :    USE is the operation for which the key is required.  It must be
     427             :    either PUBKEY_USAGE_ENC, PUBKEY_USAGE_SIG, PUBKEY_USAGE_CERT or
     428             :    PUBKEY_USAGE_AUTH.
     429             : 
     430             :    XXX: Currently, only PUBKEY_USAGE_ENC and PUBKEY_USAGE_SIG are
     431             :    implemented.
     432             : 
     433             :    INCLUDE_UNUSABLE indicates whether disabled keys are allowed.
     434             :    (Recipients specified with --encrypt-to and --hidden-encrypt-to may
     435             :    be disabled.  It is possible to edit disabled keys.)
     436             : 
     437             :    SOURCE is the context in which SEARCH_TERMS was specified, e.g.,
     438             :    "--encrypt-to", etc.  If this function is called interactively,
     439             :    then this should be NULL.
     440             : 
     441             :    If WARN_POSSIBLY_AMBIGUOUS is set, then emits a warning if the user
     442             :    does not specify a long key id or a fingerprint.
     443             : 
     444             :    The results are placed in *KEYS.  *KEYS must be NULL!  */
     445             : gpg_error_t
     446           0 : get_pubkeys (ctrl_t ctrl,
     447             :              char *search_terms, int use, int include_unusable, char *source,
     448             :              int warn_possibly_ambiguous,
     449             :              pubkey_t *r_keys)
     450             : {
     451             :   /* We show a warning when a key appears multiple times in the DB.
     452             :      This can happen for two reasons:
     453             : 
     454             :        - The user has configured multiple keyrings or keyboxes.
     455             : 
     456             :        - The keyring or keybox has been corrupted in some way, e.g., a
     457             :          bug or a random process changing them.
     458             : 
     459             :      For each duplicate, we only want to show the key once.  Hence,
     460             :      this list.  */
     461             :   static strlist_t key_dups;
     462             : 
     463             :   /* USE transformed to a string.  */
     464             :   char *use_str;
     465             : 
     466             :   gpg_error_t err;
     467             : 
     468             :   KEYDB_SEARCH_DESC desc;
     469             : 
     470             :   GETKEY_CTX ctx;
     471           0 :   pubkey_t results = NULL;
     472             :   pubkey_t r;
     473             : 
     474             :   int count;
     475             : 
     476             :   char fingerprint[2 * MAX_FINGERPRINT_LEN + 1];
     477             : 
     478           0 :   if (DBG_LOOKUP)
     479             :     {
     480           0 :       log_debug ("\n");
     481           0 :       log_debug ("%s: Checking %s=%s\n",
     482             :                  __func__, source ? source : "user input", search_terms);
     483             :     }
     484             : 
     485           0 :   if (*r_keys)
     486           0 :     log_bug ("%s: KEYS should be NULL!\n", __func__);
     487             : 
     488           0 :   switch (use)
     489             :     {
     490           0 :     case PUBKEY_USAGE_ENC: use_str = "encrypt"; break;
     491           0 :     case PUBKEY_USAGE_SIG: use_str = "sign"; break;
     492           0 :     case PUBKEY_USAGE_CERT: use_str = "cetify"; break;
     493           0 :     case PUBKEY_USAGE_AUTH: use_str = "authentication"; break;
     494           0 :     default: log_bug ("%s: Bad value for USE (%d)\n", __func__, use);
     495             :     }
     496             : 
     497           0 :   if (use == PUBKEY_USAGE_CERT || use == PUBKEY_USAGE_AUTH)
     498           0 :     log_bug ("%s: use=%s is unimplemented.\n", __func__, use_str);
     499             : 
     500           0 :   err = classify_user_id (search_terms, &desc, 1);
     501           0 :   if (err)
     502             :     {
     503           0 :       log_info (_("key \"%s\" not found: %s\n"),
     504             :                 search_terms, gpg_strerror (err));
     505           0 :       if (!opt.quiet && source)
     506           0 :         log_info (_("(check argument of option '%s')\n"), source);
     507           0 :       goto out;
     508             :     }
     509             : 
     510           0 :   if (warn_possibly_ambiguous
     511           0 :       && ! (desc.mode == KEYDB_SEARCH_MODE_LONG_KID
     512           0 :             || desc.mode == KEYDB_SEARCH_MODE_FPR16
     513           0 :             || desc.mode == KEYDB_SEARCH_MODE_FPR20
     514           0 :             || desc.mode == KEYDB_SEARCH_MODE_FPR))
     515             :     {
     516           0 :       log_info (_("Warning: '%s' should be a long key ID or a fingerprint\n"),
     517             :                 search_terms);
     518           0 :       if (!opt.quiet && source)
     519           0 :         log_info (_("(check argument of option '%s')\n"), source);
     520             :     }
     521             : 
     522             :   /* Gather all of the results.  */
     523           0 :   ctx = NULL;
     524           0 :   count = 0;
     525             :   do
     526             :     {
     527           0 :       PKT_public_key *pk = xmalloc_clear (sizeof *pk);
     528             :       KBNODE kb;
     529           0 :       pk->req_usage = use;
     530             : 
     531           0 :       if (! ctx)
     532           0 :         err = get_pubkey_byname (ctrl, &ctx, pk, search_terms, &kb, NULL,
     533             :                                  include_unusable, 1);
     534             :       else
     535           0 :         err = getkey_next (ctx, pk, &kb);
     536             : 
     537           0 :       if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
     538             :         /* No more results.   */
     539             :         {
     540           0 :           xfree (pk);
     541           0 :           break;
     542             :         }
     543           0 :       else if (err)
     544             :         /* An error (other than "not found").  */
     545             :         {
     546           0 :           log_error (_("error looking up: %s\n"),
     547             :                      gpg_strerror (err));
     548           0 :           xfree (pk);
     549           0 :           break;
     550             :         }
     551             : 
     552             :       /* Another result!  */
     553           0 :       count ++;
     554             : 
     555           0 :       r = xmalloc_clear (sizeof (*r));
     556           0 :       r->pk = pk;
     557           0 :       r->keyblock = kb;
     558           0 :       r->next = results;
     559           0 :       results = r;
     560             :     }
     561           0 :   while (ctx);
     562           0 :   getkey_end (ctx);
     563             : 
     564           0 :   if (DBG_LOOKUP)
     565             :     {
     566           0 :       log_debug ("%s resulted in %d matches.\n", search_terms, count);
     567           0 :       for (r = results; r; r = r->next)
     568           0 :         log_debug ("  %s\n",
     569           0 :                    hexfingerprint (r->keyblock->pkt->pkt.public_key,
     570             :                                    fingerprint, sizeof (fingerprint)));
     571             :     }
     572             : 
     573           0 :   if (! results && gpg_err_code (err) == GPG_ERR_NOT_FOUND)
     574             :     /* No match.  */
     575             :     {
     576           0 :       if (DBG_LOOKUP)
     577           0 :         log_debug ("%s: '%s' not found.\n", __func__, search_terms);
     578             : 
     579           0 :       log_info (_("key \"%s\" not found\n"), search_terms);
     580           0 :       if (!opt.quiet && source)
     581           0 :         log_info (_("(check argument of option '%s')\n"), source);
     582             : 
     583           0 :       goto out;
     584             :     }
     585           0 :   else if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
     586             :     /* No more matches.  */
     587             :     ;
     588           0 :   else if (err)
     589             :     /* Some other error.  An error message was already printed
     590             :        out.  Free RESULTS and continue.  */
     591           0 :     goto out;
     592             : 
     593             :   /* Check for duplicates.  */
     594           0 :   if (DBG_LOOKUP)
     595           0 :     log_debug ("%s: Checking results of %s='%s' for dups\n",
     596             :                __func__, source ? source : "user input", search_terms);
     597           0 :   count = 0;
     598           0 :   for (r = results; r; r = r->next)
     599             :     {
     600             :       pubkey_t *prevp;
     601             :       pubkey_t next;
     602             :       pubkey_t r2;
     603           0 :       int dups = 0;
     604             : 
     605           0 :       prevp = &r->next;
     606           0 :       next = r->next;
     607           0 :       while ((r2 = next))
     608             :         {
     609           0 :           if (cmp_public_keys (r->keyblock->pkt->pkt.public_key,
     610           0 :                                r2->keyblock->pkt->pkt.public_key) != 0)
     611             :             /* Not a dup.  */
     612             :             {
     613           0 :               prevp = &r2->next;
     614           0 :               next = r2->next;
     615           0 :               continue;
     616             :             }
     617             : 
     618           0 :           dups ++;
     619           0 :           count ++;
     620             : 
     621             :           /* Remove R2 from the list.  */
     622           0 :           *prevp = r2->next;
     623           0 :           release_kbnode (r2->keyblock);
     624           0 :           next = r2->next;
     625           0 :           xfree (r2);
     626             :         }
     627             : 
     628           0 :       if (dups)
     629             :         {
     630           0 :           hexfingerprint (r->keyblock->pkt->pkt.public_key,
     631             :                           fingerprint, sizeof fingerprint);
     632           0 :           if (! strlist_find (key_dups, fingerprint))
     633             :             {
     634             :               char fingerprint_formatted[MAX_FORMATTED_FINGERPRINT_LEN + 1];
     635             : 
     636           0 :               log_info (_("Warning: %s appears in the keyring %d times\n"),
     637             :                         format_hexfingerprint (fingerprint,
     638             :                                                fingerprint_formatted,
     639             :                                                sizeof fingerprint_formatted),
     640             :                         1 + dups);
     641           0 :               add_to_strlist (&key_dups, fingerprint);
     642             :             }
     643             :         }
     644             :     }
     645             : 
     646           0 :   if (DBG_LOOKUP && count)
     647             :     {
     648           0 :       log_debug ("After removing %d dups:\n", count);
     649           0 :       for (r = results, count = 0; r; r = r->next)
     650           0 :         log_debug ("  %d: %s\n",
     651             :                    count,
     652           0 :                    hexfingerprint (r->keyblock->pkt->pkt.public_key,
     653             :                                    fingerprint, sizeof fingerprint));
     654             :     }
     655             : 
     656             :  out:
     657           0 :   if (err)
     658           0 :     pubkeys_free (results);
     659             :   else
     660           0 :     *r_keys = results;
     661             : 
     662           0 :   return err;
     663             : }
     664             : 
     665             : 
     666             : static void
     667        1421 : pk_from_block (PKT_public_key *pk, kbnode_t keyblock, kbnode_t found_key)
     668             : {
     669        1421 :   kbnode_t a = found_key ? found_key : keyblock;
     670             : 
     671        1421 :   log_assert (a->pkt->pkttype == PKT_PUBLIC_KEY
     672             :               || a->pkt->pkttype == PKT_PUBLIC_SUBKEY);
     673             : 
     674        1421 :   copy_public_key (pk, a->pkt->pkt.public_key);
     675        1421 : }
     676             : 
     677             : 
     678             : /* Return the public key with the key id KEYID and store it at PK.
     679             :  * The resources in *PK should be released using
     680             :  * release_public_key_parts().  This function also stores a copy of
     681             :  * the public key in the user id cache (see cache_public_key).
     682             :  *
     683             :  * If PK is NULL, this function just stores the public key in the
     684             :  * cache and returns the usual return code.
     685             :  *
     686             :  * PK->REQ_USAGE (which is a mask of PUBKEY_USAGE_SIG,
     687             :  * PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT) is passed through to the
     688             :  * lookup function.  If this is non-zero, only keys with the specified
     689             :  * usage will be returned.  As such, it is essential that
     690             :  * PK->REQ_USAGE be correctly initialized!
     691             :  *
     692             :  * Returns 0 on success, GPG_ERR_NO_PUBKEY if there is no public key
     693             :  * with the specified key id, or another error code if an error
     694             :  * occurs.
     695             :  *
     696             :  * If the data was not read from the cache, then the self-signed data
     697             :  * has definitely been merged into the public key using
     698             :  * merge_selfsigs.  */
     699             : int
     700         919 : get_pubkey (PKT_public_key * pk, u32 * keyid)
     701             : {
     702         919 :   int internal = 0;
     703         919 :   int rc = 0;
     704             : 
     705             : #if MAX_PK_CACHE_ENTRIES
     706         919 :   if (pk)
     707             :     {
     708             :       /* Try to get it from the cache.  We don't do this when pk is
     709             :          NULL as it does not guarantee that the user IDs are
     710             :          cached. */
     711             :       pk_cache_entry_t ce;
     712         944 :       for (ce = pk_cache; ce; ce = ce->next)
     713             :         {
     714         238 :           if (ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1])
     715             :             /* XXX: We don't check PK->REQ_USAGE here, but if we don't
     716             :                read from the cache, we do check it!  */
     717             :             {
     718         200 :               copy_public_key (pk, ce->pk);
     719         200 :               return 0;
     720             :             }
     721             :         }
     722             :     }
     723             : #endif
     724             :   /* More init stuff.  */
     725         719 :   if (!pk)
     726             :     {
     727          13 :       pk = xmalloc_clear (sizeof *pk);
     728          13 :       internal++;
     729             :     }
     730             : 
     731             : 
     732             :   /* Do a lookup.  */
     733             :   {
     734             :     struct getkey_ctx_s ctx;
     735         719 :     KBNODE kb = NULL;
     736         719 :     KBNODE found_key = NULL;
     737         719 :     memset (&ctx, 0, sizeof ctx);
     738         719 :     ctx.exact = 1; /* Use the key ID exactly as given.  */
     739         719 :     ctx.not_allocated = 1;
     740         719 :     ctx.kr_handle = keydb_new ();
     741         719 :     if (!ctx.kr_handle)
     742             :       {
     743           0 :         rc = gpg_error_from_syserror ();
     744           0 :         goto leave;
     745             :       }
     746         719 :     ctx.nitems = 1;
     747         719 :     ctx.items[0].mode = KEYDB_SEARCH_MODE_LONG_KID;
     748         719 :     ctx.items[0].u.kid[0] = keyid[0];
     749         719 :     ctx.items[0].u.kid[1] = keyid[1];
     750         719 :     ctx.req_usage = pk->req_usage;
     751         719 :     rc = lookup (&ctx, &kb, &found_key, 0);
     752         719 :     if (!rc)
     753             :       {
     754         710 :         pk_from_block (pk, kb, found_key);
     755             :       }
     756         719 :     getkey_end (&ctx);
     757         719 :     release_kbnode (kb);
     758             :   }
     759         719 :   if (!rc)
     760         710 :     goto leave;
     761             : 
     762           9 :   rc = GPG_ERR_NO_PUBKEY;
     763             : 
     764             : leave:
     765         719 :   if (!rc)
     766         710 :     cache_public_key (pk);
     767         719 :   if (internal)
     768          13 :     free_public_key (pk);
     769         719 :   return rc;
     770             : }
     771             : 
     772             : 
     773             : /* Similar to get_pubkey, but it does not take PK->REQ_USAGE into
     774             :  * account nor does it merge in the self-signed data.  This function
     775             :  * also only considers primary keys.  It is intended to be used as a
     776             :  * quick check of the key to avoid recursion.  It should only be used
     777             :  * in very certain cases.  Like get_pubkey and unlike any of the other
     778             :  * lookup functions, this function also consults the user id cache
     779             :  * (see cache_public_key).
     780             :  *
     781             :  * Return the public key in *PK.  The resources in *PK should be
     782             :  * released using release_public_key_parts().  */
     783             : int
     784           3 : get_pubkey_fast (PKT_public_key * pk, u32 * keyid)
     785             : {
     786           3 :   int rc = 0;
     787             :   KEYDB_HANDLE hd;
     788             :   KBNODE keyblock;
     789             :   u32 pkid[2];
     790             : 
     791           3 :   log_assert (pk);
     792             : #if MAX_PK_CACHE_ENTRIES
     793             :   {
     794             :     /* Try to get it from the cache */
     795             :     pk_cache_entry_t ce;
     796             : 
     797           3 :     for (ce = pk_cache; ce; ce = ce->next)
     798             :       {
     799           0 :         if (ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1]
     800             :             /* Only consider primary keys.  */
     801           0 :             && ce->pk->keyid[0] == ce->pk->main_keyid[0]
     802           0 :             && ce->pk->keyid[1] == ce->pk->main_keyid[1])
     803             :           {
     804           0 :             if (pk)
     805           0 :               copy_public_key (pk, ce->pk);
     806           0 :             return 0;
     807             :           }
     808             :       }
     809             :   }
     810             : #endif
     811             : 
     812           3 :   hd = keydb_new ();
     813           3 :   if (!hd)
     814           0 :     return gpg_error_from_syserror ();
     815           3 :   rc = keydb_search_kid (hd, keyid);
     816           3 :   if (gpg_err_code (rc) == GPG_ERR_NOT_FOUND)
     817             :     {
     818           3 :       keydb_release (hd);
     819           3 :       return GPG_ERR_NO_PUBKEY;
     820             :     }
     821           0 :   rc = keydb_get_keyblock (hd, &keyblock);
     822           0 :   keydb_release (hd);
     823           0 :   if (rc)
     824             :     {
     825           0 :       log_error ("keydb_get_keyblock failed: %s\n", gpg_strerror (rc));
     826           0 :       return GPG_ERR_NO_PUBKEY;
     827             :     }
     828             : 
     829           0 :   log_assert (keyblock && keyblock->pkt
     830             :               && keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
     831             : 
     832             :   /* We return the primary key.  If KEYID matched a subkey, then we
     833             :      return an error.  */
     834           0 :   keyid_from_pk (keyblock->pkt->pkt.public_key, pkid);
     835           0 :   if (keyid[0] == pkid[0] && keyid[1] == pkid[1])
     836           0 :     copy_public_key (pk, keyblock->pkt->pkt.public_key);
     837             :   else
     838           0 :     rc = GPG_ERR_NO_PUBKEY;
     839             : 
     840           0 :   release_kbnode (keyblock);
     841             : 
     842             :   /* Not caching key here since it won't have all of the fields
     843             :      properly set. */
     844             : 
     845           0 :   return rc;
     846             : }
     847             : 
     848             : 
     849             : /* Return the key block for the key with key id KEYID or NULL, if an
     850             :  * error occurs.  Use release_kbnode() to release the key block.
     851             :  *
     852             :  * The self-signed data has already been merged into the public key
     853             :  * using merge_selfsigs.  */
     854             : kbnode_t
     855         720 : get_pubkeyblock (u32 * keyid)
     856             : {
     857             :   struct getkey_ctx_s ctx;
     858         720 :   int rc = 0;
     859         720 :   KBNODE keyblock = NULL;
     860             : 
     861         720 :   memset (&ctx, 0, sizeof ctx);
     862             :   /* No need to set exact here because we want the entire block.  */
     863         720 :   ctx.not_allocated = 1;
     864         720 :   ctx.kr_handle = keydb_new ();
     865         720 :   if (!ctx.kr_handle)
     866           0 :     return NULL;
     867         720 :   ctx.nitems = 1;
     868         720 :   ctx.items[0].mode = KEYDB_SEARCH_MODE_LONG_KID;
     869         720 :   ctx.items[0].u.kid[0] = keyid[0];
     870         720 :   ctx.items[0].u.kid[1] = keyid[1];
     871         720 :   rc = lookup (&ctx, &keyblock, NULL, 0);
     872         720 :   getkey_end (&ctx);
     873             : 
     874         720 :   return rc ? NULL : keyblock;
     875             : }
     876             : 
     877             : 
     878             : /* Return the public key with the key id KEYID iff the secret key is
     879             :  * available and store it at PK.  The resources should be released
     880             :  * using release_public_key_parts().
     881             :  *
     882             :  * Unlike other lookup functions, PK may not be NULL.  PK->REQ_USAGE
     883             :  * is passed through to the lookup function and is a mask of
     884             :  * PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT.  Thus, it
     885             :  * must be valid!  If this is non-zero, only keys with the specified
     886             :  * usage will be returned.
     887             :  *
     888             :  * Returns 0 on success.  If a public key with the specified key id is
     889             :  * not found or a secret key is not available for that public key, an
     890             :  * error code is returned.  Note: this function ignores legacy keys.
     891             :  * An error code is also return if an error occurs.
     892             :  *
     893             :  * The self-signed data has already been merged into the public key
     894             :  * using merge_selfsigs.  */
     895             : gpg_error_t
     896         269 : get_seckey (PKT_public_key *pk, u32 *keyid)
     897             : {
     898             :   gpg_error_t err;
     899             :   struct getkey_ctx_s ctx;
     900         269 :   kbnode_t keyblock = NULL;
     901         269 :   kbnode_t found_key = NULL;
     902             : 
     903         269 :   memset (&ctx, 0, sizeof ctx);
     904         269 :   ctx.exact = 1; /* Use the key ID exactly as given.  */
     905         269 :   ctx.not_allocated = 1;
     906         269 :   ctx.kr_handle = keydb_new ();
     907         269 :   if (!ctx.kr_handle)
     908           0 :     return gpg_error_from_syserror ();
     909         269 :   ctx.nitems = 1;
     910         269 :   ctx.items[0].mode = KEYDB_SEARCH_MODE_LONG_KID;
     911         269 :   ctx.items[0].u.kid[0] = keyid[0];
     912         269 :   ctx.items[0].u.kid[1] = keyid[1];
     913         269 :   ctx.req_usage = pk->req_usage;
     914         269 :   err = lookup (&ctx, &keyblock, &found_key, 1);
     915         269 :   if (!err)
     916             :     {
     917         269 :       pk_from_block (pk, keyblock, found_key);
     918             :     }
     919         269 :   getkey_end (&ctx);
     920         269 :   release_kbnode (keyblock);
     921             : 
     922         269 :   if (!err)
     923             :     {
     924         269 :       err = agent_probe_secret_key (/*ctrl*/NULL, pk);
     925         269 :       if (err)
     926           0 :         release_public_key_parts (pk);
     927             :     }
     928             : 
     929         269 :   return err;
     930             : }
     931             : 
     932             : 
     933             : /* Skip unusable keys.  A key is unusable if it is revoked, expired or
     934             :    disabled or if the selected user id is revoked or expired.  */
     935             : static int
     936         217 : skip_unusable (void *dummy, u32 * keyid, int uid_no)
     937             : {
     938         217 :   int unusable = 0;
     939             :   KBNODE keyblock;
     940             :   PKT_public_key *pk;
     941             : 
     942             :   (void) dummy;
     943             : 
     944         217 :   keyblock = get_pubkeyblock (keyid);
     945         217 :   if (!keyblock)
     946             :     {
     947           0 :       log_error ("error checking usability status of %s\n", keystr (keyid));
     948           0 :       goto leave;
     949             :     }
     950             : 
     951         217 :   pk = keyblock->pkt->pkt.public_key;
     952             : 
     953             :   /* Is the key revoked or expired?  */
     954         217 :   if (pk->flags.revoked || pk->has_expired)
     955           0 :     unusable = 1;
     956             : 
     957             :   /* Is the user ID in question revoked or expired? */
     958         217 :   if (!unusable && uid_no)
     959             :     {
     960             :       KBNODE node;
     961         132 :       int uids_seen = 0;
     962             : 
     963         264 :       for (node = keyblock; node; node = node->next)
     964             :         {
     965         264 :           if (node->pkt->pkttype == PKT_USER_ID)
     966             :             {
     967         132 :               PKT_user_id *user_id = node->pkt->pkt.user_id;
     968             : 
     969         132 :               uids_seen ++;
     970         132 :               if (uids_seen != uid_no)
     971           0 :                 continue;
     972             : 
     973         132 :               if (user_id->is_revoked || user_id->is_expired)
     974           0 :                 unusable = 1;
     975             : 
     976         132 :               break;
     977             :             }
     978             :         }
     979             : 
     980             :       /* If UID_NO is non-zero, then the keyblock better have at least
     981             :          that many UIDs.  */
     982         132 :       log_assert (uids_seen == uid_no);
     983             :     }
     984             : 
     985         217 :   if (!unusable)
     986         217 :     unusable = pk_is_disabled (pk);
     987             : 
     988             : leave:
     989         217 :   release_kbnode (keyblock);
     990         217 :   return unusable;
     991             : }
     992             : 
     993             : 
     994             : /* Search for keys matching some criteria.
     995             : 
     996             :    If RETCTX is not NULL, then the constructed context is returned in
     997             :    *RETCTX so that getpubkey_next can be used to get subsequent
     998             :    results.  In this case, getkey_end() must be used to free the
     999             :    search context.  If RETCTX is not NULL, then RET_KDBHD must be
    1000             :    NULL.
    1001             : 
    1002             :    If NAMELIST is not NULL, then a search query is constructed using
    1003             :    classify_user_id on each of the strings in the list.  (Recall: the
    1004             :    database does an OR of the terms, not an AND.)  If NAMELIST is
    1005             :    NULL, then all results are returned.
    1006             : 
    1007             :    If PK is not NULL, the public key of the first result is returned
    1008             :    in *PK.  Note: PK->REQ_USAGE must be valid!!!  If PK->REQ_USAGE is
    1009             :    set, it is used to filter the search results.  See the
    1010             :    documentation for finish_lookup to understand exactly how this is
    1011             :    used.  Note: The self-signed data has already been merged into the
    1012             :    public key using merge_selfsigs.  Free *PK by calling
    1013             :    release_public_key_parts (or, if PK was allocated using xfree, you
    1014             :    can use free_public_key, which calls release_public_key_parts(PK)
    1015             :    and then xfree(PK)).
    1016             : 
    1017             :    If WANT_SECRET is set, then only keys with an available secret key
    1018             :    (either locally or via key registered on a smartcard) are returned.
    1019             : 
    1020             :    If INCLUDE_UNUSABLE is set, then unusable keys (see the
    1021             :    documentation for skip_unusable for an exact definition) are
    1022             :    skipped unless they are looked up by key id or by fingerprint.
    1023             : 
    1024             :    If RET_KB is not NULL, the keyblock is returned in *RET_KB.  This
    1025             :    should be freed using release_kbnode().
    1026             : 
    1027             :    If RET_KDBHD is not NULL, then the new database handle used to
    1028             :    conduct the search is returned in *RET_KDBHD.  This can be used to
    1029             :    get subsequent results using keydb_search_next.  Note: in this
    1030             :    case, no advanced filtering is done for subsequent results (e.g.,
    1031             :    WANT_SECRET and PK->REQ_USAGE are not respected).
    1032             : 
    1033             :    This function returns 0 on success.  Otherwise, an error code is
    1034             :    returned.  In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
    1035             :    (if want_secret is set) is returned if the key is not found.  */
    1036             : static int
    1037         502 : key_byname (GETKEY_CTX *retctx, strlist_t namelist,
    1038             :             PKT_public_key *pk,
    1039             :             int want_secret, int include_unusable,
    1040             :             KBNODE * ret_kb, KEYDB_HANDLE * ret_kdbhd)
    1041             : {
    1042         502 :   int rc = 0;
    1043             :   int n;
    1044             :   strlist_t r;
    1045             :   GETKEY_CTX ctx;
    1046         502 :   KBNODE help_kb = NULL;
    1047         502 :   KBNODE found_key = NULL;
    1048             : 
    1049         502 :   if (retctx)
    1050             :     {
    1051             :       /* Reset the returned context in case of error.  */
    1052         366 :       log_assert (!ret_kdbhd); /* Not allowed because the handle is stored
    1053             :                                   in the context.  */
    1054         366 :       *retctx = NULL;
    1055             :     }
    1056         502 :   if (ret_kdbhd)
    1057           0 :     *ret_kdbhd = NULL;
    1058             : 
    1059         502 :   if (!namelist)
    1060             :     /* No search terms: iterate over the whole DB.  */
    1061             :     {
    1062          85 :       ctx = xmalloc_clear (sizeof *ctx);
    1063          85 :       ctx->nitems = 1;
    1064          85 :       ctx->items[0].mode = KEYDB_SEARCH_MODE_FIRST;
    1065          85 :       if (!include_unusable)
    1066          85 :         ctx->items[0].skipfnc = skip_unusable;
    1067             :     }
    1068             :   else
    1069             :     {
    1070             :       /* Build the search context.  */
    1071         837 :       for (n = 0, r = namelist; r; r = r->next)
    1072         420 :         n++;
    1073             : 
    1074             :       /* CTX has space for a single search term at the end.  Thus, we
    1075             :          need to allocate sizeof *CTX plus (n - 1) sizeof
    1076             :          CTX->ITEMS.  */
    1077         417 :       ctx = xmalloc_clear (sizeof *ctx + (n - 1) * sizeof ctx->items);
    1078         417 :       ctx->nitems = n;
    1079             : 
    1080         837 :       for (n = 0, r = namelist; r; r = r->next, n++)
    1081             :         {
    1082             :           gpg_error_t err;
    1083             : 
    1084         420 :           err = classify_user_id (r->d, &ctx->items[n], 1);
    1085             : 
    1086         420 :           if (ctx->items[n].exact)
    1087           3 :             ctx->exact = 1;
    1088         420 :           if (err)
    1089             :             {
    1090           0 :               xfree (ctx);
    1091           0 :               return gpg_err_code (err); /* FIXME: remove gpg_err_code.  */
    1092             :             }
    1093         420 :           if (!include_unusable
    1094         257 :               && ctx->items[n].mode != KEYDB_SEARCH_MODE_SHORT_KID
    1095         133 :               && ctx->items[n].mode != KEYDB_SEARCH_MODE_LONG_KID
    1096         133 :               && ctx->items[n].mode != KEYDB_SEARCH_MODE_FPR16
    1097         133 :               && ctx->items[n].mode != KEYDB_SEARCH_MODE_FPR20
    1098         132 :               && ctx->items[n].mode != KEYDB_SEARCH_MODE_FPR)
    1099         132 :             ctx->items[n].skipfnc = skip_unusable;
    1100             :         }
    1101             :     }
    1102             : 
    1103         502 :   ctx->want_secret = want_secret;
    1104         502 :   ctx->kr_handle = keydb_new ();
    1105         502 :   if (!ctx->kr_handle)
    1106             :     {
    1107           0 :       rc = gpg_error_from_syserror ();
    1108           0 :       getkey_end (ctx);
    1109           0 :       return rc;
    1110             :     }
    1111             : 
    1112         502 :   if (!ret_kb)
    1113         387 :     ret_kb = &help_kb;
    1114             : 
    1115         502 :   if (pk)
    1116             :     {
    1117         387 :       ctx->req_usage = pk->req_usage;
    1118             :     }
    1119             : 
    1120         502 :   rc = lookup (ctx, ret_kb, &found_key, want_secret);
    1121         502 :   if (!rc && pk)
    1122             :     {
    1123         387 :       pk_from_block (pk, *ret_kb, found_key);
    1124             :     }
    1125             : 
    1126         502 :   release_kbnode (help_kb);
    1127             : 
    1128         502 :   if (retctx) /* Caller wants the context.  */
    1129         366 :     *retctx = ctx;
    1130             :   else
    1131             :     {
    1132         136 :       if (ret_kdbhd)
    1133             :         {
    1134           0 :           *ret_kdbhd = ctx->kr_handle;
    1135           0 :           ctx->kr_handle = NULL;
    1136             :         }
    1137         136 :       getkey_end (ctx);
    1138             :     }
    1139             : 
    1140         502 :   return rc;
    1141             : }
    1142             : 
    1143             : 
    1144             : /* Find a public key identified by NAME.
    1145             :  *
    1146             :  * If name appears to be a valid valid RFC822 mailbox (i.e., email
    1147             :  * address) and auto key lookup is enabled (no_akl == 0), then the
    1148             :  * specified auto key lookup methods (--auto-key-lookup) are used to
    1149             :  * import the key into the local keyring.  Otherwise, just the local
    1150             :  * keyring is consulted.
    1151             :  *
    1152             :  * If RETCTX is not NULL, then the constructed context is returned in
    1153             :  * *RETCTX so that getpubkey_next can be used to get subsequent
    1154             :  * results.  In this case, getkey_end() must be used to free the
    1155             :  * search context.  If RETCTX is not NULL, then RET_KDBHD must be
    1156             :  * NULL.
    1157             :  *
    1158             :  * If PK is not NULL, the public key of the first result is returned
    1159             :  * in *PK.  Note: PK->REQ_USAGE must be valid!!!  PK->REQ_USAGE is
    1160             :  * passed through to the lookup function and is a mask of
    1161             :  * PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT.  If this
    1162             :  * is non-zero, only keys with the specified usage will be returned.
    1163             :  * Note: The self-signed data has already been merged into the public
    1164             :  * key using merge_selfsigs.  Free *PK by calling
    1165             :  * release_public_key_parts (or, if PK was allocated using xfree, you
    1166             :  * can use free_public_key, which calls release_public_key_parts(PK)
    1167             :  * and then xfree(PK)).
    1168             :  *
    1169             :  * NAME is a string, which is turned into a search query using
    1170             :  * classify_user_id.
    1171             :  *
    1172             :  * If RET_KEYBLOCK is not NULL, the keyblock is returned in
    1173             :  * *RET_KEYBLOCK.  This should be freed using release_kbnode().
    1174             :  *
    1175             :  * If RET_KDBHD is not NULL, then the new database handle used to
    1176             :  * conduct the search is returned in *RET_KDBHD.  This can be used to
    1177             :  * get subsequent results using keydb_search_next or to modify the
    1178             :  * returned record.  Note: in this case, no advanced filtering is done
    1179             :  * for subsequent results (e.g., PK->REQ_USAGE is not respected).
    1180             :  * Unlike RETCTX, this is always returned.
    1181             :  *
    1182             :  * If INCLUDE_UNUSABLE is set, then unusable keys (see the
    1183             :  * documentation for skip_unusable for an exact definition) are
    1184             :  * skipped unless they are looked up by key id or by fingerprint.
    1185             :  *
    1186             :  * If NO_AKL is set, then the auto key locate functionality is
    1187             :  * disabled and only the local key ring is considered.  Note: the
    1188             :  * local key ring is consulted even if local is not in the
    1189             :  * --auto-key-locate option list!
    1190             :  *
    1191             :  * This function returns 0 on success.  Otherwise, an error code is
    1192             :  * returned.  In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
    1193             :  * (if want_secret is set) is returned if the key is not found.  */
    1194             : int
    1195         288 : get_pubkey_byname (ctrl_t ctrl, GETKEY_CTX * retctx, PKT_public_key * pk,
    1196             :                    const char *name, KBNODE * ret_keyblock,
    1197             :                    KEYDB_HANDLE * ret_kdbhd, int include_unusable, int no_akl)
    1198             : {
    1199             :   int rc;
    1200         288 :   strlist_t namelist = NULL;
    1201             :   struct akl *akl;
    1202             :   int is_mbox;
    1203         288 :   int nodefault = 0;
    1204         288 :   int anylocalfirst = 0;
    1205             : 
    1206             :   /* If RETCTX is not NULL, then RET_KDBHD must be NULL.  */
    1207         288 :   log_assert (retctx == NULL || ret_kdbhd == NULL);
    1208             : 
    1209         288 :   if (retctx)
    1210         283 :     *retctx = NULL;
    1211             : 
    1212             :   /* Does NAME appear to be a mailbox (mail address)?  */
    1213         288 :   is_mbox = is_valid_mailbox (name);
    1214             : 
    1215             :   /* The auto-key-locate feature works as follows: there are a number
    1216             :    * of methods to look up keys.  By default, the local keyring is
    1217             :    * tried first.  Then, each method listed in the --auto-key-locate is
    1218             :    * tried in the order it appears.
    1219             :    *
    1220             :    * This can be changed as follows:
    1221             :    *
    1222             :    *   - if nodefault appears anywhere in the list of options, then
    1223             :    *     the local keyring is not tried first, or,
    1224             :    *
    1225             :    *   - if local appears anywhere in the list of options, then the
    1226             :    *     local keyring is not tried first, but in the order in which
    1227             :    *     it was listed in the --auto-key-locate option.
    1228             :    *
    1229             :    * Note: we only save the search context in RETCTX if the local
    1230             :    * method is the first method tried (either explicitly or
    1231             :    * implicitly).  */
    1232         288 :   if (!no_akl)
    1233             :     {
    1234             :       /* auto-key-locate is enabled.  */
    1235             : 
    1236             :       /* nodefault is true if "nodefault" or "local" appear.  */
    1237         282 :       for (akl = opt.auto_key_locate; akl; akl = akl->next)
    1238           0 :         if (akl->type == AKL_NODEFAULT || akl->type == AKL_LOCAL)
    1239             :           {
    1240           0 :             nodefault = 1;
    1241           0 :             break;
    1242             :           }
    1243             :       /* anylocalfirst is true if "local" appears before any other
    1244             :          search methods (except "nodefault").  */
    1245         282 :       for (akl = opt.auto_key_locate; akl; akl = akl->next)
    1246           0 :         if (akl->type != AKL_NODEFAULT)
    1247             :           {
    1248           0 :             if (akl->type == AKL_LOCAL)
    1249           0 :               anylocalfirst = 1;
    1250           0 :             break;
    1251             :           }
    1252             :     }
    1253             : 
    1254         288 :   if (!nodefault)
    1255             :     {
    1256             :       /* "nodefault" didn't occur.  Thus, "local" is implicitly the
    1257             :        *  first method to try.  */
    1258         288 :       anylocalfirst = 1;
    1259             :     }
    1260             : 
    1261         288 :   if (nodefault && is_mbox)
    1262             :     {
    1263             :       /* Either "nodefault" or "local" (explicitly) appeared in the
    1264             :        * auto key locate list and NAME appears to be an email address.
    1265             :        * Don't try the local keyring.  */
    1266           0 :       rc = GPG_ERR_NO_PUBKEY;
    1267             :     }
    1268             :   else
    1269             :     {
    1270             :       /* Either "nodefault" and "local" don't appear in the auto key
    1271             :        * locate list (in which case we try the local keyring first) or
    1272             :        * NAME does not appear to be an email address (in which case we
    1273             :        * only try the local keyring).  In this case, lookup NAME in
    1274             :        * the local keyring.  */
    1275         288 :       add_to_strlist (&namelist, name);
    1276         288 :       rc = key_byname (retctx, namelist, pk, 0,
    1277             :                        include_unusable, ret_keyblock, ret_kdbhd);
    1278             :     }
    1279             : 
    1280             :   /* If the requested name resembles a valid mailbox and automatic
    1281             :      retrieval has been enabled, we try to import the key. */
    1282         288 :   if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY && !no_akl && is_mbox)
    1283             :     {
    1284             :       /* NAME wasn't present in the local keyring (or we didn't try
    1285             :        * the local keyring).  Since the auto key locate feature is
    1286             :        * enabled and NAME appears to be an email address, try the auto
    1287             :        * locate feature.  */
    1288           0 :       for (akl = opt.auto_key_locate; akl; akl = akl->next)
    1289             :         {
    1290           0 :           unsigned char *fpr = NULL;
    1291             :           size_t fpr_len;
    1292           0 :           int did_akl_local = 0;
    1293           0 :           int no_fingerprint = 0;
    1294           0 :           const char *mechanism = "?";
    1295             : 
    1296           0 :           switch (akl->type)
    1297             :             {
    1298             :             case AKL_NODEFAULT:
    1299             :               /* This is a dummy mechanism.  */
    1300           0 :               mechanism = "None";
    1301           0 :               rc = GPG_ERR_NO_PUBKEY;
    1302           0 :               break;
    1303             : 
    1304             :             case AKL_LOCAL:
    1305           0 :               mechanism = "Local";
    1306           0 :               did_akl_local = 1;
    1307           0 :               if (retctx)
    1308             :                 {
    1309           0 :                   getkey_end (*retctx);
    1310           0 :                   *retctx = NULL;
    1311             :                 }
    1312           0 :               add_to_strlist (&namelist, name);
    1313           0 :               rc = key_byname (anylocalfirst ? retctx : NULL,
    1314             :                                namelist, pk, 0,
    1315             :                                include_unusable, ret_keyblock, ret_kdbhd);
    1316           0 :               break;
    1317             : 
    1318             :             case AKL_CERT:
    1319           0 :               mechanism = "DNS CERT";
    1320           0 :               glo_ctrl.in_auto_key_retrieve++;
    1321           0 :               rc = keyserver_import_cert (ctrl, name, 0, &fpr, &fpr_len);
    1322           0 :               glo_ctrl.in_auto_key_retrieve--;
    1323           0 :               break;
    1324             : 
    1325             :             case AKL_PKA:
    1326           0 :               mechanism = "PKA";
    1327           0 :               glo_ctrl.in_auto_key_retrieve++;
    1328           0 :               rc = keyserver_import_pka (ctrl, name, &fpr, &fpr_len);
    1329           0 :               glo_ctrl.in_auto_key_retrieve--;
    1330           0 :               break;
    1331             : 
    1332             :             case AKL_DANE:
    1333           0 :               mechanism = "DANE";
    1334           0 :               glo_ctrl.in_auto_key_retrieve++;
    1335           0 :               rc = keyserver_import_cert (ctrl, name, 1, &fpr, &fpr_len);
    1336           0 :               glo_ctrl.in_auto_key_retrieve--;
    1337           0 :               break;
    1338             : 
    1339             :             case AKL_WKD:
    1340           0 :               mechanism = "WKD";
    1341           0 :               glo_ctrl.in_auto_key_retrieve++;
    1342           0 :               rc = keyserver_import_wkd (ctrl, name, 0, &fpr, &fpr_len);
    1343           0 :               glo_ctrl.in_auto_key_retrieve--;
    1344           0 :               break;
    1345             : 
    1346             :             case AKL_LDAP:
    1347           0 :               mechanism = "LDAP";
    1348           0 :               glo_ctrl.in_auto_key_retrieve++;
    1349           0 :               rc = keyserver_import_ldap (ctrl, name, &fpr, &fpr_len);
    1350           0 :               glo_ctrl.in_auto_key_retrieve--;
    1351           0 :               break;
    1352             : 
    1353             :             case AKL_KEYSERVER:
    1354             :               /* Strictly speaking, we don't need to only use a valid
    1355             :                * mailbox for the getname search, but it helps cut down
    1356             :                * on the problem of searching for something like "john"
    1357             :                * and getting a whole lot of keys back. */
    1358           0 :               if (keyserver_any_configured (ctrl))
    1359             :                 {
    1360           0 :                   mechanism = "keyserver";
    1361           0 :                   glo_ctrl.in_auto_key_retrieve++;
    1362           0 :                   rc = keyserver_import_name (ctrl, name, &fpr, &fpr_len,
    1363             :                                               opt.keyserver);
    1364           0 :                   glo_ctrl.in_auto_key_retrieve--;
    1365             :                 }
    1366             :               else
    1367             :                 {
    1368           0 :                   mechanism = "Unconfigured keyserver";
    1369           0 :                   rc = GPG_ERR_NO_PUBKEY;
    1370             :                 }
    1371           0 :               break;
    1372             : 
    1373             :             case AKL_SPEC:
    1374             :               {
    1375             :                 struct keyserver_spec *keyserver;
    1376             : 
    1377           0 :                 mechanism = akl->spec->uri;
    1378           0 :                 keyserver = keyserver_match (akl->spec);
    1379           0 :                 glo_ctrl.in_auto_key_retrieve++;
    1380           0 :                 rc = keyserver_import_name (ctrl,
    1381             :                                             name, &fpr, &fpr_len, keyserver);
    1382           0 :                 glo_ctrl.in_auto_key_retrieve--;
    1383             :               }
    1384           0 :               break;
    1385             :             }
    1386             : 
    1387             :           /* Use the fingerprint of the key that we actually fetched.
    1388             :            * This helps prevent problems where the key that we fetched
    1389             :            * doesn't have the same name that we used to fetch it.  In
    1390             :            * the case of CERT and PKA, this is an actual security
    1391             :            * requirement as the URL might point to a key put in by an
    1392             :            * attacker.  By forcing the use of the fingerprint, we
    1393             :            * won't use the attacker's key here. */
    1394           0 :           if (!rc && fpr)
    1395           0 :             {
    1396             :               char fpr_string[MAX_FINGERPRINT_LEN * 2 + 1];
    1397             : 
    1398           0 :               log_assert (fpr_len <= MAX_FINGERPRINT_LEN);
    1399             : 
    1400           0 :               free_strlist (namelist);
    1401           0 :               namelist = NULL;
    1402             : 
    1403           0 :               bin2hex (fpr, fpr_len, fpr_string);
    1404             : 
    1405           0 :               if (opt.verbose)
    1406           0 :                 log_info ("auto-key-locate found fingerprint %s\n",
    1407             :                           fpr_string);
    1408             : 
    1409           0 :               add_to_strlist (&namelist, fpr_string);
    1410             :             }
    1411           0 :           else if (!rc && !fpr && !did_akl_local)
    1412             :             { /* The acquisition method said no failure occurred, but
    1413             :                * it didn't return a fingerprint.  That's a failure.  */
    1414           0 :               no_fingerprint = 1;
    1415           0 :               rc = GPG_ERR_NO_PUBKEY;
    1416             :             }
    1417           0 :           xfree (fpr);
    1418           0 :           fpr = NULL;
    1419             : 
    1420           0 :           if (!rc && !did_akl_local)
    1421             :             { /* There was no error and we didn't do a local lookup.
    1422             :                * This means that we imported a key into the local
    1423             :                * keyring.  Try to read the imported key from the
    1424             :                * keyring.  */
    1425           0 :               if (retctx)
    1426             :                 {
    1427           0 :                   getkey_end (*retctx);
    1428           0 :                   *retctx = NULL;
    1429             :                 }
    1430           0 :               rc = key_byname (anylocalfirst ? retctx : NULL,
    1431             :                                namelist, pk, 0,
    1432             :                                include_unusable, ret_keyblock, ret_kdbhd);
    1433             :             }
    1434           0 :           if (!rc)
    1435             :             {
    1436             :               /* Key found.  */
    1437           0 :               log_info (_("automatically retrieved '%s' via %s\n"),
    1438             :                         name, mechanism);
    1439           0 :               break;
    1440             :             }
    1441           0 :           if (gpg_err_code (rc) != GPG_ERR_NO_PUBKEY
    1442           0 :               || opt.verbose || no_fingerprint)
    1443           0 :             log_info (_("error retrieving '%s' via %s: %s\n"),
    1444             :                       name, mechanism,
    1445           0 :                       no_fingerprint ? _("No fingerprint") : gpg_strerror (rc));
    1446             :         }
    1447             :     }
    1448             : 
    1449             : 
    1450         288 :   if (rc && retctx)
    1451             :     {
    1452           0 :       getkey_end (*retctx);
    1453           0 :       *retctx = NULL;
    1454             :     }
    1455             : 
    1456         288 :   if (retctx && *retctx)
    1457             :     {
    1458         283 :       log_assert (!(*retctx)->extra_list);
    1459         283 :       (*retctx)->extra_list = namelist;
    1460             :     }
    1461             :   else
    1462           5 :     free_strlist (namelist);
    1463             : 
    1464         288 :   return rc;
    1465             : }
    1466             : 
    1467             : 
    1468             : 
    1469             : 
    1470             : /* Comparison machinery for get_best_pubkey_byname.  */
    1471             : 
    1472             : /* First we have a struct to cache computed information about the key
    1473             :  * in question.  */
    1474             : struct pubkey_cmp_cookie
    1475             : {
    1476             :   int valid;                    /* Is this cookie valid?  */
    1477             :   PKT_public_key key;           /* The key.  */
    1478             :   PKT_user_id *uid;             /* The matching UID packet.  */
    1479             :   unsigned int validity;        /* Computed validity of (KEY, UID).  */
    1480             :   u32 creation_time;            /* Creation time of the newest subkey
    1481             :                                    capable of encryption.  */
    1482             : };
    1483             : 
    1484             : 
    1485             : /* Then we have a series of helper functions.  */
    1486             : static int
    1487          46 : key_is_ok (const PKT_public_key *key)
    1488             : {
    1489         131 :   return (! key->has_expired && ! key->flags.revoked
    1490          85 :           && key->flags.valid && ! key->flags.disabled);
    1491             : }
    1492             : 
    1493             : 
    1494             : static int
    1495          46 : uid_is_ok (const PKT_public_key *key, const PKT_user_id *uid)
    1496             : {
    1497          46 :   return key_is_ok (key) && ! uid->is_revoked;
    1498             : }
    1499             : 
    1500             : 
    1501             : static int
    1502          64 : subkey_is_ok (const PKT_public_key *sub)
    1503             : {
    1504          64 :   return ! sub->flags.revoked && sub->flags.valid && ! sub->flags.disabled;
    1505             : }
    1506             : 
    1507             : 
    1508             : /* Finally this function compares a NEW key to the former candidate
    1509             :  * OLD.  Returns < 0 if the old key is worse, > 0 if the old key is
    1510             :  * better, == 0 if it is a tie.  */
    1511             : static int
    1512          49 : pubkey_cmp (ctrl_t ctrl, const char *name, struct pubkey_cmp_cookie *old,
    1513             :             struct pubkey_cmp_cookie *new, KBNODE new_keyblock)
    1514             : {
    1515             :   kbnode_t n;
    1516             : 
    1517          49 :   new->creation_time = 0;
    1518         162 :   for (n = find_next_kbnode (new_keyblock, PKT_PUBLIC_SUBKEY);
    1519          64 :        n; n = find_next_kbnode (n, PKT_PUBLIC_SUBKEY))
    1520             :     {
    1521          64 :       PKT_public_key *sub = n->pkt->pkt.public_key;
    1522             : 
    1523          64 :       if ((sub->pubkey_usage & PUBKEY_USAGE_ENC) == 0)
    1524           0 :         continue;
    1525             : 
    1526          64 :       if (! subkey_is_ok (sub))
    1527           0 :         continue;
    1528             : 
    1529          64 :       if (sub->timestamp > new->creation_time)
    1530          64 :         new->creation_time = sub->timestamp;
    1531             :     }
    1532             : 
    1533          98 :   for (n = find_next_kbnode (new_keyblock, PKT_USER_ID);
    1534           0 :        n; n = find_next_kbnode (n, PKT_USER_ID))
    1535             :     {
    1536          49 :       PKT_user_id *uid = n->pkt->pkt.user_id;
    1537          49 :       char *mbox = mailbox_from_userid (uid->name);
    1538          49 :       int match = mbox ? strcasecmp (name, mbox) == 0 : 0;
    1539             : 
    1540          49 :       xfree (mbox);
    1541          49 :       if (! match)
    1542           0 :         continue;
    1543             : 
    1544          49 :       new->uid = scopy_user_id (uid);
    1545          49 :       new->validity =
    1546          49 :         get_validity (ctrl, new_keyblock, &new->key, uid, NULL, 0) & TRUST_MASK;
    1547          49 :       new->valid = 1;
    1548             : 
    1549          49 :       if (! old->valid)
    1550          26 :         return -1;      /* No OLD key.  */
    1551             : 
    1552          23 :       if (! uid_is_ok (&old->key, old->uid) && uid_is_ok (&new->key, uid))
    1553           7 :         return -1;      /* Validity of the NEW key is better.  */
    1554             : 
    1555          16 :       if (old->validity < new->validity)
    1556           0 :         return -1;      /* Validity of the NEW key is better.  */
    1557             : 
    1558          16 :       if (old->validity == new->validity && uid_is_ok (&new->key, uid)
    1559          16 :           && old->creation_time < new->creation_time)
    1560          16 :         return -1;      /* Both keys are of the same validity, but the
    1561             :                            NEW key is newer.  */
    1562             :     }
    1563             : 
    1564             :   /* Stick with the OLD key.  */
    1565           0 :   return 1;
    1566             : }
    1567             : 
    1568             : 
    1569             : /* This function works like get_pubkey_byname, but if the name
    1570             :  * resembles a mail address, the results are ranked and only the best
    1571             :  * result is returned.  */
    1572             : int
    1573         282 : get_best_pubkey_byname (ctrl_t ctrl, GETKEY_CTX *retctx, PKT_public_key *pk,
    1574             :                         const char *name, KBNODE *ret_keyblock,
    1575             :                         int include_unusable, int no_akl)
    1576             : {
    1577             :   int rc;
    1578         282 :   struct getkey_ctx_s *ctx = NULL;
    1579             : 
    1580         282 :   if (retctx)
    1581          31 :     *retctx = NULL;
    1582             : 
    1583         282 :   rc = get_pubkey_byname (ctrl, &ctx, pk, name, ret_keyblock,
    1584             :                           NULL, include_unusable, no_akl);
    1585         282 :   if (rc)
    1586             :     {
    1587           0 :       if (ctx)
    1588           0 :         getkey_end (ctx);
    1589           0 :       return rc;
    1590             :     }
    1591             : 
    1592         282 :   if (is_valid_mailbox (name) && ctx)
    1593             :     {
    1594             :       /* Rank results and return only the most relevant key.  */
    1595         163 :       struct pubkey_cmp_cookie best = { 0 }, new;
    1596             :       KBNODE new_keyblock;
    1597         375 :       while (getkey_next (ctx, &new.key, &new_keyblock) == 0)
    1598             :         {
    1599          49 :           int diff = pubkey_cmp (ctrl, name, &best, &new, new_keyblock);
    1600          49 :           release_kbnode (new_keyblock);
    1601          49 :           if (diff < 0)
    1602             :             {
    1603             :               /* New key is better.  */
    1604          49 :               release_public_key_parts (&best.key);
    1605          49 :               free_user_id (best.uid);
    1606          49 :               best = new;
    1607             :             }
    1608           0 :           else if (diff > 0)
    1609             :             {
    1610             :               /* Old key is better.  */
    1611           0 :               release_public_key_parts (&new.key);
    1612           0 :               free_user_id (new.uid);
    1613             :             }
    1614             :           else
    1615             :             {
    1616             :               /* A tie.  Keep the old key.  */
    1617           0 :               release_public_key_parts (&new.key);
    1618           0 :               free_user_id (new.uid);
    1619             :             }
    1620             :         }
    1621         163 :       getkey_end (ctx);
    1622         163 :       ctx = NULL;
    1623         163 :       free_user_id (best.uid);
    1624             : 
    1625         163 :       if (best.valid)
    1626             :         {
    1627          26 :           if (retctx || ret_keyblock)
    1628             :             {
    1629          26 :               ctx = xtrycalloc (1, sizeof **retctx);
    1630          26 :               if (! ctx)
    1631           0 :                 rc = gpg_error_from_syserror ();
    1632             :               else
    1633             :                 {
    1634          26 :                   ctx->kr_handle = keydb_new ();
    1635          26 :                   if (! ctx->kr_handle)
    1636             :                     {
    1637           0 :                       xfree (ctx);
    1638           0 :                       *retctx = NULL;
    1639           0 :                       rc = gpg_error_from_syserror ();
    1640             :                     }
    1641             :                   else
    1642             :                     {
    1643          26 :                       u32 *keyid = pk_keyid (&best.key);
    1644          26 :                       ctx->exact = 1;
    1645          26 :                       ctx->nitems = 1;
    1646          26 :                       ctx->items[0].mode = KEYDB_SEARCH_MODE_LONG_KID;
    1647          26 :                       ctx->items[0].u.kid[0] = keyid[0];
    1648          26 :                       ctx->items[0].u.kid[1] = keyid[1];
    1649             : 
    1650          26 :                       if (ret_keyblock)
    1651             :                         {
    1652          26 :                           release_kbnode (*ret_keyblock);
    1653          26 :                           *ret_keyblock = NULL;
    1654          26 :                           rc = getkey_next (ctx, NULL, ret_keyblock);
    1655             :                         }
    1656             :                     }
    1657             :                 }
    1658             :             }
    1659             : 
    1660          26 :           if (pk)
    1661           0 :             *pk = best.key;
    1662             :           else
    1663          26 :             release_public_key_parts (&best.key);
    1664             :         }
    1665             :     }
    1666             : 
    1667         282 :   if (rc && ctx)
    1668             :     {
    1669           0 :       getkey_end (ctx);
    1670           0 :       ctx = NULL;
    1671             :     }
    1672             : 
    1673         282 :   if (retctx && ctx)
    1674          26 :     *retctx = ctx;
    1675             :   else
    1676         256 :     getkey_end (ctx);
    1677             : 
    1678         282 :   return rc;
    1679             : }
    1680             : 
    1681             : 
    1682             : 
    1683             : /* Get a public key from a file.
    1684             :  *
    1685             :  * PK is the buffer to store the key.  The caller needs to make sure
    1686             :  * that PK->REQ_USAGE is valid.  PK->REQ_USAGE is passed through to
    1687             :  * the lookup function and is a mask of PUBKEY_USAGE_SIG,
    1688             :  * PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT.  If this is non-zero, only
    1689             :  * keys with the specified usage will be returned.
    1690             :  *
    1691             :  * FNAME is the file name.  That file should contain exactly one
    1692             :  * keyblock.
    1693             :  *
    1694             :  * This function returns 0 on success.  Otherwise, an error code is
    1695             :  * returned.  In particular, GPG_ERR_NO_PUBKEY is returned if the key
    1696             :  * is not found.
    1697             :  *
    1698             :  * The self-signed data has already been merged into the public key
    1699             :  * using merge_selfsigs.  The caller must release the content of PK by
    1700             :  * calling release_public_key_parts (or, if PK was malloced, using
    1701             :  * free_public_key).
    1702             :  */
    1703             : gpg_error_t
    1704           6 : get_pubkey_fromfile (ctrl_t ctrl, PKT_public_key *pk, const char *fname)
    1705             : {
    1706             :   gpg_error_t err;
    1707             :   kbnode_t keyblock;
    1708             :   kbnode_t found_key;
    1709             :   unsigned int infoflags;
    1710             : 
    1711           6 :   err = read_key_from_file (ctrl, fname, &keyblock);
    1712           6 :   if (!err)
    1713             :     {
    1714             :       /* Warning: node flag bits 0 and 1 should be preserved by
    1715             :        * merge_selfsigs.  FIXME: Check whether this still holds. */
    1716           6 :       merge_selfsigs (keyblock);
    1717           6 :       found_key = finish_lookup (keyblock, pk->req_usage, 0, &infoflags);
    1718           6 :       print_status_key_considered (keyblock, infoflags);
    1719           6 :       if (found_key)
    1720           6 :         pk_from_block (pk, keyblock, found_key);
    1721             :       else
    1722           0 :         err = gpg_error (GPG_ERR_UNUSABLE_PUBKEY);
    1723             :     }
    1724             : 
    1725           6 :   release_kbnode (keyblock);
    1726           6 :   return err;
    1727             : }
    1728             : 
    1729             : 
    1730             : /* Lookup a key with the specified fingerprint.
    1731             :  *
    1732             :  * If PK is not NULL, the public key of the first result is returned
    1733             :  * in *PK.  Note: this function does an exact search and thus the
    1734             :  * returned public key may be a subkey rather than the primary key.
    1735             :  * Note: The self-signed data has already been merged into the public
    1736             :  * key using merge_selfsigs.  Free *PK by calling
    1737             :  * release_public_key_parts (or, if PK was allocated using xfree, you
    1738             :  * can use free_public_key, which calls release_public_key_parts(PK)
    1739             :  * and then xfree(PK)).
    1740             :  *
    1741             :  * If PK->REQ_USAGE is set, it is used to filter the search results.
    1742             :  * (Thus, if PK is not NULL, PK->REQ_USAGE must be valid!!!)  See the
    1743             :  * documentation for finish_lookup to understand exactly how this is
    1744             :  * used.
    1745             :  *
    1746             :  * If R_KEYBLOCK is not NULL, then the first result's keyblock is
    1747             :  * returned in *R_KEYBLOCK.  This should be freed using
    1748             :  * release_kbnode().
    1749             :  *
    1750             :  * FPRINT is a byte array whose contents is the fingerprint to use as
    1751             :  * the search term.  FPRINT_LEN specifies the length of the
    1752             :  * fingerprint (in bytes).  Currently, only 16 and 20-byte
    1753             :  * fingerprints are supported.
    1754             :  *
    1755             :  * FIXME: We should replace this with the _byname function.  This can
    1756             :  * be done by creating a userID conforming to the unified fingerprint
    1757             :  * style.  */
    1758             : int
    1759         238 : get_pubkey_byfprint (PKT_public_key *pk, kbnode_t *r_keyblock,
    1760             :                      const byte * fprint, size_t fprint_len)
    1761             : {
    1762             :   int rc;
    1763             : 
    1764         238 :   if (r_keyblock)
    1765          52 :     *r_keyblock = NULL;
    1766             : 
    1767         238 :   if (fprint_len == 20 || fprint_len == 16)
    1768         238 :     {
    1769             :       struct getkey_ctx_s ctx;
    1770         238 :       KBNODE kb = NULL;
    1771         238 :       KBNODE found_key = NULL;
    1772             : 
    1773         238 :       memset (&ctx, 0, sizeof ctx);
    1774         238 :       ctx.exact = 1;
    1775         238 :       ctx.not_allocated = 1;
    1776         238 :       ctx.kr_handle = keydb_new ();
    1777         238 :       if (!ctx.kr_handle)
    1778           0 :         return gpg_error_from_syserror ();
    1779             : 
    1780         238 :       ctx.nitems = 1;
    1781         238 :       ctx.items[0].mode = fprint_len == 16 ? KEYDB_SEARCH_MODE_FPR16
    1782             :         : KEYDB_SEARCH_MODE_FPR20;
    1783         238 :       memcpy (ctx.items[0].u.fpr, fprint, fprint_len);
    1784         238 :       rc = lookup (&ctx, &kb, &found_key, 0);
    1785         238 :       if (!rc && pk)
    1786           0 :         pk_from_block (pk, kb, found_key);
    1787         238 :       if (!rc && r_keyblock)
    1788             :         {
    1789          52 :           *r_keyblock = kb;
    1790          52 :           kb = NULL;
    1791             :         }
    1792         238 :       release_kbnode (kb);
    1793         238 :       getkey_end (&ctx);
    1794             :     }
    1795             :   else
    1796           0 :     rc = GPG_ERR_GENERAL; /* Oops */
    1797         238 :   return rc;
    1798             : }
    1799             : 
    1800             : 
    1801             : /* This function is similar to get_pubkey_byfprint, but it doesn't
    1802             :  * merge the self-signed data into the public key and subkeys or into
    1803             :  * the user ids.  It also doesn't add the key to the user id cache.
    1804             :  * Further, this function ignores PK->REQ_USAGE.
    1805             :  *
    1806             :  * This function is intended to avoid recursion and, as such, should
    1807             :  * only be used in very specific situations.
    1808             :  *
    1809             :  * Like get_pubkey_byfprint, PK may be NULL.  In that case, this
    1810             :  * function effectively just checks for the existence of the key.  */
    1811             : int
    1812         196 : get_pubkey_byfprint_fast (PKT_public_key * pk,
    1813             :                           const byte * fprint, size_t fprint_len)
    1814             : {
    1815         196 :   int rc = 0;
    1816             :   KEYDB_HANDLE hd;
    1817             :   KBNODE keyblock;
    1818             :   byte fprbuf[MAX_FINGERPRINT_LEN];
    1819             :   int i;
    1820             : 
    1821        4116 :   for (i = 0; i < MAX_FINGERPRINT_LEN && i < fprint_len; i++)
    1822        3920 :     fprbuf[i] = fprint[i];
    1823         392 :   while (i < MAX_FINGERPRINT_LEN)
    1824           0 :     fprbuf[i++] = 0;
    1825             : 
    1826         196 :   hd = keydb_new ();
    1827         196 :   if (!hd)
    1828           0 :     return gpg_error_from_syserror ();
    1829             : 
    1830         196 :   rc = keydb_search_fpr (hd, fprbuf);
    1831         196 :   if (gpg_err_code (rc) == GPG_ERR_NOT_FOUND)
    1832             :     {
    1833         148 :       keydb_release (hd);
    1834         148 :       return GPG_ERR_NO_PUBKEY;
    1835             :     }
    1836          48 :   rc = keydb_get_keyblock (hd, &keyblock);
    1837          48 :   keydb_release (hd);
    1838          48 :   if (rc)
    1839             :     {
    1840           0 :       log_error ("keydb_get_keyblock failed: %s\n", gpg_strerror (rc));
    1841           0 :       return GPG_ERR_NO_PUBKEY;
    1842             :     }
    1843             : 
    1844          48 :   log_assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY
    1845             :               || keyblock->pkt->pkttype == PKT_PUBLIC_SUBKEY);
    1846          48 :   if (pk)
    1847          48 :     copy_public_key (pk, keyblock->pkt->pkt.public_key);
    1848          48 :   release_kbnode (keyblock);
    1849             : 
    1850             :   /* Not caching key here since it won't have all of the fields
    1851             :      properly set. */
    1852             : 
    1853          48 :   return 0;
    1854             : }
    1855             : 
    1856             : const char *
    1857          95 : parse_def_secret_key (ctrl_t ctrl)
    1858             : {
    1859          95 :   KEYDB_HANDLE hd = NULL;
    1860             :   strlist_t t;
    1861             :   static int warned;
    1862             : 
    1863          95 :   for (t = opt.def_secret_key; t; t = t->next)
    1864             :     {
    1865             :       gpg_error_t err;
    1866             :       KEYDB_SEARCH_DESC desc;
    1867             :       KBNODE kb;
    1868             :       KBNODE node;
    1869             : 
    1870          10 :       err = classify_user_id (t->d, &desc, 1);
    1871          10 :       if (err)
    1872             :         {
    1873           0 :           log_error (_("secret key \"%s\" not found: %s\n"),
    1874           0 :                      t->d, gpg_strerror (err));
    1875           0 :           if (!opt.quiet)
    1876           0 :             log_info (_("(check argument of option '%s')\n"), "--default-key");
    1877           0 :           continue;
    1878             :         }
    1879             : 
    1880          10 :       if (! hd)
    1881             :         {
    1882          10 :           hd = keydb_new ();
    1883          10 :           if (!hd)
    1884           0 :             return NULL;
    1885             :         }
    1886             :       else
    1887           0 :         keydb_search_reset (hd);
    1888             : 
    1889             : 
    1890          10 :       err = keydb_search (hd, &desc, 1, NULL);
    1891          10 :       if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
    1892           0 :         continue;
    1893             : 
    1894          10 :       if (err)
    1895             :         {
    1896           0 :           log_error (_("key \"%s\" not found: %s\n"), t->d, gpg_strerror (err));
    1897           0 :           t = NULL;
    1898          10 :           break;
    1899             :         }
    1900             : 
    1901          10 :       err = keydb_get_keyblock (hd, &kb);
    1902          10 :       if (err)
    1903             :         {
    1904           0 :           log_error (_("error reading keyblock: %s\n"),
    1905             :                      gpg_strerror (err));
    1906           0 :           continue;
    1907             :         }
    1908             : 
    1909          10 :       merge_selfsigs (kb);
    1910             : 
    1911          10 :       err = gpg_error (GPG_ERR_NO_SECKEY);
    1912          10 :       node = kb;
    1913             :       do
    1914             :         {
    1915          10 :           PKT_public_key *pk = node->pkt->pkt.public_key;
    1916             : 
    1917             :           /* Check that the key has the signing capability.  */
    1918          10 :           if (! (pk->pubkey_usage & PUBKEY_USAGE_SIG))
    1919           0 :             continue;
    1920             : 
    1921             :           /* Check if the key is valid.  */
    1922          10 :           if (pk->flags.revoked)
    1923             :             {
    1924           0 :               if (DBG_LOOKUP)
    1925           0 :                 log_debug ("not using %s as default key, %s",
    1926             :                            keystr_from_pk (pk), "revoked");
    1927           0 :               continue;
    1928             :             }
    1929          10 :           if (pk->has_expired)
    1930             :             {
    1931           0 :               if (DBG_LOOKUP)
    1932           0 :                 log_debug ("not using %s as default key, %s",
    1933             :                            keystr_from_pk (pk), "expired");
    1934           0 :               continue;
    1935             :             }
    1936          10 :           if (pk_is_disabled (pk))
    1937             :             {
    1938           0 :               if (DBG_LOOKUP)
    1939           0 :                 log_debug ("not using %s as default key, %s",
    1940             :                            keystr_from_pk (pk), "disabled");
    1941           0 :               continue;
    1942             :             }
    1943             : 
    1944          10 :           err = agent_probe_secret_key (ctrl, pk);
    1945          10 :           if (! err)
    1946             :             /* This is a valid key.  */
    1947          10 :             break;
    1948             :         }
    1949           0 :       while ((node = find_next_kbnode (node, PKT_PUBLIC_SUBKEY)));
    1950             : 
    1951          10 :       release_kbnode (kb);
    1952          10 :       if (err)
    1953             :         {
    1954           0 :           if (! warned && ! opt.quiet)
    1955             :             {
    1956           0 :               log_info (_("Warning: not using '%s' as default key: %s\n"),
    1957           0 :                         t->d, gpg_strerror (GPG_ERR_NO_SECKEY));
    1958           0 :               print_reported_error (err, GPG_ERR_NO_SECKEY);
    1959             :             }
    1960             :         }
    1961             :       else
    1962             :         {
    1963          10 :           if (! warned && ! opt.quiet)
    1964          10 :             log_info (_("using \"%s\" as default secret key for signing\n"),
    1965          10 :                       t->d);
    1966          10 :           break;
    1967             :         }
    1968             :     }
    1969             : 
    1970          95 :   if (! warned && opt.def_secret_key && ! t)
    1971           0 :     log_info (_("all values passed to '%s' ignored\n"),
    1972             :               "--default-key");
    1973             : 
    1974          95 :   warned = 1;
    1975             : 
    1976          95 :   if (hd)
    1977          10 :     keydb_release (hd);
    1978             : 
    1979          95 :   if (t)
    1980          10 :     return t->d;
    1981          85 :   return NULL;
    1982             : }
    1983             : 
    1984             : 
    1985             : /* Look up a secret key.
    1986             :  *
    1987             :  * If PK is not NULL, the public key of the first result is returned
    1988             :  * in *PK.  Note: PK->REQ_USAGE must be valid!!!  If PK->REQ_USAGE is
    1989             :  * set, it is used to filter the search results.  See the
    1990             :  * documentation for finish_lookup to understand exactly how this is
    1991             :  * used.  Note: The self-signed data has already been merged into the
    1992             :  * public key using merge_selfsigs.  Free *PK by calling
    1993             :  * release_public_key_parts (or, if PK was allocated using xfree, you
    1994             :  * can use free_public_key, which calls release_public_key_parts(PK)
    1995             :  * and then xfree(PK)).
    1996             :  *
    1997             :  * If --default-key was set, then the specified key is looked up.  (In
    1998             :  * this case, the default key is returned even if it is considered
    1999             :  * unusable.  See the documentation for skip_unusable for exactly what
    2000             :  * this means.)
    2001             :  *
    2002             :  * Otherwise, this initiates a DB scan that returns all keys that are
    2003             :  * usable (see previous paragraph for exactly what usable means) and
    2004             :  * for which a secret key is available.
    2005             :  *
    2006             :  * This function returns the first match.  Additional results can be
    2007             :  * returned using getkey_next.  */
    2008             : gpg_error_t
    2009           0 : get_seckey_default (ctrl_t ctrl, PKT_public_key *pk)
    2010             : {
    2011             :   gpg_error_t err;
    2012           0 :   strlist_t namelist = NULL;
    2013           0 :   int include_unusable = 1;
    2014             : 
    2015             : 
    2016           0 :   const char *def_secret_key = parse_def_secret_key (ctrl);
    2017           0 :   if (def_secret_key)
    2018           0 :     add_to_strlist (&namelist, def_secret_key);
    2019             :   else
    2020           0 :     include_unusable = 0;
    2021             : 
    2022           0 :   err = key_byname (NULL, namelist, pk, 1, include_unusable, NULL, NULL);
    2023             : 
    2024           0 :   free_strlist (namelist);
    2025             : 
    2026           0 :   return err;
    2027             : }
    2028             : 
    2029             : 
    2030             : 
    2031             : /* Search for keys matching some criteria.
    2032             :  *
    2033             :  * If RETCTX is not NULL, then the constructed context is returned in
    2034             :  * *RETCTX so that getpubkey_next can be used to get subsequent
    2035             :  * results.  In this case, getkey_end() must be used to free the
    2036             :  * search context.  If RETCTX is not NULL, then RET_KDBHD must be
    2037             :  * NULL.
    2038             :  *
    2039             :  * If PK is not NULL, the public key of the first result is returned
    2040             :  * in *PK.  Note: PK->REQ_USAGE must be valid!!!  If PK->REQ_USAGE is
    2041             :  * set, it is used to filter the search results.  See the
    2042             :  * documentation for finish_lookup to understand exactly how this is
    2043             :  * used.  Note: The self-signed data has already been merged into the
    2044             :  * public key using merge_selfsigs.  Free *PK by calling
    2045             :  * release_public_key_parts (or, if PK was allocated using xfree, you
    2046             :  * can use free_public_key, which calls release_public_key_parts(PK)
    2047             :  * and then xfree(PK)).
    2048             :  *
    2049             :  * If NAMES is not NULL, then a search query is constructed using
    2050             :  * classify_user_id on each of the strings in the list.  (Recall: the
    2051             :  * database does an OR of the terms, not an AND.)  If NAMES is
    2052             :  * NULL, then all results are returned.
    2053             :  *
    2054             :  * If WANT_SECRET is set, then only keys with an available secret key
    2055             :  * (either locally or via key registered on a smartcard) are returned.
    2056             :  *
    2057             :  * This function does not skip unusable keys (see the documentation
    2058             :  * for skip_unusable for an exact definition).
    2059             :  *
    2060             :  * If RET_KEYBLOCK is not NULL, the keyblock is returned in
    2061             :  * *RET_KEYBLOCK.  This should be freed using release_kbnode().
    2062             :  *
    2063             :  * This function returns 0 on success.  Otherwise, an error code is
    2064             :  * returned.  In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
    2065             :  * (if want_secret is set) is returned if the key is not found.  */
    2066             : gpg_error_t
    2067          83 : getkey_bynames (getkey_ctx_t *retctx, PKT_public_key *pk,
    2068             :                 strlist_t names, int want_secret, kbnode_t *ret_keyblock)
    2069             : {
    2070          83 :   return key_byname (retctx, names, pk, want_secret, 1,
    2071             :                      ret_keyblock, NULL);
    2072             : }
    2073             : 
    2074             : 
    2075             : /* Search for one key matching some criteria.
    2076             :  *
    2077             :  * If RETCTX is not NULL, then the constructed context is returned in
    2078             :  * *RETCTX so that getpubkey_next can be used to get subsequent
    2079             :  * results.  In this case, getkey_end() must be used to free the
    2080             :  * search context.  If RETCTX is not NULL, then RET_KDBHD must be
    2081             :  * NULL.
    2082             :  *
    2083             :  * If PK is not NULL, the public key of the first result is returned
    2084             :  * in *PK.  Note: PK->REQ_USAGE must be valid!!!  If PK->REQ_USAGE is
    2085             :  * set, it is used to filter the search results.  See the
    2086             :  * documentation for finish_lookup to understand exactly how this is
    2087             :  * used.  Note: The self-signed data has already been merged into the
    2088             :  * public key using merge_selfsigs.  Free *PK by calling
    2089             :  * release_public_key_parts (or, if PK was allocated using xfree, you
    2090             :  * can use free_public_key, which calls release_public_key_parts(PK)
    2091             :  * and then xfree(PK)).
    2092             :  *
    2093             :  * If NAME is not NULL, then a search query is constructed using
    2094             :  * classify_user_id on the string.  In this case, even unusable keys
    2095             :  * (see the documentation for skip_unusable for an exact definition of
    2096             :  * unusable) are returned.  Otherwise, if --default-key was set, then
    2097             :  * that key is returned (even if it is unusable).  If neither of these
    2098             :  * conditions holds, then the first usable key is returned.
    2099             :  *
    2100             :  * If WANT_SECRET is set, then only keys with an available secret key
    2101             :  * (either locally or via key registered on a smartcard) are returned.
    2102             :  *
    2103             :  * This function does not skip unusable keys (see the documentation
    2104             :  * for skip_unusable for an exact definition).
    2105             :  *
    2106             :  * If RET_KEYBLOCK is not NULL, the keyblock is returned in
    2107             :  * *RET_KEYBLOCK.  This should be freed using release_kbnode().
    2108             :  *
    2109             :  * This function returns 0 on success.  Otherwise, an error code is
    2110             :  * returned.  In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
    2111             :  * (if want_secret is set) is returned if the key is not found.
    2112             :  *
    2113             :  * FIXME: We also have the get_pubkey_byname function which has a
    2114             :  * different semantic.  Should be merged with this one.  */
    2115             : gpg_error_t
    2116         131 : getkey_byname (ctrl_t ctrl, getkey_ctx_t *retctx, PKT_public_key *pk,
    2117             :                const char *name, int want_secret, kbnode_t *ret_keyblock)
    2118             : {
    2119             :   gpg_error_t err;
    2120         131 :   strlist_t namelist = NULL;
    2121         131 :   int with_unusable = 1;
    2122         131 :   const char *def_secret_key = NULL;
    2123             : 
    2124         131 :   if (want_secret && !name)
    2125          90 :     def_secret_key = parse_def_secret_key (ctrl);
    2126             : 
    2127         131 :   if (want_secret && !name && def_secret_key)
    2128           5 :     add_to_strlist (&namelist, def_secret_key);
    2129         126 :   else if (name)
    2130          41 :     add_to_strlist (&namelist, name);
    2131             :   else
    2132          85 :     with_unusable = 0;
    2133             : 
    2134         131 :   err = key_byname (retctx, namelist, pk, want_secret, with_unusable,
    2135             :                     ret_keyblock, NULL);
    2136             : 
    2137             :   /* FIXME: Check that we really return GPG_ERR_NO_SECKEY if
    2138             :      WANT_SECRET has been used.  */
    2139             : 
    2140         131 :   free_strlist (namelist);
    2141             : 
    2142         131 :   return err;
    2143             : }
    2144             : 
    2145             : 
    2146             : /* Return the next search result.
    2147             :  *
    2148             :  * If PK is not NULL, the public key of the next result is returned in
    2149             :  * *PK.  Note: The self-signed data has already been merged into the
    2150             :  * public key using merge_selfsigs.  Free *PK by calling
    2151             :  * release_public_key_parts (or, if PK was allocated using xmalloc, you
    2152             :  * can use free_public_key, which calls release_public_key_parts(PK)
    2153             :  * and then xfree(PK)).
    2154             :  *
    2155             :  * RET_KEYBLOCK can be given as NULL; if it is not NULL it the entire
    2156             :  * found keyblock is returned which must be released with
    2157             :  * release_kbnode.  If the function returns an error NULL is stored at
    2158             :  * RET_KEYBLOCK.
    2159             :  *
    2160             :  * The self-signed data has already been merged into the public key
    2161             :  * using merge_selfsigs.  */
    2162             : gpg_error_t
    2163         349 : getkey_next (getkey_ctx_t ctx, PKT_public_key *pk, kbnode_t *ret_keyblock)
    2164             : {
    2165             :   int rc; /* Fixme:  Make sure this is proper gpg_error */
    2166         349 :   KBNODE keyblock = NULL;
    2167         349 :   KBNODE found_key = NULL;
    2168             : 
    2169             :   /* We need to disable the caching so that for an exact key search we
    2170             :      won't get the result back from the cache and thus end up in an
    2171             :      endless loop.  The endless loop can occur, because the cache is
    2172             :      used without respecting the current file pointer!  */
    2173         349 :   keydb_disable_caching (ctx->kr_handle);
    2174             : 
    2175             :   /* FOUND_KEY is only valid as long as RET_KEYBLOCK is.  If the
    2176             :    * caller wants PK, but not RET_KEYBLOCK, we need hand in our own
    2177             :    * keyblock.  */
    2178         349 :   if (pk && ret_keyblock == NULL)
    2179           0 :       ret_keyblock = &keyblock;
    2180             : 
    2181         349 :   rc = lookup (ctx, ret_keyblock, pk ? &found_key : NULL, ctx->want_secret);
    2182         349 :   if (!rc && pk)
    2183             :     {
    2184          49 :       log_assert (found_key);
    2185          49 :       pk_from_block (pk, NULL, found_key);
    2186          49 :       release_kbnode (keyblock);
    2187             :     }
    2188             : 
    2189         349 :   return rc;
    2190             : }
    2191             : 
    2192             : 
    2193             : /* Release any resources used by a key listing context.  This must be
    2194             :  * called on the context returned by, e.g., getkey_byname.  */
    2195             : void
    2196        2616 : getkey_end (getkey_ctx_t ctx)
    2197             : {
    2198        2616 :   if (ctx)
    2199             :     {
    2200        2474 :       keydb_release (ctx->kr_handle);
    2201        2474 :       free_strlist (ctx->extra_list);
    2202        2474 :       if (!ctx->not_allocated)
    2203         528 :         xfree (ctx);
    2204             :     }
    2205        2616 : }
    2206             : 
    2207             : 
    2208             : 
    2209             : /************************************************
    2210             :  ************* Merging stuff ********************
    2211             :  ************************************************/
    2212             : 
    2213             : /* Set the mainkey_id fields for all keys in KEYBLOCK.  This is
    2214             :  * usually done by merge_selfsigs but at some places we only need the
    2215             :  * main_kid not a full merge.  The function also guarantees that all
    2216             :  * pk->keyids are computed.  */
    2217             : void
    2218          19 : setup_main_keyids (kbnode_t keyblock)
    2219             : {
    2220             :   u32 kid[2], mainkid[2];
    2221             :   kbnode_t kbctx, node;
    2222             :   PKT_public_key *pk;
    2223             : 
    2224          19 :   if (keyblock->pkt->pkttype != PKT_PUBLIC_KEY)
    2225           0 :     BUG ();
    2226          19 :   pk = keyblock->pkt->pkt.public_key;
    2227             : 
    2228          19 :   keyid_from_pk (pk, mainkid);
    2229         160 :   for (kbctx=NULL; (node = walk_kbnode (keyblock, &kbctx, 0)); )
    2230             :     {
    2231         225 :       if (!(node->pkt->pkttype == PKT_PUBLIC_KEY
    2232         103 :             || node->pkt->pkttype == PKT_PUBLIC_SUBKEY))
    2233          87 :         continue;
    2234          35 :       pk = node->pkt->pkt.public_key;
    2235          35 :       keyid_from_pk (pk, kid); /* Make sure pk->keyid is set.  */
    2236          35 :       if (!pk->main_keyid[0] && !pk->main_keyid[1])
    2237             :         {
    2238          31 :           pk->main_keyid[0] = mainkid[0];
    2239          31 :           pk->main_keyid[1] = mainkid[1];
    2240             :         }
    2241             :     }
    2242          19 : }
    2243             : 
    2244             : 
    2245             : /* KEYBLOCK corresponds to a public key block.  This function merges
    2246             :  * much of the information from the self-signed data into the public
    2247             :  * key, public subkey and user id data structures.  If you use the
    2248             :  * high-level search API (e.g., get_pubkey) for looking up key blocks,
    2249             :  * then you don't need to call this function.  This function is
    2250             :  * useful, however, if you change the keyblock, e.g., by adding or
    2251             :  * removing a self-signed data packet.  */
    2252             : void
    2253         126 : merge_keys_and_selfsig (KBNODE keyblock)
    2254             : {
    2255         126 :   if (!keyblock)
    2256             :     ;
    2257         126 :   else if (keyblock->pkt->pkttype == PKT_PUBLIC_KEY)
    2258         126 :     merge_selfsigs (keyblock);
    2259             :   else
    2260           0 :     log_debug ("FIXME: merging secret key blocks is not anymore available\n");
    2261         126 : }
    2262             : 
    2263             : 
    2264             : static int
    2265        6300 : parse_key_usage (PKT_signature * sig)
    2266             : {
    2267        6300 :   int key_usage = 0;
    2268             :   const byte *p;
    2269             :   size_t n;
    2270             :   byte flags;
    2271             : 
    2272        6300 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_FLAGS, &n);
    2273        6300 :   if (p && n)
    2274             :     {
    2275             :       /* First octet of the keyflags.  */
    2276        3620 :       flags = *p;
    2277             : 
    2278        3620 :       if (flags & 1)
    2279             :         {
    2280        1772 :           key_usage |= PUBKEY_USAGE_CERT;
    2281        1772 :           flags &= ~1;
    2282             :         }
    2283             : 
    2284        3620 :       if (flags & 2)
    2285             :         {
    2286        1894 :           key_usage |= PUBKEY_USAGE_SIG;
    2287        1894 :           flags &= ~2;
    2288             :         }
    2289             : 
    2290             :       /* We do not distinguish between encrypting communications and
    2291             :          encrypting storage. */
    2292        3620 :       if (flags & (0x04 | 0x08))
    2293             :         {
    2294        1725 :           key_usage |= PUBKEY_USAGE_ENC;
    2295        1725 :           flags &= ~(0x04 | 0x08);
    2296             :         }
    2297             : 
    2298        3620 :       if (flags & 0x20)
    2299             :         {
    2300           5 :           key_usage |= PUBKEY_USAGE_AUTH;
    2301           5 :           flags &= ~0x20;
    2302             :         }
    2303             : 
    2304        3620 :       if (flags)
    2305           0 :         key_usage |= PUBKEY_USAGE_UNKNOWN;
    2306             : 
    2307        7240 :       if (!key_usage)
    2308           0 :         key_usage |= PUBKEY_USAGE_NONE;
    2309             :     }
    2310        2680 :   else if (p) /* Key flags of length zero.  */
    2311           0 :     key_usage |= PUBKEY_USAGE_NONE;
    2312             : 
    2313             :   /* We set PUBKEY_USAGE_UNKNOWN to indicate that this key has a
    2314             :      capability that we do not handle.  This serves to distinguish
    2315             :      between a zero key usage which we handle as the default
    2316             :      capabilities for that algorithm, and a usage that we do not
    2317             :      handle.  Likewise we use PUBKEY_USAGE_NONE to indicate that
    2318             :      key_flags have been given but they do not specify any usage.  */
    2319             : 
    2320        6300 :   return key_usage;
    2321             : }
    2322             : 
    2323             : 
    2324             : /* Apply information from SIGNODE (which is the valid self-signature
    2325             :  * associated with that UID) to the UIDNODE:
    2326             :  * - weather the UID has been revoked
    2327             :  * - assumed creation date of the UID
    2328             :  * - temporary store the keyflags here
    2329             :  * - temporary store the key expiration time here
    2330             :  * - mark whether the primary user ID flag hat been set.
    2331             :  * - store the preferences
    2332             :  */
    2333             : static void
    2334        3491 : fixup_uidnode (KBNODE uidnode, KBNODE signode, u32 keycreated)
    2335             : {
    2336        3491 :   PKT_user_id *uid = uidnode->pkt->pkt.user_id;
    2337        3491 :   PKT_signature *sig = signode->pkt->pkt.signature;
    2338             :   const byte *p, *sym, *hash, *zip;
    2339             :   size_t n, nsym, nhash, nzip;
    2340             : 
    2341        3491 :   sig->flags.chosen_selfsig = 1;/* We chose this one. */
    2342        3491 :   uid->created = 0;          /* Not created == invalid. */
    2343        3491 :   if (IS_UID_REV (sig))
    2344             :     {
    2345           2 :       uid->is_revoked = 1;
    2346           4 :       return; /* Has been revoked.  */
    2347             :     }
    2348             :   else
    2349        3489 :     uid->is_revoked = 0;
    2350             : 
    2351        3489 :   uid->expiredate = sig->expiredate;
    2352             : 
    2353        3489 :   if (sig->flags.expired)
    2354             :     {
    2355           0 :       uid->is_expired = 1;
    2356           0 :       return; /* Has expired.  */
    2357             :     }
    2358             :   else
    2359        3489 :     uid->is_expired = 0;
    2360             : 
    2361        3489 :   uid->created = sig->timestamp; /* This one is okay. */
    2362        3489 :   uid->selfsigversion = sig->version;
    2363             :   /* If we got this far, it's not expired :) */
    2364        3489 :   uid->is_expired = 0;
    2365             : 
    2366             :   /* Store the key flags in the helper variable for later processing.  */
    2367        3489 :   uid->help_key_usage = parse_key_usage (sig);
    2368             : 
    2369             :   /* Ditto for the key expiration.  */
    2370        3489 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
    2371        3489 :   if (p && buf32_to_u32 (p))
    2372         321 :     uid->help_key_expire = keycreated + buf32_to_u32 (p);
    2373             :   else
    2374        3168 :     uid->help_key_expire = 0;
    2375             : 
    2376             :   /* Set the primary user ID flag - we will later wipe out some
    2377             :    * of them to only have one in our keyblock.  */
    2378        3489 :   uid->is_primary = 0;
    2379        3489 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_PRIMARY_UID, NULL);
    2380        3489 :   if (p && *p)
    2381         135 :     uid->is_primary = 2;
    2382             : 
    2383             :   /* We could also query this from the unhashed area if it is not in
    2384             :    * the hased area and then later try to decide which is the better
    2385             :    * there should be no security problem with this.
    2386             :    * For now we only look at the hashed one.  */
    2387             : 
    2388             :   /* Now build the preferences list.  These must come from the
    2389             :      hashed section so nobody can modify the ciphers a key is
    2390             :      willing to accept.  */
    2391        3489 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_PREF_SYM, &n);
    2392        3489 :   sym = p;
    2393        3489 :   nsym = p ? n : 0;
    2394        3489 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_PREF_HASH, &n);
    2395        3489 :   hash = p;
    2396        3489 :   nhash = p ? n : 0;
    2397        3489 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_PREF_COMPR, &n);
    2398        3489 :   zip = p;
    2399        3489 :   nzip = p ? n : 0;
    2400        3489 :   if (uid->prefs)
    2401          18 :     xfree (uid->prefs);
    2402        3489 :   n = nsym + nhash + nzip;
    2403        3489 :   if (!n)
    2404           0 :     uid->prefs = NULL;
    2405             :   else
    2406             :     {
    2407        3489 :       uid->prefs = xmalloc (sizeof (*uid->prefs) * (n + 1));
    2408        3489 :       n = 0;
    2409       16195 :       for (; nsym; nsym--, n++)
    2410             :         {
    2411       12706 :           uid->prefs[n].type = PREFTYPE_SYM;
    2412       12706 :           uid->prefs[n].value = *sym++;
    2413             :         }
    2414       11804 :       for (; nhash; nhash--, n++)
    2415             :         {
    2416        8315 :           uid->prefs[n].type = PREFTYPE_HASH;
    2417        8315 :           uid->prefs[n].value = *hash++;
    2418             :         }
    2419       10046 :       for (; nzip; nzip--, n++)
    2420             :         {
    2421        6557 :           uid->prefs[n].type = PREFTYPE_ZIP;
    2422        6557 :           uid->prefs[n].value = *zip++;
    2423             :         }
    2424        3489 :       uid->prefs[n].type = PREFTYPE_NONE; /* End of list marker  */
    2425        3489 :       uid->prefs[n].value = 0;
    2426             :     }
    2427             : 
    2428             :   /* See whether we have the MDC feature.  */
    2429        3489 :   uid->flags.mdc = 0;
    2430        3489 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_FEATURES, &n);
    2431        3489 :   if (p && n && (p[0] & 0x01))
    2432        1779 :     uid->flags.mdc = 1;
    2433             : 
    2434             :   /* And the keyserver modify flag.  */
    2435        3489 :   uid->flags.ks_modify = 1;
    2436        3489 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KS_FLAGS, &n);
    2437        3489 :   if (p && n && (p[0] & 0x80))
    2438        2833 :     uid->flags.ks_modify = 0;
    2439             : }
    2440             : 
    2441             : static void
    2442           0 : sig_to_revoke_info (PKT_signature * sig, struct revoke_info *rinfo)
    2443             : {
    2444           0 :   rinfo->date = sig->timestamp;
    2445           0 :   rinfo->algo = sig->pubkey_algo;
    2446           0 :   rinfo->keyid[0] = sig->keyid[0];
    2447           0 :   rinfo->keyid[1] = sig->keyid[1];
    2448           0 : }
    2449             : 
    2450             : 
    2451             : /* Given a keyblock, parse the key block and extract various pieces of
    2452             :    information and save them with the primary key packet and the user
    2453             :    id packets.  For instance, some information is stored in signature
    2454             :    packets.  We find the latest such valid packet (since the user can
    2455             :    change that information) and copy its contents into the
    2456             :    PKT_public_key.
    2457             : 
    2458             :    Note that R_REVOKED may be set to 0, 1 or 2.
    2459             : 
    2460             :    This function fills in the following fields in the primary key's
    2461             :    keyblock:
    2462             : 
    2463             :      main_keyid          (computed)
    2464             :      revkey / numrevkeys (derived from self signed key data)
    2465             :      flags.valid         (whether we have at least 1 self-sig)
    2466             :      flags.maybe_revoked (whether a designed revoked the key, but
    2467             :                           we are missing the key to check the sig)
    2468             :      selfsigversion      (highest version of any valid self-sig)
    2469             :      pubkey_usage        (derived from most recent self-sig or most
    2470             :                           recent user id)
    2471             :      has_expired         (various sources)
    2472             :      expiredate          (various sources)
    2473             : 
    2474             :   See the documentation for fixup_uidnode for how the user id packets
    2475             :   are modified.  In addition to that the primary user id's is_primary
    2476             :   field is set to 1 and the other user id's is_primary are set to
    2477             :   0.  */
    2478             : static void
    2479        2657 : merge_selfsigs_main (KBNODE keyblock, int *r_revoked,
    2480             :                      struct revoke_info *rinfo)
    2481             : {
    2482        2657 :   PKT_public_key *pk = NULL;
    2483             :   KBNODE k;
    2484             :   u32 kid[2];
    2485             :   u32 sigdate, uiddate, uiddate2;
    2486             :   KBNODE signode, uidnode, uidnode2;
    2487        2657 :   u32 curtime = make_timestamp ();
    2488        2657 :   unsigned int key_usage = 0;
    2489        2657 :   u32 keytimestamp = 0;
    2490        2657 :   u32 key_expire = 0;
    2491        2657 :   int key_expire_seen = 0;
    2492        2657 :   byte sigversion = 0;
    2493             : 
    2494        2657 :   *r_revoked = 0;
    2495        2657 :   memset (rinfo, 0, sizeof (*rinfo));
    2496             : 
    2497             :   /* Section 11.1 of RFC 4880 determines the order of packets within a
    2498             :      message.  There are three sections, which must occur in the
    2499             :      following order: the public key, the user ids and user attributes
    2500             :      and the subkeys.  Within each section, each primary packet (e.g.,
    2501             :      a user id packet) is followed by one or more signature packets,
    2502             :      which modify that packet.  */
    2503             : 
    2504             :   /* According to Section 11.1 of RFC 4880, the public key must be the
    2505             :      first packet.  */
    2506        2657 :   if (keyblock->pkt->pkttype != PKT_PUBLIC_KEY)
    2507             :     /* parse_keyblock_image ensures that the first packet is the
    2508             :        public key.  */
    2509           0 :     BUG ();
    2510        2657 :   pk = keyblock->pkt->pkt.public_key;
    2511        2657 :   keytimestamp = pk->timestamp;
    2512             : 
    2513        2657 :   keyid_from_pk (pk, kid);
    2514        2657 :   pk->main_keyid[0] = kid[0];
    2515        2657 :   pk->main_keyid[1] = kid[1];
    2516             : 
    2517        2657 :   if (pk->version < 4)
    2518             :     {
    2519             :       /* Before v4 the key packet itself contains the expiration date
    2520             :        * and there was no way to change it, so we start with the one
    2521             :        * from the key packet.  */
    2522           0 :       key_expire = pk->max_expiredate;
    2523           0 :       key_expire_seen = 1;
    2524             :     }
    2525             : 
    2526             :   /* First pass:
    2527             : 
    2528             :       - Find the latest direct key self-signature.  We assume that the
    2529             :         newest one overrides all others.
    2530             : 
    2531             :       - Determine whether the key has been revoked.
    2532             : 
    2533             :       - Gather all revocation keys (unlike other data, we don't just
    2534             :         take them from the latest self-signed packet).
    2535             : 
    2536             :       - Determine max (sig[...]->version).
    2537             :    */
    2538             : 
    2539             :   /* Reset this in case this key was already merged. */
    2540        2657 :   xfree (pk->revkey);
    2541        2657 :   pk->revkey = NULL;
    2542        2657 :   pk->numrevkeys = 0;
    2543             : 
    2544        2657 :   signode = NULL;
    2545        2657 :   sigdate = 0; /* Helper variable to find the latest signature.  */
    2546             : 
    2547             :   /* According to Section 11.1 of RFC 4880, the public key comes first
    2548             :      and is immediately followed by any signature packets that modify
    2549             :      it.  */
    2550        7973 :   for (k = keyblock;
    2551        5316 :        k && k->pkt->pkttype != PKT_USER_ID
    2552        2659 :          && k->pkt->pkttype != PKT_ATTRIBUTE
    2553        2659 :          && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
    2554        2659 :        k = k->next)
    2555             :     {
    2556        2659 :       if (k->pkt->pkttype == PKT_SIGNATURE)
    2557             :         {
    2558           2 :           PKT_signature *sig = k->pkt->pkt.signature;
    2559           2 :           if (sig->keyid[0] == kid[0] && sig->keyid[1] == kid[1])
    2560             :             /* Self sig.  */
    2561             :             {
    2562           2 :               if (check_key_signature (keyblock, k, NULL))
    2563             :                 ; /* Signature did not verify.  */
    2564           2 :               else if (IS_KEY_REV (sig))
    2565             :                 {
    2566             :                   /* Key has been revoked - there is no way to
    2567             :                    * override such a revocation, so we theoretically
    2568             :                    * can stop now.  We should not cope with expiration
    2569             :                    * times for revocations here because we have to
    2570             :                    * assume that an attacker can generate all kinds of
    2571             :                    * signatures.  However due to the fact that the key
    2572             :                    * has been revoked it does not harm either and by
    2573             :                    * continuing we gather some more info on that
    2574             :                    * key.  */
    2575           0 :                   *r_revoked = 1;
    2576           0 :                   sig_to_revoke_info (sig, rinfo);
    2577             :                 }
    2578           2 :               else if (IS_KEY_SIG (sig))
    2579             :                 {
    2580             :                   /* Add the indicated revocations keys from all
    2581             :                      signatures not just the latest.  We do this
    2582             :                      because you need multiple 1F sigs to properly
    2583             :                      handle revocation keys (PGP does it this way, and
    2584             :                      a revocation key could be sensitive and hence in
    2585             :                      a different signature). */
    2586           2 :                   if (sig->revkey)
    2587             :                     {
    2588             :                       int i;
    2589             : 
    2590           2 :                       pk->revkey =
    2591           2 :                         xrealloc (pk->revkey, sizeof (struct revocation_key) *
    2592             :                                   (pk->numrevkeys + sig->numrevkeys));
    2593             : 
    2594           4 :                       for (i = 0; i < sig->numrevkeys; i++)
    2595           4 :                         memcpy (&pk->revkey[pk->numrevkeys++],
    2596           4 :                                 &sig->revkey[i],
    2597             :                                 sizeof (struct revocation_key));
    2598             :                     }
    2599             : 
    2600           2 :                   if (sig->timestamp >= sigdate)
    2601             :                     /* This is the latest signature so far.  */
    2602             :                     {
    2603           2 :                       if (sig->flags.expired)
    2604             :                         ; /* Signature has expired - ignore it.  */
    2605             :                       else
    2606             :                         {
    2607           2 :                           sigdate = sig->timestamp;
    2608           2 :                           signode = k;
    2609           2 :                           if (sig->version > sigversion)
    2610           2 :                             sigversion = sig->version;
    2611             : 
    2612             :                         }
    2613             :                     }
    2614             :                 }
    2615             :             }
    2616             :         }
    2617             :     }
    2618             : 
    2619             :   /* Remove dupes from the revocation keys.  */
    2620        2657 :   if (pk->revkey)
    2621             :     {
    2622           2 :       int i, j, x, changed = 0;
    2623             : 
    2624           4 :       for (i = 0; i < pk->numrevkeys; i++)
    2625             :         {
    2626           2 :           for (j = i + 1; j < pk->numrevkeys; j++)
    2627             :             {
    2628           0 :               if (memcmp (&pk->revkey[i], &pk->revkey[j],
    2629             :                           sizeof (struct revocation_key)) == 0)
    2630             :                 {
    2631             :                   /* remove j */
    2632             : 
    2633           0 :                   for (x = j; x < pk->numrevkeys - 1; x++)
    2634           0 :                     pk->revkey[x] = pk->revkey[x + 1];
    2635             : 
    2636           0 :                   pk->numrevkeys--;
    2637           0 :                   j--;
    2638           0 :                   changed = 1;
    2639             :                 }
    2640             :             }
    2641             :         }
    2642             : 
    2643           2 :       if (changed)
    2644           0 :         pk->revkey = xrealloc (pk->revkey,
    2645             :                                pk->numrevkeys *
    2646             :                                sizeof (struct revocation_key));
    2647             :     }
    2648             : 
    2649        2657 :   if (signode)
    2650             :     /* SIGNODE is the 1F signature packet with the latest creation
    2651             :        time.  Extract some information from it.  */
    2652             :     {
    2653             :       /* Some information from a direct key signature take precedence
    2654             :        * over the same information given in UID sigs.  */
    2655           2 :       PKT_signature *sig = signode->pkt->pkt.signature;
    2656             :       const byte *p;
    2657             : 
    2658           2 :       key_usage = parse_key_usage (sig);
    2659             : 
    2660           2 :       p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
    2661           2 :       if (p && buf32_to_u32 (p))
    2662             :         {
    2663           0 :           key_expire = keytimestamp + buf32_to_u32 (p);
    2664           0 :           key_expire_seen = 1;
    2665             :         }
    2666             : 
    2667             :       /* Mark that key as valid: One direct key signature should
    2668             :        * render a key as valid.  */
    2669           2 :       pk->flags.valid = 1;
    2670             :     }
    2671             : 
    2672             :   /* Pass 1.5: Look for key revocation signatures that were not made
    2673             :      by the key (i.e. did a revocation key issue a revocation for
    2674             :      us?).  Only bother to do this if there is a revocation key in the
    2675             :      first place and we're not revoked already.  */
    2676             : 
    2677        2657 :   if (!*r_revoked && pk->revkey)
    2678           6 :     for (k = keyblock; k && k->pkt->pkttype != PKT_USER_ID; k = k->next)
    2679             :       {
    2680           4 :         if (k->pkt->pkttype == PKT_SIGNATURE)
    2681             :           {
    2682           2 :             PKT_signature *sig = k->pkt->pkt.signature;
    2683             : 
    2684           2 :             if (IS_KEY_REV (sig) &&
    2685           0 :                 (sig->keyid[0] != kid[0] || sig->keyid[1] != kid[1]))
    2686             :               {
    2687           0 :                 int rc = check_revocation_keys (pk, sig);
    2688           0 :                 if (rc == 0)
    2689             :                   {
    2690           0 :                     *r_revoked = 2;
    2691           0 :                     sig_to_revoke_info (sig, rinfo);
    2692             :                     /* Don't continue checking since we can't be any
    2693             :                        more revoked than this.  */
    2694           0 :                     break;
    2695             :                   }
    2696           0 :                 else if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY)
    2697           0 :                   pk->flags.maybe_revoked = 1;
    2698             : 
    2699             :                 /* A failure here means the sig did not verify, was
    2700             :                    not issued by a revocation key, or a revocation
    2701             :                    key loop was broken.  If a revocation key isn't
    2702             :                    findable, however, the key might be revoked and
    2703             :                    we don't know it.  */
    2704             : 
    2705             :                 /* TODO: In the future handle subkey and cert
    2706             :                    revocations?  PGP doesn't, but it's in 2440. */
    2707             :               }
    2708             :           }
    2709             :       }
    2710             : 
    2711             :   /* Second pass: Look at the self-signature of all user IDs.  */
    2712             : 
    2713             :   /* According to RFC 4880 section 11.1, user id and attribute packets
    2714             :      are in the second section, after the public key packet and before
    2715             :      the subkey packets.  */
    2716        2657 :   signode = uidnode = NULL;
    2717        2657 :   sigdate = 0; /* Helper variable to find the latest signature in one UID. */
    2718       12675 :   for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY; k = k->next)
    2719             :     {
    2720       10018 :       if (k->pkt->pkttype == PKT_USER_ID || k->pkt->pkttype == PKT_ATTRIBUTE)
    2721             :         /* New user id packet.  */
    2722             :         {
    2723        3500 :           if (uidnode && signode)
    2724             :             /* Apply the data from the most recent self-signed packet
    2725             :                to the preceding user id packet.  */
    2726             :             {
    2727         841 :               fixup_uidnode (uidnode, signode, keytimestamp);
    2728         841 :               pk->flags.valid = 1;
    2729             :             }
    2730             :           /* Clear SIGNODE.  The only relevant self-signed data for
    2731             :              UIDNODE follows it.  */
    2732        3500 :           if (k->pkt->pkttype == PKT_USER_ID)
    2733        3500 :             uidnode = k;
    2734             :           else
    2735           0 :             uidnode = NULL;
    2736        3500 :           signode = NULL;
    2737        3500 :           sigdate = 0;
    2738             :         }
    2739        6518 :       else if (k->pkt->pkttype == PKT_SIGNATURE && uidnode)
    2740             :         {
    2741        3859 :           PKT_signature *sig = k->pkt->pkt.signature;
    2742        3859 :           if (sig->keyid[0] == kid[0] && sig->keyid[1] == kid[1])
    2743             :             {
    2744        3543 :               if (check_key_signature (keyblock, k, NULL))
    2745             :                 ;               /* signature did not verify */
    2746        3543 :               else if ((IS_UID_SIG (sig) || IS_UID_REV (sig))
    2747        3543 :                        && sig->timestamp >= sigdate)
    2748             :                 {
    2749             :                   /* Note: we allow invalidation of cert revocations
    2750             :                    * by a newer signature.  An attacker can't use this
    2751             :                    * because a key should be revoked with a key revocation.
    2752             :                    * The reason why we have to allow for that is that at
    2753             :                    * one time an email address may become invalid but later
    2754             :                    * the same email address may become valid again (hired,
    2755             :                    * fired, hired again).  */
    2756             : 
    2757        3540 :                   sigdate = sig->timestamp;
    2758        3540 :                   signode = k;
    2759        3540 :                   signode->pkt->pkt.signature->flags.chosen_selfsig = 0;
    2760        3540 :                   if (sig->version > sigversion)
    2761        2648 :                     sigversion = sig->version;
    2762             :                 }
    2763             :             }
    2764             :         }
    2765             :     }
    2766        2657 :   if (uidnode && signode)
    2767             :     {
    2768        2650 :       fixup_uidnode (uidnode, signode, keytimestamp);
    2769        2650 :       pk->flags.valid = 1;
    2770             :     }
    2771             : 
    2772             :   /* If the key isn't valid yet, and we have
    2773             :      --allow-non-selfsigned-uid set, then force it valid. */
    2774        2657 :   if (!pk->flags.valid && opt.allow_non_selfsigned_uid)
    2775             :     {
    2776           4 :       if (opt.verbose)
    2777           0 :         log_info (_("Invalid key %s made valid by"
    2778             :                     " --allow-non-selfsigned-uid\n"), keystr_from_pk (pk));
    2779           4 :       pk->flags.valid = 1;
    2780             :     }
    2781             : 
    2782             :   /* The key STILL isn't valid, so try and find an ultimately
    2783             :      trusted signature. */
    2784        2657 :   if (!pk->flags.valid)
    2785             :     {
    2786           1 :       uidnode = NULL;
    2787             : 
    2788           9 :       for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
    2789           7 :            k = k->next)
    2790             :         {
    2791           7 :           if (k->pkt->pkttype == PKT_USER_ID)
    2792           3 :             uidnode = k;
    2793           4 :           else if (k->pkt->pkttype == PKT_SIGNATURE && uidnode)
    2794             :             {
    2795           3 :               PKT_signature *sig = k->pkt->pkt.signature;
    2796             : 
    2797           3 :               if (sig->keyid[0] != kid[0] || sig->keyid[1] != kid[1])
    2798             :                 {
    2799             :                   PKT_public_key *ultimate_pk;
    2800             : 
    2801           3 :                   ultimate_pk = xmalloc_clear (sizeof (*ultimate_pk));
    2802             : 
    2803             :                   /* We don't want to use the full get_pubkey to
    2804             :                      avoid infinite recursion in certain cases.
    2805             :                      There is no reason to check that an ultimately
    2806             :                      trusted key is still valid - if it has been
    2807             :                      revoked the user should also remove the
    2808             :                      ultimate trust flag.  */
    2809           3 :                   if (get_pubkey_fast (ultimate_pk, sig->keyid) == 0
    2810           0 :                       && check_key_signature2 (keyblock, k, ultimate_pk,
    2811             :                                                NULL, NULL, NULL, NULL) == 0
    2812           0 :                       && get_ownertrust (ultimate_pk) == TRUST_ULTIMATE)
    2813             :                     {
    2814           0 :                       free_public_key (ultimate_pk);
    2815           0 :                       pk->flags.valid = 1;
    2816           0 :                       break;
    2817             :                     }
    2818             : 
    2819           3 :                   free_public_key (ultimate_pk);
    2820             :                 }
    2821             :             }
    2822             :         }
    2823             :     }
    2824             : 
    2825             :   /* Record the highest selfsig version so we know if this is a v3
    2826             :      key through and through, or a v3 key with a v4 selfsig
    2827             :      somewhere.  This is useful in a few places to know if the key
    2828             :      must be treated as PGP2-style or OpenPGP-style.  Note that a
    2829             :      selfsig revocation with a higher version number will also raise
    2830             :      this value.  This is okay since such a revocation must be
    2831             :      issued by the user (i.e. it cannot be issued by someone else to
    2832             :      modify the key behavior.) */
    2833             : 
    2834        2657 :   pk->selfsigversion = sigversion;
    2835             : 
    2836             :   /* Now that we had a look at all user IDs we can now get some information
    2837             :    * from those user IDs.
    2838             :    */
    2839             : 
    2840        2657 :   if (!key_usage)
    2841             :     {
    2842             :       /* Find the latest user ID with key flags set. */
    2843        2657 :       uiddate = 0; /* Helper to find the latest user ID.  */
    2844       15332 :       for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
    2845       10018 :            k = k->next)
    2846             :         {
    2847       10018 :           if (k->pkt->pkttype == PKT_USER_ID)
    2848             :             {
    2849        3500 :               PKT_user_id *uid = k->pkt->pkt.user_id;
    2850        3500 :               if (uid->help_key_usage && uid->created > uiddate)
    2851             :                 {
    2852        1769 :                   key_usage = uid->help_key_usage;
    2853        1769 :                   uiddate = uid->created;
    2854             :                 }
    2855             :             }
    2856             :         }
    2857             :     }
    2858        2657 :   if (!key_usage)
    2859             :     {
    2860             :       /* No key flags at all: get it from the algo.  */
    2861         967 :       key_usage = openpgp_pk_algo_usage (pk->pubkey_algo);
    2862             :     }
    2863             :   else
    2864             :     {
    2865             :       /* Check that the usage matches the usage as given by the algo.  */
    2866        1690 :       int x = openpgp_pk_algo_usage (pk->pubkey_algo);
    2867        1690 :       if (x) /* Mask it down to the actual allowed usage.  */
    2868        1690 :         key_usage &= x;
    2869             :     }
    2870             : 
    2871             :   /* Whatever happens, it's a primary key, so it can certify. */
    2872        2657 :   pk->pubkey_usage = key_usage | PUBKEY_USAGE_CERT;
    2873             : 
    2874        2657 :   if (!key_expire_seen)
    2875             :     {
    2876             :       /* Find the latest valid user ID with a key expiration set
    2877             :        * Note, that this may be a different one from the above because
    2878             :        * some user IDs may have no expiration date set.  */
    2879        2657 :       uiddate = 0;
    2880       15332 :       for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
    2881       10018 :            k = k->next)
    2882             :         {
    2883       10018 :           if (k->pkt->pkttype == PKT_USER_ID)
    2884             :             {
    2885        3500 :               PKT_user_id *uid = k->pkt->pkt.user_id;
    2886        3500 :               if (uid->help_key_expire && uid->created > uiddate)
    2887             :                 {
    2888         321 :                   key_expire = uid->help_key_expire;
    2889         321 :                   uiddate = uid->created;
    2890             :                 }
    2891             :             }
    2892             :         }
    2893             :     }
    2894             : 
    2895             :   /* Currently only v3 keys have a maximum expiration date, but I'll
    2896             :      bet v5 keys get this feature again. */
    2897        2657 :   if (key_expire == 0
    2898         321 :       || (pk->max_expiredate && key_expire > pk->max_expiredate))
    2899        2336 :     key_expire = pk->max_expiredate;
    2900             : 
    2901        2657 :   pk->has_expired = key_expire >= curtime ? 0 : key_expire;
    2902        2657 :   pk->expiredate = key_expire;
    2903             : 
    2904             :   /* Fixme: we should see how to get rid of the expiretime fields  but
    2905             :    * this needs changes at other places too. */
    2906             : 
    2907             :   /* And now find the real primary user ID and delete all others.  */
    2908        2657 :   uiddate = uiddate2 = 0;
    2909        2657 :   uidnode = uidnode2 = NULL;
    2910       12675 :   for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY; k = k->next)
    2911             :     {
    2912       10018 :       if (k->pkt->pkttype == PKT_USER_ID && !k->pkt->pkt.user_id->attrib_data)
    2913             :         {
    2914        3500 :           PKT_user_id *uid = k->pkt->pkt.user_id;
    2915        3500 :           if (uid->is_primary)
    2916             :             {
    2917         137 :               if (uid->created > uiddate)
    2918             :                 {
    2919         135 :                   uiddate = uid->created;
    2920         135 :                   uidnode = k;
    2921             :                 }
    2922           2 :               else if (uid->created == uiddate && uidnode)
    2923             :                 {
    2924             :                   /* The dates are equal, so we need to do a
    2925             :                      different (and arbitrary) comparison.  This
    2926             :                      should rarely, if ever, happen.  It's good to
    2927             :                      try and guarantee that two different GnuPG
    2928             :                      users with two different keyrings at least pick
    2929             :                      the same primary. */
    2930           0 :                   if (cmp_user_ids (uid, uidnode->pkt->pkt.user_id) > 0)
    2931           0 :                     uidnode = k;
    2932             :                 }
    2933             :             }
    2934             :           else
    2935             :             {
    2936        3363 :               if (uid->created > uiddate2)
    2937             :                 {
    2938        3351 :                   uiddate2 = uid->created;
    2939        3351 :                   uidnode2 = k;
    2940             :                 }
    2941          12 :               else if (uid->created == uiddate2 && uidnode2)
    2942             :                 {
    2943           2 :                   if (cmp_user_ids (uid, uidnode2->pkt->pkt.user_id) > 0)
    2944           2 :                     uidnode2 = k;
    2945             :                 }
    2946             :             }
    2947             :         }
    2948             :     }
    2949        2657 :   if (uidnode)
    2950             :     {
    2951         762 :       for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
    2952         492 :            k = k->next)
    2953             :         {
    2954         628 :           if (k->pkt->pkttype == PKT_USER_ID &&
    2955         136 :               !k->pkt->pkt.user_id->attrib_data)
    2956             :             {
    2957         136 :               PKT_user_id *uid = k->pkt->pkt.user_id;
    2958         136 :               if (k != uidnode)
    2959           1 :                 uid->is_primary = 0;
    2960             :             }
    2961             :         }
    2962             :     }
    2963        2522 :   else if (uidnode2)
    2964             :     {
    2965             :       /* None is flagged primary - use the latest user ID we have,
    2966             :          and disambiguate with the arbitrary packet comparison. */
    2967        2515 :       uidnode2->pkt->pkt.user_id->is_primary = 1;
    2968             :     }
    2969             :   else
    2970             :     {
    2971             :       /* None of our uids were self-signed, so pick the one that
    2972             :          sorts first to be the primary.  This is the best we can do
    2973             :          here since there are no self sigs to date the uids. */
    2974             : 
    2975           7 :       uidnode = NULL;
    2976             : 
    2977          33 :       for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
    2978          19 :            k = k->next)
    2979             :         {
    2980          19 :           if (k->pkt->pkttype == PKT_USER_ID
    2981           9 :               && !k->pkt->pkt.user_id->attrib_data)
    2982             :             {
    2983           9 :               if (!uidnode)
    2984             :                 {
    2985           7 :                   uidnode = k;
    2986           7 :                   uidnode->pkt->pkt.user_id->is_primary = 1;
    2987           7 :                   continue;
    2988             :                 }
    2989             :               else
    2990             :                 {
    2991           2 :                   if (cmp_user_ids (k->pkt->pkt.user_id,
    2992           2 :                                     uidnode->pkt->pkt.user_id) > 0)
    2993             :                     {
    2994           0 :                       uidnode->pkt->pkt.user_id->is_primary = 0;
    2995           0 :                       uidnode = k;
    2996           0 :                       uidnode->pkt->pkt.user_id->is_primary = 1;
    2997             :                     }
    2998             :                   else
    2999           2 :                     k->pkt->pkt.user_id->is_primary = 0;       /* just to be
    3000             :                                                                    safe */
    3001             :                 }
    3002             :             }
    3003             :         }
    3004             :     }
    3005        2657 : }
    3006             : 
    3007             : /* Convert a buffer to a signature.  Useful for 0x19 embedded sigs.
    3008             :    Caller must free the signature when they are done. */
    3009             : static PKT_signature *
    3010         126 : buf_to_sig (const byte * buf, size_t len)
    3011             : {
    3012         126 :   PKT_signature *sig = xmalloc_clear (sizeof (PKT_signature));
    3013         126 :   IOBUF iobuf = iobuf_temp_with_content (buf, len);
    3014         126 :   int save_mode = set_packet_list_mode (0);
    3015             : 
    3016         126 :   if (parse_signature (iobuf, PKT_SIGNATURE, len, sig) != 0)
    3017             :     {
    3018           0 :       xfree (sig);
    3019           0 :       sig = NULL;
    3020             :     }
    3021             : 
    3022         126 :   set_packet_list_mode (save_mode);
    3023         126 :   iobuf_close (iobuf);
    3024             : 
    3025         126 :   return sig;
    3026             : }
    3027             : 
    3028             : /* Use the self-signed data to fill in various fields in subkeys.
    3029             : 
    3030             :    KEYBLOCK is the whole keyblock.  SUBNODE is the subkey to fill in.
    3031             : 
    3032             :    Sets the following fields on the subkey:
    3033             : 
    3034             :      main_keyid
    3035             :      flags.valid        if the subkey has a valid self-sig binding
    3036             :      flags.revoked
    3037             :      flags.backsig
    3038             :      pubkey_usage
    3039             :      has_expired
    3040             :      expired_date
    3041             : 
    3042             :    On this subkey's most revent valid self-signed packet, the
    3043             :    following field is set:
    3044             : 
    3045             :      flags.chosen_selfsig
    3046             :   */
    3047             : static void
    3048        2810 : merge_selfsigs_subkey (KBNODE keyblock, KBNODE subnode)
    3049             : {
    3050        2810 :   PKT_public_key *mainpk = NULL, *subpk = NULL;
    3051             :   PKT_signature *sig;
    3052             :   KBNODE k;
    3053             :   u32 mainkid[2];
    3054        2810 :   u32 sigdate = 0;
    3055             :   KBNODE signode;
    3056        2810 :   u32 curtime = make_timestamp ();
    3057        2810 :   unsigned int key_usage = 0;
    3058        2810 :   u32 keytimestamp = 0;
    3059        2810 :   u32 key_expire = 0;
    3060             :   const byte *p;
    3061             : 
    3062        2810 :   if (subnode->pkt->pkttype != PKT_PUBLIC_SUBKEY)
    3063           0 :     BUG ();
    3064        2810 :   mainpk = keyblock->pkt->pkt.public_key;
    3065        2810 :   if (mainpk->version < 4)
    3066           1 :     return;/* (actually this should never happen) */
    3067        2810 :   keyid_from_pk (mainpk, mainkid);
    3068        2810 :   subpk = subnode->pkt->pkt.public_key;
    3069        2810 :   keytimestamp = subpk->timestamp;
    3070             : 
    3071        2810 :   subpk->flags.valid = 0;
    3072        2810 :   subpk->flags.exact = 0;
    3073        2810 :   subpk->main_keyid[0] = mainpk->main_keyid[0];
    3074        2810 :   subpk->main_keyid[1] = mainpk->main_keyid[1];
    3075             : 
    3076             :   /* Find the latest key binding self-signature.  */
    3077        2810 :   signode = NULL;
    3078        2810 :   sigdate = 0; /* Helper to find the latest signature.  */
    3079        8430 :   for (k = subnode->next; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
    3080        2810 :        k = k->next)
    3081             :     {
    3082        2810 :       if (k->pkt->pkttype == PKT_SIGNATURE)
    3083             :         {
    3084        2810 :           sig = k->pkt->pkt.signature;
    3085        2810 :           if (sig->keyid[0] == mainkid[0] && sig->keyid[1] == mainkid[1])
    3086             :             {
    3087        2809 :               if (check_key_signature (keyblock, k, NULL))
    3088             :                 ; /* Signature did not verify.  */
    3089        2809 :               else if (IS_SUBKEY_REV (sig))
    3090             :                 {
    3091             :                   /* Note that this means that the date on a
    3092             :                      revocation sig does not matter - even if the
    3093             :                      binding sig is dated after the revocation sig,
    3094             :                      the subkey is still marked as revoked.  This
    3095             :                      seems ok, as it is just as easy to make new
    3096             :                      subkeys rather than re-sign old ones as the
    3097             :                      problem is in the distribution.  Plus, PGP (7)
    3098             :                      does this the same way.  */
    3099           0 :                   subpk->flags.revoked = 1;
    3100           0 :                   sig_to_revoke_info (sig, &subpk->revoked);
    3101             :                   /* Although we could stop now, we continue to
    3102             :                    * figure out other information like the old expiration
    3103             :                    * time.  */
    3104             :                 }
    3105        2809 :               else if (IS_SUBKEY_SIG (sig) && sig->timestamp >= sigdate)
    3106             :                 {
    3107        2809 :                   if (sig->flags.expired)
    3108             :                     ; /* Signature has expired - ignore it.  */
    3109             :                   else
    3110             :                     {
    3111        2809 :                       sigdate = sig->timestamp;
    3112        2809 :                       signode = k;
    3113        2809 :                       signode->pkt->pkt.signature->flags.chosen_selfsig = 0;
    3114             :                     }
    3115             :                 }
    3116             :             }
    3117             :         }
    3118             :     }
    3119             : 
    3120             :   /* No valid key binding.  */
    3121        2810 :   if (!signode)
    3122           1 :     return;
    3123             : 
    3124        2809 :   sig = signode->pkt->pkt.signature;
    3125        2809 :   sig->flags.chosen_selfsig = 1; /* So we know which selfsig we chose later.  */
    3126             : 
    3127        2809 :   key_usage = parse_key_usage (sig);
    3128        2809 :   if (!key_usage)
    3129             :     {
    3130             :       /* No key flags at all: get it from the algo.  */
    3131         961 :       key_usage = openpgp_pk_algo_usage (subpk->pubkey_algo);
    3132             :     }
    3133             :   else
    3134             :     {
    3135             :       /* Check that the usage matches the usage as given by the algo.  */
    3136        1848 :       int x = openpgp_pk_algo_usage (subpk->pubkey_algo);
    3137        1848 :       if (x) /* Mask it down to the actual allowed usage.  */
    3138        1848 :         key_usage &= x;
    3139             :     }
    3140             : 
    3141        2809 :   subpk->pubkey_usage = key_usage;
    3142             : 
    3143        2809 :   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
    3144        2809 :   if (p && buf32_to_u32 (p))
    3145         326 :     key_expire = keytimestamp + buf32_to_u32 (p);
    3146             :   else
    3147        2483 :     key_expire = 0;
    3148        2809 :   subpk->has_expired = key_expire >= curtime ? 0 : key_expire;
    3149        2809 :   subpk->expiredate = key_expire;
    3150             : 
    3151             :   /* Algo doesn't exist.  */
    3152        2809 :   if (openpgp_pk_test_algo (subpk->pubkey_algo))
    3153           0 :     return;
    3154             : 
    3155        2809 :   subpk->flags.valid = 1;
    3156             : 
    3157             :   /* Find the most recent 0x19 embedded signature on our self-sig. */
    3158        2809 :   if (!subpk->flags.backsig)
    3159             :     {
    3160        2809 :       int seq = 0;
    3161             :       size_t n;
    3162        2809 :       PKT_signature *backsig = NULL;
    3163             : 
    3164        2809 :       sigdate = 0;
    3165             : 
    3166             :       /* We do this while() since there may be other embedded
    3167             :          signatures in the future.  We only want 0x19 here. */
    3168             : 
    3169        5618 :       while ((p = enum_sig_subpkt (sig->hashed,
    3170             :                                    SIGSUBPKT_SIGNATURE, &n, &seq, NULL)))
    3171           0 :         if (n > 3
    3172           0 :             && ((p[0] == 3 && p[2] == 0x19) || (p[0] == 4 && p[1] == 0x19)))
    3173             :           {
    3174           0 :             PKT_signature *tempsig = buf_to_sig (p, n);
    3175           0 :             if (tempsig)
    3176             :               {
    3177           0 :                 if (tempsig->timestamp > sigdate)
    3178             :                   {
    3179           0 :                     if (backsig)
    3180           0 :                       free_seckey_enc (backsig);
    3181             : 
    3182           0 :                     backsig = tempsig;
    3183           0 :                     sigdate = backsig->timestamp;
    3184             :                   }
    3185             :                 else
    3186           0 :                   free_seckey_enc (tempsig);
    3187             :               }
    3188             :           }
    3189             : 
    3190        2809 :       seq = 0;
    3191             : 
    3192             :       /* It is safe to have this in the unhashed area since the 0x19
    3193             :          is located on the selfsig for convenience, not security. */
    3194             : 
    3195        5744 :       while ((p = enum_sig_subpkt (sig->unhashed, SIGSUBPKT_SIGNATURE,
    3196             :                                    &n, &seq, NULL)))
    3197         126 :         if (n > 3
    3198         126 :             && ((p[0] == 3 && p[2] == 0x19) || (p[0] == 4 && p[1] == 0x19)))
    3199             :           {
    3200         126 :             PKT_signature *tempsig = buf_to_sig (p, n);
    3201         126 :             if (tempsig)
    3202             :               {
    3203         126 :                 if (tempsig->timestamp > sigdate)
    3204             :                   {
    3205         126 :                     if (backsig)
    3206           0 :                       free_seckey_enc (backsig);
    3207             : 
    3208         126 :                     backsig = tempsig;
    3209         126 :                     sigdate = backsig->timestamp;
    3210             :                   }
    3211             :                 else
    3212           0 :                   free_seckey_enc (tempsig);
    3213             :               }
    3214             :           }
    3215             : 
    3216        2809 :       if (backsig)
    3217             :         {
    3218             :           /* At this point, backsig contains the most recent 0x19 sig.
    3219             :              Let's see if it is good. */
    3220             : 
    3221             :           /* 2==valid, 1==invalid, 0==didn't check */
    3222         126 :           if (check_backsig (mainpk, subpk, backsig) == 0)
    3223         126 :             subpk->flags.backsig = 2;
    3224             :           else
    3225           0 :             subpk->flags.backsig = 1;
    3226             : 
    3227         126 :           free_seckey_enc (backsig);
    3228             :         }
    3229             :     }
    3230             : }
    3231             : 
    3232             : 
    3233             : /* Merge information from the self-signatures with the public key,
    3234             :    subkeys and user ids to make using them more easy.
    3235             : 
    3236             :    See documentation for merge_selfsigs_main, merge_selfsigs_subkey
    3237             :    and fixup_uidnode for exactly which fields are updated.  */
    3238             : static void
    3239        2657 : merge_selfsigs (KBNODE keyblock)
    3240             : {
    3241             :   KBNODE k;
    3242             :   int revoked;
    3243             :   struct revoke_info rinfo;
    3244             :   PKT_public_key *main_pk;
    3245             :   prefitem_t *prefs;
    3246             :   unsigned int mdc_feature;
    3247             : 
    3248        2657 :   if (keyblock->pkt->pkttype != PKT_PUBLIC_KEY)
    3249             :     {
    3250           0 :       if (keyblock->pkt->pkttype == PKT_SECRET_KEY)
    3251             :         {
    3252           0 :           log_error ("expected public key but found secret key "
    3253             :                      "- must stop\n");
    3254             :           /* We better exit here because a public key is expected at
    3255             :              other places too.  FIXME: Figure this out earlier and
    3256             :              don't get to here at all */
    3257           0 :           g10_exit (1);
    3258             :         }
    3259           0 :       BUG ();
    3260             :     }
    3261             : 
    3262        2657 :   merge_selfsigs_main (keyblock, &revoked, &rinfo);
    3263             : 
    3264             :   /* Now merge in the data from each of the subkeys.  */
    3265       18295 :   for (k = keyblock; k; k = k->next)
    3266             :     {
    3267       15638 :       if (k->pkt->pkttype == PKT_PUBLIC_SUBKEY)
    3268             :         {
    3269        2810 :           merge_selfsigs_subkey (keyblock, k);
    3270             :         }
    3271             :     }
    3272             : 
    3273        2657 :   main_pk = keyblock->pkt->pkt.public_key;
    3274        2657 :   if (revoked || main_pk->has_expired || !main_pk->flags.valid)
    3275             :     {
    3276             :       /* If the primary key is revoked, expired, or invalid we
    3277             :        * better set the appropriate flags on that key and all
    3278             :        * subkeys.  */
    3279         282 :       for (k = keyblock; k; k = k->next)
    3280             :         {
    3281         233 :           if (k->pkt->pkttype == PKT_PUBLIC_KEY
    3282         184 :               || k->pkt->pkttype == PKT_PUBLIC_SUBKEY)
    3283             :             {
    3284          89 :               PKT_public_key *pk = k->pkt->pkt.public_key;
    3285          89 :               if (!main_pk->flags.valid)
    3286           2 :                 pk->flags.valid = 0;
    3287          89 :               if (revoked && !pk->flags.revoked)
    3288             :                 {
    3289           0 :                   pk->flags.revoked = revoked;
    3290           0 :                   memcpy (&pk->revoked, &rinfo, sizeof (rinfo));
    3291             :                 }
    3292          89 :               if (main_pk->has_expired)
    3293          87 :                 pk->has_expired = main_pk->has_expired;
    3294             :             }
    3295             :         }
    3296        2706 :       return;
    3297             :     }
    3298             : 
    3299             :   /* Set the preference list of all keys to those of the primary real
    3300             :    * user ID.  Note: we use these preferences when we don't know by
    3301             :    * which user ID the key has been selected.
    3302             :    * fixme: we should keep atoms of commonly used preferences or
    3303             :    * use reference counting to optimize the preference lists storage.
    3304             :    * FIXME: it might be better to use the intersection of
    3305             :    * all preferences.
    3306             :    * Do a similar thing for the MDC feature flag.  */
    3307        2608 :   prefs = NULL;
    3308        2608 :   mdc_feature = 0;
    3309        7010 :   for (k = keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY; k = k->next)
    3310             :     {
    3311        7010 :       if (k->pkt->pkttype == PKT_USER_ID
    3312        3447 :           && !k->pkt->pkt.user_id->attrib_data
    3313        3447 :           && k->pkt->pkt.user_id->is_primary)
    3314             :         {
    3315        2608 :           prefs = k->pkt->pkt.user_id->prefs;
    3316        2608 :           mdc_feature = k->pkt->pkt.user_id->flags.mdc;
    3317        2608 :           break;
    3318             :         }
    3319             :     }
    3320       18013 :   for (k = keyblock; k; k = k->next)
    3321             :     {
    3322       15405 :       if (k->pkt->pkttype == PKT_PUBLIC_KEY
    3323       12797 :           || k->pkt->pkttype == PKT_PUBLIC_SUBKEY)
    3324             :         {
    3325        5378 :           PKT_public_key *pk = k->pkt->pkt.public_key;
    3326        5378 :           if (pk->prefs)
    3327          29 :             xfree (pk->prefs);
    3328        5378 :           pk->prefs = copy_prefs (prefs);
    3329        5378 :           pk->flags.mdc = mdc_feature;
    3330             :         }
    3331             :     }
    3332             : }
    3333             : 
    3334             : 
    3335             : 
    3336             : /* See whether the key satisfies any additional requirements specified
    3337             :  * in CTX.  If so, return the node of an appropriate key or subkey.
    3338             :  * Otherwise, return NULL if there was no appropriate key.
    3339             :  *
    3340             :  * Note that we do not return a reference, i.e. the result must not be
    3341             :  * freed using 'release_kbnode'.
    3342             :  *
    3343             :  * In case the primary key is not required, select a suitable subkey.
    3344             :  * We need the primary key if PUBKEY_USAGE_CERT is set in REQ_USAGE or
    3345             :  * we are in PGP6 or PGP7 mode and PUBKEY_USAGE_SIG is set in
    3346             :  * REQ_USAGE.
    3347             :  *
    3348             :  * If any of PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT
    3349             :  * are set in REQ_USAGE, we filter by the key's function.  Concretely,
    3350             :  * if PUBKEY_USAGE_SIG and PUBKEY_USAGE_CERT are set, then we only
    3351             :  * return a key if it is (at least) either a signing or a
    3352             :  * certification key.
    3353             :  *
    3354             :  * If REQ_USAGE is set, then we reject any keys that are not good
    3355             :  * (i.e., valid, not revoked, not expired, etc.).  This allows the
    3356             :  * getkey functions to be used for plain key listings.
    3357             :  *
    3358             :  * Sets the matched key's user id field (pk->user_id) to the user id
    3359             :  * that matched the low-level search criteria or NULL.
    3360             :  *
    3361             :  * If R_FLAGS is not NULL set certain flags for more detailed error
    3362             :  * reporting.  Used flags are:
    3363             :  *
    3364             :  * - LOOKUP_ALL_SUBKEYS_EXPIRED :: All Subkeys are expired or have
    3365             :  *                                 been revoked.
    3366             :  * - LOOKUP_NOT_SELECTED :: No suitable key found
    3367             :  *
    3368             :  * This function needs to handle several different cases:
    3369             :  *
    3370             :  *  1. No requested usage and no primary key requested
    3371             :  *     Examples for this case are that we have a keyID to be used
    3372             :  *     for decrytion or verification.
    3373             :  *  2. No usage but primary key requested
    3374             :  *     This is the case for all functions which work on an
    3375             :  *     entire keyblock, e.g. for editing or listing
    3376             :  *  3. Usage and primary key requested
    3377             :  *     FIXME
    3378             :  *  4. Usage but no primary key requested
    3379             :  *     FIXME
    3380             :  *
    3381             :  */
    3382             : static kbnode_t
    3383        2521 : finish_lookup (kbnode_t keyblock, unsigned int req_usage, int want_exact,
    3384             :                unsigned int *r_flags)
    3385             : {
    3386             :   kbnode_t k;
    3387             : 
    3388             :   /* If WANT_EXACT is set, the key or subkey that actually matched the
    3389             :      low-level search criteria.  */
    3390        2521 :   kbnode_t foundk = NULL;
    3391             :   /* The user id (if any) that matched the low-level search criteria.  */
    3392        2521 :   PKT_user_id *foundu = NULL;
    3393             : 
    3394             :   u32 latest_date;
    3395             :   kbnode_t latest_key;
    3396             :   PKT_public_key *pk;
    3397             :   int req_prim;
    3398        2521 :   u32 curtime = make_timestamp ();
    3399             : 
    3400        2521 :   if (r_flags)
    3401        2521 :     *r_flags = 0;
    3402             : 
    3403             : #define USAGE_MASK  (PUBKEY_USAGE_SIG|PUBKEY_USAGE_ENC|PUBKEY_USAGE_CERT)
    3404        2521 :   req_usage &= USAGE_MASK;
    3405             : 
    3406             :   /* Request the primary if we're certifying another key, and also if
    3407             :    * signing data while --pgp6 or --pgp7 is on since pgp 6 and 7 do
    3408             :    * not understand signatures made by a signing subkey.  PGP 8 does. */
    3409        5042 :   req_prim = ((req_usage & PUBKEY_USAGE_CERT)
    3410        2521 :               || ((PGP6 || PGP7) && (req_usage & PUBKEY_USAGE_SIG)));
    3411             : 
    3412             : 
    3413        2521 :   log_assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
    3414             : 
    3415             :   /* For an exact match mark the primary or subkey that matched the
    3416             :      low-level search criteria.  */
    3417        2521 :   if (want_exact)
    3418             :     {
    3419        3029 :       for (k = keyblock; k; k = k->next)
    3420             :         {
    3421        3029 :           if ((k->flag & 1))
    3422             :             {
    3423        1246 :               log_assert (k->pkt->pkttype == PKT_PUBLIC_KEY
    3424             :                           || k->pkt->pkttype == PKT_PUBLIC_SUBKEY);
    3425        1246 :               foundk = k;
    3426        1246 :               pk = k->pkt->pkt.public_key;
    3427        1246 :               pk->flags.exact = 1;
    3428        1246 :               break;
    3429             :             }
    3430             :         }
    3431             :     }
    3432             : 
    3433             :   /* Get the user id that matched that low-level search criteria.  */
    3434       16398 :   for (k = keyblock; k; k = k->next)
    3435             :     {
    3436       14108 :       if ((k->flag & 2))
    3437             :         {
    3438         231 :           log_assert (k->pkt->pkttype == PKT_USER_ID);
    3439         231 :           foundu = k->pkt->pkt.user_id;
    3440         231 :           break;
    3441             :         }
    3442             :     }
    3443             : 
    3444        2521 :   if (DBG_LOOKUP)
    3445           0 :     log_debug ("finish_lookup: checking key %08lX (%s)(req_usage=%x)\n",
    3446           0 :                (ulong) keyid_from_pk (keyblock->pkt->pkt.public_key, NULL),
    3447             :                foundk ? "one" : "all", req_usage);
    3448             : 
    3449        2521 :   if (!req_usage)
    3450             :     {
    3451        2128 :       latest_key = foundk ? foundk : keyblock;
    3452        2128 :       goto found;
    3453             :     }
    3454             : 
    3455         393 :   latest_date = 0;
    3456         393 :   latest_key = NULL;
    3457             :   /* Set LATEST_KEY to the latest (the one with the most recent
    3458             :    * timestamp) good (valid, not revoked, not expired, etc.) subkey.
    3459             :    *
    3460             :    * Don't bother if we are only looking for a primary key or we need
    3461             :    * an exact match and the exact match is not a subkey.  */
    3462         393 :   if (req_prim || (foundk && foundk->pkt->pkttype != PKT_PUBLIC_SUBKEY))
    3463             :     ;
    3464             :   else
    3465             :     {
    3466             :       kbnode_t nextk;
    3467         392 :       int n_subkeys = 0;
    3468         392 :       int n_revoked_or_expired = 0;
    3469             : 
    3470             :       /* Either start a loop or check just this one subkey.  */
    3471        2768 :       for (k = foundk ? foundk : keyblock; k; k = nextk)
    3472             :         {
    3473        2376 :           if (foundk)
    3474             :             {
    3475             :               /* If FOUNDK is not NULL, then only consider that exact
    3476             :                  key, i.e., don't iterate.  */
    3477           2 :               nextk = NULL;
    3478             :             }
    3479             :           else
    3480        2374 :             nextk = k->next;
    3481             : 
    3482        2376 :           if (k->pkt->pkttype != PKT_PUBLIC_SUBKEY)
    3483        1942 :             continue;
    3484             : 
    3485         434 :           pk = k->pkt->pkt.public_key;
    3486         434 :           if (DBG_LOOKUP)
    3487           0 :             log_debug ("\tchecking subkey %08lX\n",
    3488           0 :                        (ulong) keyid_from_pk (pk, NULL));
    3489             : 
    3490         434 :           if (!pk->flags.valid)
    3491             :             {
    3492           0 :               if (DBG_LOOKUP)
    3493           0 :                 log_debug ("\tsubkey not valid\n");
    3494           0 :               continue;
    3495             :             }
    3496         434 :           if (!((pk->pubkey_usage & USAGE_MASK) & req_usage))
    3497             :             {
    3498         145 :               if (DBG_LOOKUP)
    3499           0 :                 log_debug ("\tusage does not match: want=%x have=%x\n",
    3500           0 :                            req_usage, pk->pubkey_usage);
    3501         145 :               continue;
    3502             :             }
    3503             : 
    3504         289 :           n_subkeys++;
    3505         289 :           if (pk->flags.revoked)
    3506             :             {
    3507           0 :               if (DBG_LOOKUP)
    3508           0 :                 log_debug ("\tsubkey has been revoked\n");
    3509           0 :               n_revoked_or_expired++;
    3510           0 :               continue;
    3511             :             }
    3512         289 :           if (pk->has_expired)
    3513             :             {
    3514           0 :               if (DBG_LOOKUP)
    3515           0 :                 log_debug ("\tsubkey has expired\n");
    3516           0 :               n_revoked_or_expired++;
    3517           0 :               continue;
    3518             :             }
    3519         289 :           if (pk->timestamp > curtime && !opt.ignore_valid_from)
    3520             :             {
    3521           0 :               if (DBG_LOOKUP)
    3522           0 :                 log_debug ("\tsubkey not yet valid\n");
    3523           0 :               continue;
    3524             :             }
    3525             : 
    3526         289 :           if (DBG_LOOKUP)
    3527           0 :             log_debug ("\tsubkey might be fine\n");
    3528             :           /* In case a key has a timestamp of 0 set, we make sure
    3529             :              that it is used.  A better change would be to compare
    3530             :              ">=" but that might also change the selected keys and
    3531             :              is as such a more intrusive change.  */
    3532         289 :           if (pk->timestamp > latest_date || (!pk->timestamp && !latest_date))
    3533             :             {
    3534         289 :               latest_date = pk->timestamp;
    3535         289 :               latest_key = k;
    3536             :             }
    3537             :         }
    3538         392 :       if (n_subkeys == n_revoked_or_expired && r_flags)
    3539         118 :         *r_flags |= LOOKUP_ALL_SUBKEYS_EXPIRED;
    3540             :     }
    3541             : 
    3542             :   /* Check if the primary key is ok (valid, not revoke, not expire,
    3543             :    * matches requested usage) if:
    3544             :    *
    3545             :    *   - we didn't find an appropriate subkey and we're not doing an
    3546             :    *     exact search,
    3547             :    *
    3548             :    *   - we're doing an exact match and the exact match was the
    3549             :    *     primary key, or,
    3550             :    *
    3551             :    *   - we're just considering the primary key.  */
    3552         393 :   if ((!latest_key && !want_exact) || foundk == keyblock || req_prim)
    3553             :     {
    3554         119 :       if (DBG_LOOKUP && !foundk && !req_prim)
    3555           0 :         log_debug ("\tno suitable subkeys found - trying primary\n");
    3556         119 :       pk = keyblock->pkt->pkt.public_key;
    3557         119 :       if (!pk->flags.valid)
    3558             :         {
    3559           0 :           if (DBG_LOOKUP)
    3560           0 :             log_debug ("\tprimary key not valid\n");
    3561             :         }
    3562         119 :       else if (!((pk->pubkey_usage & USAGE_MASK) & req_usage))
    3563             :         {
    3564           0 :           if (DBG_LOOKUP)
    3565           0 :             log_debug ("\tprimary key usage does not match: "
    3566           0 :                        "want=%x have=%x\n", req_usage, pk->pubkey_usage);
    3567             :         }
    3568         119 :       else if (pk->flags.revoked)
    3569             :         {
    3570           0 :           if (DBG_LOOKUP)
    3571           0 :             log_debug ("\tprimary key has been revoked\n");
    3572             :         }
    3573         119 :       else if (pk->has_expired)
    3574             :         {
    3575           0 :           if (DBG_LOOKUP)
    3576           0 :             log_debug ("\tprimary key has expired\n");
    3577             :         }
    3578             :       else /* Okay.  */
    3579             :         {
    3580         119 :           if (DBG_LOOKUP)
    3581           0 :             log_debug ("\tprimary key may be used\n");
    3582         119 :           latest_key = keyblock;
    3583             :         }
    3584             :     }
    3585             : 
    3586         393 :   if (!latest_key)
    3587             :     {
    3588           0 :       if (DBG_LOOKUP)
    3589           0 :         log_debug ("\tno suitable key found -  giving up\n");
    3590           0 :       if (r_flags)
    3591           0 :         *r_flags |= LOOKUP_NOT_SELECTED;
    3592           0 :       return NULL; /* Not found.  */
    3593             :     }
    3594             : 
    3595             :  found:
    3596        2521 :   if (DBG_LOOKUP)
    3597           0 :     log_debug ("\tusing key %08lX\n",
    3598           0 :                (ulong) keyid_from_pk (latest_key->pkt->pkt.public_key, NULL));
    3599             : 
    3600        2521 :   if (latest_key)
    3601             :     {
    3602        2521 :       pk = latest_key->pkt->pkt.public_key;
    3603        2521 :       free_user_id (pk->user_id);
    3604        2521 :       pk->user_id = scopy_user_id (foundu);
    3605             :     }
    3606             : 
    3607        2521 :   if (latest_key != keyblock && opt.verbose)
    3608             :     {
    3609           6 :       char *tempkeystr =
    3610           6 :         xstrdup (keystr_from_pk (latest_key->pkt->pkt.public_key));
    3611           6 :       log_info (_("using subkey %s instead of primary key %s\n"),
    3612           6 :                 tempkeystr, keystr_from_pk (keyblock->pkt->pkt.public_key));
    3613           6 :       xfree (tempkeystr);
    3614             :     }
    3615             : 
    3616        2521 :   cache_user_id (keyblock);
    3617             : 
    3618        2521 :   return latest_key ? latest_key : keyblock; /* Found.  */
    3619             : }
    3620             : 
    3621             : 
    3622             : /* Print a KEY_CONSIDERED status line.  */
    3623             : static void
    3624        2521 : print_status_key_considered (kbnode_t keyblock, unsigned int flags)
    3625             : {
    3626             :   char hexfpr[2*MAX_FINGERPRINT_LEN + 1];
    3627             :   kbnode_t node;
    3628             :   char flagbuf[20];
    3629             : 
    3630        2521 :   if (!is_status_enabled ())
    3631        4980 :     return;
    3632             : 
    3633          31 :   for (node=keyblock; node; node = node->next)
    3634          31 :     if (node->pkt->pkttype == PKT_PUBLIC_KEY
    3635           0 :         || node->pkt->pkttype == PKT_SECRET_KEY)
    3636             :       break;
    3637          31 :   if (!node)
    3638             :     {
    3639           0 :       log_error ("%s: keyblock w/o primary key\n", __func__);
    3640           0 :       return;
    3641             :     }
    3642             : 
    3643          31 :   hexfingerprint (node->pkt->pkt.public_key, hexfpr, sizeof hexfpr);
    3644          31 :   snprintf (flagbuf, sizeof flagbuf, " %u", flags);
    3645          31 :   write_status_strings (STATUS_KEY_CONSIDERED, hexfpr, flagbuf, NULL);
    3646             : }
    3647             : 
    3648             : 
    3649             : 
    3650             : /* A high-level function to lookup keys.
    3651             : 
    3652             :    This function builds on top of the low-level keydb API.  It first
    3653             :    searches the database using the description stored in CTX->ITEMS,
    3654             :    then it filters the results using CTX and, finally, if WANT_SECRET
    3655             :    is set, it ignores any keys for which no secret key is available.
    3656             : 
    3657             :    Unlike the low-level search functions, this function also merges
    3658             :    all of the self-signed data into the keys, subkeys and user id
    3659             :    packets (see the merge_selfsigs for details).
    3660             : 
    3661             :    On success the key's keyblock is stored at *RET_KEYBLOCK, and the
    3662             :    specific subkey is stored at *RET_FOUND_KEY.  Note that we do not
    3663             :    return a reference in *RET_FOUND_KEY, i.e. the result must not be
    3664             :    freed using 'release_kbnode', and it is only valid until
    3665             :    *RET_KEYBLOCK is deallocated.  Therefore, if RET_FOUND_KEY is not
    3666             :    NULL, then RET_KEYBLOCK must not be NULL.  */
    3667             : static int
    3668        2797 : lookup (getkey_ctx_t ctx, kbnode_t *ret_keyblock, kbnode_t *ret_found_key,
    3669             :         int want_secret)
    3670             : {
    3671             :   int rc;
    3672        2797 :   int no_suitable_key = 0;
    3673        2797 :   KBNODE keyblock = NULL;
    3674        2797 :   KBNODE found_key = NULL;
    3675             :   unsigned int infoflags;
    3676             : 
    3677        2797 :   log_assert (ret_found_key == NULL || ret_keyblock != NULL);
    3678        2797 :   if (ret_keyblock)
    3679        2796 :     *ret_keyblock = NULL;
    3680             : 
    3681             :   for (;;)
    3682             :     {
    3683        2797 :       rc = keydb_search (ctx->kr_handle, ctx->items, ctx->nitems, NULL);
    3684        2797 :       if (rc)
    3685         282 :         break;
    3686             : 
    3687             :       /* If we are iterating over the entire database, then we need to
    3688             :          change from KEYDB_SEARCH_MODE_FIRST, which does an implicit
    3689             :          reset, to KEYDB_SEARCH_MODE_NEXT, which gets the next
    3690             :          record.  */
    3691        2515 :       if (ctx->nitems && ctx->items->mode == KEYDB_SEARCH_MODE_FIRST)
    3692          85 :         ctx->items->mode = KEYDB_SEARCH_MODE_NEXT;
    3693             : 
    3694        2515 :       rc = keydb_get_keyblock (ctx->kr_handle, &keyblock);
    3695        2515 :       if (rc)
    3696             :         {
    3697           0 :           log_error ("keydb_get_keyblock failed: %s\n", gpg_strerror (rc));
    3698           0 :           goto skip;
    3699             :         }
    3700             : 
    3701        2515 :       if (want_secret && agent_probe_any_secret_key (NULL, keyblock))
    3702           0 :         goto skip; /* No secret key available.  */
    3703             : 
    3704             :       /* Warning: node flag bits 0 and 1 should be preserved by
    3705             :        * merge_selfsigs.  */
    3706        2515 :       merge_selfsigs (keyblock);
    3707        2515 :       found_key = finish_lookup (keyblock, ctx->req_usage, ctx->exact,
    3708             :                                  &infoflags);
    3709        2515 :       print_status_key_considered (keyblock, infoflags);
    3710        2515 :       if (found_key)
    3711             :         {
    3712        2515 :           no_suitable_key = 0;
    3713        2515 :           goto found;
    3714             :         }
    3715             :       else
    3716             :         {
    3717           0 :           no_suitable_key = 1;
    3718             :         }
    3719             : 
    3720             :     skip:
    3721             :       /* Release resources and continue search. */
    3722           0 :       release_kbnode (keyblock);
    3723           0 :       keyblock = NULL;
    3724             :       /* The keyblock cache ignores the current "file position".
    3725             :          Thus, if we request the next result and the cache matches
    3726             :          (and it will since it is what we just looked for), we'll get
    3727             :          the same entry back!  We can avoid this infinite loop by
    3728             :          disabling the cache.  */
    3729           0 :       keydb_disable_caching (ctx->kr_handle);
    3730           0 :     }
    3731             : 
    3732             :  found:
    3733        2797 :   if (rc && gpg_err_code (rc) != GPG_ERR_NOT_FOUND)
    3734           0 :     log_error ("keydb_search failed: %s\n", gpg_strerror (rc));
    3735             : 
    3736        2797 :   if (!rc)
    3737             :     {
    3738        2515 :       if (ret_keyblock)
    3739             :         {
    3740        2515 :           *ret_keyblock = keyblock; /* Return the keyblock.  */
    3741        2515 :           keyblock = NULL;
    3742             :         }
    3743             :     }
    3744         282 :   else if (gpg_err_code (rc) == GPG_ERR_NOT_FOUND && no_suitable_key)
    3745           0 :     rc = want_secret? GPG_ERR_UNUSABLE_SECKEY : GPG_ERR_UNUSABLE_PUBKEY;
    3746         282 :   else if (gpg_err_code (rc) == GPG_ERR_NOT_FOUND)
    3747         282 :     rc = want_secret? GPG_ERR_NO_SECKEY : GPG_ERR_NO_PUBKEY;
    3748             : 
    3749        2797 :   release_kbnode (keyblock);
    3750             : 
    3751        2797 :   if (ret_found_key)
    3752             :     {
    3753        1940 :       if (! rc)
    3754        1768 :         *ret_found_key = found_key;
    3755             :       else
    3756         172 :         *ret_found_key = NULL;
    3757             :     }
    3758             : 
    3759        2797 :   return rc;
    3760             : }
    3761             : 
    3762             : 
    3763             : /* Enumerate some secret keys (specifically, those specified with
    3764             :  * --default-key and --try-secret-key).  Use the following procedure:
    3765             :  *
    3766             :  *  1) Initialize a void pointer to NULL
    3767             :  *  2) Pass a reference to this pointer to this function (content)
    3768             :  *     and provide space for the secret key (sk)
    3769             :  *  3) Call this function as long as it does not return an error (or
    3770             :  *     until you are done).  The error code GPG_ERR_EOF indicates the
    3771             :  *     end of the listing.
    3772             :  *  4) Call this function a last time with SK set to NULL,
    3773             :  *     so that can free it's context.
    3774             :  *
    3775             :  * In pseudo-code:
    3776             :  *
    3777             :  *   void *ctx = NULL;
    3778             :  *   PKT_public_key *sk = xmalloc_clear (sizeof (*sk));
    3779             :  *
    3780             :  *   while ((err = enum_secret_keys (&ctx, sk)))
    3781             :  *     { // Process SK.
    3782             :  *       if (done)
    3783             :  *         break;
    3784             :  *       free_public_key (sk);
    3785             :  *       sk = xmalloc_clear (sizeof (*sk));
    3786             :  *     }
    3787             :  *
    3788             :  *   // Release any resources used by CTX.
    3789             :  *   enum_secret_keys (&ctx, NULL);
    3790             :  *   free_public_key (sk);
    3791             :  *
    3792             :  *   if (gpg_err_code (err) != GPG_ERR_EOF)
    3793             :  *     ; // An error occurred.
    3794             :  */
    3795             : gpg_error_t
    3796           0 : enum_secret_keys (ctrl_t ctrl, void **context, PKT_public_key *sk)
    3797             : {
    3798           0 :   gpg_error_t err = 0;
    3799             :   const char *name;
    3800             :   kbnode_t keyblock;
    3801             :   struct
    3802             :   {
    3803             :     int eof;
    3804             :     int state;
    3805             :     strlist_t sl;
    3806             :     kbnode_t keyblock;
    3807             :     kbnode_t node;
    3808             :     getkey_ctx_t ctx;
    3809           0 :   } *c = *context;
    3810             : 
    3811           0 :   if (!c)
    3812             :     {
    3813             :       /* Make a new context.  */
    3814           0 :       c = xtrycalloc (1, sizeof *c);
    3815           0 :       if (!c)
    3816           0 :         return gpg_error_from_syserror ();
    3817           0 :       *context = c;
    3818             :     }
    3819             : 
    3820           0 :   if (!sk)
    3821             :     {
    3822             :       /* Free the context.  */
    3823           0 :       release_kbnode (c->keyblock);
    3824           0 :       getkey_end (c->ctx);
    3825           0 :       xfree (c);
    3826           0 :       *context = NULL;
    3827           0 :       return 0;
    3828             :     }
    3829             : 
    3830           0 :   if (c->eof)
    3831           0 :     return gpg_error (GPG_ERR_EOF);
    3832             : 
    3833             :   for (;;)
    3834             :     {
    3835             :       /* Loop until we have a keyblock.  */
    3836           0 :       while (!c->keyblock)
    3837             :         {
    3838             :           /* Loop over the list of secret keys.  */
    3839             :           do
    3840             :             {
    3841           0 :               name = NULL;
    3842           0 :               keyblock = NULL;
    3843           0 :               switch (c->state)
    3844             :                 {
    3845             :                 case 0: /* First try to use the --default-key.  */
    3846           0 :                   name = parse_def_secret_key (ctrl);
    3847           0 :                   c->state = 1;
    3848           0 :                   break;
    3849             : 
    3850             :                 case 1: /* Init list of keys to try.  */
    3851           0 :                   c->sl = opt.secret_keys_to_try;
    3852           0 :                   c->state++;
    3853           0 :                   break;
    3854             : 
    3855             :                 case 2: /* Get next item from list.  */
    3856           0 :                   if (c->sl)
    3857             :                     {
    3858           0 :                       name = c->sl->d;
    3859           0 :                       c->sl = c->sl->next;
    3860             :                     }
    3861             :                   else
    3862           0 :                     c->state++;
    3863           0 :                   break;
    3864             : 
    3865             :                 case 3: /* Init search context to enum all secret keys.  */
    3866           0 :                   err = getkey_bynames (&c->ctx, NULL, NULL, 1, &keyblock);
    3867           0 :                   if (err)
    3868             :                     {
    3869           0 :                       release_kbnode (keyblock);
    3870           0 :                       keyblock = NULL;
    3871           0 :                       getkey_end (c->ctx);
    3872           0 :                       c->ctx = NULL;
    3873             :                     }
    3874           0 :                   c->state++;
    3875           0 :                   break;
    3876             : 
    3877             :                 case 4: /* Get next item from the context.  */
    3878           0 :                   if (c->ctx)
    3879             :                     {
    3880           0 :                       err = getkey_next (c->ctx, NULL, &keyblock);
    3881           0 :                       if (err)
    3882             :                         {
    3883           0 :                           release_kbnode (keyblock);
    3884           0 :                           keyblock = NULL;
    3885           0 :                           getkey_end (c->ctx);
    3886           0 :                           c->ctx = NULL;
    3887             :                         }
    3888             :                     }
    3889             :                   else
    3890           0 :                     c->state++;
    3891           0 :                   break;
    3892             : 
    3893             :                 default: /* No more names to check - stop.  */
    3894           0 :                   c->eof = 1;
    3895           0 :                   return gpg_error (GPG_ERR_EOF);
    3896             :                 }
    3897             :             }
    3898           0 :           while ((!name || !*name) && !keyblock);
    3899             : 
    3900           0 :           if (keyblock)
    3901           0 :             c->node = c->keyblock = keyblock;
    3902             :           else
    3903             :             {
    3904           0 :               err = getkey_byname (ctrl, NULL, NULL, name, 1, &c->keyblock);
    3905           0 :               if (err)
    3906             :                 {
    3907             :                   /* getkey_byname might return a keyblock even in the
    3908             :                      error case - I have not checked.  Thus better release
    3909             :                      it.  */
    3910           0 :                   release_kbnode (c->keyblock);
    3911           0 :                   c->keyblock = NULL;
    3912             :                 }
    3913             :               else
    3914           0 :                 c->node = c->keyblock;
    3915             :             }
    3916             :         }
    3917             : 
    3918             :       /* Get the next key from the current keyblock.  */
    3919           0 :       for (; c->node; c->node = c->node->next)
    3920             :         {
    3921           0 :           if (c->node->pkt->pkttype == PKT_PUBLIC_KEY
    3922           0 :               || c->node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
    3923             :             {
    3924           0 :               copy_public_key (sk, c->node->pkt->pkt.public_key);
    3925           0 :               c->node = c->node->next;
    3926           0 :               return 0; /* Found.  */
    3927             :             }
    3928             :         }
    3929             : 
    3930             :       /* Dispose the keyblock and continue.  */
    3931           0 :       release_kbnode (c->keyblock);
    3932           0 :       c->keyblock = NULL;
    3933           0 :     }
    3934             : }
    3935             : 
    3936             : 
    3937             : /*********************************************
    3938             :  ***********  User ID printing helpers *******
    3939             :  *********************************************/
    3940             : 
    3941             : /* Return a string with a printable representation of the user_id.
    3942             :  * this string must be freed by xfree.   */
    3943             : static char *
    3944         732 : get_user_id_string (u32 * keyid, int mode, size_t *r_len)
    3945             : {
    3946             :   user_id_db_t r;
    3947             :   keyid_list_t a;
    3948         732 :   int pass = 0;
    3949             :   char *p;
    3950             : 
    3951             :   /* Try it two times; second pass reads from the database.  */
    3952             :   do
    3953             :     {
    3954         767 :       for (r = user_id_db; r; r = r->next)
    3955             :         {
    3956        1301 :           for (a = r->keyids; a; a = a->next)
    3957             :             {
    3958        1274 :               if (a->keyid[0] == keyid[0] && a->keyid[1] == keyid[1])
    3959             :                 {
    3960         727 :                   if (mode == 2)
    3961             :                     {
    3962             :                       /* An empty string as user id is possible.  Make
    3963             :                          sure that the malloc allocates one byte and
    3964             :                          does not bail out.  */
    3965         720 :                       p = xmalloc (r->len? r->len : 1);
    3966         720 :                       memcpy (p, r->name, r->len);
    3967         720 :                       if (r_len)
    3968         720 :                         *r_len = r->len;
    3969             :                     }
    3970             :                   else
    3971             :                     {
    3972           7 :                       if (mode)
    3973           3 :                         p = xasprintf ("%08lX%08lX %.*s",
    3974           2 :                                        (ulong) keyid[0], (ulong) keyid[1],
    3975           1 :                                        r->len, r->name);
    3976             :                       else
    3977           6 :                         p = xasprintf ("%s %.*s", keystr (keyid),
    3978           6 :                                        r->len, r->name);
    3979           7 :                       if (r_len)
    3980           0 :                         *r_len = strlen (p);
    3981             :                     }
    3982             : 
    3983         727 :                   return p;
    3984             :                 }
    3985             :             }
    3986             :         }
    3987             :     }
    3988          13 :   while (++pass < 2 && !get_pubkey (NULL, keyid));
    3989             : 
    3990           5 :   if (mode == 2)
    3991           5 :     p = xstrdup (user_id_not_found_utf8 ());
    3992           0 :   else if (mode)
    3993           0 :     p = xasprintf ("%08lX%08lX [?]", (ulong) keyid[0], (ulong) keyid[1]);
    3994             :   else
    3995           0 :     p = xasprintf ("%s [?]", keystr (keyid));
    3996             : 
    3997           5 :   if (r_len)
    3998           5 :     *r_len = strlen (p);
    3999           5 :   return p;
    4000             : }
    4001             : 
    4002             : 
    4003             : char *
    4004           6 : get_user_id_string_native (u32 * keyid)
    4005             : {
    4006           6 :   char *p = get_user_id_string (keyid, 0, NULL);
    4007           6 :   char *p2 = utf8_to_native (p, strlen (p), 0);
    4008           6 :   xfree (p);
    4009           6 :   return p2;
    4010             : }
    4011             : 
    4012             : 
    4013             : char *
    4014           1 : get_long_user_id_string (u32 * keyid)
    4015             : {
    4016           1 :   return get_user_id_string (keyid, 1, NULL);
    4017             : }
    4018             : 
    4019             : 
    4020             : /* Please try to use get_user_byfpr instead of this one.  */
    4021             : char *
    4022         725 : get_user_id (u32 * keyid, size_t * rn)
    4023             : {
    4024         725 :   return get_user_id_string (keyid, 2, rn);
    4025             : }
    4026             : 
    4027             : 
    4028             : /* Please try to use get_user_id_byfpr_native instead of this one.  */
    4029             : char *
    4030         274 : get_user_id_native (u32 * keyid)
    4031             : {
    4032             :   size_t rn;
    4033         274 :   char *p = get_user_id (keyid, &rn);
    4034         274 :   char *p2 = utf8_to_native (p, rn, 0);
    4035         274 :   xfree (p);
    4036         274 :   return p2;
    4037             : }
    4038             : 
    4039             : 
    4040             : /* Return the user id for a key designated by its fingerprint, FPR,
    4041             :    which must be MAX_FINGERPRINT_LEN bytes in size.  Note: the
    4042             :    returned string, which must be freed using xfree, may not be NUL
    4043             :    terminated.  To determine the length of the string, you must use
    4044             :    *RN.  */
    4045             : char *
    4046         186 : get_user_id_byfpr (const byte *fpr, size_t *rn)
    4047             : {
    4048             :   user_id_db_t r;
    4049             :   char *p;
    4050         186 :   int pass = 0;
    4051             : 
    4052             :   /* Try it two times; second pass reads from the database.  */
    4053             :   do
    4054             :     {
    4055        1601 :       for (r = user_id_db; r; r = r->next)
    4056             :         {
    4057             :           keyid_list_t a;
    4058        3952 :           for (a = r->keyids; a; a = a->next)
    4059             :             {
    4060        2723 :               if (!memcmp (a->fpr, fpr, MAX_FINGERPRINT_LEN))
    4061             :                 {
    4062             :                   /* An empty string as user id is possible.  Make
    4063             :                      sure that the malloc allocates one byte and does
    4064             :                      not bail out.  */
    4065         186 :                   p = xmalloc (r->len? r->len : 1);
    4066         186 :                   memcpy (p, r->name, r->len);
    4067         186 :                   *rn = r->len;
    4068         186 :                   return p;
    4069             :                 }
    4070             :             }
    4071             :         }
    4072             :     }
    4073             :   while (++pass < 2
    4074         186 :          && !get_pubkey_byfprint (NULL, NULL, fpr, MAX_FINGERPRINT_LEN));
    4075           0 :   p = xstrdup (user_id_not_found_utf8 ());
    4076           0 :   *rn = strlen (p);
    4077           0 :   return p;
    4078             : }
    4079             : 
    4080             : /* Like get_user_id_byfpr, but convert the string to the native
    4081             :    encoding.  The returned string needs to be freed.  Unlike
    4082             :    get_user_id_byfpr, the returned string is NUL terminated.  */
    4083             : char *
    4084         186 : get_user_id_byfpr_native (const byte *fpr)
    4085             : {
    4086             :   size_t rn;
    4087         186 :   char *p = get_user_id_byfpr (fpr, &rn);
    4088         186 :   char *p2 = utf8_to_native (p, rn, 0);
    4089         186 :   xfree (p);
    4090         186 :   return p2;
    4091             : }
    4092             : 
    4093             : 
    4094             : /* Return the database handle used by this context.  The context still
    4095             :    owns the handle.  */
    4096             : KEYDB_HANDLE
    4097           0 : get_ctx_handle (GETKEY_CTX ctx)
    4098             : {
    4099           0 :   return ctx->kr_handle;
    4100             : }
    4101             : 
    4102             : static void
    4103           0 : free_akl (struct akl *akl)
    4104             : {
    4105           0 :   if (! akl)
    4106           0 :     return;
    4107             : 
    4108           0 :   if (akl->spec)
    4109           0 :     free_keyserver_spec (akl->spec);
    4110             : 
    4111           0 :   xfree (akl);
    4112             : }
    4113             : 
    4114             : void
    4115           0 : release_akl (void)
    4116             : {
    4117           0 :   while (opt.auto_key_locate)
    4118             :     {
    4119           0 :       struct akl *akl2 = opt.auto_key_locate;
    4120           0 :       opt.auto_key_locate = opt.auto_key_locate->next;
    4121           0 :       free_akl (akl2);
    4122             :     }
    4123           0 : }
    4124             : 
    4125             : /* Returns false on error. */
    4126             : int
    4127           0 : parse_auto_key_locate (char *options)
    4128             : {
    4129             :   char *tok;
    4130             : 
    4131           0 :   while ((tok = optsep (&options)))
    4132             :     {
    4133           0 :       struct akl *akl, *check, *last = NULL;
    4134           0 :       int dupe = 0;
    4135             : 
    4136           0 :       if (tok[0] == '\0')
    4137           0 :         continue;
    4138             : 
    4139           0 :       akl = xmalloc_clear (sizeof (*akl));
    4140             : 
    4141           0 :       if (ascii_strcasecmp (tok, "clear") == 0)
    4142             :         {
    4143           0 :           xfree (akl);
    4144           0 :           free_akl (opt.auto_key_locate);
    4145           0 :           opt.auto_key_locate = NULL;
    4146           0 :           continue;
    4147             :         }
    4148           0 :       else if (ascii_strcasecmp (tok, "nodefault") == 0)
    4149           0 :         akl->type = AKL_NODEFAULT;
    4150           0 :       else if (ascii_strcasecmp (tok, "local") == 0)
    4151           0 :         akl->type = AKL_LOCAL;
    4152           0 :       else if (ascii_strcasecmp (tok, "ldap") == 0)
    4153           0 :         akl->type = AKL_LDAP;
    4154           0 :       else if (ascii_strcasecmp (tok, "keyserver") == 0)
    4155           0 :         akl->type = AKL_KEYSERVER;
    4156           0 :       else if (ascii_strcasecmp (tok, "cert") == 0)
    4157           0 :         akl->type = AKL_CERT;
    4158           0 :       else if (ascii_strcasecmp (tok, "pka") == 0)
    4159           0 :         akl->type = AKL_PKA;
    4160           0 :       else if (ascii_strcasecmp (tok, "dane") == 0)
    4161           0 :         akl->type = AKL_DANE;
    4162           0 :       else if (ascii_strcasecmp (tok, "wkd") == 0)
    4163           0 :         akl->type = AKL_WKD;
    4164           0 :       else if ((akl->spec = parse_keyserver_uri (tok, 1)))
    4165           0 :         akl->type = AKL_SPEC;
    4166             :       else
    4167             :         {
    4168           0 :           free_akl (akl);
    4169           0 :           return 0;
    4170             :         }
    4171             : 
    4172             :       /* We must maintain the order the user gave us */
    4173           0 :       for (check = opt.auto_key_locate; check;
    4174           0 :            last = check, check = check->next)
    4175             :         {
    4176             :           /* Check for duplicates */
    4177           0 :           if (check->type == akl->type
    4178           0 :               && (akl->type != AKL_SPEC
    4179           0 :                   || (akl->type == AKL_SPEC
    4180           0 :                       && strcmp (check->spec->uri, akl->spec->uri) == 0)))
    4181             :             {
    4182           0 :               dupe = 1;
    4183           0 :               free_akl (akl);
    4184           0 :               break;
    4185             :             }
    4186             :         }
    4187             : 
    4188           0 :       if (!dupe)
    4189             :         {
    4190           0 :           if (last)
    4191           0 :             last->next = akl;
    4192             :           else
    4193           0 :             opt.auto_key_locate = akl;
    4194             :         }
    4195             :     }
    4196             : 
    4197           0 :   return 1;
    4198             : }
    4199             : 
    4200             : 
    4201             : /* Returns true if a secret key is available for the public key with
    4202             :    key id KEYID; returns false if not.  This function ignores legacy
    4203             :    keys.  Note: this is just a fast check and does not tell us whether
    4204             :    the secret key is valid; this check merely indicates whether there
    4205             :    is some secret key with the specified key id.  */
    4206             : int
    4207         508 : have_secret_key_with_kid (u32 *keyid)
    4208             : {
    4209             :   gpg_error_t err;
    4210             :   KEYDB_HANDLE kdbhd;
    4211             :   KEYDB_SEARCH_DESC desc;
    4212             :   kbnode_t keyblock;
    4213             :   kbnode_t node;
    4214         508 :   int result = 0;
    4215             : 
    4216         508 :   kdbhd = keydb_new ();
    4217         508 :   if (!kdbhd)
    4218           0 :     return 0;
    4219         508 :   memset (&desc, 0, sizeof desc);
    4220         508 :   desc.mode = KEYDB_SEARCH_MODE_LONG_KID;
    4221         508 :   desc.u.kid[0] = keyid[0];
    4222         508 :   desc.u.kid[1] = keyid[1];
    4223        1525 :   while (!result)
    4224             :     {
    4225         739 :       err = keydb_search (kdbhd, &desc, 1, NULL);
    4226         739 :       if (err)
    4227         230 :         break;
    4228             : 
    4229         509 :       err = keydb_get_keyblock (kdbhd, &keyblock);
    4230         509 :       if (err)
    4231             :         {
    4232           0 :           log_error (_("error reading keyblock: %s\n"), gpg_strerror (err));
    4233           0 :           break;
    4234             :         }
    4235             : 
    4236        1328 :       for (node = keyblock; node; node = node->next)
    4237             :         {
    4238             :           /* Bit 0 of the flags is set if the search found the key
    4239             :              using that key or subkey.  Note: a search will only ever
    4240             :              match a single key or subkey.  */
    4241        1328 :           if ((node->flag & 1))
    4242             :             {
    4243         509 :               log_assert (node->pkt->pkttype == PKT_PUBLIC_KEY
    4244             :                           || node->pkt->pkttype == PKT_PUBLIC_SUBKEY);
    4245             : 
    4246         509 :               if (!agent_probe_secret_key (NULL, node->pkt->pkt.public_key))
    4247         278 :                 result = 1; /* Secret key available.  */
    4248             :               else
    4249         231 :                 result = 0;
    4250             : 
    4251         509 :               break;
    4252             :             }
    4253             :         }
    4254         509 :       release_kbnode (keyblock);
    4255             :     }
    4256             : 
    4257         508 :   keydb_release (kdbhd);
    4258         508 :   return result;
    4259             : }

Generated by: LCOV version 1.11