Coverage Report

Created: 2026-02-09 07:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gnupg/g10/mainproc.c
Line
Count
Source
1
/* mainproc.c - handle packets
2
 * Copyright (C) 1998-2009 Free Software Foundation, Inc.
3
 * Copyright (C) 2013-2014 Werner Koch
4
 * Copyright (C) 2020, 2024 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 <time.h>
27
28
#include "gpg.h"
29
#include "../common/util.h"
30
#include "packet.h"
31
#include "../common/iobuf.h"
32
#include "options.h"
33
#include "keydb.h"
34
#include "filter.h"
35
#include "main.h"
36
#include "../common/status.h"
37
#include "../common/i18n.h"
38
#include "trustdb.h"
39
#include "keyserver-internal.h"
40
#include "photoid.h"
41
#include "../common/mbox-util.h"
42
#include "call-dirmngr.h"
43
#include "../common/compliance.h"
44
45
/* Put an upper limit on nested packets.  The 32 is an arbitrary
46
   value, a much lower should actually be sufficient.  */
47
56.7k
#define MAX_NESTING_DEPTH 32
48
49
50
/* An object to build a list of symkey packet info.  */
51
struct symlist_item
52
{
53
  struct symlist_item *next;
54
  int cipher_algo;
55
  enum gcry_cipher_modes cipher_mode;
56
  int other_error;
57
};
58
59
60
/*
61
 * Object to hold the processing context.
62
 */
63
typedef struct mainproc_context *CTX;
64
struct mainproc_context
65
{
66
  ctrl_t ctrl;
67
  struct mainproc_context *anchor;  /* May be useful in the future. */
68
  PKT_public_key *last_pubkey;
69
  PKT_user_id     *last_user_id;
70
  md_filter_context_t mfx;
71
  int sigs_only;    /* Process only signatures and reject all other stuff. */
72
  int encrypt_only; /* Process only encryption messages. */
73
74
  /* Name of the file with the complete signature or the file with the
75
     detached signature.  This is currently only used to deduce the
76
     file name of the data file if that has not been given. */
77
  const char *sigfilename;
78
79
  /* A structure to describe the signed data in case of a detached
80
     signature. */
81
  struct
82
  {
83
    /* A file descriptor of the signed data.  Only used if not -1. */
84
    gnupg_fd_t data_fd;
85
    /* A list of filenames with the data files or NULL. This is only
86
       used if DATA_FD is -1. */
87
    strlist_t data_names;
88
    /* Flag to indicated that either one of the next previous fields
89
       is used.  This is only needed for better readability. */
90
    int used;
91
  } signed_data;
92
93
  DEK *dek;
94
  int last_was_session_key;
95
  kbnode_t list;    /* The current list of packets. */
96
  iobuf_t iobuf;    /* Used to get the filename etc. */
97
  int trustletter;  /* Temporary usage in list_node. */
98
  ulong symkeys;    /* Number of symmetrically encrypted session keys.  */
99
  struct seskey_enc_list *sesenc_list; /* List of encryption packets. */
100
  struct symlist_item *symenc_list;   /* List of sym. encryption packets. */
101
  int seen_pkt_encrypted_aead; /* PKT_ENCRYPTED_AEAD packet seen. */
102
  int seen_pkt_encrypted_mdc;  /* PKT_ENCRYPTED_MDC packet seen. */
103
  struct {
104
    unsigned int sig_seen:1;      /* Set to true if a signature packet
105
                                     has been seen. */
106
    unsigned int data:1;          /* Any data packet seen */
107
    unsigned int uncompress_failed:1;
108
  } any;
109
};
110
111
112
/* Counter with the number of literal data packets seen.  Note that
113
 * this is also bumped at the end of an encryption.  This counter is
114
 * used for a basic consistency check of a received PGP message.  */
115
static int literals_seen;
116
117
118
/*** Local prototypes.  ***/
119
static int do_proc_packets (CTX c, iobuf_t a, int keep_dek_and_list);
120
static void list_node (CTX c, kbnode_t node);
121
static void proc_tree (CTX c, kbnode_t node);
122
123
124
/*** Functions.  ***/
125
126
/* Reset the literal data counter.  This is required to setup a new
127
 * decryption or verification context.  */
128
void
129
reset_literals_seen(void)
130
0
{
131
0
  literals_seen = 0;
132
0
}
133
134
135
static void
136
release_list( CTX c )
137
87.7k
{
138
87.7k
  proc_tree (c, c->list);
139
87.7k
  release_kbnode (c->list);
140
87.7k
  free_seskey_enc_list (c->sesenc_list);
141
87.7k
  c->sesenc_list = NULL;
142
108k
  while (c->symenc_list)
143
20.6k
    {
144
20.6k
      struct symlist_item *tmp = c->symenc_list->next;
145
20.6k
      xfree (c->symenc_list);
146
20.6k
      c->symenc_list = tmp;
147
20.6k
    }
148
87.7k
  c->symenc_list = NULL;
149
87.7k
  c->list = NULL;
150
87.7k
  c->any.data = 0;
151
87.7k
  c->any.uncompress_failed = 0;
152
87.7k
  c->last_was_session_key = 0;
153
87.7k
  c->seen_pkt_encrypted_aead = 0;
154
87.7k
  c->seen_pkt_encrypted_mdc = 0;
155
87.7k
  xfree (c->dek);
156
87.7k
  c->dek = NULL;
157
87.7k
}
158
159
160
static int
161
add_onepass_sig (CTX c, PACKET *pkt)
162
1.90k
{
163
1.90k
  kbnode_t node;
164
165
1.90k
  if (c->list) /* Add another packet. */
166
1.83k
    add_kbnode (c->list, new_kbnode (pkt));
167
76
  else /* Insert the first one.  */
168
76
    c->list = node = new_kbnode (pkt);
169
170
1.90k
  return 1;
171
1.90k
}
172
173
174
static int
175
add_gpg_control (CTX c, PACKET *pkt)
176
2.48k
{
177
2.48k
  if ( pkt->pkt.gpg_control->control == CTRLPKT_CLEARSIGN_START )
178
2.48k
    {
179
      /* New clear text signature.
180
       * Process the last one and reset everything */
181
2.48k
      release_list(c);
182
2.48k
    }
183
184
2.48k
  if (c->list)  /* Add another packet.  */
185
0
    add_kbnode (c->list, new_kbnode (pkt));
186
2.48k
  else /* Insert the first one. */
187
2.48k
    c->list = new_kbnode (pkt);
188
189
2.48k
  return 1;
190
2.48k
}
191
192
193
static int
194
add_user_id (CTX c, PACKET *pkt)
195
18.3k
{
196
18.3k
  if (!c->list)
197
3.82k
    {
198
3.82k
      log_error ("orphaned user ID\n");
199
3.82k
      return 0;
200
3.82k
    }
201
14.5k
  add_kbnode (c->list, new_kbnode (pkt));
202
14.5k
  return 1;
203
18.3k
}
204
205
206
static int
207
add_subkey (CTX c, PACKET *pkt)
208
8.19k
{
209
8.19k
  if (!c->list)
210
4.67k
    {
211
4.67k
      log_error ("subkey w/o mainkey\n");
212
4.67k
      return 0;
213
4.67k
    }
214
3.52k
  add_kbnode (c->list, new_kbnode (pkt));
215
3.52k
  return 1;
216
8.19k
}
217
218
219
static int
220
add_ring_trust (CTX c, PACKET *pkt)
221
0
{
222
0
  if (!c->list)
223
0
    {
224
0
      log_error ("ring trust w/o key\n");
225
0
      return 0;
226
0
    }
227
0
  add_kbnode (c->list, new_kbnode (pkt));
228
0
  return 1;
229
0
}
230
231
232
static int
233
add_signature (CTX c, PACKET *pkt)
234
24.1k
{
235
24.1k
  kbnode_t node;
236
237
24.1k
  c->any.sig_seen = 1;
238
24.1k
  if (pkt->pkttype == PKT_SIGNATURE && !c->list)
239
1.06k
    {
240
      /* This is the first signature for the following datafile.
241
       * GPG does not write such packets; instead it always uses
242
       * onepass-sig packets.  The drawback of PGP's method
243
       * of prepending the signature to the data is
244
       * that it is not possible to make a signature from data read
245
       * from stdin.  (GPG is able to read PGP stuff anyway.) */
246
1.06k
      node = new_kbnode (pkt);
247
1.06k
      c->list = node;
248
1.06k
      return 1;
249
1.06k
    }
250
23.0k
  else if (!c->list)
251
0
    return 0; /* oops (invalid packet sequence)*/
252
23.0k
  else if (!c->list->pkt)
253
0
    BUG();    /* so nicht */
254
255
  /* Add a new signature node item at the end. */
256
23.0k
  node = new_kbnode (pkt);
257
23.0k
  add_kbnode (c->list, node);
258
259
23.0k
  return 1;
260
24.1k
}
261
262
static gpg_error_t
263
symkey_decrypt_seskey (DEK *dek, byte *seskey, size_t slen)
264
0
{
265
0
  gpg_error_t err;
266
0
  gcry_cipher_hd_t hd;
267
0
  unsigned int noncelen, keylen;
268
0
  enum gcry_cipher_modes ciphermode;
269
270
0
  if (dek->use_aead)
271
0
    {
272
0
      err = openpgp_aead_algo_info (dek->use_aead, &ciphermode, &noncelen);
273
0
      if (err)
274
0
        return err;
275
0
    }
276
0
  else
277
0
    {
278
0
      ciphermode = GCRY_CIPHER_MODE_CFB;
279
0
      noncelen = 0;
280
0
    }
281
282
  /* Check that the session key has a size of 16 to 32 bytes.  */
283
0
  if ((dek->use_aead && (slen < (noncelen + 16 + 16)
284
0
                         || slen > (noncelen + 32 + 16)))
285
0
      || (!dek->use_aead && (slen < 17 || slen > 33)))
286
0
    {
287
0
      log_error ( _("weird size for an encrypted session key (%d)\n"),
288
0
      (int)slen);
289
0
      return gpg_error (GPG_ERR_BAD_KEY);
290
0
    }
291
292
0
  err = openpgp_cipher_open (&hd, dek->algo, ciphermode, GCRY_CIPHER_SECURE);
293
0
  if (!err)
294
0
    err = gcry_cipher_setkey (hd, dek->key, dek->keylen);
295
0
  if (!err)
296
0
    err = gcry_cipher_setiv (hd, noncelen? seskey : NULL, noncelen);
297
0
  if (err)
298
0
    goto leave;
299
300
0
  if (dek->use_aead)
301
0
    {
302
0
      byte ad[4];
303
304
0
      ad[0] = (0xc0 | PKT_SYMKEY_ENC);
305
0
      ad[1] = 5;
306
0
      ad[2] = dek->algo;
307
0
      ad[3] = dek->use_aead;
308
0
      err = gcry_cipher_authenticate (hd, ad, 4);
309
0
      if (err)
310
0
        goto leave;
311
0
      gcry_cipher_final (hd);
312
0
      keylen = slen - noncelen - 16;
313
0
      err = gcry_cipher_decrypt (hd, seskey+noncelen, keylen, NULL, 0);
314
0
      if (err)
315
0
        goto leave;
316
0
      err = gcry_cipher_checktag (hd, seskey+noncelen+keylen, 16);
317
0
      if (err)
318
0
        goto leave;
319
      /* Now we replace the dek components with the real session key to
320
       * decrypt the contents of the sequencing packet. */
321
0
      if (keylen > DIM(dek->key))
322
0
        {
323
0
          err = gpg_error (GPG_ERR_TOO_LARGE);
324
0
          goto leave;
325
0
        }
326
0
      dek->keylen = keylen;
327
0
      memcpy (dek->key, seskey + noncelen, dek->keylen);
328
0
    }
329
0
  else
330
0
    {
331
0
      gcry_cipher_decrypt (hd, seskey, slen, NULL, 0 );
332
      /* Here we can only test whether the algo given in decrypted
333
       * session key is a valid OpenPGP algo.  With 11 defined
334
       * symmetric algorithms we will miss 4.3% of wrong passphrases
335
       * here.  The actual checking is done later during bulk
336
       * decryption; we can't bring this check forward easily.  We
337
       * need to use the GPG_ERR_CHECKSUM so that we won't run into
338
       * the gnupg < 2.2 bug compatible case which would terminate the
339
       * process on GPG_ERR_CIPHER_ALGO.  Note that with AEAD (above)
340
       * we will have a reliable test here.  */
341
0
      if (openpgp_cipher_test_algo (seskey[0])
342
0
          || openpgp_cipher_get_algo_keylen (seskey[0]) != slen - 1)
343
0
        {
344
0
          err = gpg_error (GPG_ERR_CHECKSUM);
345
0
          goto leave;
346
0
        }
347
348
      /* Now we replace the dek components with the real session key to
349
       * decrypt the contents of the sequencing packet. */
350
0
      keylen = slen-1;
351
0
      if (keylen > DIM(dek->key))
352
0
        {
353
0
          err = gpg_error (GPG_ERR_TOO_LARGE);
354
0
          goto leave;
355
0
        }
356
0
      dek->algo = seskey[0];
357
0
      dek->keylen = keylen;
358
0
      memcpy (dek->key, seskey + 1, dek->keylen);
359
0
    }
360
361
  /*log_hexdump( "thekey", dek->key, dek->keylen );*/
362
363
0
 leave:
364
0
  gcry_cipher_close (hd);
365
0
  return err;
366
0
}
367
368
369
static void
370
proc_symkey_enc (CTX c, PACKET *pkt)
371
20.6k
{
372
20.6k
  gpg_error_t err;
373
20.6k
  PKT_symkey_enc *enc;
374
375
20.6k
  enc = pkt->pkt.symkey_enc;
376
20.6k
  if (!enc)
377
20.6k
    log_error ("invalid symkey encrypted packet\n");
378
16.7k
  else if(!c->dek)
379
16.7k
    {
380
16.7k
      int algo = enc->cipher_algo;
381
16.7k
      const char *s = openpgp_cipher_algo_name (algo);
382
16.7k
      const char *a = (enc->aead_algo ? openpgp_aead_algo_name (enc->aead_algo)
383
16.7k
                       /**/           : "CFB");
384
385
16.7k
      if (!openpgp_cipher_test_algo (algo))
386
14.3k
        {
387
14.3k
          if (!opt.quiet)
388
14.3k
            {
389
14.3k
              if (enc->seskeylen)
390
14.3k
                log_info (_("%s.%s encrypted session key\n"), s, a );
391
13.9k
              else
392
14.3k
                log_info (_("%s.%s encrypted data\n"), s, a );
393
14.3k
            }
394
14.3k
        }
395
2.34k
      else
396
2.34k
        {
397
2.34k
          log_error (_("encrypted with unknown algorithm %d.%s\n"), algo, a);
398
2.34k
          s = NULL; /* Force a goto leave.  */
399
2.34k
        }
400
401
16.7k
      if (openpgp_md_test_algo (enc->s2k.hash_algo))
402
14.5k
        {
403
14.5k
          log_error(_("passphrase generated with unknown digest"
404
14.5k
                      " algorithm %d\n"),enc->s2k.hash_algo);
405
14.5k
          s = NULL;
406
14.5k
        }
407
408
16.7k
      c->last_was_session_key = 2;
409
16.7k
      if (!s || opt.list_only)
410
14.8k
        goto leave;
411
412
1.89k
      if (opt.override_session_key)
413
0
        {
414
0
          c->dek = xmalloc_clear (sizeof *c->dek);
415
0
          if (get_override_session_key (c->dek, opt.override_session_key))
416
0
            {
417
0
              xfree (c->dek);
418
0
              c->dek = NULL;
419
0
            }
420
0
        }
421
1.89k
      else
422
1.89k
        {
423
1.89k
          c->dek = passphrase_to_dek (algo, &enc->s2k, 0, 0, NULL,
424
1.89k
                                      GETPASSWORD_FLAG_SYMDECRYPT, NULL);
425
1.89k
          if (c->dek)
426
0
            {
427
0
              c->dek->symmetric = 1;
428
0
              c->dek->use_aead = enc->aead_algo;
429
430
              /* FIXME: This doesn't work perfectly if a symmetric key
431
                 comes before a public key in the message - if the
432
                 user doesn't know the passphrase, then there is a
433
                 chance that the "decrypted" algorithm will happen to
434
                 be a valid one, which will make the returned dek
435
                 appear valid, so we won't try any public keys that
436
                 come later. */
437
0
              if (enc->seskeylen)
438
0
                {
439
0
                  err = symkey_decrypt_seskey (c->dek,
440
0
                                               enc->seskey, enc->seskeylen);
441
0
                  if (err)
442
0
                    {
443
0
                      log_info ("decryption of the symmetrically encrypted"
444
0
                                 " session key failed: %s\n",
445
0
                                 gpg_strerror (err));
446
0
                      if (gpg_err_code (err) != GPG_ERR_BAD_KEY
447
0
                          && gpg_err_code (err) != GPG_ERR_CHECKSUM)
448
0
                        log_fatal ("process terminated to be bug compatible"
449
0
                                   " with GnuPG <= 2.2\n");
450
0
                      else
451
0
                        write_status_text (STATUS_ERROR,
452
0
                                           "symkey_decrypt.maybe_error"
453
0
                                           " 11_BAD_PASSPHRASE");
454
455
0
                      if (c->dek->s2k_cacheid[0])
456
0
                        {
457
0
                          if (opt.debug)
458
0
                            log_debug ("cleared passphrase cached with ID:"
459
0
                                       " %s\n", c->dek->s2k_cacheid);
460
0
                          passphrase_clear_cache (c->dek->s2k_cacheid);
461
0
                        }
462
0
                      xfree (c->dek);
463
0
                      c->dek = NULL;
464
0
                    }
465
0
                }
466
0
              else
467
0
                c->dek->algo_info_printed = 1;
468
0
            }
469
1.89k
        }
470
1.89k
    }
471
472
20.6k
 leave:
473
  /* Record infos from the packet.  */
474
20.6k
  {
475
20.6k
    struct symlist_item  *symitem;
476
20.6k
    symitem = xcalloc (1, sizeof *symitem);
477
20.6k
    if (enc)
478
16.7k
      {
479
16.7k
        symitem->cipher_algo = enc->cipher_algo;
480
16.7k
        symitem->cipher_mode = !enc->aead_algo;
481
16.7k
        symitem->cipher_mode
482
16.7k
          = (enc->aead_algo == AEAD_ALGO_NONE? GCRY_CIPHER_MODE_CFB :
483
16.7k
             enc->aead_algo == AEAD_ALGO_OCB?  GCRY_CIPHER_MODE_OCB :
484
747
             GCRY_CIPHER_MODE_NONE);
485
16.7k
      }
486
3.95k
    else
487
3.95k
      symitem->other_error = 1;
488
20.6k
    symitem->next = c->symenc_list;
489
20.6k
    c->symenc_list = symitem;
490
20.6k
  }
491
20.6k
  c->symkeys++;
492
20.6k
  free_packet (pkt, NULL);
493
20.6k
}
494
495
496
static void
497
proc_pubkey_enc (CTX c, PACKET *pkt)
498
11.7k
{
499
11.7k
  PKT_pubkey_enc *enc;
500
501
  /* Check whether the secret key is available and store in this case.  */
502
11.7k
  c->last_was_session_key = 1;
503
11.7k
  enc = pkt->pkt.pubkey_enc;
504
  /*printf("enc: encrypted by a pubkey with keyid %08lX\n", enc->keyid[1] );*/
505
  /* Hmmm: why do I have this algo check here - anyway there is
506
   * function to check it. */
507
11.7k
  if (opt.verbose)
508
11.7k
    log_info (_("public key is %s\n"), keystr (enc->keyid));
509
510
11.7k
  if (is_status_enabled ())
511
0
    {
512
0
      char buf[50];
513
0
      snprintf (buf, sizeof buf, "%08lX%08lX %d 0",
514
0
                (ulong)enc->keyid[0], (ulong)enc->keyid[1], enc->pubkey_algo);
515
0
      write_status_text (STATUS_ENC_TO, buf);
516
0
    }
517
518
11.7k
  if (!opt.list_only && !opt.override_session_key)
519
11.7k
    {
520
11.7k
      struct seskey_enc_list *x = xcalloc (1, sizeof *x);
521
522
11.7k
      copy_pubkey_enc_parts (&x->u.pub, enc);
523
11.7k
      x->result = -1;
524
11.7k
      x->next = c->sesenc_list;
525
11.7k
      c->sesenc_list = x;
526
11.7k
    }
527
528
11.7k
  free_packet(pkt, NULL);
529
11.7k
}
530
531
532
/*
533
 * Print the list of public key encrypted packets which we could
534
 * not decrypt.
535
 */
536
static void
537
print_sesenc_list (ctrl_t ctrl, struct seskey_enc_list *list)
538
37.6k
{
539
1.36M
  for (; list; list = list->next)
540
1.32M
    {
541
1.32M
      PKT_public_key *pk;
542
1.32M
      char pkstrbuf[PUBKEY_STRING_SIZE];
543
1.32M
      char *p;
544
545
1.32M
      if (list->u_sym)
546
0
        continue;
547
548
1.32M
      pk = xmalloc_clear (sizeof *pk);
549
550
1.32M
      pk->pubkey_algo = list->u.pub.pubkey_algo;
551
1.32M
      if (!get_pubkey (ctrl, pk, list->u.pub.keyid))
552
0
        {
553
0
          pubkey_string (pk, pkstrbuf, sizeof pkstrbuf);
554
555
0
          log_info (_("encrypted with %s key, ID %s, created %s\n"),
556
0
                    pkstrbuf, keystr_from_pk (pk),
557
0
                    strtimestamp (pk->timestamp));
558
0
          p = get_user_id_native (ctrl, list->u.pub.keyid);
559
0
          log_printf (_("      \"%s\"\n"), p);
560
0
          xfree (p);
561
0
        }
562
1.32M
      else
563
1.32M
        log_info (_("encrypted with %s key, ID %s\n"),
564
1.32M
                  openpgp_pk_algo_name (list->u.pub.pubkey_algo),
565
1.32M
                  keystr (list->u.pub.keyid));
566
567
1.32M
      if (opt.flags.require_pqc_encryption
568
0
          && pk->pubkey_algo != PUBKEY_ALGO_KYBER)
569
1.32M
        log_info (_("WARNING: key is not quantum-resistant\n"));
570
571
1.32M
      free_public_key (pk);
572
1.32M
    }
573
37.6k
}
574
575
576
static void
577
proc_encrypted (CTX c, PACKET *pkt)
578
37.6k
{
579
37.6k
  int result = 0;
580
37.6k
  int early_plaintext = literals_seen;
581
37.6k
  unsigned int compliance_de_vs = 0;
582
37.6k
  enum gcry_cipher_modes ciphermode;
583
37.6k
  int unknown_ciphermode;
584
585
37.6k
  if (pkt)
586
37.6k
    {
587
37.6k
      if (pkt->pkttype == PKT_ENCRYPTED_AEAD)
588
11.0k
        c->seen_pkt_encrypted_aead = 1;
589
37.6k
      if (pkt->pkttype == PKT_ENCRYPTED_MDC)
590
6.11k
        c->seen_pkt_encrypted_mdc = 1;
591
37.6k
    }
592
0
  else /* No PKT indicates the add-recipients mode.  */
593
37.6k
    log_assert (c->ctrl->modify_recipients);
594
595
37.6k
  if (early_plaintext)
596
37.6k
    {
597
37.6k
      log_info (_("WARNING: multiple plaintexts seen\n"));
598
37.6k
      write_status_errcode ("decryption.early_plaintext", GPG_ERR_BAD_DATA);
599
      /* We fail only later so that we can print some more info first.  */
600
37.6k
    }
601
602
37.6k
  if (!opt.quiet)
603
37.6k
    {
604
37.6k
      if (c->symkeys>1)
605
37.6k
        log_info (_("encrypted with %lu passphrases\n"), c->symkeys);
606
24.6k
      else if (c->symkeys == 1)
607
24.6k
        log_info (_("encrypted with 1 passphrase\n"));
608
37.6k
      print_sesenc_list (c->ctrl, c->sesenc_list);
609
37.6k
    }
610
611
  /* Figure out the session key by looking at all pkenc packets. */
612
37.6k
  if (opt.list_only || c->dek)
613
0
    ;
614
37.6k
  else if (opt.override_session_key)
615
0
    {
616
0
      c->dek = xmalloc_clear (sizeof *c->dek);
617
0
      result = get_override_session_key (c->dek, opt.override_session_key);
618
0
      if (result)
619
0
        {
620
0
          xfree (c->dek);
621
0
          c->dek = NULL;
622
0
          log_info (_("public key decryption failed: %s\n"),
623
0
                    gpg_strerror (result));
624
0
          write_status_error ("pkdecrypt_failed", result);
625
0
        }
626
0
    }
627
37.6k
  else if (c->sesenc_list)
628
4.79k
    {
629
4.79k
      c->dek = xmalloc_secure_clear (sizeof *c->dek);
630
4.79k
      result = get_session_key (c->ctrl, c->sesenc_list, c->dek);
631
4.79k
      if (is_status_enabled ())
632
0
        {
633
0
          struct seskey_enc_list *list;
634
635
0
          for (list = c->sesenc_list; list; list = list->next)
636
0
            if (list->result && !list->u_sym)
637
0
              { /* Key was not tried or it caused an error.  */
638
0
                char buf[20];
639
0
                snprintf (buf, sizeof buf, "%08lX%08lX",
640
0
                          (ulong)list->u.pub.keyid[0],
641
0
                          (ulong)list->u.pub.keyid[1]);
642
0
                write_status_text (STATUS_NO_SECKEY, buf);
643
0
              }
644
0
        }
645
646
4.79k
      if (result)
647
4.79k
        {
648
4.79k
          log_info (_("public key decryption failed: %s\n"),
649
4.79k
                    gpg_strerror (result));
650
4.79k
          write_status_error ("pkdecrypt_failed", result);
651
652
          /* Error: Delete the DEK. */
653
4.79k
          xfree (c->dek);
654
4.79k
          c->dek = NULL;
655
4.79k
        }
656
4.79k
    }
657
658
37.6k
  if (c->dek && opt.verbose > 1)
659
37.6k
    log_info (_("public key encrypted data: good DEK\n"));
660
661
37.6k
  if (c->ctrl->modify_recipients)
662
0
    {
663
0
      if (c->anchor)
664
0
        {
665
0
          log_error ("command not possible with nested data\n");
666
0
          write_status_errcode ("decryption.mod_recp", GPG_ERR_BAD_DATA);
667
0
          xfree (c->dek);
668
0
          c->dek = NULL;
669
0
          return;
670
0
        }
671
0
      literals_seen++;
672
      /* Simply return here.  Our caller will then test for DEK and
673
       * the PK_list to decide whether decryption worked.  */
674
0
      return;
675
0
    }
676
677
37.6k
  if (!opt.show_only_session_key)
678
37.6k
    write_status (STATUS_BEGIN_DECRYPTION);
679
680
  /*log_debug("dat: %sencrypted data\n", c->dek?"":"conventional ");*/
681
37.6k
  if (opt.list_only)
682
0
    result = -1;
683
37.6k
  else if (!c->dek && !c->last_was_session_key)
684
21.5k
    {
685
21.5k
      int algo;
686
21.5k
      STRING2KEY s2kbuf;
687
21.5k
      STRING2KEY *s2k = NULL;
688
21.5k
      int canceled;
689
690
21.5k
      if (opt.override_session_key)
691
0
        {
692
0
          c->dek = xmalloc_clear (sizeof *c->dek);
693
0
          result = get_override_session_key (c->dek, opt.override_session_key);
694
0
          if (result)
695
0
            {
696
0
              xfree (c->dek);
697
0
              c->dek = NULL;
698
0
            }
699
0
        }
700
21.5k
      else
701
21.5k
        {
702
          /* Assume this is old style conventional encrypted data. */
703
21.5k
          algo = opt.def_cipher_algo;
704
21.5k
          if (algo)
705
21.5k
            log_info (_("assuming %s encrypted data\n"),
706
0
                      openpgp_cipher_algo_name (algo));
707
21.5k
          else if (openpgp_cipher_test_algo (CIPHER_ALGO_IDEA))
708
0
            {
709
0
              algo = opt.def_cipher_algo;
710
0
              if (!algo)
711
0
                algo = opt.s2k_cipher_algo;
712
0
              log_info (_("IDEA cipher unavailable, "
713
0
                          "optimistically attempting to use %s instead\n"),
714
0
                        openpgp_cipher_algo_name (algo));
715
0
            }
716
21.5k
          else
717
21.5k
            {
718
21.5k
              algo = CIPHER_ALGO_IDEA;
719
21.5k
              if (!opt.s2k_digest_algo)
720
21.5k
                {
721
                  /* If no digest is given we assume SHA-1. */
722
21.5k
                  s2kbuf.mode = 0;
723
21.5k
                  s2kbuf.hash_algo = DIGEST_ALGO_SHA1;
724
21.5k
                  s2k = &s2kbuf;
725
21.5k
                }
726
21.5k
              log_info (_("assuming %s encrypted data\n"), "IDEA");
727
21.5k
            }
728
729
21.5k
          c->dek = passphrase_to_dek (algo, s2k, 0, 0, NULL,
730
21.5k
                                      GETPASSWORD_FLAG_SYMDECRYPT, &canceled);
731
21.5k
          if (c->dek)
732
0
            c->dek->algo_info_printed = 1;
733
21.5k
          else if (canceled)
734
21.5k
            result = gpg_error (GPG_ERR_CANCELED);
735
0
          else
736
0
            result = gpg_error (GPG_ERR_INV_PASSPHRASE);
737
21.5k
        }
738
21.5k
    }
739
16.0k
  else if (!c->dek)
740
16.0k
    {
741
16.0k
      if (c->symkeys && !c->sesenc_list)
742
12.7k
        result = gpg_error (GPG_ERR_BAD_KEY);
743
744
16.0k
      if (!result)
745
0
        result = gpg_error (GPG_ERR_NO_SECKEY);
746
16.0k
    }
747
748
  /* We need to know the ciphermode for gnupg_cipher_is_compliant.  */
749
37.6k
  unknown_ciphermode = 0;
750
37.6k
  if (pkt->pkt.encrypted->aead_algo)
751
1.72k
    {
752
1.72k
      unsigned int dummy;
753
1.72k
      if (openpgp_aead_algo_info (pkt->pkt.encrypted->aead_algo,
754
1.72k
                                  &ciphermode, &dummy))
755
856
        unknown_ciphermode = 1;  /* error -> unknown mode */
756
1.72k
    }
757
35.8k
  else
758
35.8k
    ciphermode = GCRY_CIPHER_MODE_CFB;
759
760
  /* Compute compliance with CO_DE_VS.  */
761
37.6k
  if (!result && (is_status_enabled () || opt.flags.require_compliance)
762
      /* Overriding session key voids compliance.  */
763
0
      && !opt.override_session_key
764
      /* Check symmetric cipher.  */
765
0
      && gnupg_gcrypt_is_compliant (CO_DE_VS)
766
0
      && !unknown_ciphermode
767
0
      && gnupg_cipher_is_compliant (CO_DE_VS, c->dek->algo, ciphermode))
768
0
    {
769
0
      struct seskey_enc_list *i;
770
0
      struct symlist_item *si;
771
0
      int compliant = 1;
772
0
      PKT_public_key *pk = xmalloc (sizeof *pk);
773
774
0
      if ( !(c->sesenc_list || c->symkeys) )
775
0
        log_debug ("%s: where else did the session key come from?\n", __func__);
776
777
      /* Check that all seen symmetric key packets use compliant
778
       * algos.  This is so that no non-compliant encrypted session
779
       * key can be sneaked in.  */
780
0
      for (si = c->symenc_list; si && compliant; si = si->next)
781
0
        {
782
0
          if (si->cipher_mode == GCRY_CIPHER_MODE_NONE
783
0
              || !gnupg_cipher_is_compliant (CO_DE_VS, si->cipher_algo,
784
0
                                             si->cipher_mode))
785
0
            compliant = 0;
786
0
        }
787
788
      /* Check that every known public key used to encrypt the session key
789
       * is compliant.  */
790
0
      for (i = c->sesenc_list; i && compliant; i = i->next)
791
0
        {
792
0
          if (i->u_sym)
793
0
            continue;
794
0
          memset (pk, 0, sizeof *pk);
795
0
          pk->pubkey_algo = i->u.pub.pubkey_algo;
796
0
          if (!get_pubkey (c->ctrl, pk, i->u.pub.keyid)
797
0
              && !gnupg_pk_is_compliant (CO_DE_VS, pk->pubkey_algo, 0,
798
0
                                         pk->pkey, nbits_from_pk (pk), NULL))
799
0
            compliant = 0;
800
0
          release_public_key_parts (pk);
801
0
        }
802
803
0
      xfree (pk);
804
805
0
      if (compliant)
806
0
        compliance_de_vs |= 1;
807
0
    }
808
809
37.6k
  if (!result)
810
0
    {
811
0
      int compl_error;
812
0
      result = decrypt_data (c->ctrl, c, pkt->pkt.encrypted, c->dek,
813
0
                             &compl_error);
814
0
      if (!result && !compl_error)
815
0
        compliance_de_vs |= 2;
816
0
    }
817
818
  /* Trigger the deferred error.  */
819
37.6k
  if (!result && early_plaintext)
820
0
    result = gpg_error (GPG_ERR_BAD_DATA);
821
37.6k
  else if (!result && opt.show_only_session_key)
822
0
    result = -1;
823
824
825
37.6k
  if (result == -1)
826
0
    ;
827
37.6k
  else if (!result
828
0
           && !opt.ignore_mdc_error
829
0
           && !pkt->pkt.encrypted->mdc_method
830
0
           && !pkt->pkt.encrypted->aead_algo)
831
0
    {
832
      /* The message has been decrypted but does not carry an MDC or
833
       * uses AEAD encryption.  --ignore-mdc-error has also not been
834
       * used.  To avoid attacks changing an MDC message to a non-MDC
835
       * message, we fail here.  */
836
0
      log_error (_("WARNING: message was not integrity protected\n"));
837
0
      if (!pkt->pkt.encrypted->mdc_method
838
0
          && (openpgp_cipher_get_algo_blklen (c->dek->algo) == 8
839
0
              || c->dek->algo == CIPHER_ALGO_TWOFISH))
840
0
        {
841
          /* Before 2.2.8 we did not fail hard for a missing MDC if
842
           * one of the old ciphers where used.  Although these cases
843
           * are rare in practice we print a hint on how to decrypt
844
           * such messages.  */
845
0
          log_string
846
0
            (GPGRT_LOGLVL_INFO,
847
0
             _("Hint: If this message was created before the year 2003 it is\n"
848
0
               "likely that this message is legitimate.  This is because back\n"
849
0
               "then integrity protection was not widely used.\n"));
850
0
          log_info (_("Use the option '%s' to decrypt anyway.\n"),
851
0
                     "--ignore-mdc-error");
852
0
          write_status_errcode ("nomdc_with_legacy_cipher",
853
0
                                GPG_ERR_DECRYPT_FAILED);
854
0
        }
855
0
      log_info (_("decryption forced to fail!\n"));
856
0
      write_status (STATUS_DECRYPTION_FAILED);
857
0
    }
858
37.6k
  else if (!result || (gpg_err_code (result) == GPG_ERR_BAD_SIGNATURE
859
0
                       && !pkt->pkt.encrypted->aead_algo
860
0
                       && opt.ignore_mdc_error))
861
0
    {
862
      /* All is fine or for an MDC message the MDC failed but the
863
       * --ignore-mdc-error option is active.  For compatibility
864
       * reasons we issue GOODMDC also for AEAD messages.  */
865
0
      write_status (STATUS_DECRYPTION_OKAY);
866
0
      if (opt.verbose > 1)
867
0
        log_info(_("decryption okay\n"));
868
869
0
      if (pkt->pkt.encrypted->aead_algo)
870
0
        {
871
0
          write_status (STATUS_GOODMDC);
872
0
          compliance_de_vs |= 4;
873
0
        }
874
0
      else if (pkt->pkt.encrypted->mdc_method && !result)
875
0
        {
876
0
          write_status (STATUS_GOODMDC);
877
0
          compliance_de_vs |= 4;
878
0
        }
879
0
      else
880
0
        log_info (_("WARNING: message was not integrity protected\n"));
881
0
    }
882
37.6k
  else if (gpg_err_code (result) == GPG_ERR_BAD_SIGNATURE
883
37.6k
           || gpg_err_code (result) == GPG_ERR_TRUNCATED)
884
0
    {
885
0
      glo_ctrl.lasterr = result;
886
0
      log_error (_("WARNING: encrypted message has been manipulated!\n"));
887
0
      write_status (STATUS_BADMDC);
888
0
      write_status (STATUS_DECRYPTION_FAILED);
889
0
    }
890
37.6k
  else
891
37.6k
    {
892
37.6k
      if (gpg_err_code (result) == GPG_ERR_BAD_KEY
893
24.8k
          || gpg_err_code (result) == GPG_ERR_CHECKSUM
894
24.8k
          || gpg_err_code (result) == GPG_ERR_CIPHER_ALGO)
895
12.7k
        {
896
12.7k
          if (c->symkeys)
897
12.7k
            write_status_text (STATUS_ERROR,
898
12.7k
                               "symkey_decrypt.maybe_error"
899
12.7k
                               " 11_BAD_PASSPHRASE");
900
901
12.7k
          if (c->dek && *c->dek->s2k_cacheid != '\0')
902
0
            {
903
0
              if (opt.debug)
904
0
                log_debug ("cleared passphrase cached with ID: %s\n",
905
0
                           c->dek->s2k_cacheid);
906
0
              passphrase_clear_cache (c->dek->s2k_cacheid);
907
0
            }
908
12.7k
        }
909
37.6k
      glo_ctrl.lasterr = result;
910
37.6k
      write_status (STATUS_DECRYPTION_FAILED);
911
37.6k
      log_error (_("decryption failed: %s\n"), gpg_strerror (result));
912
      /* Hmmm: does this work when we have encrypted using multiple
913
       * ways to specify the session key (symmmetric and PK). */
914
37.6k
    }
915
916
917
  /* If we concluded that the decryption was compliant, issue a
918
   * compliance status before the end of the decryption status.  */
919
37.6k
  if (compliance_de_vs == (4|2|1))
920
0
    {
921
0
      write_status_strings (STATUS_DECRYPTION_COMPLIANCE_MODE,
922
0
                            gnupg_status_compliance_flag (CO_DE_VS),
923
0
                            NULL);
924
0
    }
925
926
37.6k
  xfree (c->dek);
927
37.6k
  c->dek = NULL;
928
37.6k
  free_packet (pkt, NULL);
929
37.6k
  c->last_was_session_key = 0;
930
931
37.6k
  if (!opt.show_only_session_key)
932
37.6k
    write_status (STATUS_END_DECRYPTION);
933
934
  /* Bump the counter even if we have not seen a literal data packet
935
   * inside an encryption container.  This acts as a sentinel in case
936
   * a misplace extra literal data packets follows after this
937
   * encrypted packet.  */
938
37.6k
  literals_seen++;
939
940
  /* The --require-compliance option allows one to simplify decryption in
941
   * de-vs compliance mode by just looking at the exit status.  */
942
37.6k
  if (opt.flags.require_compliance
943
0
      && opt.compliance == CO_DE_VS
944
0
      && compliance_de_vs != (4|2|1)
945
0
      && !opt.show_only_session_key)
946
0
    {
947
0
      log_error (_("operation forced to fail due to"
948
0
                   " unfulfilled compliance rules\n"));
949
0
      g10_errors_seen = 1;
950
0
    }
951
37.6k
}
952
953
954
static int
955
have_seen_pkt_encrypted_aead_or_mdc( CTX c )
956
1.52k
{
957
1.52k
  CTX cc;
958
959
5.83k
  for (cc = c; cc; cc = cc->anchor)
960
4.44k
    {
961
4.44k
      if (cc->seen_pkt_encrypted_aead)
962
70
  return 1;
963
4.37k
      if (cc->seen_pkt_encrypted_mdc)
964
68
  return 1;
965
4.37k
    }
966
967
1.38k
  return 0;
968
1.52k
}
969
970
971
static void
972
proc_plaintext( CTX c, PACKET *pkt )
973
4.59k
{
974
4.59k
  PKT_plaintext *pt = pkt->pkt.plaintext;
975
4.59k
  int any, clearsig, rc;
976
4.59k
  kbnode_t n;
977
4.59k
  unsigned char *extrahash;
978
4.59k
  size_t extrahashlen;
979
980
  /* This is a literal data packet.  Bump a counter for later checks.  */
981
4.59k
  literals_seen++;
982
983
4.59k
  if (pt->namelen == 8 && !memcmp( pt->name, "_CONSOLE", 8))
984
4.59k
    log_info (_("Note: sender requested \"for-your-eyes-only\"\n"));
985
4.59k
  else if (opt.verbose)
986
0
    {
987
      /* We don't use print_utf8_buffer because that would require a
988
       * string change which we don't want in 2.2.  It is also not
989
       * clear whether the filename is always utf-8 encoded.  */
990
0
      char *tmp = make_printable_string (pt->name, pt->namelen, 0);
991
0
      log_info (_("original file name='%.*s'\n"), (int)strlen (tmp), tmp);
992
0
      xfree (tmp);
993
0
    }
994
995
4.59k
  free_md_filter_context (&c->mfx);
996
4.59k
  if (gcry_md_open (&c->mfx.md, 0, 0))
997
0
    BUG ();
998
  /* fixme: we may need to push the textfilter if we have sigclass 1
999
   * and no armoring - Not yet tested
1000
   * Hmmm, why don't we need it at all if we have sigclass 1
1001
   * Should we assume that plaintext in mode 't' has always sigclass 1??
1002
   * See: Russ Allbery's mail 1999-02-09
1003
   */
1004
4.59k
  any = clearsig = 0;
1005
106k
  for (n=c->list; n; n = n->next )
1006
104k
    {
1007
104k
      if (n->pkt->pkttype == PKT_ONEPASS_SIG)
1008
26.7k
        {
1009
          /* The onepass signature case. */
1010
26.7k
          if (n->pkt->pkt.onepass_sig->digest_algo)
1011
26.2k
            {
1012
26.2k
              if (!opt.skip_verify)
1013
26.2k
                gcry_md_enable (c->mfx.md,
1014
26.2k
                                n->pkt->pkt.onepass_sig->digest_algo);
1015
1016
26.2k
              any = 1;
1017
26.2k
            }
1018
26.7k
        }
1019
77.6k
      else if (n->pkt->pkttype == PKT_GPG_CONTROL
1020
48.7k
               && n->pkt->pkt.gpg_control->control == CTRLPKT_CLEARSIGN_START)
1021
2.21k
        {
1022
          /* The clearsigned message case. */
1023
2.21k
          size_t datalen = n->pkt->pkt.gpg_control->datalen;
1024
2.21k
          const byte *data = n->pkt->pkt.gpg_control->data;
1025
1026
          /* Check that we have at least the sigclass and one hash.  */
1027
2.21k
          if  (datalen < 2)
1028
2.21k
            log_fatal ("invalid control packet CTRLPKT_CLEARSIGN_START\n");
1029
          /* Note that we don't set the clearsig flag for not-dash-escaped
1030
           * documents.  */
1031
2.21k
          clearsig = (*data == 0x01);
1032
5.23k
          for (data++, datalen--; datalen; datalen--, data++)
1033
3.02k
            if (!opt.skip_verify)
1034
3.02k
              gcry_md_enable (c->mfx.md, *data);
1035
2.21k
          any = 1;
1036
2.21k
          break;  /* Stop here as one-pass signature packets are not
1037
                     expected.  */
1038
2.21k
        }
1039
75.4k
      else if (n->pkt->pkttype == PKT_SIGNATURE)
1040
27.3k
        {
1041
          /* The SIG+LITERAL case that PGP used to use.  */
1042
27.3k
          if (!opt.skip_verify)
1043
27.3k
            gcry_md_enable (c->mfx.md, n->pkt->pkt.signature->digest_algo);
1044
27.3k
          any = 1;
1045
27.3k
        }
1046
104k
    }
1047
1048
4.59k
  if (!any && !opt.skip_verify && !have_seen_pkt_encrypted_aead_or_mdc(c))
1049
1.38k
    {
1050
      /* This is for the old GPG LITERAL+SIG case.  It's not legal
1051
         according to 2440, so hopefully it won't come up that often.
1052
         There is no good way to specify what algorithms to use in
1053
         that case, so these there are the historical answer. */
1054
1.38k
  gcry_md_enable (c->mfx.md, DIGEST_ALGO_RMD160);
1055
1.38k
  gcry_md_enable (c->mfx.md, DIGEST_ALGO_SHA1);
1056
1.38k
    }
1057
4.59k
  if (DBG_HASHING)
1058
0
    {
1059
0
      gcry_md_debug (c->mfx.md, "verify");
1060
0
      if (c->mfx.md2)
1061
0
        gcry_md_debug (c->mfx.md2, "verify2");
1062
0
    }
1063
1064
4.59k
  rc=0;
1065
1066
4.59k
  if (literals_seen > 1)
1067
4.59k
    {
1068
4.59k
      log_info (_("WARNING: multiple plaintexts seen\n"));
1069
1070
4.59k
      write_status_text (STATUS_ERROR, "proc_pkt.plaintext 89_BAD_DATA");
1071
4.59k
      log_inc_errorcount ();
1072
4.59k
      rc = gpg_error (GPG_ERR_UNEXPECTED);
1073
4.59k
    }
1074
1075
4.59k
  if (!rc)
1076
0
    {
1077
      /* It we are in --verify mode, we do not want to output the
1078
       * signed text.  However, if --output is also used we do what
1079
       * has been requested and write out the signed data.  */
1080
0
      rc = handle_plaintext (pt, &c->mfx,
1081
0
                             (opt.outfp || opt.outfile)? 0 :  c->sigs_only,
1082
0
                             clearsig);
1083
0
      if (gpg_err_code (rc) == GPG_ERR_EACCES && !c->sigs_only)
1084
0
        {
1085
          /* Can't write output but we hash it anyway to check the
1086
             signature. */
1087
0
          rc = handle_plaintext( pt, &c->mfx, 1, clearsig );
1088
0
        }
1089
0
    }
1090
1091
4.59k
  if (rc)
1092
4.59k
    log_error ("handle plaintext failed: %s\n", gpg_strerror (rc));
1093
1094
  /* We add a marker control packet instead of the plaintext packet.
1095
   * This is so that we can later detect invalid packet sequences.
1096
   * The packet is further used to convey extra data from the
1097
   * plaintext packet to the signature verification. */
1098
4.59k
  extrahash = xtrymalloc (6 + pt->namelen);
1099
4.59k
  if (!extrahash)
1100
0
    {
1101
      /* No way to return an error.  */
1102
0
      rc = gpg_error_from_syserror ();
1103
0
      log_error ("malloc failed in %s: %s\n", __func__, gpg_strerror (rc));
1104
0
      extrahashlen = 0;
1105
0
    }
1106
4.59k
  else
1107
4.59k
    {
1108
4.59k
      extrahash[0] = pt->mode;
1109
4.59k
      extrahash[1] = pt->namelen;
1110
4.59k
      if (pt->namelen)
1111
2.01k
        memcpy (extrahash+2, pt->name, pt->namelen);
1112
4.59k
      extrahashlen = 2 + pt->namelen;
1113
4.59k
      extrahash[extrahashlen++] = pt->timestamp >> 24;
1114
4.59k
      extrahash[extrahashlen++] = pt->timestamp >> 16;
1115
4.59k
      extrahash[extrahashlen++] = pt->timestamp >>  8;
1116
4.59k
      extrahash[extrahashlen++] = pt->timestamp      ;
1117
4.59k
    }
1118
1119
4.59k
  free_packet (pkt, NULL);
1120
4.59k
  c->last_was_session_key = 0;
1121
1122
4.59k
  n = new_kbnode (create_gpg_control (CTRLPKT_PLAINTEXT_MARK,
1123
4.59k
                                      extrahash, extrahashlen));
1124
4.59k
  xfree (extrahash);
1125
4.59k
  if (c->list)
1126
4.09k
    add_kbnode (c->list, n);
1127
495
  else
1128
495
    c->list = n;
1129
4.59k
}
1130
1131
1132
static int
1133
proc_compressed_cb (iobuf_t a, void *info)
1134
0
{
1135
0
  if ( ((CTX)info)->signed_data.used
1136
0
       && ((CTX)info)->signed_data.data_fd != GNUPG_INVALID_FD)
1137
0
    return proc_signature_packets_by_fd (((CTX)info)->ctrl, info, a,
1138
0
                                         ((CTX)info)->signed_data.data_fd);
1139
0
  else
1140
0
    return proc_signature_packets (((CTX)info)->ctrl, info, a,
1141
0
                                   ((CTX)info)->signed_data.data_names,
1142
0
                                   ((CTX)info)->sigfilename );
1143
0
}
1144
1145
1146
static int
1147
proc_encrypt_cb (iobuf_t a, void *info )
1148
0
{
1149
0
  CTX c = info;
1150
0
  return proc_encryption_packets (c->ctrl, info, a, NULL, NULL);
1151
0
}
1152
1153
1154
static int
1155
proc_compressed (CTX c, PACKET *pkt)
1156
50.1k
{
1157
50.1k
  PKT_compressed *zd = pkt->pkt.compressed;
1158
50.1k
  int rc;
1159
1160
  /*printf("zip: compressed data packet\n");*/
1161
50.1k
  if (c->sigs_only)
1162
0
    rc = handle_compressed (c->ctrl, c, zd, proc_compressed_cb, c);
1163
50.1k
  else if( c->encrypt_only )
1164
0
    rc = handle_compressed (c->ctrl, c, zd, proc_encrypt_cb, c);
1165
50.1k
  else
1166
50.1k
    rc = handle_compressed (c->ctrl, c, zd, NULL, NULL);
1167
1168
50.1k
  if (gpg_err_code (rc) == GPG_ERR_BAD_DATA)
1169
288
    {
1170
288
      if  (!c->any.uncompress_failed)
1171
9
        {
1172
9
          CTX cc;
1173
1174
297
          for (cc=c; cc; cc = cc->anchor)
1175
288
            cc->any.uncompress_failed = 1;
1176
9
          log_error ("uncompressing failed: %s\n", gpg_strerror (rc));
1177
9
        }
1178
288
    }
1179
49.8k
  else if (rc)
1180
49.8k
    log_error ("uncompressing failed: %s\n", gpg_strerror (rc));
1181
1182
50.1k
  free_packet (pkt, NULL);
1183
50.1k
  c->last_was_session_key = 0;
1184
50.1k
  return rc;
1185
50.1k
}
1186
1187
1188
/*
1189
 * Check the signature.  If R_PK is not NULL a copy of the public key
1190
 * used to verify the signature will be stored there, or NULL if not
1191
 * found.  If FORCED_PK is not NULL, this public key is used to verify
1192
 * _data signatures_ and no key lookup is done.  Returns: 0 = valid
1193
 * signature or an error code.  If R_KEYBLOCK is not NULL the keyblock
1194
 * carries the used PK is stored there.  The caller should always free
1195
 * the return value using release_kbnode.
1196
 */
1197
static int
1198
do_check_sig (CTX c, kbnode_t node, const void *extrahash, size_t extrahashlen,
1199
              PKT_public_key *forced_pk, int *is_selfsig,
1200
        int *is_expkey, int *is_revkey,
1201
              PKT_public_key **r_pk, kbnode_t *r_keyblock)
1202
8.86k
{
1203
8.86k
  PKT_signature *sig;
1204
8.86k
  gcry_md_hd_t md = NULL;
1205
8.86k
  gcry_md_hd_t md2 = NULL;
1206
8.86k
  gcry_md_hd_t md_good = NULL;
1207
8.86k
  int algo, rc;
1208
1209
8.86k
  if (r_pk)
1210
8.86k
    *r_pk = NULL;
1211
8.86k
  if (r_keyblock)
1212
8.86k
    *r_keyblock = NULL;
1213
1214
8.86k
  log_assert (node->pkt->pkttype == PKT_SIGNATURE);
1215
8.86k
  if (is_selfsig)
1216
0
    *is_selfsig = 0;
1217
8.86k
  sig = node->pkt->pkt.signature;
1218
1219
8.86k
  algo = sig->digest_algo;
1220
8.86k
  rc = openpgp_md_test_algo (algo);
1221
8.86k
  if (rc)
1222
7.57k
    return rc;
1223
1224
1.29k
  if (sig->sig_class == 0x00)
1225
547
    {
1226
547
      if (c->mfx.md)
1227
547
        {
1228
547
          if (gcry_md_copy (&md, c->mfx.md ))
1229
0
            BUG ();
1230
547
        }
1231
0
      else /* detached signature */
1232
0
        {
1233
          /* check_signature() will enable the md. */
1234
0
          if (gcry_md_open (&md, 0, 0 ))
1235
0
            BUG ();
1236
0
        }
1237
547
    }
1238
747
  else if (sig->sig_class == 0x01)
1239
0
    {
1240
      /* How do we know that we have to hash the (already hashed) text
1241
         in canonical mode ??? (calculating both modes???) */
1242
0
      if (c->mfx.md)
1243
0
        {
1244
0
          if (gcry_md_copy (&md, c->mfx.md ))
1245
0
            BUG ();
1246
0
          if (c->mfx.md2 && gcry_md_copy (&md2, c->mfx.md2))
1247
0
            BUG ();
1248
0
  }
1249
0
      else /* detached signature */
1250
0
        {
1251
0
          log_debug ("Do we really need this here?");
1252
          /* check_signature() will enable the md*/
1253
0
          if (gcry_md_open (&md, 0, 0 ))
1254
0
            BUG ();
1255
0
          if (gcry_md_open (&md2, 0, 0 ))
1256
0
            BUG ();
1257
0
  }
1258
0
    }
1259
747
  else if ((sig->sig_class&~3) == 0x10
1260
746
           ||   sig->sig_class == 0x18
1261
745
           ||   sig->sig_class == 0x1f
1262
734
     ||   sig->sig_class == 0x20
1263
443
     ||   sig->sig_class == 0x28
1264
443
           ||   sig->sig_class == 0x30)
1265
304
    {
1266
304
      if (c->list->pkt->pkttype == PKT_PUBLIC_KEY
1267
304
          || c->list->pkt->pkttype == PKT_PUBLIC_SUBKEY)
1268
0
        {
1269
0
          return check_key_signature (c->ctrl, c->list, node, is_selfsig);
1270
0
  }
1271
304
      else if (sig->sig_class == 0x20)
1272
291
        {
1273
291
          log_error (_("standalone revocation - "
1274
291
                       "use \"gpg --import\" to apply\n"));
1275
291
          return GPG_ERR_NOT_PROCESSED;
1276
291
  }
1277
13
      else
1278
13
        {
1279
13
          log_error ("invalid root packet for sigclass %02x\n", sig->sig_class);
1280
13
          return GPG_ERR_SIG_CLASS;
1281
13
  }
1282
304
    }
1283
443
  else
1284
443
    return GPG_ERR_SIG_CLASS;
1285
1286
  /* We only get here if we are checking the signature of a binary
1287
     (0x00) or text document (0x01).  */
1288
547
  rc = check_signature (c->ctrl, sig, md, extrahash, extrahashlen,
1289
547
                        forced_pk, NULL, is_expkey, is_revkey,
1290
547
                        r_pk, r_keyblock);
1291
547
  if (! rc)
1292
0
    md_good = md;
1293
547
  else if (gpg_err_code (rc) == GPG_ERR_BAD_SIGNATURE && md2)
1294
0
    {
1295
0
      PKT_public_key *pk2;
1296
1297
0
      if (r_keyblock)
1298
0
        release_kbnode (*r_keyblock);
1299
0
      rc = check_signature (c->ctrl, sig, md2, extrahash, extrahashlen,
1300
0
                            forced_pk, NULL, is_expkey, is_revkey,
1301
0
                            r_pk? &pk2 : NULL, r_keyblock);
1302
0
      if (!rc)
1303
0
        {
1304
0
          md_good = md2;
1305
0
          if (r_pk)
1306
0
            {
1307
0
              free_public_key (*r_pk);
1308
0
              *r_pk = pk2;
1309
0
            }
1310
0
        }
1311
0
    }
1312
1313
547
  if (md_good)
1314
0
    {
1315
0
      unsigned char *buffer = gcry_md_read (md_good, sig->digest_algo);
1316
0
      sig->digest_len = gcry_md_get_algo_dlen (map_md_openpgp_to_gcry (algo));
1317
0
      memcpy (sig->digest, buffer, sig->digest_len);
1318
0
    }
1319
1320
547
  gcry_md_close (md);
1321
547
  gcry_md_close (md2);
1322
1323
547
  return rc;
1324
1.29k
}
1325
1326
1327
static void
1328
print_userid (PACKET *pkt)
1329
10.7k
{
1330
10.7k
  if (!pkt)
1331
0
    BUG();
1332
1333
10.7k
  if (pkt->pkttype != PKT_USER_ID)
1334
0
    {
1335
0
      es_printf ("ERROR: unexpected packet type %d", pkt->pkttype );
1336
0
      return;
1337
0
    }
1338
10.7k
  if (opt.with_colons)
1339
0
    {
1340
0
      if (pkt->pkt.user_id->attrib_data)
1341
0
        es_printf("%u %lu",
1342
0
                  pkt->pkt.user_id->numattribs,
1343
0
                  pkt->pkt.user_id->attrib_len);
1344
0
      else
1345
0
        es_write_sanitized (es_stdout, pkt->pkt.user_id->name,
1346
0
                            pkt->pkt.user_id->len, ":", NULL);
1347
0
    }
1348
10.7k
  else
1349
10.7k
    print_utf8_buffer (es_stdout, pkt->pkt.user_id->name,
1350
10.7k
                       pkt->pkt.user_id->len );
1351
10.7k
}
1352
1353
1354
/*
1355
 * List the keyblock in a user friendly way
1356
 */
1357
static void
1358
list_node (CTX c, kbnode_t node)
1359
41.6k
{
1360
41.6k
  if (!node)
1361
0
    ;
1362
41.6k
  else if (node->pkt->pkttype == PKT_PUBLIC_KEY
1363
14.3k
           || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
1364
29.9k
    {
1365
29.9k
      PKT_public_key *pk = node->pkt->pkt.public_key;
1366
1367
29.9k
      if (opt.with_colons)
1368
0
        {
1369
0
          u32 keyid[2];
1370
1371
0
          keyid_from_pk( pk, keyid );
1372
0
          if (pk->flags.primary)
1373
0
            c->trustletter = (opt.fast_list_mode
1374
0
                              ? 0
1375
0
                              : get_validity_info
1376
0
                                  (c->ctrl,
1377
0
                                   node->pkt->pkttype == PKT_PUBLIC_KEY
1378
0
                                   ? node : NULL,
1379
0
                                   pk, NULL));
1380
0
          es_printf ("%s:", pk->flags.primary? "pub":"sub" );
1381
0
          if (c->trustletter)
1382
0
            es_putc (c->trustletter, es_stdout);
1383
0
          es_printf (":%u:%d:%08lX%08lX:%s:%s::",
1384
0
                     nbits_from_pk( pk ),
1385
0
                     pk->pubkey_algo,
1386
0
                     (ulong)keyid[0],(ulong)keyid[1],
1387
0
                     colon_datestr_from_pk( pk ),
1388
0
                     colon_strtime (pk->expiredate) );
1389
0
          if (pk->flags.primary && !opt.fast_list_mode)
1390
0
            es_putc (get_ownertrust_info (c->ctrl, pk, 1), es_stdout);
1391
0
          es_putc (':', es_stdout);
1392
0
          es_putc ('\n', es_stdout);
1393
0
        }
1394
29.9k
      else
1395
29.9k
        {
1396
29.9k
          print_key_line (c->ctrl, es_stdout, pk, 0);
1397
29.9k
        }
1398
1399
29.9k
      if (opt.keyid_format == KF_NONE && !opt.with_colons)
1400
0
        ; /* Already printed.  */
1401
29.9k
      else if ((pk->flags.primary && opt.fingerprint) || opt.fingerprint > 1)
1402
0
        print_fingerprint (c->ctrl, NULL, pk, 0);
1403
1404
29.9k
      if (pk->flags.primary)
1405
27.2k
        {
1406
27.2k
          int kl = opt.keyid_format == KF_NONE? 0 : keystrlen ();
1407
1408
          /* Now list all userids with their signatures. */
1409
51.4k
          for (node = node->next; node; node = node->next)
1410
24.1k
            {
1411
24.1k
              if (node->pkt->pkttype == PKT_SIGNATURE)
1412
10.3k
                {
1413
10.3k
                  list_node (c,  node );
1414
10.3k
                }
1415
13.8k
              else if (node->pkt->pkttype == PKT_USER_ID)
1416
10.7k
                {
1417
10.7k
                  if (opt.with_colons)
1418
10.7k
                    es_printf ("%s:::::::::",
1419
0
                               node->pkt->pkt.user_id->attrib_data?"uat":"uid");
1420
10.7k
                  else
1421
10.7k
                    es_printf ("uid%*s",
1422
10.7k
                               kl + (opt.legacy_list_mode? 9:11),
1423
10.7k
                               "" );
1424
10.7k
                  print_userid (node->pkt);
1425
10.7k
                  if (opt.with_colons)
1426
10.7k
                    es_putc (':', es_stdout);
1427
10.7k
                  es_putc ('\n', es_stdout);
1428
10.7k
    }
1429
3.09k
              else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
1430
2.71k
                {
1431
2.71k
                  list_node(c,  node );
1432
2.71k
                }
1433
24.1k
            }
1434
27.2k
        }
1435
29.9k
    }
1436
11.6k
  else if (node->pkt->pkttype == PKT_SECRET_KEY
1437
10.3k
           || node->pkt->pkttype == PKT_SECRET_SUBKEY)
1438
1.30k
    {
1439
1440
1.30k
      log_debug ("FIXME: No way to print secret key packets here\n");
1441
      /* fixme: We may use a function to turn a secret key packet into
1442
         a public key one and use that here.  */
1443
1.30k
    }
1444
10.3k
  else if (node->pkt->pkttype == PKT_SIGNATURE)
1445
10.3k
    {
1446
10.3k
      PKT_signature *sig = node->pkt->pkt.signature;
1447
10.3k
      int is_selfsig = 0;
1448
10.3k
      int rc2 = 0;
1449
10.3k
      size_t n;
1450
10.3k
      char *p;
1451
10.3k
      int sigrc = ' ';
1452
1453
10.3k
      if (!opt.verbose)
1454
10.3k
        return;
1455
1456
0
      if (sig->sig_class == 0x20 || sig->sig_class == 0x30)
1457
0
        es_fputs ("rev", es_stdout);
1458
0
      else
1459
0
        es_fputs ("sig", es_stdout);
1460
0
      if (opt.check_sigs)
1461
0
        {
1462
0
          fflush (stdout);
1463
0
          rc2 = do_check_sig (c, node, NULL, 0, NULL,
1464
0
                              &is_selfsig, NULL, NULL, NULL, NULL);
1465
0
          switch (gpg_err_code (rc2))
1466
0
            {
1467
0
            case 0:             sigrc = '!'; break;
1468
0
            case GPG_ERR_BAD_SIGNATURE:   sigrc = '-'; break;
1469
0
            case GPG_ERR_NO_PUBKEY:
1470
0
            case GPG_ERR_UNUSABLE_PUBKEY: sigrc = '?'; break;
1471
0
            default:              sigrc = '%'; break;
1472
0
      }
1473
0
  }
1474
0
      else /* Check whether this is a self signature.  */
1475
0
        {
1476
0
          u32 keyid[2];
1477
1478
0
          if (c->list->pkt->pkttype == PKT_PUBLIC_KEY
1479
0
              || c->list->pkt->pkttype == PKT_SECRET_KEY )
1480
0
            {
1481
0
              keyid_from_pk (c->list->pkt->pkt.public_key, keyid);
1482
1483
0
              if (keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1])
1484
0
                is_selfsig = 1;
1485
0
            }
1486
0
  }
1487
1488
0
      if (opt.with_colons)
1489
0
        {
1490
0
          es_putc (':', es_stdout);
1491
0
          if (sigrc != ' ')
1492
0
            es_putc (sigrc, es_stdout);
1493
0
          es_printf ("::%d:%08lX%08lX:%s:%s:", sig->pubkey_algo,
1494
0
                     (ulong)sig->keyid[0], (ulong)sig->keyid[1],
1495
0
                     colon_datestr_from_sig (sig),
1496
0
                     colon_expirestr_from_sig (sig));
1497
1498
0
          if (sig->trust_depth || sig->trust_value)
1499
0
            es_printf ("%d %d",sig->trust_depth,sig->trust_value);
1500
0
          es_putc (':', es_stdout);
1501
1502
0
          if (sig->trust_regexp)
1503
0
            es_write_sanitized (es_stdout, sig->trust_regexp,
1504
0
                                strlen (sig->trust_regexp), ":", NULL);
1505
0
          es_putc (':', es_stdout);
1506
0
  }
1507
0
      else
1508
0
        es_printf ("%c       %s %s   ",
1509
0
                   sigrc, keystr (sig->keyid), datestr_from_sig(sig));
1510
0
      if (sigrc == '%')
1511
0
        es_printf ("[%s] ", gpg_strerror (rc2) );
1512
0
      else if (sigrc == '?')
1513
0
        ;
1514
0
      else if (is_selfsig)
1515
0
        {
1516
0
          if (opt.with_colons)
1517
0
            es_putc (':', es_stdout);
1518
0
          es_fputs (sig->sig_class == 0x18? "[keybind]":"[selfsig]", es_stdout);
1519
0
          if (opt.with_colons)
1520
0
            es_putc (':', es_stdout);
1521
0
  }
1522
0
      else if (!opt.fast_list_mode)
1523
0
        {
1524
0
          p = get_user_id (c->ctrl, sig->keyid, &n, NULL);
1525
0
          es_write_sanitized (es_stdout, p, n,
1526
0
                              opt.with_colons?":":NULL, NULL );
1527
0
          xfree (p);
1528
0
  }
1529
0
      if (opt.with_colons)
1530
0
        es_printf (":%02x%c:", sig->sig_class, sig->flags.exportable?'x':'l');
1531
0
      es_putc ('\n', es_stdout);
1532
0
    }
1533
0
  else
1534
10.3k
    log_error ("invalid node with packet of type %d\n", node->pkt->pkttype);
1535
41.6k
}
1536
1537
1538
int
1539
proc_packets (ctrl_t ctrl, void *anchor, iobuf_t a )
1540
56.7k
{
1541
56.7k
  int rc;
1542
56.7k
  CTX c = xmalloc_clear (sizeof *c);
1543
1544
56.7k
  c->ctrl = ctrl;
1545
56.7k
  c->anchor = anchor;
1546
56.7k
  rc = do_proc_packets (c, a, 0);
1547
56.7k
  xfree (c);
1548
1549
56.7k
  return rc;
1550
56.7k
}
1551
1552
1553
int
1554
proc_signature_packets (ctrl_t ctrl, void *anchor, iobuf_t a,
1555
      strlist_t signedfiles, const char *sigfilename )
1556
0
{
1557
0
  CTX c = xmalloc_clear (sizeof *c);
1558
0
  int rc;
1559
1560
0
  c->ctrl = ctrl;
1561
0
  c->anchor = anchor;
1562
0
  c->sigs_only = 1;
1563
1564
0
  c->signed_data.data_fd = GNUPG_INVALID_FD;
1565
0
  c->signed_data.data_names = signedfiles;
1566
0
  c->signed_data.used = !!signedfiles;
1567
1568
0
  c->sigfilename = sigfilename;
1569
0
  rc = do_proc_packets (c, a, 0);
1570
1571
  /* If we have not encountered any signature we print an error
1572
     messages, send a NODATA status back and return an error code.
1573
     Using log_error is required because verify_files does not check
1574
     error codes for each file but we want to terminate the process
1575
     with an error. */
1576
0
  if (!rc && !c->any.sig_seen)
1577
0
    {
1578
0
      write_status_text (STATUS_NODATA, "4");
1579
0
      log_error (_("no signature found\n"));
1580
0
      rc = GPG_ERR_NO_DATA;
1581
0
    }
1582
1583
  /* Propagate the signature seen flag upward. Do this only on success
1584
     so that we won't issue the nodata status several times.  */
1585
0
  if (!rc && c->anchor && c->any.sig_seen)
1586
0
    c->anchor->any.sig_seen = 1;
1587
1588
0
  xfree (c);
1589
0
  return rc;
1590
0
}
1591
1592
1593
int
1594
proc_signature_packets_by_fd (ctrl_t ctrl, void *anchor, iobuf_t a,
1595
                              gnupg_fd_t signed_data_fd)
1596
0
{
1597
0
  int rc;
1598
0
  CTX c;
1599
1600
0
  c = xtrycalloc (1, sizeof *c);
1601
0
  if (!c)
1602
0
    return gpg_error_from_syserror ();
1603
1604
0
  c->ctrl = ctrl;
1605
0
  c->anchor = anchor;
1606
0
  c->sigs_only = 1;
1607
1608
0
  c->signed_data.data_fd = signed_data_fd;
1609
0
  c->signed_data.data_names = NULL;
1610
0
  c->signed_data.used = (signed_data_fd != GNUPG_INVALID_FD);
1611
1612
0
  rc = do_proc_packets (c, a, 0);
1613
1614
  /* If we have not encountered any signature we print an error
1615
     messages, send a NODATA status back and return an error code.
1616
     Using log_error is required because verify_files does not check
1617
     error codes for each file but we want to terminate the process
1618
     with an error. */
1619
0
  if (!rc && !c->any.sig_seen)
1620
0
    {
1621
0
      write_status_text (STATUS_NODATA, "4");
1622
0
      log_error (_("no signature found\n"));
1623
0
      rc = gpg_error (GPG_ERR_NO_DATA);
1624
0
    }
1625
1626
  /* Propagate the signature seen flag upward. Do this only on success
1627
     so that we won't issue the nodata status several times. */
1628
0
  if (!rc && c->anchor && c->any.sig_seen)
1629
0
    c->anchor->any.sig_seen = 1;
1630
1631
0
  xfree ( c );
1632
0
  return rc;
1633
0
}
1634
1635
1636
/* Handle encryption packets.  If called recursively the caller's CTX
1637
 * should be given for ANCHOR.  If R_DEK and R_LIST are not NULL the
1638
 * DEK (or NULL) is returned there and the list at R_LIST; the caller
1639
 * needs to release them; even if the function returns an error. */
1640
gpg_error_t
1641
proc_encryption_packets (ctrl_t ctrl, void *anchor, iobuf_t a,
1642
                         DEK **r_dek, struct seskey_enc_list **r_list)
1643
0
{
1644
0
  CTX c = xmalloc_clear (sizeof *c);
1645
0
  int rc;
1646
1647
0
  c->ctrl = ctrl;
1648
0
  c->anchor = anchor;
1649
0
  c->encrypt_only = 1;
1650
0
  if (r_dek && r_list)
1651
0
    {
1652
0
      rc = do_proc_packets (c, a, 1);
1653
0
      *r_dek = c->dek;
1654
0
      c->dek = NULL;
1655
0
      *r_list = c->sesenc_list;
1656
0
      c->sesenc_list = NULL;
1657
0
    }
1658
0
  else
1659
0
    rc = do_proc_packets (c, a, 0);
1660
0
  xfree (c);
1661
0
  return rc;
1662
0
}
1663
1664
1665
static int
1666
check_nesting (CTX c)
1667
56.7k
{
1668
56.7k
  int level;
1669
1670
327k
  for (level=0; c; c = c->anchor)
1671
271k
    level++;
1672
1673
56.7k
  if (level > MAX_NESTING_DEPTH)
1674
9
    {
1675
9
      log_error ("input data with too deeply nested packets\n");
1676
9
      write_status_text (STATUS_UNEXPECTED, "1");
1677
9
      return GPG_ERR_BAD_DATA;
1678
9
    }
1679
1680
56.7k
  return 0;
1681
56.7k
}
1682
1683
1684
/* Main processing loop.  If KEEP_DEK_AND_LIST is set the DEK and
1685
 * SESENC_LIST of the context C are not released at the end of the
1686
 * function.  The caller is then required to do this.  */
1687
static int
1688
do_proc_packets (CTX c, iobuf_t a, int keep_dek_and_list)
1689
56.7k
{
1690
56.7k
  PACKET *pkt;
1691
56.7k
  struct parse_packet_ctx_s parsectx;
1692
56.7k
  int rc = 0;
1693
56.7k
  int any_data = 0;
1694
56.7k
  int newpkt;
1695
1696
56.7k
  rc = check_nesting (c);
1697
56.7k
  if (rc)
1698
9
    return rc;
1699
1700
56.7k
  pkt = xmalloc( sizeof *pkt );
1701
56.7k
  c->iobuf = a;
1702
56.7k
  init_packet(pkt);
1703
56.7k
  init_parse_packet (&parsectx, a);
1704
272k
  while ((rc=parse_packet (&parsectx, pkt)) != -1)
1705
266k
    {
1706
266k
      any_data = 1;
1707
266k
      if (rc)
1708
56.5k
        {
1709
56.5k
          if (c->ctrl->modify_recipients && gpg_err_code (rc) == GPG_ERR_TRUE)
1710
0
            {
1711
              /* Save the last read CTB (which was the last byte
1712
               * actually read from the input) and get out of the
1713
               * loop.  */
1714
0
              c->ctrl->last_read_ctb = parsectx.last_ctb;
1715
              /* We need to call the first part of the encrypted data
1716
               * handler to get the DEK.  */
1717
0
              proc_encrypted (c, NULL);
1718
0
              rc = -1;
1719
0
              break;
1720
0
            }
1721
56.5k
          free_packet (pkt, &parsectx);
1722
          /* Stop processing when an invalid packet has been encountered
1723
           * but don't do so when we are doing a --list-packets.  */
1724
56.5k
          if (gpg_err_code (rc) == GPG_ERR_INV_PACKET
1725
50.3k
              && opt.list_packets == 0)
1726
50.3k
            break;
1727
6.18k
          continue;
1728
56.5k
  }
1729
210k
      newpkt = -1;
1730
210k
      if (opt.list_packets)
1731
0
        {
1732
0
          switch (pkt->pkttype)
1733
0
            {
1734
0
            case PKT_PUBKEY_ENC:    proc_pubkey_enc (c, pkt); break;
1735
0
            case PKT_SYMKEY_ENC:    proc_symkey_enc (c, pkt); break;
1736
0
            case PKT_ENCRYPTED:
1737
0
            case PKT_ENCRYPTED_MDC:
1738
0
            case PKT_ENCRYPTED_AEAD:proc_encrypted (c, pkt); break;
1739
0
            case PKT_COMPRESSED:    rc = proc_compressed (c, pkt); break;
1740
0
            default: newpkt = 0; break;
1741
0
      }
1742
0
  }
1743
210k
      else if (c->sigs_only)
1744
0
        {
1745
0
          switch (pkt->pkttype)
1746
0
            {
1747
0
            case PKT_PUBLIC_KEY:
1748
0
            case PKT_SECRET_KEY:
1749
0
            case PKT_USER_ID:
1750
0
            case PKT_SYMKEY_ENC:
1751
0
            case PKT_PUBKEY_ENC:
1752
0
            case PKT_ENCRYPTED:
1753
0
            case PKT_ENCRYPTED_MDC:
1754
0
            case PKT_ENCRYPTED_AEAD:
1755
0
              write_status_text( STATUS_UNEXPECTED, "0" );
1756
0
              rc = GPG_ERR_UNEXPECTED;
1757
0
              goto leave;
1758
1759
0
            case PKT_SIGNATURE:   newpkt = add_signature (c, pkt); break;
1760
0
            case PKT_PLAINTEXT:   proc_plaintext (c, pkt); break;
1761
0
            case PKT_COMPRESSED:  rc = proc_compressed (c, pkt); break;
1762
0
            case PKT_ONEPASS_SIG: newpkt = add_onepass_sig (c, pkt); break;
1763
0
            case PKT_GPG_CONTROL: newpkt = add_gpg_control (c, pkt); break;
1764
0
            default: newpkt = 0; break;
1765
0
      }
1766
0
  }
1767
210k
      else if (c->encrypt_only)
1768
0
        {
1769
0
          switch (pkt->pkttype)
1770
0
            {
1771
0
            case PKT_PUBLIC_KEY:
1772
0
            case PKT_SECRET_KEY:
1773
0
            case PKT_USER_ID:
1774
0
              write_status_text (STATUS_UNEXPECTED, "0");
1775
0
              rc = GPG_ERR_UNEXPECTED;
1776
0
              goto leave;
1777
1778
0
            case PKT_SIGNATURE:   newpkt = add_signature (c, pkt); break;
1779
1780
0
            case PKT_SYMKEY_ENC:
1781
0
            case PKT_PUBKEY_ENC:
1782
              /* In --add-recipients mode set the stop flag as soon as
1783
               * we see the first of these packets.  */
1784
0
              if (c->ctrl->modify_recipients)
1785
0
                parsectx.only_fookey_enc = 1;
1786
0
              if (pkt->pkttype == PKT_SYMKEY_ENC)
1787
0
                proc_symkey_enc (c, pkt);
1788
0
              else
1789
0
                proc_pubkey_enc (c, pkt);
1790
0
              break;
1791
1792
0
            case PKT_ENCRYPTED:
1793
0
            case PKT_ENCRYPTED_MDC:
1794
0
            case PKT_ENCRYPTED_AEAD: proc_encrypted (c, pkt); break;
1795
0
            case PKT_PLAINTEXT:   proc_plaintext (c, pkt); break;
1796
0
            case PKT_COMPRESSED:  rc = proc_compressed (c, pkt); break;
1797
0
            case PKT_ONEPASS_SIG: newpkt = add_onepass_sig (c, pkt); break;
1798
0
            case PKT_GPG_CONTROL: newpkt = add_gpg_control (c, pkt); break;
1799
0
            default: newpkt = 0; break;
1800
0
      }
1801
0
  }
1802
210k
      else
1803
210k
        {
1804
210k
          switch (pkt->pkttype)
1805
210k
            {
1806
27.2k
            case PKT_PUBLIC_KEY:
1807
28.5k
            case PKT_SECRET_KEY:
1808
28.5k
              release_list (c);
1809
28.5k
              c->list = new_kbnode (pkt);
1810
28.5k
              newpkt = 1;
1811
28.5k
              break;
1812
2.92k
            case PKT_PUBLIC_SUBKEY:
1813
8.19k
            case PKT_SECRET_SUBKEY:
1814
8.19k
              newpkt = add_subkey (c, pkt);
1815
8.19k
              break;
1816
18.3k
            case PKT_USER_ID:     newpkt = add_user_id (c, pkt); break;
1817
24.1k
            case PKT_SIGNATURE:   newpkt = add_signature (c, pkt); break;
1818
11.7k
            case PKT_PUBKEY_ENC:  proc_pubkey_enc (c, pkt); break;
1819
20.6k
            case PKT_SYMKEY_ENC:  proc_symkey_enc (c, pkt); break;
1820
20.4k
            case PKT_ENCRYPTED:
1821
26.5k
            case PKT_ENCRYPTED_MDC:
1822
37.6k
            case PKT_ENCRYPTED_AEAD: proc_encrypted (c, pkt); break;
1823
4.59k
            case PKT_PLAINTEXT:   proc_plaintext (c, pkt); break;
1824
50.1k
            case PKT_COMPRESSED:  rc = proc_compressed (c, pkt); break;
1825
1.90k
            case PKT_ONEPASS_SIG: newpkt = add_onepass_sig (c, pkt); break;
1826
2.48k
            case PKT_GPG_CONTROL: newpkt = add_gpg_control(c, pkt); break;
1827
0
            case PKT_RING_TRUST:  newpkt = add_ring_trust (c, pkt); break;
1828
1.75k
            default: newpkt = 0; break;
1829
210k
      }
1830
210k
  }
1831
1832
210k
      if (rc)
1833
632
        goto leave;
1834
1835
      /* This is a very ugly construct and frankly, I don't remember why
1836
       * I used it.  Adding the MDC check here is a hack.
1837
       * The right solution is to initiate another context for encrypted
1838
       * packet and not to reuse the current one ...  It works right
1839
       * when there is a compression packet between which adds just
1840
       * an extra layer.
1841
       *
1842
       * Note that we should not reset the any.data due to another
1843
       * packets.  Just set it once on seeing a plaintext.
1844
       *
1845
       * Hmmm: Rewrite this whole module here??
1846
       */
1847
209k
      if (pkt->pkttype != PKT_SIGNATURE && pkt->pkttype != PKT_MDC)
1848
184k
        c->any.data |= (pkt->pkttype == PKT_PLAINTEXT);
1849
1850
209k
      if (newpkt == -1)
1851
124k
        ;
1852
85.4k
      else if (newpkt)
1853
75.1k
        {
1854
75.1k
          pkt = xmalloc (sizeof *pkt);
1855
75.1k
          init_packet (pkt);
1856
75.1k
  }
1857
10.2k
      else
1858
10.2k
        free_packet (pkt, &parsectx);
1859
209k
    }
1860
1861
56.1k
  if (rc == GPG_ERR_INV_PACKET)
1862
50.3k
    write_status_text (STATUS_NODATA, "3");
1863
1864
56.1k
  if (any_data)
1865
55.2k
    rc = 0;
1866
856
  else if (rc == -1)
1867
856
    write_status_text (STATUS_NODATA, "2");
1868
1869
1870
56.7k
 leave:
1871
56.7k
  if (!keep_dek_and_list)
1872
56.7k
    release_list (c);
1873
56.7k
  free_packet (pkt, &parsectx);
1874
56.7k
  deinit_parse_packet (&parsectx);
1875
56.7k
  xfree (pkt);
1876
56.7k
  free_md_filter_context (&c->mfx);
1877
56.7k
  return rc;
1878
56.1k
}
1879
1880
1881
/* Return true if the AKL has the WKD method specified.  */
1882
static int
1883
akl_has_wkd_method (void)
1884
0
{
1885
0
  struct akl *akl;
1886
1887
0
  for (akl = opt.auto_key_locate; akl; akl = akl->next)
1888
0
    if (akl->type == AKL_WKD)
1889
0
      return 1;
1890
0
  return 0;
1891
0
}
1892
1893
1894
/* Return the ISSUER fingerprint buffer and its length at R_LEN.
1895
 * Returns NULL if not available.  The returned buffer is valid as
1896
 * long as SIG is not modified.  */
1897
const byte *
1898
issuer_fpr_raw (PKT_signature *sig, size_t *r_len)
1899
9.41k
{
1900
9.41k
  const byte *p;
1901
9.41k
  size_t n;
1902
1903
9.41k
  p = parse_sig_subpkt (sig, 1, SIGSUBPKT_ISSUER_FPR, &n);
1904
9.41k
  if (p && ((n == 21 && p[0] == 4) || (n == 33 && p[0] == 5)))
1905
337
    {
1906
337
      *r_len = n - 1;
1907
337
      return p+1;
1908
337
    }
1909
9.07k
  *r_len = 0;
1910
9.07k
  return NULL;
1911
9.41k
}
1912
1913
1914
/* Return the ISSUER fingerprint string in human readable format if
1915
 * available.  Caller must release the string.  */
1916
/* FIXME: Move to another file.  */
1917
char *
1918
issuer_fpr_string (PKT_signature *sig)
1919
8.86k
{
1920
8.86k
  const byte *p;
1921
8.86k
  size_t n;
1922
1923
8.86k
  p = issuer_fpr_raw (sig, &n);
1924
8.86k
  return p? bin2hex (p, n, NULL) : NULL;
1925
8.86k
}
1926
1927
static void
1928
print_good_bad_signature (int statno, const char *keyid_str, kbnode_t un,
1929
                          PKT_signature *sig, int rc)
1930
0
{
1931
0
  char *p;
1932
1933
0
  write_status_text_and_buffer (statno, keyid_str,
1934
0
                                un? un->pkt->pkt.user_id->name:"[?]",
1935
0
                                un? un->pkt->pkt.user_id->len:3,
1936
0
                                -1);
1937
1938
0
  if (un)
1939
0
    p = utf8_to_native (un->pkt->pkt.user_id->name,
1940
0
                        un->pkt->pkt.user_id->len, 0);
1941
0
  else
1942
0
    p = xstrdup ("[?]");
1943
1944
0
  if (rc)
1945
0
    log_info (_("BAD signature from \"%s\""), p);
1946
0
  else if (sig->flags.expired)
1947
0
    log_info (_("Expired signature from \"%s\""), p);
1948
0
  else
1949
0
    log_info (_("Good signature from \"%s\""), p);
1950
1951
0
  xfree (p);
1952
0
}
1953
1954
1955
static int
1956
check_sig_and_print (CTX c, kbnode_t node)
1957
9.68k
{
1958
9.68k
  PKT_signature *sig = node->pkt->pkt.signature;
1959
9.68k
  const char *astr;
1960
9.68k
  gpg_error_t rc;
1961
9.68k
  int is_expkey = 0;
1962
9.68k
  int is_revkey = 0;
1963
9.68k
  char *issuer_fpr = NULL;
1964
9.68k
  PKT_public_key *pk = NULL;  /* The public key for the signature or NULL. */
1965
9.68k
  const void *extrahash = NULL;
1966
9.68k
  size_t extrahashlen = 0;
1967
9.68k
  kbnode_t keyblock = NULL;
1968
9.68k
  char pkstrbuf[PUBKEY_STRING_SIZE] = { 0 };
1969
1970
1971
9.68k
  if (opt.skip_verify)
1972
0
    {
1973
0
      log_info(_("signature verification suppressed\n"));
1974
0
      return 0;
1975
0
    }
1976
1977
  /* Check that the message composition is valid.
1978
   *
1979
   * Per RFC-2440bis (-15) allowed:
1980
   *
1981
   * S{1,n}           -- detached signature.
1982
   * S{1,n} P         -- old style PGP2 signature
1983
   * O{1,n} P S{1,n}  -- standard OpenPGP signature.
1984
   * C P S{1,n}       -- cleartext signature.
1985
   *
1986
   *
1987
   *      O = One-Pass Signature packet.
1988
   *      S = Signature packet.
1989
   *      P = OpenPGP Message packet (Encrypted | Compressed | Literal)
1990
   *             (Note that the current rfc2440bis draft also allows
1991
   *              for a signed message but that does not work as it
1992
   *              introduces ambiguities.)
1993
   *          We keep track of these packages using the marker packet
1994
   *          CTRLPKT_PLAINTEXT_MARK.
1995
   *      C = Marker packet for cleartext signatures.
1996
   *
1997
   * We reject all other messages.
1998
   *
1999
   * Actually we are calling this too often, i.e. for verification of
2000
   * each message but better have some duplicate work than to silently
2001
   * introduce a bug here.
2002
   */
2003
9.68k
  {
2004
9.68k
    kbnode_t n;
2005
9.68k
    int n_onepass, n_sig;
2006
2007
/*     log_debug ("checking signature packet composition\n"); */
2008
/*     dump_kbnode (c->list); */
2009
2010
9.68k
    n = c->list;
2011
9.68k
    log_assert (n);
2012
9.68k
    if ( n->pkt->pkttype == PKT_SIGNATURE )
2013
8.89k
      {
2014
        /* This is either "S{1,n}" case (detached signature) or
2015
           "S{1,n} P" (old style PGP2 signature). */
2016
1.09M
        for (n = n->next; n; n = n->next)
2017
1.08M
          if (n->pkt->pkttype != PKT_SIGNATURE)
2018
1.71k
            break;
2019
8.89k
        if (!n)
2020
7.18k
          ; /* Okay, this is a detached signature.  */
2021
1.71k
        else if (n->pkt->pkttype == PKT_GPG_CONTROL
2022
1.47k
                 && (n->pkt->pkt.gpg_control->control
2023
1.47k
                     == CTRLPKT_PLAINTEXT_MARK) )
2024
1.47k
          {
2025
1.47k
            if (n->next)
2026
344
              goto ambiguous;  /* We only allow one P packet. */
2027
1.13k
            extrahash = n->pkt->pkt.gpg_control->data;
2028
1.13k
            extrahashlen = n->pkt->pkt.gpg_control->datalen;
2029
1.13k
          }
2030
239
        else
2031
239
          goto ambiguous;
2032
8.89k
      }
2033
788
    else if (n->pkt->pkttype == PKT_ONEPASS_SIG)
2034
645
      {
2035
        /* This is the "O{1,n} P S{1,n}" case (standard signature). */
2036
645
        for (n_onepass=1, n = n->next;
2037
1.40k
             n && n->pkt->pkttype == PKT_ONEPASS_SIG; n = n->next)
2038
764
          n_onepass++;
2039
645
        if (!n || !(n->pkt->pkttype == PKT_GPG_CONTROL
2040
607
                    && (n->pkt->pkt.gpg_control->control
2041
607
                        == CTRLPKT_PLAINTEXT_MARK)))
2042
38
          goto ambiguous;
2043
607
        extrahash = n->pkt->pkt.gpg_control->data;
2044
607
        extrahashlen = n->pkt->pkt.gpg_control->datalen;
2045
2046
607
        for (n_sig=0, n = n->next;
2047
1.84k
             n && n->pkt->pkttype == PKT_SIGNATURE; n = n->next)
2048
1.23k
          n_sig++;
2049
607
        if (!n_sig)
2050
0
          goto ambiguous;
2051
2052
  /* If we wanted to disallow multiple sig verification, we'd do
2053
   * something like this:
2054
         *
2055
   * if (n)
2056
         *   goto ambiguous;
2057
         *
2058
         * However, this can stay allowable as we can't get here.  */
2059
2060
607
        if (n_onepass != n_sig)
2061
56
          {
2062
56
            log_info ("number of one-pass packets does not match "
2063
56
                      "number of signature packets\n");
2064
56
            goto ambiguous;
2065
56
          }
2066
607
      }
2067
143
    else if (n->pkt->pkttype == PKT_GPG_CONTROL
2068
143
             && n->pkt->pkt.gpg_control->control == CTRLPKT_CLEARSIGN_START )
2069
5
      {
2070
        /* This is the "C P S{1,n}" case (clear text signature). */
2071
5
        n = n->next;
2072
5
        if (!n || !(n->pkt->pkttype == PKT_GPG_CONTROL
2073
5
                    && (n->pkt->pkt.gpg_control->control
2074
5
                        == CTRLPKT_PLAINTEXT_MARK)))
2075
0
          goto ambiguous;
2076
5
        extrahash = n->pkt->pkt.gpg_control->data;
2077
5
        extrahashlen = n->pkt->pkt.gpg_control->datalen;
2078
5
        for (n_sig=0, n = n->next;
2079
5
             n && n->pkt->pkttype == PKT_SIGNATURE; n = n->next)
2080
0
          n_sig++;
2081
5
        if (n || !n_sig)
2082
5
          goto ambiguous;
2083
5
      }
2084
138
    else
2085
138
      {
2086
820
      ambiguous:
2087
820
        log_error(_("can't handle this ambiguous signature data\n"));
2088
820
        rc = 0;
2089
820
        goto leave;
2090
138
      }
2091
9.68k
  } /* End checking signature packet composition.  */
2092
2093
8.86k
  if (sig->signers_uid)
2094
3.53k
    write_status_buffer (STATUS_NEWSIG,
2095
3.53k
                         sig->signers_uid, strlen (sig->signers_uid), 0);
2096
5.33k
  else
2097
5.33k
    write_status_text (STATUS_NEWSIG, NULL);
2098
2099
8.86k
  astr = openpgp_pk_algo_name ( sig->pubkey_algo );
2100
8.86k
  issuer_fpr = issuer_fpr_string (sig);
2101
2102
8.86k
  if (issuer_fpr)
2103
337
    {
2104
337
      log_info (_("Signature made %s\n"), asctimestamp(sig->timestamp));
2105
337
      log_info (_("               using %s key %s\n"),
2106
337
                astr? astr: "?", issuer_fpr);
2107
2108
337
    }
2109
8.53k
  else if (!keystrlen () || keystrlen () > 8)
2110
8.53k
    {
2111
8.53k
      log_info (_("Signature made %s\n"), asctimestamp(sig->timestamp));
2112
8.53k
      log_info (_("               using %s key %s\n"),
2113
8.53k
                astr? astr: "?", keystr(sig->keyid));
2114
8.53k
    }
2115
0
  else /* Legacy format.  */
2116
8.53k
    log_info (_("Signature made %s using %s key ID %s\n"),
2117
0
              asctimestamp(sig->timestamp), astr? astr: "?",
2118
0
              keystr(sig->keyid));
2119
2120
  /* In verbose mode print the signers UID.  */
2121
8.86k
  if (sig->signers_uid)
2122
8.86k
    log_info (_("               issuer \"%s\"\n"), sig->signers_uid);
2123
2124
8.86k
  rc = do_check_sig (c, node, extrahash, extrahashlen, NULL,
2125
8.86k
                     NULL, &is_expkey, &is_revkey, &pk, &keyblock);
2126
2127
  /* If the key is not found but the signature includes a key block we
2128
   * use that key block for verification and on success import it.  */
2129
8.86k
  if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY
2130
545
      && sig->flags.key_block
2131
0
      && opt.flags.auto_key_import)
2132
0
    {
2133
0
      kbnode_t included_keyblock = NULL;
2134
0
      PKT_public_key *included_pk;
2135
0
      const byte *kblock;
2136
0
      size_t kblock_len;
2137
2138
0
      included_pk = xcalloc (1, sizeof *included_pk);
2139
0
      kblock = parse_sig_subpkt (sig, 1, SIGSUBPKT_KEY_BLOCK, &kblock_len);
2140
0
      if (kblock && kblock_len > 1
2141
0
          && !get_pubkey_from_buffer (c->ctrl, included_pk,
2142
0
                                      kblock+1, kblock_len-1,
2143
0
                                      sig->keyid, &included_keyblock))
2144
0
        {
2145
          /* Note: This is the only place where we use the forced_pk
2146
           *       arg (ie. included_pk) with do_check_sig.  */
2147
0
          rc = do_check_sig (c, node, extrahash, extrahashlen, included_pk,
2148
0
                             NULL, &is_expkey, &is_revkey, &pk, NULL);
2149
0
          if (opt.verbose)
2150
0
            log_info ("checked signature using included key block: %s\n",
2151
0
                       gpg_strerror (rc));
2152
0
          if (!rc)
2153
0
            {
2154
              /* The keyblock has been verified, we now import it.  */
2155
0
              rc = import_included_key_block (c->ctrl, included_keyblock);
2156
0
            }
2157
2158
0
        }
2159
0
      free_public_key (included_pk);
2160
0
      release_kbnode (included_keyblock);
2161
2162
      /* To make sure that nothing strange happened we check the
2163
       * signature again now using our own key store. This also
2164
       * returns the keyblock which we use later on.  */
2165
0
      if (!rc)
2166
0
        {
2167
0
          release_kbnode (keyblock);
2168
0
          keyblock = NULL;
2169
0
          rc = do_check_sig (c, node, extrahash, extrahashlen, NULL,
2170
0
                             NULL, &is_expkey, &is_revkey, &pk, &keyblock);
2171
0
        }
2172
0
    }
2173
2174
  /* If the key isn't found, check for a preferred keyserver.  Note
2175
   * that this is only done if honor-keyserver-url has been set.  We
2176
   * test for this in the loop so that we can show info about the
2177
   * preferred keyservers.  */
2178
8.86k
  if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY
2179
545
      && sig->flags.pref_ks)
2180
0
    {
2181
0
      const byte *p;
2182
0
      int seq = 0;
2183
0
      size_t n;
2184
0
      int any_pref_ks = 0;
2185
2186
0
      while ((p=enum_sig_subpkt (sig, 1, SIGSUBPKT_PREF_KS, &n, &seq, NULL)))
2187
0
        {
2188
          /* According to my favorite copy editor, in English grammar,
2189
             you say "at" if the key is located on a web page, but
2190
             "from" if it is located on a keyserver.  I'm not going to
2191
             even try to make two strings here :) */
2192
0
          log_info(_("Key available at: ") );
2193
0
          print_utf8_buffer (log_get_stream(), p, n);
2194
0
          log_printf ("\n");
2195
0
          any_pref_ks = 1;
2196
2197
0
          if ((opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE)
2198
0
              && (opt.keyserver_options.options&KEYSERVER_HONOR_KEYSERVER_URL))
2199
0
            {
2200
0
              struct keyserver_spec *spec;
2201
2202
0
              spec = parse_preferred_keyserver (sig);
2203
0
              if (spec)
2204
0
                {
2205
0
                  int res;
2206
2207
0
                  if (DBG_LOOKUP)
2208
0
                    log_debug ("trying auto-key-retrieve method %s\n",
2209
0
                               "Pref-KS");
2210
2211
0
                  free_public_key (pk);
2212
0
                  pk = NULL;
2213
0
                  glo_ctrl.in_auto_key_retrieve++;
2214
0
                  res = keyserver_import_keyid (c->ctrl, sig->keyid,spec,
2215
0
                                                KEYSERVER_IMPORT_FLAG_QUICK);
2216
0
                  glo_ctrl.in_auto_key_retrieve--;
2217
0
                  if (!res)
2218
0
                    {
2219
0
                      release_kbnode (keyblock);
2220
0
                      keyblock = NULL;
2221
0
                      rc = do_check_sig (c, node, extrahash, extrahashlen, NULL,
2222
0
                                         NULL, &is_expkey, &is_revkey, &pk,
2223
0
                                         &keyblock);
2224
0
                    }
2225
0
                  else if (DBG_LOOKUP)
2226
0
                    log_debug ("lookup via %s failed: %s\n", "Pref-KS",
2227
0
                               gpg_strerror (res));
2228
0
                  free_keyserver_spec (spec);
2229
2230
0
                  if (!rc)
2231
0
                    break;
2232
0
                }
2233
0
            }
2234
0
        }
2235
2236
0
      if (any_pref_ks
2237
0
          && (opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE)
2238
0
          && !(opt.keyserver_options.options&KEYSERVER_HONOR_KEYSERVER_URL))
2239
0
        log_info (_("Note: Use '%s' to make use of this info\n"),
2240
0
                  "--keyserver-option honor-keyserver-url");
2241
0
    }
2242
2243
  /* If the above methods didn't work, our next try is to retrieve the
2244
   * key from the WKD.  This requires that WKD is in the AKL and the
2245
   * Signer's UID is in the signature.  */
2246
8.86k
  if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY
2247
545
      && (opt.keyserver_options.options & KEYSERVER_AUTO_KEY_RETRIEVE)
2248
0
      && !opt.flags.disable_signer_uid
2249
0
      && akl_has_wkd_method ()
2250
0
      && sig->signers_uid)
2251
0
    {
2252
0
      int res;
2253
2254
0
      if (DBG_LOOKUP)
2255
0
        log_debug ("trying auto-key-retrieve method %s\n", "WKD");
2256
0
      free_public_key (pk);
2257
0
      pk = NULL;
2258
0
      glo_ctrl.in_auto_key_retrieve++;
2259
0
      res = keyserver_import_wkd (c->ctrl, sig->signers_uid,
2260
0
                                  KEYSERVER_IMPORT_FLAG_QUICK, NULL, NULL);
2261
0
      glo_ctrl.in_auto_key_retrieve--;
2262
      /* Fixme: If the fingerprint is embedded in the signature,
2263
       * compare it to the fingerprint of the returned key.  */
2264
0
      if (!res)
2265
0
        {
2266
0
          release_kbnode (keyblock);
2267
0
          keyblock = NULL;
2268
0
          rc = do_check_sig (c, node, extrahash, extrahashlen, NULL,
2269
0
                             NULL, &is_expkey, &is_revkey, &pk, &keyblock);
2270
0
        }
2271
0
      else if (DBG_LOOKUP)
2272
0
        log_debug ("lookup via %s failed: %s\n", "WKD", gpg_strerror (res));
2273
0
    }
2274
2275
  /* If the above methods didn't work, our next try is to locate
2276
   * the key via its fingerprint from a keyserver.  This requires
2277
   * that the signers fingerprint is encoded in the signature.  */
2278
8.86k
  if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY
2279
545
      && (opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE)
2280
0
      && keyserver_any_configured (c->ctrl))
2281
0
    {
2282
0
      int res;
2283
0
      const byte *p;
2284
0
      size_t n;
2285
2286
0
      p = issuer_fpr_raw (sig, &n);
2287
0
      if (p)
2288
0
        {
2289
0
          if (DBG_LOOKUP)
2290
0
            log_debug ("trying auto-key-retrieve method %s\n", "KS");
2291
2292
          /* v4 or v5 packet with a SHA-1/256 fingerprint.  */
2293
0
          free_public_key (pk);
2294
0
          pk = NULL;
2295
0
          glo_ctrl.in_auto_key_retrieve++;
2296
0
          res = keyserver_import_fpr (c->ctrl, p, n, opt.keyserver,
2297
0
                                      KEYSERVER_IMPORT_FLAG_QUICK);
2298
0
          glo_ctrl.in_auto_key_retrieve--;
2299
0
          if (!res)
2300
0
            {
2301
0
              release_kbnode (keyblock);
2302
0
              keyblock = NULL;
2303
0
              rc = do_check_sig (c, node, extrahash, extrahashlen, NULL,
2304
0
                                 NULL, &is_expkey, &is_revkey, &pk,
2305
0
                                 &keyblock);
2306
0
            }
2307
0
          else if (DBG_LOOKUP)
2308
0
            log_debug ("lookup via %s failed: %s\n", "KS", gpg_strerror (res));
2309
0
        }
2310
0
    }
2311
2312
  /* Do something with the result of the signature checking.  */
2313
8.86k
  if (!rc || gpg_err_code (rc) == GPG_ERR_BAD_SIGNATURE)
2314
0
    {
2315
      /* We have checked the signature and the result is either a good
2316
       * signature or a bad signature.  Further examination follows.  */
2317
0
      kbnode_t un;
2318
0
      int count = 0;
2319
0
      int keyblock_has_pk = 0;  /* For failsafe check.  */
2320
0
      int statno;
2321
0
      char keyid_str[50];
2322
0
      PKT_public_key *mainpk = NULL;
2323
2324
0
      if (rc)
2325
0
        statno = STATUS_BADSIG;
2326
0
      else if (sig->flags.expired)
2327
0
        statno = STATUS_EXPSIG;
2328
0
      else if (is_expkey)
2329
0
        statno = STATUS_EXPKEYSIG;
2330
0
      else if(is_revkey)
2331
0
        statno = STATUS_REVKEYSIG;
2332
0
      else
2333
0
        statno = STATUS_GOODSIG;
2334
2335
0
      snprintf (keyid_str, sizeof keyid_str, "%08lX%08lX [uncertain] ",
2336
0
                (ulong)sig->keyid[0], (ulong)sig->keyid[1]);
2337
2338
      /* Find and print the primary user ID along with the
2339
         "Good|Expired|Bad signature" line.  */
2340
0
      for (un=keyblock; un; un = un->next)
2341
0
        {
2342
0
          int valid;
2343
2344
0
          if (!keyblock_has_pk
2345
0
              && (un->pkt->pkttype == PKT_PUBLIC_KEY
2346
0
                  || un->pkt->pkttype == PKT_PUBLIC_SUBKEY)
2347
0
              && !cmp_public_keys (un->pkt->pkt.public_key, pk))
2348
0
            {
2349
0
              keyblock_has_pk = 1;
2350
0
            }
2351
0
          if (un->pkt->pkttype == PKT_PUBLIC_KEY)
2352
0
            {
2353
0
              mainpk = un->pkt->pkt.public_key;
2354
0
              continue;
2355
0
            }
2356
0
          if (un->pkt->pkttype != PKT_USER_ID)
2357
0
            continue;
2358
0
          if (!un->pkt->pkt.user_id->created)
2359
0
            continue;
2360
0
          if (un->pkt->pkt.user_id->flags.revoked)
2361
0
            continue;
2362
0
          if (un->pkt->pkt.user_id->flags.expired)
2363
0
            continue;
2364
0
          if (!un->pkt->pkt.user_id->flags.primary)
2365
0
            continue;
2366
          /* We want the textual primary user ID here */
2367
0
          if (un->pkt->pkt.user_id->attrib_data)
2368
0
            continue;
2369
2370
0
          log_assert (mainpk);
2371
2372
    /* Since this is just informational, don't actually ask the
2373
       user to update any trust information.  (Note: we register
2374
       the signature later.)  Because print_good_bad_signature
2375
       does not print a LF we need to compute the validity
2376
       before calling that function.  */
2377
0
          if ((opt.verify_options & VERIFY_SHOW_UID_VALIDITY))
2378
0
            valid = get_validity (c->ctrl, keyblock, mainpk,
2379
0
                                  un->pkt->pkt.user_id, NULL, 0);
2380
0
          else
2381
0
            valid = 0; /* Not used.  */
2382
2383
0
          keyid_str[17] = 0; /* cut off the "[uncertain]" part */
2384
2385
0
          print_good_bad_signature (statno, keyid_str, un, sig, rc);
2386
2387
0
          if ((opt.verify_options & VERIFY_SHOW_UID_VALIDITY))
2388
0
            log_printf (" [%s]\n",trust_value_to_string(valid));
2389
0
          else
2390
0
            log_printf ("\n");
2391
2392
0
          count++;
2393
          /* At this point we could in theory stop because the primary
2394
           * UID flag is never set for more than one User ID per
2395
           * keyblock.  However, we use this loop also for a failsafe
2396
           * check that the public key used to create the signature is
2397
           * contained in the keyring.*/
2398
0
  }
2399
2400
0
      if (!mainpk || !keyblock_has_pk)
2401
0
        {
2402
0
          log_error ("signature key lost from keyblock (%p,%p,%d)\n",
2403
0
                     keyblock, mainpk, keyblock_has_pk);
2404
0
          rc = gpg_error (GPG_ERR_INTERNAL);
2405
0
        }
2406
2407
      /* In case we did not found a valid textual userid above
2408
         we print the first user id packet or a "[?]" instead along
2409
         with the "Good|Expired|Bad signature" line.  */
2410
0
      if (!count)
2411
0
        {
2412
          /* Try for an invalid textual userid */
2413
0
          for (un=keyblock; un; un = un->next)
2414
0
            {
2415
0
              if (un->pkt->pkttype == PKT_USER_ID
2416
0
                  && !un->pkt->pkt.user_id->attrib_data)
2417
0
                break;
2418
0
            }
2419
2420
          /* Try for any userid at all */
2421
0
          if (!un)
2422
0
            {
2423
0
              for (un=keyblock; un; un = un->next)
2424
0
                {
2425
0
                  if (un->pkt->pkttype == PKT_USER_ID)
2426
0
                    break;
2427
0
    }
2428
0
      }
2429
2430
0
          if (opt.trust_model==TM_ALWAYS || !un)
2431
0
            keyid_str[17] = 0; /* cut off the "[uncertain]" part */
2432
2433
0
          print_good_bad_signature (statno, keyid_str, un, sig, rc);
2434
2435
0
          if (opt.trust_model != TM_ALWAYS && un)
2436
0
            log_printf (" %s",_("[uncertain]") );
2437
0
          log_printf ("\n");
2438
0
  }
2439
2440
      /* If we have a good signature and already printed
2441
       * the primary user ID, print all the other user IDs */
2442
0
      if (count
2443
0
          && !rc
2444
0
          && !(opt.verify_options & VERIFY_SHOW_PRIMARY_UID_ONLY))
2445
0
        {
2446
0
          char *p;
2447
0
          for( un=keyblock; un; un = un->next)
2448
0
            {
2449
0
              if (un->pkt->pkttype != PKT_USER_ID)
2450
0
                continue;
2451
0
              if ((un->pkt->pkt.user_id->flags.revoked
2452
0
                   || un->pkt->pkt.user_id->flags.expired)
2453
0
                  && !(opt.verify_options & VERIFY_SHOW_UNUSABLE_UIDS))
2454
0
                continue;
2455
              /* Skip textual primary user ids which we printed above. */
2456
0
              if (un->pkt->pkt.user_id->flags.primary
2457
0
                  && !un->pkt->pkt.user_id->attrib_data )
2458
0
                continue;
2459
2460
              /* If this user id has attribute data, print that.  */
2461
0
              if (un->pkt->pkt.user_id->attrib_data)
2462
0
                {
2463
0
                  dump_attribs (un->pkt->pkt.user_id, mainpk);
2464
2465
0
                  if (opt.verify_options&VERIFY_SHOW_PHOTOS)
2466
0
                    show_photos (c->ctrl,
2467
0
                                 un->pkt->pkt.user_id->attribs,
2468
0
                                 un->pkt->pkt.user_id->numattribs,
2469
0
                                 mainpk ,un->pkt->pkt.user_id);
2470
0
                }
2471
2472
0
              p = utf8_to_native (un->pkt->pkt.user_id->name,
2473
0
          un->pkt->pkt.user_id->len, 0);
2474
0
              log_info (_("                aka \"%s\""), p);
2475
0
              xfree (p);
2476
2477
0
              if ((opt.verify_options & VERIFY_SHOW_UID_VALIDITY))
2478
0
                {
2479
0
                  const char *valid;
2480
2481
0
                  if (un->pkt->pkt.user_id->flags.revoked)
2482
0
                    valid = _("revoked");
2483
0
                  else if (un->pkt->pkt.user_id->flags.expired)
2484
0
                    valid = _("expired");
2485
0
                  else
2486
        /* Since this is just informational, don't
2487
           actually ask the user to update any trust
2488
           information.  */
2489
0
                    valid = (trust_value_to_string
2490
0
                             (get_validity (c->ctrl, keyblock, mainpk,
2491
0
                                            un->pkt->pkt.user_id, NULL, 0)));
2492
0
                  log_printf (" [%s]\n",valid);
2493
0
                }
2494
0
              else
2495
0
                log_printf ("\n");
2496
0
            }
2497
0
  }
2498
2499
      /* For good signatures print notation data.  */
2500
0
      if (!rc)
2501
0
        {
2502
0
          if ((opt.verify_options & VERIFY_SHOW_POLICY_URLS))
2503
0
            show_policy_url (sig, 0, 1);
2504
0
          else
2505
0
            show_policy_url (sig, 0, 2);
2506
2507
0
          if ((opt.verify_options & VERIFY_SHOW_KEYSERVER_URLS))
2508
0
            show_keyserver_url (sig, 0, 1);
2509
0
          else
2510
0
            show_keyserver_url (sig, 0, 2);
2511
2512
0
          if ((opt.verify_options & VERIFY_SHOW_NOTATIONS))
2513
0
            show_notation
2514
0
              (sig, 0, 1,
2515
0
               (((opt.verify_options&VERIFY_SHOW_STD_NOTATIONS)?1:0)
2516
0
                + ((opt.verify_options&VERIFY_SHOW_USER_NOTATIONS)?2:0)
2517
0
                + ((opt.verify_options &VERIFY_SHOW_HIDDEN_NOTATIONS)? 4:0)
2518
0
                ));
2519
0
          else
2520
0
            show_notation (sig, 0, 2, 0);
2521
0
          print_matching_notations (sig);
2522
0
        }
2523
2524
      /* Fill PKSTRBUF with the algostring in case we later need it.  */
2525
0
      if (pk)
2526
0
        pubkey_string (pk, pkstrbuf, sizeof pkstrbuf);
2527
2528
      /* For good signatures print the VALIDSIG status line.  */
2529
0
      if (!rc && (is_status_enabled ()
2530
0
                  || opt.assert_signer_list
2531
0
                  || opt.assert_pubkey_algos) && pk)
2532
0
        {
2533
0
          char pkhex[MAX_FINGERPRINT_LEN*2+1];
2534
0
          char mainpkhex[MAX_FINGERPRINT_LEN*2+1];
2535
2536
0
          hexfingerprint (pk, pkhex, sizeof pkhex);
2537
0
          hexfingerprint (mainpk, mainpkhex, sizeof mainpkhex);
2538
2539
          /* TODO: Replace the reserved '0' in the field below with
2540
             bits for status flags (policy url, notation, etc.).  */
2541
0
          write_status_printf (STATUS_VALIDSIG,
2542
0
                               "%s %s %lu %lu %d 0 %d %d %02X %s",
2543
0
                               pkhex,
2544
0
                               strtimestamp (sig->timestamp),
2545
0
                               (ulong)sig->timestamp,
2546
0
                               (ulong)sig->expiredate,
2547
0
                               sig->version, sig->pubkey_algo,
2548
0
                               sig->digest_algo,
2549
0
                               sig->sig_class,
2550
0
                               mainpkhex);
2551
          /* Handle the --assert-signer option.  */
2552
0
          check_assert_signer_list (mainpkhex, pkhex);
2553
          /* Handle the --assert-pubkey-algo option.  */
2554
0
          check_assert_pubkey_algo (pkstrbuf, pkhex);
2555
0
  }
2556
2557
      /* Print compliance warning for Good signatures.  */
2558
0
      if (!rc && pk && !opt.quiet
2559
0
          && !gnupg_pk_is_compliant (opt.compliance, pk->pubkey_algo, 0,
2560
0
                                     pk->pkey, nbits_from_pk (pk), NULL))
2561
0
        {
2562
0
          log_info (_("WARNING: This key is not suitable for signing"
2563
0
                      " in %s mode\n"),
2564
0
                    gnupg_compliance_option_string (opt.compliance));
2565
0
        }
2566
2567
      /* For good signatures compute and print the trust information.
2568
         Note that in the Tofu trust model this may ask the user on
2569
         how to resolve a conflict.  */
2570
0
      if (!rc)
2571
0
        {
2572
0
          rc = check_signatures_trust (c->ctrl, keyblock, pk, sig);
2573
0
        }
2574
2575
      /* Print extra information about the signature.  */
2576
0
      if (sig->flags.expired)
2577
0
        {
2578
0
          log_info (_("Signature expired %s\n"), asctimestamp(sig->expiredate));
2579
0
          if (!rc)
2580
0
            rc = gpg_error (GPG_ERR_GENERAL); /* Need a better error here?  */
2581
0
        }
2582
0
      else if (sig->expiredate)
2583
0
        log_info (_("Signature expires %s\n"), asctimestamp(sig->expiredate));
2584
2585
0
      if (opt.verbose)
2586
0
        {
2587
0
          log_info (_("%s signature, digest algorithm %s%s%s\n"),
2588
0
                    sig->sig_class==0x00?_("binary"):
2589
0
                    sig->sig_class==0x01?_("textmode"):_("unknown"),
2590
0
                    gcry_md_algo_name (sig->digest_algo),
2591
0
                    *pkstrbuf?_(", key algorithm "):"", pkstrbuf);
2592
0
        }
2593
2594
      /* Print final warnings.  */
2595
0
      if (!rc && !c->signed_data.used)
2596
0
        {
2597
          /* Signature is basically good but we test whether the
2598
             deprecated command
2599
               gpg --verify FILE.sig
2600
             was used instead of
2601
               gpg --verify FILE.sig FILE
2602
             to verify a detached signature.  If we figure out that a
2603
             data file with a matching name exists, we print a warning.
2604
2605
             The problem is that the first form would also verify a
2606
             standard signature.  This behavior could be used to
2607
             create a made up .sig file for a tarball by creating a
2608
             standard signature from a valid detached signature packet
2609
             (for example from a signed git tag).  Then replace the
2610
             sig file on the FTP server along with a changed tarball.
2611
             Using the first form the verify command would correctly
2612
             verify the signature but don't even consider the tarball.  */
2613
0
          kbnode_t n;
2614
0
          char *dfile;
2615
2616
0
          dfile = get_matching_datafile (c->sigfilename);
2617
0
          if (dfile)
2618
0
            {
2619
0
              for (n = c->list; n; n = n->next)
2620
0
                if (n->pkt->pkttype != PKT_SIGNATURE)
2621
0
                  break;
2622
0
              if (n)
2623
0
                {
2624
                  /* Not only signature packets in the tree thus this
2625
                     is not a detached signature.  */
2626
0
                  log_info (_("WARNING: not a detached signature; "
2627
0
                              "file '%s' was NOT verified!\n"), dfile);
2628
0
                  assert_signer_true = 0;
2629
0
                }
2630
0
              xfree (dfile);
2631
0
            }
2632
0
        }
2633
2634
      /* Compute compliance with CO_DE_VS.  */
2635
0
      if (pk
2636
0
          && gnupg_gcrypt_is_compliant (CO_DE_VS)
2637
0
          && gnupg_pk_is_compliant (CO_DE_VS, pk->pubkey_algo, 0, pk->pkey,
2638
0
                                    nbits_from_pk (pk), NULL)
2639
0
          && gnupg_digest_is_compliant (CO_DE_VS, sig->digest_algo))
2640
0
        write_status_strings (STATUS_VERIFICATION_COMPLIANCE_MODE,
2641
0
                              gnupg_status_compliance_flag (CO_DE_VS),
2642
0
                              NULL);
2643
0
      else if (opt.flags.require_compliance
2644
0
               && opt.compliance == CO_DE_VS)
2645
0
        {
2646
0
          log_error (_("operation forced to fail due to"
2647
0
                       " unfulfilled compliance rules\n"));
2648
0
          if (!rc)
2649
0
            rc = gpg_error (GPG_ERR_FORBIDDEN);
2650
0
        }
2651
2652
2653
0
      free_public_key (pk);
2654
0
      pk = NULL;
2655
0
      release_kbnode( keyblock );
2656
0
      if (rc)
2657
0
        g10_errors_seen = 1;
2658
0
    }
2659
8.86k
  else  /* Error checking the signature. (neither Good nor Bad).  */
2660
8.86k
    {
2661
8.86k
      write_status_printf (STATUS_ERRSIG, "%08lX%08lX %d %d %02x %lu %d %s",
2662
8.86k
                           (ulong)sig->keyid[0], (ulong)sig->keyid[1],
2663
8.86k
                           sig->pubkey_algo, sig->digest_algo,
2664
8.86k
                           sig->sig_class, (ulong)sig->timestamp,
2665
8.86k
                           gpg_err_code (rc),
2666
8.86k
                           issuer_fpr? issuer_fpr:"-");
2667
8.86k
      if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY)
2668
545
        {
2669
545
          write_status_printf (STATUS_NO_PUBKEY, "%08lX%08lX",
2670
545
                               (ulong)sig->keyid[0], (ulong)sig->keyid[1]);
2671
545
  }
2672
8.86k
      if (gpg_err_code (rc) != GPG_ERR_NOT_PROCESSED)
2673
8.86k
        log_error (_("Can't check signature: %s\n"), gpg_strerror (rc));
2674
8.86k
    }
2675
2676
9.68k
 leave:
2677
9.68k
  free_public_key (pk);
2678
9.68k
  xfree (issuer_fpr);
2679
9.68k
  return rc;
2680
8.86k
}
2681
2682
2683
/*
2684
 * Process the tree which starts at node
2685
 */
2686
static void
2687
proc_tree (CTX c, kbnode_t node)
2688
87.7k
{
2689
87.7k
  kbnode_t n1;
2690
87.7k
  int rc;
2691
2692
87.7k
  if (opt.list_packets || opt.list_only)
2693
0
    return;
2694
2695
  /* We must skip our special plaintext marker packets here because
2696
     they may be the root packet.  These packets are only used in
2697
     additional checks and skipping them here doesn't matter.  */
2698
89.0k
  while (node
2699
33.4k
         && node->pkt->pkttype == PKT_GPG_CONTROL
2700
3.72k
          && node->pkt->pkt.gpg_control->control == CTRLPKT_PLAINTEXT_MARK)
2701
1.24k
    {
2702
1.24k
      node = node->next;
2703
1.24k
    }
2704
87.7k
  if (!node)
2705
55.5k
    return;
2706
2707
32.1k
  c->trustletter = ' ';
2708
32.1k
  if (node->pkt->pkttype == PKT_PUBLIC_KEY
2709
4.94k
      || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
2710
27.2k
    {
2711
27.2k
      merge_keys_and_selfsig (c->ctrl, node);
2712
27.2k
      list_node (c, node);
2713
27.2k
    }
2714
4.94k
  else if (node->pkt->pkttype == PKT_SECRET_KEY)
2715
1.30k
    {
2716
1.30k
      merge_keys_and_selfsig (c->ctrl, node);
2717
1.30k
      list_node (c, node);
2718
1.30k
    }
2719
3.64k
  else if (node->pkt->pkttype == PKT_ONEPASS_SIG)
2720
76
    {
2721
      /* Check all signatures.  */
2722
76
      if (!c->any.data)
2723
0
        {
2724
0
          int use_textmode = 0;
2725
2726
0
          free_md_filter_context (&c->mfx);
2727
          /* Prepare to create all requested message digests.  */
2728
0
          rc = gcry_md_open (&c->mfx.md, 0, 0);
2729
0
          if (rc)
2730
0
            goto hash_err;
2731
2732
          /* Fixme: why looking for the signature packet and not the
2733
             one-pass packet?  */
2734
0
          for (n1 = node; (n1 = find_next_kbnode (n1, PKT_SIGNATURE));)
2735
0
            gcry_md_enable (c->mfx.md, n1->pkt->pkt.signature->digest_algo);
2736
2737
0
          if (n1 && n1->pkt->pkt.onepass_sig->sig_class == 0x01)
2738
0
            use_textmode = 1;
2739
2740
          /* Ask for file and hash it. */
2741
0
          if (c->sigs_only)
2742
0
            {
2743
0
              if (c->signed_data.used
2744
0
                  && c->signed_data.data_fd != GNUPG_INVALID_FD)
2745
0
                rc = hash_datafile_by_fd (c->mfx.md, NULL,
2746
0
                                          c->signed_data.data_fd,
2747
0
                                          use_textmode);
2748
0
              else
2749
0
                rc = hash_datafiles (c->mfx.md, NULL,
2750
0
                                     c->signed_data.data_names,
2751
0
                                     c->sigfilename,
2752
0
                                     use_textmode);
2753
0
      }
2754
0
          else
2755
0
            {
2756
0
              rc = ask_for_detached_datafile (c->mfx.md, NULL,
2757
0
                                              iobuf_get_real_fname (c->iobuf),
2758
0
                                              use_textmode);
2759
0
      }
2760
2761
0
        hash_err:
2762
0
          if (rc)
2763
0
            {
2764
0
              log_error ("can't hash datafile: %s\n", gpg_strerror (rc));
2765
0
              return;
2766
0
      }
2767
0
  }
2768
76
      else if (c->signed_data.used)
2769
0
        {
2770
0
          log_error (_("not a detached signature\n"));
2771
0
          return;
2772
0
        }
2773
2774
721
      for (n1 = node; (n1 = find_next_kbnode (n1, PKT_SIGNATURE));)
2775
645
        if (check_sig_and_print (c, n1) && opt.batch
2776
0
            && !opt.flags.proc_all_sigs)
2777
0
          break;
2778
2779
76
    }
2780
3.57k
  else if (node->pkt->pkttype == PKT_GPG_CONTROL
2781
2.48k
           && node->pkt->pkt.gpg_control->control == CTRLPKT_CLEARSIGN_START)
2782
2.48k
    {
2783
      /* Clear text signed message.  */
2784
2.48k
      if (!c->any.data)
2785
270
        {
2786
270
          log_error ("cleartext signature without data\n");
2787
270
          return;
2788
270
        }
2789
2.21k
      else if (c->signed_data.used)
2790
0
        {
2791
0
          log_error (_("not a detached signature\n"));
2792
0
          return;
2793
0
        }
2794
2795
2.21k
      for (n1 = node; (n1 = find_next_kbnode (n1, PKT_SIGNATURE));)
2796
5
        if (check_sig_and_print (c, n1) && opt.batch
2797
0
            && !opt.flags.proc_all_sigs)
2798
0
          break;
2799
2.21k
    }
2800
1.09k
  else if (node->pkt->pkttype == PKT_SIGNATURE)
2801
1.06k
    {
2802
1.06k
      PKT_signature *sig = node->pkt->pkt.signature;
2803
1.06k
      int multiple_ok = 1;
2804
2805
1.06k
      n1 = find_next_kbnode (node, PKT_SIGNATURE);
2806
1.06k
      if (n1)
2807
573
        {
2808
573
          byte class = sig->sig_class;
2809
573
          byte hash  = sig->digest_algo;
2810
2811
8.94k
          for (; n1; (n1 = find_next_kbnode(n1, PKT_SIGNATURE)))
2812
8.58k
            {
2813
              /* We can't currently handle multiple signatures of
2814
               * different classes (we'd pretty much have to run a
2815
               * different hash context for each), but if they are all
2816
               * the same and it is detached signature, we make an
2817
               * exception.  Note that the old code also disallowed
2818
               * multiple signatures if the digest algorithms are
2819
               * different.  We softened this restriction only for
2820
               * detached signatures, to be on the safe side. */
2821
8.58k
              if (n1->pkt->pkt.signature->sig_class != class
2822
8.37k
                  || (c->any.data
2823
1.58k
                      && n1->pkt->pkt.signature->digest_algo != hash))
2824
215
                {
2825
215
                  multiple_ok = 0;
2826
215
                  log_info (_("WARNING: multiple signatures detected.  "
2827
215
                              "Only the first will be checked.\n"));
2828
215
                  break;
2829
215
                }
2830
8.58k
            }
2831
573
        }
2832
2833
1.06k
      if (sig->sig_class != 0x00 && sig->sig_class != 0x01)
2834
979
        {
2835
979
          log_info(_("standalone signature of class 0x%02x\n"), sig->sig_class);
2836
979
        }
2837
86
      else if (!c->any.data)
2838
64
        {
2839
          /* Detached signature */
2840
64
          free_md_filter_context (&c->mfx);
2841
64
          rc = gcry_md_open (&c->mfx.md, sig->digest_algo, 0);
2842
64
          if (rc)
2843
64
            goto detached_hash_err;
2844
2845
0
          if (multiple_ok)
2846
0
            {
2847
              /* If we have and want to handle multiple signatures we
2848
               * need to enable all hash algorithms for the context.  */
2849
0
              for (n1 = node; (n1 = find_next_kbnode (n1, PKT_SIGNATURE)); )
2850
0
                if (!openpgp_md_test_algo (n1->pkt->pkt.signature->digest_algo))
2851
0
                  gcry_md_enable (c->mfx.md,
2852
0
                                  map_md_openpgp_to_gcry
2853
0
                                  (n1->pkt->pkt.signature->digest_algo));
2854
0
            }
2855
2856
0
          if (RFC2440 || RFC4880)
2857
0
            ; /* Strict RFC mode.  */
2858
0
          else if (sig->digest_algo == DIGEST_ALGO_SHA1
2859
0
                   && sig->pubkey_algo == PUBKEY_ALGO_DSA
2860
0
                   && sig->sig_class == 0x01)
2861
0
            {
2862
              /* Enable a workaround for a pgp5 bug when the detached
2863
               * signature has been created in textmode.  Note that we
2864
               * do not implement this for multiple signatures with
2865
               * different hash algorithms. */
2866
0
              rc = gcry_md_open (&c->mfx.md2, sig->digest_algo, 0);
2867
0
              if (rc)
2868
0
                goto detached_hash_err;
2869
0
      }
2870
2871
          /* Here we used to have another hack to work around a pgp
2872
           * 2 bug: It worked by not using the textmode for detached
2873
           * signatures; this would let the first signature check
2874
           * (on md) fail but the second one (on md2), which adds an
2875
           * extra CR would then have produced the "correct" hash.
2876
           * This is very, very ugly hack but it may haved help in
2877
           * some cases (and break others).
2878
           *   c->mfx.md2? 0 :(sig->sig_class == 0x01)
2879
           */
2880
2881
0
          if (DBG_HASHING)
2882
0
            {
2883
0
              gcry_md_debug (c->mfx.md, "verify");
2884
0
              if (c->mfx.md2)
2885
0
                gcry_md_debug (c->mfx.md2, "verify2");
2886
0
            }
2887
2888
0
          if (c->sigs_only)
2889
0
            {
2890
0
              if (c->signed_data.used
2891
0
                  && c->signed_data.data_fd != GNUPG_INVALID_FD)
2892
0
                rc = hash_datafile_by_fd (c->mfx.md, c->mfx.md2,
2893
0
                                          c->signed_data.data_fd,
2894
0
                                          (sig->sig_class == 0x01));
2895
0
              else
2896
0
                rc = hash_datafiles (c->mfx.md, c->mfx.md2,
2897
0
                                     c->signed_data.data_names,
2898
0
                                     c->sigfilename,
2899
0
                                     (sig->sig_class == 0x01));
2900
0
      }
2901
0
          else
2902
0
            {
2903
0
              rc = ask_for_detached_datafile (c->mfx.md, c->mfx.md2,
2904
0
                                              iobuf_get_real_fname(c->iobuf),
2905
0
                                              (sig->sig_class == 0x01));
2906
0
      }
2907
2908
64
        detached_hash_err:
2909
64
          if (rc)
2910
64
            {
2911
64
              log_error ("can't hash datafile: %s\n", gpg_strerror (rc));
2912
64
              return;
2913
64
      }
2914
64
  }
2915
22
      else if (c->signed_data.used)
2916
0
        {
2917
0
          log_error (_("not a detached signature\n"));
2918
0
          return;
2919
0
        }
2920
22
      else if (!opt.quiet)
2921
22
        log_info (_("old style (PGP 2.x) signature\n"));
2922
2923
1.00k
      if (multiple_ok)
2924
789
        {
2925
9.61k
          for (n1 = node; n1; (n1 = find_next_kbnode(n1, PKT_SIGNATURE)))
2926
8.82k
      if (check_sig_and_print (c, n1) && opt.batch
2927
0
                && !opt.flags.proc_all_sigs)
2928
0
              break;
2929
789
        }
2930
212
      else
2931
212
        check_sig_and_print (c, node);
2932
2933
1.00k
    }
2934
26
  else
2935
26
    {
2936
26
      dump_kbnode (c->list);
2937
      log_error ("invalid root packet detected in proc_tree()\n");
2938
26
      dump_kbnode (node);
2939
26
    }
2940
32.1k
}