Coverage Report

Created: 2026-01-09 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gnupg/g10/build-packet.c
Line
Count
Source
1
/* build-packet.c - assemble packets and write them
2
 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3
 *               2006, 2010, 2011  Free Software Foundation, Inc.
4
 *
5
 * This file is part of GnuPG.
6
 *
7
 * GnuPG is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * GnuPG is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, see <https://www.gnu.org/licenses/>.
19
 */
20
21
#include <config.h>
22
#include <stdio.h>
23
#include <stdlib.h>
24
#include <string.h>
25
#include <ctype.h>
26
27
#include "gpg.h"
28
#include "../common/util.h"
29
#include "packet.h"
30
#include "../common/status.h"
31
#include "../common/iobuf.h"
32
#include "../common/i18n.h"
33
#include "options.h"
34
#include "../common/host2net.h"
35
36
static gpg_error_t do_ring_trust (iobuf_t out, PKT_ring_trust *rt);
37
static int do_user_id( IOBUF out, int ctb, PKT_user_id *uid );
38
static int do_key (iobuf_t out, int ctb, PKT_public_key *pk);
39
static int do_symkey_enc( IOBUF out, int ctb, PKT_symkey_enc *enc );
40
static int do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc );
41
static u32 calc_plaintext( PKT_plaintext *pt );
42
static int do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt );
43
static int do_encrypted( IOBUF out, int ctb, PKT_encrypted *ed );
44
static int do_encrypted_mdc( IOBUF out, int ctb, PKT_encrypted *ed );
45
static int do_encrypted_aead (iobuf_t out, int ctb, PKT_encrypted *ed);
46
static int do_compressed( IOBUF out, int ctb, PKT_compressed *cd );
47
static int do_signature( IOBUF out, int ctb, PKT_signature *sig );
48
static int do_onepass_sig( IOBUF out, int ctb, PKT_onepass_sig *ops );
49
50
static int calc_header_length( u32 len, int new_ctb );
51
static int write_16(IOBUF inp, u16 a);
52
static int write_32(IOBUF inp, u32 a);
53
static int write_header( IOBUF out, int ctb, u32 len );
54
static int write_sign_packet_header( IOBUF out, int ctb, u32 len );
55
static int write_header2( IOBUF out, int ctb, u32 len, int hdrlen );
56
static int write_new_header( IOBUF out, int ctb, u32 len, int hdrlen );
57
58
/* Returns 1 if CTB is a new format ctb and 0 if CTB is an old format
59
   ctb.  */
60
static int
61
ctb_new_format_p (int ctb)
62
20.3M
{
63
  /* Bit 7 must always be set.  */
64
20.3M
  log_assert ((ctb & (1 << 7)));
65
  /* Bit 6 indicates whether the packet is a new format packet.  */
66
20.3M
  return (ctb & (1 << 6));
67
20.3M
}
68
69
/* Extract the packet type from a CTB.  */
70
static int
71
ctb_pkttype (int ctb)
72
7.08M
{
73
7.08M
  if (ctb_new_format_p (ctb))
74
    /* Bits 0 through 5 are the packet type.  */
75
0
    return (ctb & ((1 << 6) - 1));
76
7.08M
  else
77
    /* Bits 2 through 5 are the packet type.  */
78
7.08M
    return (ctb & ((1 << 6) - 1)) >> 2;
79
7.08M
}
80
81
82
/* Build a keyblock image from KEYBLOCK.  Returns 0 on success and
83
 * only then stores a new iobuf object at R_IOBUF; the returned iobuf
84
 * can be access with the iobuf_get_temp_buffer and
85
 * iobuf_get_temp_length macros.  */
86
gpg_error_t
87
build_keyblock_image (kbnode_t keyblock, iobuf_t *r_iobuf)
88
3.01k
{
89
3.01k
  gpg_error_t err;
90
3.01k
  iobuf_t iobuf;
91
3.01k
  kbnode_t kbctx, node;
92
93
3.01k
  *r_iobuf = NULL;
94
95
3.01k
  iobuf = iobuf_temp ();
96
6.78M
  for (kbctx = NULL; (node = walk_kbnode (keyblock, &kbctx, 0));)
97
6.78M
    {
98
      /* Make sure to use only packets valid on a keyblock.  */
99
6.78M
      switch (node->pkt->pkttype)
100
6.78M
        {
101
3.01k
        case PKT_PUBLIC_KEY:
102
306k
        case PKT_PUBLIC_SUBKEY:
103
6.77M
        case PKT_SIGNATURE:
104
6.78M
        case PKT_USER_ID:
105
6.78M
        case PKT_ATTRIBUTE:
106
6.78M
        case PKT_RING_TRUST:
107
6.78M
          break;
108
0
        default:
109
0
          continue;
110
6.78M
        }
111
112
6.78M
      err = build_packet_and_meta (iobuf, node->pkt);
113
6.78M
      if (err)
114
0
        {
115
0
          iobuf_close (iobuf);
116
0
          return err;
117
0
        }
118
6.78M
    }
119
120
3.01k
  *r_iobuf = iobuf;
121
3.01k
  return 0;
122
3.01k
}
123
124
125
/* Build a packet and write it to the stream OUT.
126
 * Returns: 0 on success or on an error code.  */
127
int
128
build_packet (IOBUF out, PACKET *pkt)
129
6.78M
{
130
6.78M
  int rc = 0;
131
6.78M
  int new_ctb = 0;
132
6.78M
  int ctb, pkttype;
133
134
6.78M
  if (DBG_PACKET)
135
6.78M
    log_debug ("build_packet() type=%d\n", pkt->pkttype);
136
6.78M
  log_assert (pkt->pkt.generic);
137
138
6.78M
  switch ((pkttype = pkt->pkttype))
139
6.78M
    {
140
3.01k
    case PKT_PUBLIC_KEY:
141
3.01k
      if (pkt->pkt.public_key->seckey_info)
142
0
        pkttype = PKT_SECRET_KEY;
143
3.01k
      break;
144
303k
    case PKT_PUBLIC_SUBKEY:
145
303k
      if (pkt->pkt.public_key->seckey_info)
146
0
        pkttype = PKT_SECRET_SUBKEY;
147
303k
      break;
148
0
    case PKT_PLAINTEXT:
149
0
      new_ctb = pkt->pkt.plaintext->new_ctb;
150
0
      break;
151
0
    case PKT_ENCRYPTED:
152
0
    case PKT_ENCRYPTED_MDC:
153
0
    case PKT_ENCRYPTED_AEAD:
154
0
      new_ctb = pkt->pkt.encrypted->new_ctb;
155
0
      break;
156
0
    case PKT_COMPRESSED:
157
0
      new_ctb = pkt->pkt.compressed->new_ctb;
158
0
      break;
159
5.80k
    case PKT_USER_ID:
160
5.80k
      if (pkt->pkt.user_id->attrib_data)
161
0
        pkttype = PKT_ATTRIBUTE;
162
5.80k
      break;
163
6.47M
    default:
164
6.47M
      break;
165
6.78M
    }
166
167
6.78M
  if (new_ctb || pkttype > 15) /* new format */
168
0
    ctb = (0xc0 | (pkttype & 0x3f));
169
6.78M
  else
170
6.78M
    ctb = (0x80 | ((pkttype & 15)<<2));
171
6.78M
  switch (pkttype)
172
6.78M
    {
173
0
    case PKT_ATTRIBUTE:
174
5.80k
    case PKT_USER_ID:
175
5.80k
      rc = do_user_id (out, ctb, pkt->pkt.user_id);
176
5.80k
      break;
177
0
    case PKT_OLD_COMMENT:
178
0
    case PKT_COMMENT:
179
      /* Ignore these.  Theoretically, this will never be called as we
180
       * have no way to output comment packets any longer, but just in
181
       * case there is some code path that would end up outputting a
182
       * comment that was written before comments were dropped (in the
183
       * public key?) this is a no-op.  */
184
0
      break;
185
303k
    case PKT_PUBLIC_SUBKEY:
186
306k
    case PKT_PUBLIC_KEY:
187
306k
    case PKT_SECRET_SUBKEY:
188
306k
    case PKT_SECRET_KEY:
189
306k
      rc = do_key (out, ctb, pkt->pkt.public_key);
190
306k
      break;
191
0
    case PKT_SYMKEY_ENC:
192
0
      rc = do_symkey_enc (out, ctb, pkt->pkt.symkey_enc);
193
0
      break;
194
0
    case PKT_PUBKEY_ENC:
195
0
      rc = do_pubkey_enc (out, ctb, pkt->pkt.pubkey_enc);
196
0
      break;
197
0
    case PKT_PLAINTEXT:
198
0
      rc = do_plaintext (out, ctb, pkt->pkt.plaintext);
199
0
      break;
200
0
    case PKT_ENCRYPTED:
201
0
      rc = do_encrypted (out, ctb, pkt->pkt.encrypted);
202
0
      break;
203
0
    case PKT_ENCRYPTED_MDC:
204
0
      rc = do_encrypted_mdc (out, ctb, pkt->pkt.encrypted);
205
0
      break;
206
0
    case PKT_ENCRYPTED_AEAD:
207
0
      rc = do_encrypted_aead (out, ctb, pkt->pkt.encrypted);
208
0
      break;
209
0
    case PKT_COMPRESSED:
210
0
      rc = do_compressed (out, ctb, pkt->pkt.compressed);
211
0
      break;
212
6.47M
    case PKT_SIGNATURE:
213
6.47M
      rc = do_signature (out, ctb, pkt->pkt.signature);
214
6.47M
      break;
215
0
    case PKT_ONEPASS_SIG:
216
0
      rc = do_onepass_sig (out, ctb, pkt->pkt.onepass_sig);
217
0
      break;
218
0
    case PKT_RING_TRUST:
219
      /* Ignore it (only written by build_packet_and_meta)  */
220
0
      break;
221
0
    case PKT_MDC:
222
      /* We write it directly, so we should never see it here. */
223
0
    default:
224
0
      log_bug ("invalid packet type in build_packet()\n");
225
0
      break;
226
6.78M
    }
227
228
6.78M
  return rc;
229
6.78M
}
230
231
232
/* Build a packet and write it to the stream OUT.  This variant also
233
 * writes the meta data using ring trust packets.  Returns: 0 on
234
 * success or on error code.  */
235
gpg_error_t
236
build_packet_and_meta (iobuf_t out, PACKET *pkt)
237
6.78M
{
238
6.78M
  gpg_error_t err;
239
6.78M
  PKT_ring_trust rt = {0};
240
241
6.78M
  err = build_packet (out, pkt);
242
6.78M
  if (err)
243
0
    ;
244
6.78M
  else if (pkt->pkttype == PKT_SIGNATURE)
245
6.47M
    {
246
6.47M
      PKT_signature *sig = pkt->pkt.signature;
247
248
6.47M
      rt.subtype = RING_TRUST_SIG;
249
      /* Note: trustval is not yet used.  */
250
6.47M
      if (sig->flags.checked)
251
4.17M
        {
252
4.17M
          rt.sigcache = 1;
253
4.17M
          if (sig->flags.valid)
254
3.99M
            rt.sigcache |= 2;
255
4.17M
        }
256
6.47M
      err = do_ring_trust (out, &rt);
257
6.47M
    }
258
312k
  else if (pkt->pkttype == PKT_USER_ID
259
306k
           || pkt->pkttype == PKT_ATTRIBUTE)
260
5.80k
    {
261
5.80k
      PKT_user_id *uid = pkt->pkt.user_id;
262
263
5.80k
      rt.subtype = RING_TRUST_UID;
264
5.80k
      rt.keyorg = uid->keyorg;
265
5.80k
      rt.keyupdate = uid->keyupdate;
266
5.80k
      rt.url = uid->updateurl;
267
5.80k
      err = do_ring_trust (out, &rt);
268
5.80k
      rt.url = NULL;
269
5.80k
    }
270
306k
  else if (pkt->pkttype == PKT_PUBLIC_KEY
271
303k
           || pkt->pkttype == PKT_SECRET_KEY)
272
3.01k
    {
273
3.01k
      PKT_public_key *pk = pkt->pkt.public_key;
274
275
3.01k
      rt.subtype = RING_TRUST_KEY;
276
3.01k
      rt.keyorg = pk->keyorg;
277
3.01k
      rt.keyupdate = pk->keyupdate;
278
3.01k
      rt.url = pk->updateurl;
279
3.01k
      err = do_ring_trust (out, &rt);
280
3.01k
      rt.url = NULL;
281
282
3.01k
    }
283
284
6.78M
  return err;
285
6.78M
}
286
287
288
/*
289
 * Write the mpi A to OUT.  If R_NWRITTEN is not NULL the number of
290
 * bytes written is stored there.  To only get the number of bytes
291
 * which would be written NULL may be passed for OUT.
292
 */
293
gpg_error_t
294
gpg_mpi_write (iobuf_t out, gcry_mpi_t a, unsigned int *r_nwritten)
295
46.7k
{
296
46.7k
  gpg_error_t err;
297
46.7k
  unsigned int nwritten = 0;
298
299
46.7k
  if (gcry_mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE))
300
0
    {
301
0
      unsigned int nbits;
302
0
      const unsigned char *p;
303
0
      unsigned char lenhdr[2];
304
305
      /* gcry_log_debugmpi ("a", a); */
306
0
      p = gcry_mpi_get_opaque (a, &nbits);
307
0
      if (p)
308
0
        {
309
          /* First get nbits back to full bytes.  */
310
0
          nbits = ((nbits + 7) / 8) * 8;
311
          /* Then strip leading zero bits.  */
312
0
          for (; nbits >= 8 && !*p; p++, nbits -= 8)
313
0
            ;
314
0
          if (nbits >= 8 && !(*p & 0x80))
315
0
            if (--nbits >= 7 && !(*p & 0x40))
316
0
              if (--nbits >= 6 && !(*p & 0x20))
317
0
                if (--nbits >= 5 && !(*p & 0x10))
318
0
                  if (--nbits >= 4 && !(*p & 0x08))
319
0
                    if (--nbits >= 3 && !(*p & 0x04))
320
0
                      if (--nbits >= 2 && !(*p & 0x02))
321
0
                        if (--nbits >= 1 && !(*p & 0x01))
322
0
                          --nbits;
323
0
        }
324
      /* gcry_log_debug ("   [%u bit]\n", nbits); */
325
      /* gcry_log_debughex (" ", p, (nbits+7)/8); */
326
0
      lenhdr[0] = nbits >> 8;
327
0
      lenhdr[1] = nbits;
328
0
      err = out? iobuf_write (out, lenhdr, 2) : 0;
329
0
      if (!err)
330
0
        {
331
0
          nwritten += 2;
332
0
          if (p)
333
0
            {
334
0
              err = out? iobuf_write (out, p, (nbits+7)/8) : 0;
335
0
              if (!err)
336
0
                nwritten += (nbits+7)/8;
337
0
            }
338
0
        }
339
0
    }
340
46.7k
  else
341
46.7k
    {
342
46.7k
      char buffer[(MAX_EXTERN_MPI_BITS+7)/8+2]; /* 2 is for the mpi length. */
343
46.7k
      size_t nbytes;
344
345
46.7k
      nbytes = DIM(buffer);
346
46.7k
      err = gcry_mpi_print (GCRYMPI_FMT_PGP, buffer, nbytes, &nbytes, a );
347
46.7k
      if (!err)
348
46.7k
        {
349
46.7k
          err = out? iobuf_write (out, buffer, nbytes) : 0;
350
46.7k
          if (!err)
351
46.7k
            nwritten += nbytes;
352
46.7k
        }
353
0
      else if (gpg_err_code (err) == GPG_ERR_TOO_SHORT )
354
0
        {
355
0
          log_info ("mpi too large (%u bits)\n", gcry_mpi_get_nbits (a));
356
          /* The buffer was too small.  We better tell the user about
357
           * the MPI. */
358
0
          err = gpg_error (GPG_ERR_TOO_LARGE);
359
0
        }
360
46.7k
    }
361
362
46.7k
  if (r_nwritten)
363
0
    *r_nwritten = nwritten;
364
46.7k
  return err;
365
46.7k
}
366
367
368
/*
369
 * Write the mpi A to the output stream OUT as "SOS" (Strange Octet
370
 * String).  If R_NWRITTEN is not NULL the number of bytes written is
371
 * stored there.  To only get the number of bytes which would be
372
 * written, NULL may be passed for OUT.
373
 */
374
static gpg_error_t
375
sos_write (iobuf_t out, gcry_mpi_t a, unsigned int *r_nwritten)
376
13.0M
{
377
13.0M
  gpg_error_t err;
378
13.0M
  unsigned int nwritten = 0;
379
380
13.0M
  if (gcry_mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE))
381
13.0M
    {
382
13.0M
      unsigned int nbits;
383
13.0M
      const unsigned char *p;
384
13.0M
      unsigned char lenhdr[2];
385
386
      /* gcry_log_debugmpi ("a", a); */
387
13.0M
      p = gcry_mpi_get_opaque (a, &nbits);
388
      /* gcry_log_debug ("   [%u bit]\n", nbits); */
389
      /* gcry_log_debughex (" ", p, (nbits+7)/8); */
390
391
13.0M
      if (p && *p)
392
13.0M
        {
393
13.0M
          nbits = ((nbits + 7) / 8) * 8;
394
395
13.0M
          if (nbits >= 8 && !(*p & 0x80))
396
11.2M
            if (--nbits >= 7 && !(*p & 0x40))
397
2.42M
              if (--nbits >= 6 && !(*p & 0x20))
398
2.05M
                if (--nbits >= 5 && !(*p & 0x10))
399
168k
                  if (--nbits >= 4 && !(*p & 0x08))
400
86.9k
                    if (--nbits >= 3 && !(*p & 0x04))
401
86.3k
                      if (--nbits >= 2 && !(*p & 0x02))
402
70.9k
                        if (--nbits >= 1 && !(*p & 0x01))
403
0
                          --nbits;
404
13.0M
        }
405
406
13.0M
      lenhdr[0] = nbits >> 8;
407
13.0M
      lenhdr[1] = nbits;
408
13.0M
      err = out? iobuf_write (out, lenhdr, 2) : 0;
409
13.0M
      if (!err)
410
13.0M
        {
411
13.0M
          nwritten += 2;
412
13.0M
          if (p)
413
13.0M
            {
414
13.0M
              err = out? iobuf_write (out, p, (nbits+7)/8) : 0;
415
13.0M
              if (!err)
416
13.0M
                nwritten += (nbits+7)/8;
417
13.0M
            }
418
13.0M
        }
419
13.0M
    }
420
0
  else
421
0
    {
422
0
      log_info ("non-opaque MPI (%u bits) for SOS\n", gcry_mpi_get_nbits (a));
423
0
      err = gpg_error (GPG_ERR_INV_DATA);
424
0
    }
425
426
13.0M
  if (r_nwritten)
427
0
    *r_nwritten = nwritten;
428
13.0M
  return err;
429
13.0M
}
430
431
432
/*
433
 * Write an opaque string to the output stream without length info.
434
 */
435
gpg_error_t
436
gpg_mpi_write_opaque_nohdr (iobuf_t out, gcry_mpi_t a)
437
609k
{
438
609k
  int rc;
439
440
609k
  if (gcry_mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE))
441
609k
    {
442
609k
      unsigned int nbits;
443
609k
      const void *p;
444
445
609k
      p = gcry_mpi_get_opaque (a, &nbits);
446
609k
      rc = p ? iobuf_write (out, p, (nbits+7)/8) : 0;
447
609k
    }
448
0
  else
449
0
    rc = gpg_error (GPG_ERR_BAD_MPI);
450
451
609k
  return rc;
452
609k
}
453
454
455
/*
456
 * Write an opaque MPI string with a four-byte octet count to the
457
 * output stream.  If R_NWRITTEN is not NULL the number of written
458
 * bytes is stored there.  OUT may be NULL in which case only
459
 * R_NWRITTEN is updated and error checking is done.
460
 */
461
gpg_error_t
462
gpg_mpi_write_opaque_32 (iobuf_t out, gcry_mpi_t a, unsigned int *r_nwritten)
463
0
{
464
0
  gpg_error_t err;
465
466
0
  if (gcry_mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE))
467
0
    {
468
0
      unsigned int nbits, nbytes;
469
0
      const void *p;
470
471
0
      p = gcry_mpi_get_opaque (a, &nbits);
472
0
      nbytes = (nbits + 7)/8;
473
0
      if (out)
474
0
        {
475
0
          write_32 (out, nbytes);
476
0
          err = p ? iobuf_write (out, p, nbytes) : 0;
477
0
        }
478
0
      else
479
0
        err = 0;
480
0
      if (r_nwritten)
481
0
        *r_nwritten = 4 + (p? nbytes : 0);
482
0
    }
483
0
  else
484
0
    {
485
0
      err = gpg_error (GPG_ERR_BAD_MPI);
486
0
      if (r_nwritten)
487
0
        *r_nwritten = 0;
488
0
    }
489
490
0
  return err;
491
0
}
492
493
494
/* Calculate the length of a packet described by PKT.  */
495
u32
496
calc_packet_length( PACKET *pkt )
497
0
{
498
0
  u32 n = 0;
499
0
  int new_ctb = 0;
500
501
0
  log_assert (pkt->pkt.generic);
502
0
  switch (pkt->pkttype)
503
0
    {
504
0
    case PKT_PLAINTEXT:
505
0
      n = calc_plaintext (pkt->pkt.plaintext);
506
0
      new_ctb = pkt->pkt.plaintext->new_ctb;
507
0
      break;
508
0
    case PKT_ATTRIBUTE:
509
0
    case PKT_USER_ID:
510
0
    case PKT_COMMENT:
511
0
    case PKT_PUBLIC_KEY:
512
0
    case PKT_SECRET_KEY:
513
0
    case PKT_SYMKEY_ENC:
514
0
    case PKT_PUBKEY_ENC:
515
0
    case PKT_ENCRYPTED:
516
0
    case PKT_SIGNATURE:
517
0
    case PKT_ONEPASS_SIG:
518
0
    case PKT_RING_TRUST:
519
0
    case PKT_COMPRESSED:
520
0
    default:
521
0
      log_bug ("invalid packet type in calc_packet_length()");
522
0
      break;
523
0
    }
524
525
0
  n += calc_header_length (n, new_ctb);
526
0
  return n;
527
0
}
528
529
530
static gpg_error_t
531
write_fake_data (IOBUF out, gcry_mpi_t a)
532
75.6k
{
533
75.6k
  unsigned int n;
534
75.6k
  void *p;
535
536
75.6k
  if (!a)
537
90
    return 0;
538
75.5k
  if (!gcry_mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE))
539
0
    return 0; /* e.g. due to generating a key with wrong usage.  */
540
75.5k
  p = gcry_mpi_get_opaque ( a, &n);
541
75.5k
  if (!p)
542
74.7k
    return 0; /* For example due to a read error in
543
                 parse-packet.c:read_rest.  */
544
813
  return iobuf_write (out, p, (n+7)/8 );
545
75.5k
}
546
547
548
/* Write a ring trust meta packet.  */
549
static gpg_error_t
550
do_ring_trust (iobuf_t out, PKT_ring_trust *rt)
551
6.47M
{
552
6.47M
  unsigned int namelen = 0;
553
6.47M
  unsigned int pktlen = 6;
554
555
6.47M
  if (rt->subtype == RING_TRUST_KEY || rt->subtype == RING_TRUST_UID)
556
8.81k
    {
557
8.81k
      if (rt->url)
558
0
        namelen = strlen (rt->url);
559
8.81k
      pktlen += 1 + 4 + 1 + namelen;
560
8.81k
    }
561
562
6.47M
  write_header (out, (0x80 | ((PKT_RING_TRUST & 15)<<2)), pktlen);
563
6.47M
  iobuf_put (out, rt->trustval);
564
6.47M
  iobuf_put (out, rt->sigcache);
565
6.47M
  iobuf_write (out, "gpg", 3);
566
6.47M
  iobuf_put (out, rt->subtype);
567
6.47M
  if (rt->subtype == RING_TRUST_KEY || rt->subtype == RING_TRUST_UID)
568
8.81k
    {
569
8.81k
      iobuf_put (out, rt->keyorg);
570
8.81k
      write_32 (out, rt->keyupdate);
571
8.81k
      iobuf_put (out, namelen);
572
8.81k
      if (namelen)
573
0
        iobuf_write (out, rt->url, namelen);
574
8.81k
    }
575
576
6.47M
  return 0;
577
6.47M
}
578
579
580
/* Serialize the user id (RFC 4880, Section 5.11) or the user
581
 * attribute UID (Section 5.12) and write it to OUT.
582
 *
583
 * CTB is the serialization's CTB.  It specifies the header format and
584
 * the packet's type.  The header length must not be set.  */
585
static int
586
do_user_id( IOBUF out, int ctb, PKT_user_id *uid )
587
5.80k
{
588
5.80k
  int rc;
589
5.80k
  int hdrlen;
590
591
5.80k
  log_assert (ctb_pkttype (ctb) == PKT_USER_ID
592
5.80k
              || ctb_pkttype (ctb) == PKT_ATTRIBUTE);
593
594
  /* We need to take special care of a user ID with a length of 0:
595
   * Without forcing HDRLEN to 2 in this case an indeterminate length
596
   * packet would be written which is not allowed.  Note that we are
597
   * always called with a CTB indicating an old packet header format,
598
   * so that forcing a 2 octet header works.  We also check for the
599
   * maximum allowed packet size by the parser using an arbitrary
600
   * extra 10 bytes for header data. */
601
5.80k
  if (uid->attrib_data)
602
0
    {
603
0
      if (uid->attrib_len > MAX_ATTR_PACKET_LENGTH - 10)
604
0
        return gpg_error (GPG_ERR_TOO_LARGE);
605
0
      hdrlen = uid->attrib_len? 0 : 2;
606
0
      write_header2 (out, ctb, uid->attrib_len, hdrlen);
607
0
      rc = iobuf_write( out, uid->attrib_data, uid->attrib_len );
608
0
    }
609
5.80k
  else
610
5.80k
    {
611
5.80k
      if (uid->len > MAX_UID_PACKET_LENGTH - 10)
612
0
        return gpg_error (GPG_ERR_TOO_LARGE);
613
5.80k
      hdrlen = uid->len? 0 : 2;
614
5.80k
      write_header2 (out, ctb, uid->len, hdrlen);
615
5.80k
      rc = iobuf_write( out, uid->name, uid->len );
616
5.80k
    }
617
5.80k
  return rc;
618
5.80k
}
619
620
621
/* Serialize the key (RFC 4880, Section 5.5) described by PK and write
622
 * it to OUT.
623
 *
624
 * This function serializes both primary keys and subkeys with or
625
 * without a secret part.
626
 *
627
 * CTB is the serialization's CTB.  It specifies the header format and
628
 * the packet's type.  The header length must not be set.
629
 *
630
 * PK->VERSION specifies the serialization format.  A value of 0 means
631
 * to use the default version.  Currently, only version 4 packets are
632
 * supported.
633
 */
634
static int
635
do_key (iobuf_t out, int ctb, PKT_public_key *pk)
636
306k
{
637
306k
  gpg_error_t err = 0;
638
306k
  iobuf_t a;
639
306k
  int i, nskey, npkey;
640
306k
  u32 pkbytes = 0;
641
306k
  int is_v5;
642
643
306k
  log_assert (pk->version == 0 || pk->version == 4 || pk->version == 5);
644
306k
  log_assert (ctb_pkttype (ctb) == PKT_PUBLIC_KEY
645
306k
              || ctb_pkttype (ctb) == PKT_PUBLIC_SUBKEY
646
306k
              || ctb_pkttype (ctb) == PKT_SECRET_KEY
647
306k
              || ctb_pkttype (ctb) == PKT_SECRET_SUBKEY);
648
649
  /* The length of the body is stored in the packet's header, which
650
   * occurs before the body.  Unfortunately, we don't know the length
651
   * of the packet's body until we've written all of the data!  To
652
   * work around this, we first write the data into this temporary
653
   * buffer, then generate the header, and finally copy the content
654
   * of this buffer to OUT.  */
655
306k
  a = iobuf_temp();
656
657
  /* Note that the Version number, Timestamp, Algo, and the v5 Key
658
   * material count are written at the end of the function. */
659
660
306k
  is_v5 = (pk->version == 5);
661
662
  /* Get number of secret and public parameters.  They are held in one
663
     array: the public ones followed by the secret ones.  */
664
306k
  nskey = pubkey_get_nskey (pk->pubkey_algo);
665
306k
  npkey = pubkey_get_npkey (pk->pubkey_algo);
666
667
  /* If we don't have any public parameters - which is for example the
668
     case if we don't know the algorithm used - the parameters are
669
     stored as one blob in a faked (opaque) MPI. */
670
306k
  if (!npkey)
671
0
    {
672
0
      write_fake_data (a, pk->pkey[0]);
673
0
      goto leave;
674
0
    }
675
306k
  log_assert (npkey < nskey);
676
677
1.22M
  for (i=0; i < npkey; i++ )
678
916k
    {
679
916k
      if (   (pk->pubkey_algo == PUBKEY_ALGO_ECDSA && (i == 0))
680
916k
          || (pk->pubkey_algo == PUBKEY_ALGO_EDDSA && (i == 0))
681
914k
          || (pk->pubkey_algo == PUBKEY_ALGO_ECDH  && (i == 0 || i == 2))
682
306k
          || (pk->pubkey_algo == PUBKEY_ALGO_KYBER && (i == 0)))
683
609k
        err = gpg_mpi_write_opaque_nohdr (a, pk->pkey[i]);
684
306k
      else if (pk->pubkey_algo == PUBKEY_ALGO_KYBER && i == 2)
685
0
        {
686
          /* Write a four-octet count prefixed Kyber public key.  */
687
0
          err = gpg_mpi_write_opaque_32 (a, pk->pkey[2], NULL);
688
0
        }
689
306k
      else if (pk->pubkey_algo == PUBKEY_ALGO_ECDSA
690
306k
               || pk->pubkey_algo == PUBKEY_ALGO_EDDSA
691
304k
               || pk->pubkey_algo == PUBKEY_ALGO_ECDH)
692
306k
        err = sos_write (a, pk->pkey[i], NULL);
693
575
      else
694
575
        err = gpg_mpi_write (a, pk->pkey[i], NULL);
695
916k
      if (err)
696
0
        goto leave;
697
916k
    }
698
699
  /* Record the length of the public key part.  */
700
306k
  pkbytes = iobuf_get_temp_length (a);
701
702
306k
  if (pk->seckey_info)
703
0
    {
704
      /* This is a secret key packet.  */
705
0
      struct seckey_info *ski = pk->seckey_info;
706
707
      /* Build the header for protected (encrypted) secret parameters.  */
708
0
      if (ski->is_protected)
709
0
        {
710
0
          iobuf_put (a, ski->sha1chk? 0xfe : 0xff); /* S2k usage.  */
711
0
          if (is_v5)
712
0
            {
713
              /* For a v5 key determine the count of the following
714
               * key-protection material and write it.  */
715
0
              int count = 1;  /* Pubkey algo octet. */
716
0
              if (ski->s2k.mode >= 1000)
717
0
                count += 6;   /* GNU specific mode descriptor.  */
718
0
              else
719
0
                count += 2;   /* Mode and hash algo.  */
720
0
              if (ski->s2k.mode == 1 || ski->s2k.mode == 3)
721
0
                count += 8;   /* Salt.  */
722
0
              if (ski->s2k.mode == 3)
723
0
                count++;      /* S2K.COUNT */
724
0
              if (ski->s2k.mode != 1001 && ski->s2k.mode != 1002
725
0
                   && ski->s2k.mode != 1003)
726
0
                count += ski->ivlen;
727
728
0
              iobuf_put (a, count);
729
0
            }
730
0
          iobuf_put (a, ski->algo);  /* Pubkey algo octet.  */
731
0
          if (ski->s2k.mode >= 1000)
732
0
            {
733
              /* These modes are not possible in OpenPGP, we use them
734
                 to implement our extensions, 101 can be viewed as a
735
                 private/experimental extension (this is not specified
736
                 in rfc2440 but the same scheme is used for all other
737
                 algorithm identifiers). */
738
0
              iobuf_put (a, 101);
739
0
              iobuf_put (a, ski->s2k.hash_algo);
740
0
              iobuf_write (a, "GNU", 3 );
741
0
              iobuf_put (a, ski->s2k.mode - 1000);
742
0
            }
743
0
          else
744
0
            {
745
0
              iobuf_put (a, ski->s2k.mode);
746
0
              iobuf_put (a, ski->s2k.hash_algo);
747
0
            }
748
749
0
          if (ski->s2k.mode == 1 || ski->s2k.mode == 3)
750
0
            iobuf_write (a, ski->s2k.salt, 8);
751
752
0
          if (ski->s2k.mode == 3)
753
0
            iobuf_put (a, ski->s2k.count);
754
755
          /* For our special modes 1001..1003 we do not need an IV. */
756
0
          if (ski->s2k.mode != 1001 && ski->s2k.mode != 1002
757
0
               && ski->s2k.mode != 1003)
758
0
            iobuf_write (a, ski->iv, ski->ivlen);
759
760
0
        }
761
0
      else /* Not protected. */
762
0
        {
763
0
          iobuf_put (a, 0 );  /* S2K usage = not protected.  */
764
0
          if (is_v5)
765
0
            iobuf_put (a, 0); /* Zero octets of key-protection
766
                               * material follows.  */
767
0
        }
768
769
0
      if (ski->s2k.mode == 1001)
770
0
        {
771
          /* GnuPG extension - don't write a secret key at all. */
772
0
          if (is_v5)
773
0
            write_32 (a, 0); /* Zero octets of key material.  */
774
0
        }
775
0
      else if (ski->s2k.mode == 1002)
776
0
        {
777
          /* GnuPG extension - divert to OpenPGP smartcard. */
778
0
          if (is_v5)
779
0
            write_32 (a, 1 + ski->ivlen);
780
          /* Length of the serial number or 0 for no serial number. */
781
0
          iobuf_put (a, ski->ivlen );
782
          /* The serial number gets stored in the IV field.  */
783
0
          iobuf_write (a, ski->iv, ski->ivlen);
784
0
        }
785
0
      else if (ski->s2k.mode == 1003)
786
0
        {
787
          /* GnuPG extension - Store raw s-expression. */
788
0
          byte *p;
789
0
          unsigned int ndatabits;
790
791
0
          log_assert (gcry_mpi_get_flag (pk->pkey[npkey], GCRYMPI_FLAG_OPAQUE));
792
793
0
          p = gcry_mpi_get_opaque (pk->pkey[npkey], &ndatabits);
794
          /* For v5 keys we first write the number of octets of the
795
           * following key material.  */
796
0
          if (is_v5)
797
0
            write_32 (a, p? (ndatabits+7)/8 : 0);
798
0
          if (p)
799
0
            iobuf_write (a, p, (ndatabits+7)/8 );
800
0
        }
801
0
      else if (ski->is_protected)
802
0
        {
803
          /* The secret key is protected - write it out as it is.  */
804
0
          byte *p;
805
0
          unsigned int ndatabits;
806
807
0
          log_assert (gcry_mpi_get_flag (pk->pkey[npkey], GCRYMPI_FLAG_OPAQUE));
808
0
          p = gcry_mpi_get_opaque (pk->pkey[npkey], &ndatabits);
809
          /* For v5 keys we first write the number of octets of the
810
           * following encrypted key material.  */
811
0
          if (is_v5)
812
0
            write_32 (a, p? (ndatabits+7)/8 : 0);
813
0
          if (p)
814
0
            iobuf_write (a, p, (ndatabits+7)/8 );
815
0
        }
816
0
      else
817
0
        {
818
          /* Non-protected key. */
819
0
          if (is_v5)
820
0
            {
821
0
              unsigned int skbytes = 0;
822
0
              unsigned int n;
823
0
              int j;
824
825
0
              for (j=i; j < nskey; j++ )
826
0
                {
827
0
                  if (pk->pubkey_algo == PUBKEY_ALGO_KYBER && j == 4)
828
0
                    {
829
0
                      if ((err=gpg_mpi_write_opaque_32 (NULL,pk->pkey[j], &n)))
830
0
                        goto leave;
831
0
                    }
832
0
                  else if (pk->pubkey_algo == PUBKEY_ALGO_ECDSA
833
0
                           || pk->pubkey_algo == PUBKEY_ALGO_EDDSA
834
0
                           || pk->pubkey_algo == PUBKEY_ALGO_ECDH
835
0
                           || pk->pubkey_algo == PUBKEY_ALGO_KYBER)
836
0
                    {
837
0
                      if ((err = sos_write (NULL, pk->pkey[j], &n)))
838
0
                        goto leave;
839
0
                    }
840
0
                  else
841
0
                    {
842
0
                      if ( (err = gpg_mpi_write (a, pk->pkey[i], NULL)))
843
0
                        goto leave;
844
0
                    }
845
0
                  skbytes += n;
846
0
                }
847
848
0
              write_32 (a, skbytes);
849
0
            }
850
851
0
          for ( ; i < nskey; i++ )
852
0
            {
853
0
              if (pk->pubkey_algo == PUBKEY_ALGO_KYBER && i == 4)
854
0
                {
855
0
                  err = gpg_mpi_write_opaque_32 (a, pk->pkey[i], NULL);
856
0
                  if (err)
857
0
                    goto leave;
858
0
                }
859
0
              else if (pk->pubkey_algo == PUBKEY_ALGO_ECDSA
860
0
                       || pk->pubkey_algo == PUBKEY_ALGO_EDDSA
861
0
                       || pk->pubkey_algo == PUBKEY_ALGO_ECDH)
862
0
                {
863
0
                  if ((err = sos_write (a, pk->pkey[i], NULL)))
864
0
                    goto leave;
865
0
                }
866
0
              else
867
0
                {
868
0
                  if ((err = gpg_mpi_write (a, pk->pkey[i], NULL)))
869
0
                    goto leave;
870
0
                }
871
0
            }
872
873
0
          write_16 (a, ski->csum );
874
0
        }
875
0
    }
876
877
306k
 leave:
878
306k
  if (!err)
879
306k
    {
880
      /* Build the header of the packet - which we must do after
881
       * writing all the other stuff, so that we know the length of
882
       * the packet */
883
306k
      u32 len = iobuf_get_temp_length (a);
884
306k
      len += 1; /* version number  */
885
306k
      len += 4; /* timestamp  */
886
306k
      len += 1; /* algo  */
887
306k
      if (is_v5)
888
2
        len += 4; /* public key material count  */
889
890
306k
      write_header2 (out, ctb, len, 0);
891
       /* And finally write it out to the real stream. */
892
306k
      iobuf_put (out, pk->version? pk->version : 4); /* version number  */
893
306k
      write_32 (out, pk->timestamp );
894
306k
      iobuf_put (out, pk->pubkey_algo);  /* algo */
895
306k
      if (is_v5)
896
2
        write_32 (out, pkbytes);        /* public key material count  */
897
306k
      err = iobuf_write_temp (out, a);  /* pub and sec key material */
898
306k
    }
899
900
306k
  iobuf_close (a); /* Close the temporary buffer */
901
306k
  return err;
902
306k
}
903
904
905
/* Serialize the symmetric-key encrypted session key packet (RFC 4880,
906
 * 5.3) described by ENC and write it to OUT.
907
 *
908
 * CTB is the serialization's CTB.  It specifies the header format and
909
 * the packet's type.  The header length must not be set.  */
910
static int
911
do_symkey_enc( IOBUF out, int ctb, PKT_symkey_enc *enc )
912
0
{
913
0
  int rc = 0;
914
0
  IOBUF a = iobuf_temp();
915
916
0
  log_assert (ctb_pkttype (ctb) == PKT_SYMKEY_ENC);
917
0
  log_assert (enc->version == 4 || enc->version == 5);
918
919
0
  switch (enc->s2k.mode)
920
0
    {
921
0
    case 0: /* Simple S2K.  */
922
0
    case 1: /* Salted S2K.  */
923
0
    case 3: /* Iterated and salted S2K.  */
924
0
      break; /* Reasonable values.  */
925
926
0
    default:
927
0
      log_bug ("do_symkey_enc: s2k=%d\n", enc->s2k.mode);
928
0
    }
929
0
  iobuf_put (a, enc->version);
930
0
  iobuf_put (a, enc->cipher_algo);
931
0
  if (enc->version == 5)
932
0
    iobuf_put (a, enc->aead_algo);
933
0
  iobuf_put (a, enc->s2k.mode);
934
0
  iobuf_put (a, enc->s2k.hash_algo);
935
0
  if (enc->s2k.mode == 1 || enc->s2k.mode == 3)
936
0
    {
937
0
      iobuf_write (a, enc->s2k.salt, 8);
938
0
      if (enc->s2k.mode == 3)
939
0
        iobuf_put (a, enc->s2k.count);
940
0
    }
941
0
  if (enc->seskeylen)
942
0
    iobuf_write (a, enc->seskey, enc->seskeylen);
943
944
0
  write_header (out, ctb, iobuf_get_temp_length(a));
945
0
  rc = iobuf_write_temp (out, a);
946
947
0
  iobuf_close (a);
948
0
  return rc;
949
0
}
950
951
952
/* Serialize the public-key encrypted session key packet (RFC 4880,
953
   5.1) described by ENC and write it to OUT.
954
955
   CTB is the serialization's CTB.  It specifies the header format and
956
   the packet's type.  The header length must not be set.  */
957
static int
958
do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc )
959
0
{
960
0
  int rc = 0;
961
0
  int n, i;
962
0
  IOBUF a = iobuf_temp();
963
964
0
  log_assert (ctb_pkttype (ctb) == PKT_PUBKEY_ENC);
965
966
0
  iobuf_put (a, 3); /* Version.  */
967
968
0
  if ( enc->throw_keyid )
969
0
    {
970
0
      write_32(a, 0 );  /* Don't tell Eve who can decrypt the message.  */
971
0
      write_32(a, 0 );
972
0
    }
973
0
  else
974
0
    {
975
0
      write_32(a, enc->keyid[0] );
976
0
      write_32(a, enc->keyid[1] );
977
0
    }
978
0
  iobuf_put(a,enc->pubkey_algo );
979
0
  n = pubkey_get_nenc( enc->pubkey_algo );
980
0
  if ( !n )
981
0
    write_fake_data( a, enc->data[0] );
982
983
0
  for (i=0; i < n && !rc ; i++ )
984
0
    {
985
      /* For Kyber we need to insert the algo before the final data
986
       * element because it is not stored in the data array.  */
987
0
      if (enc->pubkey_algo == PUBKEY_ALGO_KYBER && i == 2)
988
0
        iobuf_put (a, enc->seskey_algo);
989
990
0
      if (i == 1 && enc->pubkey_algo == PUBKEY_ALGO_ECDH)
991
0
        rc = gpg_mpi_write_opaque_nohdr (a, enc->data[i]);
992
0
      else if (i == 1 && enc->pubkey_algo == PUBKEY_ALGO_KYBER)
993
0
        rc = gpg_mpi_write_opaque_32 (a, enc->data[i], NULL);
994
0
      else if (i == 2 && enc->pubkey_algo == PUBKEY_ALGO_KYBER)
995
0
        rc = gpg_mpi_write_opaque_nohdr (a, enc->data[i]);
996
0
      else if (enc->pubkey_algo == PUBKEY_ALGO_ECDH
997
0
               || enc->pubkey_algo == PUBKEY_ALGO_KYBER)
998
0
        rc = sos_write (a, enc->data[i], NULL);
999
0
      else
1000
0
        rc = gpg_mpi_write (a, enc->data[i], NULL);
1001
0
    }
1002
1003
0
  if (!rc)
1004
0
    {
1005
0
      write_header (out, ctb, iobuf_get_temp_length(a) );
1006
0
      rc = iobuf_write_temp (out, a);
1007
0
    }
1008
0
  iobuf_close(a);
1009
0
  return rc;
1010
0
}
1011
1012
1013
/* Calculate the length of the serialized plaintext packet PT (RFC
1014
   4480, Section 5.9).  */
1015
static u32
1016
calc_plaintext( PKT_plaintext *pt )
1017
0
{
1018
  /* Truncate namelen to the maximum 255 characters.  Note this means
1019
     that a function that calls build_packet with an illegal literal
1020
     packet will get it back legalized. */
1021
1022
0
  if(pt->namelen>255)
1023
0
    pt->namelen=255;
1024
1025
0
  return pt->len? (1 + 1 + pt->namelen + 4 + pt->len) : 0;
1026
0
}
1027
1028
/* Serialize the plaintext packet (RFC 4880, 5.9) described by PT and
1029
   write it to OUT.
1030
1031
   The body of the message is stored in PT->BUF.  The amount of data
1032
   to write is PT->LEN.  (PT->BUF should be configured to return EOF
1033
   after this much data has been read.)  If PT->LEN is 0 and CTB
1034
   indicates that this is a new format packet, then partial block mode
1035
   is assumed to have been enabled on OUT.  On success, partial block
1036
   mode is disabled.
1037
1038
   If PT->BUF is NULL, the caller must write out the data.  In
1039
   this case, if PT->LEN was 0, then partial body length mode was
1040
   enabled and the caller must disable it by calling
1041
   iobuf_set_partial_body_length_mode (out, 0).  */
1042
static int
1043
do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
1044
0
{
1045
0
    int rc = 0;
1046
0
    size_t nbytes;
1047
1048
0
    log_assert (ctb_pkttype (ctb) == PKT_PLAINTEXT);
1049
1050
0
    write_header(out, ctb, calc_plaintext( pt ) );
1051
0
    log_assert (pt->mode == 'b' || pt->mode == 't' || pt->mode == 'u'
1052
0
                || pt->mode == 'm'
1053
0
                || pt->mode == 'l' || pt->mode == '1');
1054
0
    iobuf_put(out, pt->mode );
1055
0
    iobuf_put(out, pt->namelen );
1056
0
    iobuf_write (out, pt->name, pt->namelen);
1057
0
    rc = write_32(out, pt->timestamp );
1058
0
    if (rc)
1059
0
      return rc;
1060
1061
0
    if (pt->buf)
1062
0
      {
1063
0
        nbytes = iobuf_copy (out, pt->buf);
1064
0
        if (nbytes == (size_t)(-1)
1065
0
            && (iobuf_error (out) || iobuf_error (pt->buf)))
1066
0
            return iobuf_error (out)? iobuf_error (out):iobuf_error (pt->buf);
1067
0
        else if (nbytes != (size_t)(-1) && iobuf_error (pt->buf))
1068
0
          rc = iobuf_error (pt->buf);  /* Read error.  */
1069
0
        else
1070
0
          {
1071
            /* Always get the iobuf error to catch write errors
1072
             * because iobuf_copy returns (-1) only if there was a
1073
             * errors in the output stream when entering that
1074
             * function.  */
1075
0
            rc = iobuf_error (out);
1076
0
          }
1077
0
        if(ctb_new_format_p (ctb) && !pt->len)
1078
          /* Turn off partial body length mode.  */
1079
0
          iobuf_set_partial_body_length_mode (out, 0);
1080
0
        if (pt->len && nbytes != pt->len)
1081
0
          {
1082
0
            log_error ("do_plaintext(): wrote %lu bytes"
1083
0
                       " but expected %lu bytes\n",
1084
0
                       (ulong)nbytes, (ulong)pt->len );
1085
0
            if (!rc) /* Just in case no error was set  */
1086
0
              rc = gpg_error (GPG_ERR_EIO);
1087
0
          }
1088
0
      }
1089
1090
0
    return rc;
1091
0
}
1092
1093
1094
1095
/* Serialize the symmetrically encrypted data packet (RFC 4880,
1096
   Section 5.7) described by ED and write it to OUT.
1097
1098
   Note: this only writes the packets header!  The call must then
1099
   follow up and write the initial random data and the body to OUT.
1100
   (If you use the encryption iobuf filter (cipher_filter), then this
1101
   is done automatically.)  */
1102
static int
1103
do_encrypted( IOBUF out, int ctb, PKT_encrypted *ed )
1104
0
{
1105
0
    int rc = 0;
1106
0
    u32 n;
1107
1108
0
    log_assert (! ed->mdc_method);
1109
0
    log_assert (ctb_pkttype (ctb) == PKT_ENCRYPTED);
1110
1111
0
    n = ed->len ? (ed->len + ed->extralen) : 0;
1112
0
    write_header(out, ctb, n );
1113
1114
    /* This is all. The caller has to write the real data */
1115
1116
0
    return rc;
1117
0
}
1118
1119
/* Serialize the symmetrically encrypted integrity protected data
1120
   packet (RFC 4880, Section 5.13) described by ED and write it to
1121
   OUT.
1122
1123
   Note: this only writes the packet's header!  The caller must then
1124
   follow up and write the initial random data, the body and the MDC
1125
   packet to OUT.  (If you use the encryption iobuf filter
1126
   (cipher_filter), then this is done automatically.)  */
1127
static int
1128
do_encrypted_mdc( IOBUF out, int ctb, PKT_encrypted *ed )
1129
0
{
1130
0
    int rc = 0;
1131
0
    u32 n;
1132
1133
0
    log_assert (ed->mdc_method);
1134
0
    log_assert (ctb_pkttype (ctb) == PKT_ENCRYPTED_MDC);
1135
1136
    /* Take version number and the following MDC packet in account. */
1137
0
    n = ed->len ? (ed->len + ed->extralen + 1 + 22) : 0;
1138
0
    write_header(out, ctb, n );
1139
0
    iobuf_put(out, 1 );  /* version */
1140
1141
    /* This is all. The caller has to write the real data */
1142
1143
0
    return rc;
1144
0
}
1145
1146
1147
/* Serialize the symmetrically AEAD encrypted data packet
1148
 * (rfc4880bis-03, Section 5.16) described by ED and write it to OUT.
1149
 *
1150
 * Note: this only writes only packet's header.  The caller must then
1151
 * follow up and write the actual encrypted data.  This should be done
1152
 * by pushing the the cipher_filter_aead.  */
1153
static int
1154
do_encrypted_aead (iobuf_t out, int ctb, PKT_encrypted *ed)
1155
0
{
1156
0
  u32 n;
1157
1158
0
  log_assert (ctb_pkttype (ctb) == PKT_ENCRYPTED_AEAD);
1159
1160
0
  n = ed->len ? (ed->len + ed->extralen + 4) : 0;
1161
0
  write_header (out, ctb, n );
1162
0
  iobuf_writebyte (out, 1); /* Version.  */
1163
0
  iobuf_writebyte (out, ed->cipher_algo);
1164
0
  iobuf_writebyte (out, ed->aead_algo);
1165
0
  iobuf_writebyte (out, ed->chunkbyte);
1166
1167
  /* This is all. The caller has to write the encrypted data */
1168
1169
0
  return 0;
1170
0
}
1171
1172
1173
/* Serialize the compressed packet (RFC 4880, Section 5.6) described
1174
   by CD and write it to OUT.
1175
1176
   Note: this only writes the packet's header!  The caller must then
1177
   follow up and write the body to OUT.  */
1178
static int
1179
do_compressed( IOBUF out, int ctb, PKT_compressed *cd )
1180
0
{
1181
0
    int rc = 0;
1182
1183
0
    log_assert (ctb_pkttype (ctb) == PKT_COMPRESSED);
1184
1185
    /* We must use the old convention and don't use blockmode for the
1186
       sake of PGP 2 compatibility.  However if the new_ctb flag was
1187
       set, CTB is already formatted as new style and write_header2
1188
       does create a partial length encoding using new the new
1189
       style. */
1190
0
    write_header2(out, ctb, 0, 0);
1191
0
    iobuf_put(out, cd->algorithm );
1192
1193
    /* This is all. The caller has to write the real data */
1194
1195
0
    return rc;
1196
0
}
1197
1198
1199
/****************
1200
 * Delete all subpackets of type REQTYPE and return a bool whether a packet
1201
 * was deleted.
1202
 */
1203
int
1204
delete_sig_subpkt (subpktarea_t *area, sigsubpkttype_t reqtype )
1205
0
{
1206
0
    int buflen;
1207
0
    sigsubpkttype_t type;
1208
0
    byte *buffer, *bufstart;
1209
0
    size_t n;
1210
0
    size_t unused = 0;
1211
0
    int okay = 0;
1212
1213
0
    if( !area )
1214
0
  return 0;
1215
0
    buflen = area->len;
1216
0
    buffer = area->data;
1217
0
    for(;;) {
1218
0
  if( !buflen ) {
1219
0
            okay = 1;
1220
0
            break;
1221
0
        }
1222
0
  bufstart = buffer;
1223
0
  n = *buffer++; buflen--;
1224
0
  if( n == 255 ) {
1225
0
      if( buflen < 4 )
1226
0
    break;
1227
0
      n = buf32_to_size_t (buffer);
1228
0
      buffer += 4;
1229
0
      buflen -= 4;
1230
0
  }
1231
0
  else if( n >= 192 ) {
1232
0
      if( buflen < 2 )
1233
0
    break;
1234
0
      n = (( n - 192 ) << 8) + *buffer + 192;
1235
0
      buffer++;
1236
0
      buflen--;
1237
0
  }
1238
0
  if( buflen < n )
1239
0
      break;
1240
1241
0
  type = *buffer & 0x7f;
1242
0
  if( type == reqtype ) {
1243
0
      buffer++;
1244
0
            buflen--;
1245
0
      n--;
1246
0
      if( n > buflen )
1247
0
    break;
1248
0
            buffer += n; /* point to next subpkt */
1249
0
            buflen -= n;
1250
0
            memmove (bufstart, buffer, buflen); /* shift */
1251
0
            unused +=  buffer - bufstart;
1252
0
            buffer = bufstart;
1253
0
  }
1254
0
        else {
1255
0
            buffer += n; buflen -=n;
1256
0
        }
1257
0
    }
1258
1259
0
    if (!okay)
1260
0
        log_error ("delete_subpkt: buffer shorter than subpacket\n");
1261
0
    log_assert (unused <= area->len);
1262
0
    area->len -= unused;
1263
0
    return !!unused;
1264
0
}
1265
1266
1267
/****************
1268
 * Create or update a signature subpacket for SIG of TYPE.  This
1269
 * functions knows where to put the data (hashed or unhashed).  The
1270
 * function may move data from the unhashed part to the hashed one.
1271
 * Note: All pointers into sig->[un]hashed (e.g. returned by
1272
 * parse_sig_subpkt) are not valid after a call to this function.  The
1273
 * data to put into the subpaket should be in a buffer with a length
1274
 * of buflen.
1275
 */
1276
void
1277
build_sig_subpkt (PKT_signature *sig, sigsubpkttype_t type,
1278
      const byte *buffer, size_t buflen )
1279
0
{
1280
0
    byte *p;
1281
0
    int critical, hashed;
1282
0
    subpktarea_t *oldarea, *newarea;
1283
0
    size_t nlen, n, n0;
1284
1285
0
    critical = (type & SIGSUBPKT_FLAG_CRITICAL);
1286
0
    type &= ~SIGSUBPKT_FLAG_CRITICAL;
1287
1288
    /* Sanity check buffer sizes */
1289
0
    if(parse_one_sig_subpkt(buffer,buflen,type)<0)
1290
0
      BUG();
1291
1292
0
    switch(type)
1293
0
      {
1294
0
      case SIGSUBPKT_NOTATION:
1295
0
      case SIGSUBPKT_POLICY:
1296
0
      case SIGSUBPKT_REV_KEY:
1297
0
      case SIGSUBPKT_SIGNATURE:
1298
  /* we do allow multiple subpackets */
1299
0
  break;
1300
1301
0
      default:
1302
  /* we don't allow multiple subpackets */
1303
0
  delete_sig_subpkt(sig->hashed,type);
1304
0
  delete_sig_subpkt(sig->unhashed,type);
1305
0
  break;
1306
0
      }
1307
1308
    /* Any special magic that needs to be done for this type so the
1309
       packet doesn't need to be reparsed? */
1310
0
    switch(type)
1311
0
      {
1312
0
      case SIGSUBPKT_NOTATION:
1313
0
  sig->flags.notation=1;
1314
0
  break;
1315
1316
0
      case SIGSUBPKT_POLICY:
1317
0
  sig->flags.policy_url=1;
1318
0
  break;
1319
1320
0
      case SIGSUBPKT_PREF_KS:
1321
0
  sig->flags.pref_ks=1;
1322
0
  break;
1323
1324
0
      case SIGSUBPKT_EXPORTABLE:
1325
0
  if(buffer[0])
1326
0
    sig->flags.exportable=1;
1327
0
  else
1328
0
    sig->flags.exportable=0;
1329
0
  break;
1330
1331
0
      case SIGSUBPKT_REVOCABLE:
1332
0
  if(buffer[0])
1333
0
    sig->flags.revocable=1;
1334
0
  else
1335
0
    sig->flags.revocable=0;
1336
0
  break;
1337
1338
0
      case SIGSUBPKT_TRUST:
1339
0
  sig->trust_depth=buffer[0];
1340
0
  sig->trust_value=buffer[1];
1341
0
  break;
1342
1343
0
      case SIGSUBPKT_REGEXP:
1344
0
  sig->trust_regexp=buffer;
1345
0
  break;
1346
1347
  /* This should never happen since we don't currently allow
1348
     creating such a subpacket, but just in case... */
1349
0
      case SIGSUBPKT_SIG_EXPIRE:
1350
0
  if(buf32_to_u32(buffer)+sig->timestamp<=make_timestamp())
1351
0
    sig->flags.expired=1;
1352
0
  else
1353
0
    sig->flags.expired=0;
1354
0
  break;
1355
1356
0
      default:
1357
0
  break;
1358
0
      }
1359
1360
0
    if( (buflen+1) >= 8384 )
1361
0
  nlen = 5; /* write 5 byte length header */
1362
0
    else if( (buflen+1) >= 192 )
1363
0
  nlen = 2; /* write 2 byte length header */
1364
0
    else
1365
0
  nlen = 1; /* just a 1 byte length header */
1366
1367
0
    switch( type )
1368
0
      {
1369
  /* The issuer being unhashed is a historical oddity.  It
1370
     should work equally as well hashed.  Of course, if even an
1371
     unhashed issuer is tampered with, it makes it awfully hard
1372
     to verify the sig... */
1373
0
      case SIGSUBPKT_ISSUER:
1374
0
      case SIGSUBPKT_SIGNATURE:
1375
0
        hashed = 0;
1376
0
        break;
1377
0
      default:
1378
0
        hashed = 1;
1379
0
        break;
1380
0
      }
1381
1382
0
    if( critical )
1383
0
  type |= SIGSUBPKT_FLAG_CRITICAL;
1384
1385
0
    oldarea = hashed? sig->hashed : sig->unhashed;
1386
1387
    /* Calculate new size of the area and allocate */
1388
0
    n0 = oldarea? oldarea->len : 0;
1389
0
    n = n0 + nlen + 1 + buflen; /* length, type, buffer */
1390
0
    if (oldarea && n <= oldarea->size) { /* fits into the unused space */
1391
0
        newarea = oldarea;
1392
        /*log_debug ("updating area for type %d\n", type );*/
1393
0
    }
1394
0
    else if (oldarea) {
1395
0
        newarea = xrealloc (oldarea, sizeof (*newarea) + n - 1);
1396
0
        newarea->size = n;
1397
        /*log_debug ("reallocating area for type %d\n", type );*/
1398
0
    }
1399
0
    else {
1400
0
        newarea = xmalloc (sizeof (*newarea) + n - 1);
1401
0
        newarea->size = n;
1402
        /*log_debug ("allocating area for type %d\n", type );*/
1403
0
    }
1404
0
    newarea->len = n;
1405
1406
0
    p = newarea->data + n0;
1407
0
    if (nlen == 5) {
1408
0
  *p++ = 255;
1409
0
  *p++ = (buflen+1) >> 24;
1410
0
  *p++ = (buflen+1) >> 16;
1411
0
  *p++ = (buflen+1) >>  8;
1412
0
  *p++ = (buflen+1);
1413
0
  *p++ = type;
1414
0
  memcpy (p, buffer, buflen);
1415
0
    }
1416
0
    else if (nlen == 2) {
1417
0
  *p++ = (buflen+1-192) / 256 + 192;
1418
0
  *p++ = (buflen+1-192) % 256;
1419
0
  *p++ = type;
1420
0
  memcpy (p, buffer, buflen);
1421
0
    }
1422
0
    else {
1423
0
  *p++ = buflen+1;
1424
0
  *p++ = type;
1425
0
  memcpy (p, buffer, buflen);
1426
0
    }
1427
1428
0
    if (hashed)
1429
0
  sig->hashed = newarea;
1430
0
    else
1431
0
  sig->unhashed = newarea;
1432
0
}
1433
1434
/*
1435
 * Put all the required stuff from SIG into subpackets of sig.
1436
 * PKSK is the signing key.  SIGNHINTS are various flags like
1437
 * SIGNHINT_ADSK.
1438
 * Hmmm, should we delete those subpackets which are in a wrong area?
1439
 */
1440
void
1441
build_sig_subpkt_from_sig (PKT_signature *sig, PKT_public_key *pksk,
1442
                           unsigned int signhints)
1443
0
{
1444
0
    u32  u;
1445
0
    byte buf[1+MAX_FINGERPRINT_LEN];
1446
0
    size_t fprlen;
1447
1448
    /* For v4 keys we need to write the ISSUER subpacket.  We do not
1449
     * want that for a future v5 format.  We also don't write it if
1450
     * only the new RENC keyflag is set (implementations with support
1451
     * for this key flag should understand the ISSUER_FPR).  */
1452
0
    if (pksk->version < 5 && !(signhints & SIGNHINT_ADSK))
1453
0
      {
1454
0
        u = sig->keyid[0];
1455
0
        buf[0] = (u >> 24) & 0xff;
1456
0
        buf[1] = (u >> 16) & 0xff;
1457
0
        buf[2] = (u >>  8) & 0xff;
1458
0
        buf[3] = u & 0xff;
1459
0
        u = sig->keyid[1];
1460
0
        buf[4] = (u >> 24) & 0xff;
1461
0
        buf[5] = (u >> 16) & 0xff;
1462
0
        buf[6] = (u >>  8) & 0xff;
1463
0
        buf[7] = u & 0xff;
1464
0
        build_sig_subpkt (sig, SIGSUBPKT_ISSUER, buf, 8);
1465
0
      }
1466
1467
    /* Write the new ISSUER_FPR subpacket.  */
1468
0
    fingerprint_from_pk (pksk, buf+1, &fprlen);
1469
0
    if (fprlen == 20 || fprlen == 32)
1470
0
      {
1471
0
        buf[0] = pksk->version;
1472
0
        build_sig_subpkt (sig, SIGSUBPKT_ISSUER_FPR, buf, fprlen + 1);
1473
0
      }
1474
1475
    /* Write the timestamp.  */
1476
0
    u = sig->timestamp;
1477
0
    buf[0] = (u >> 24) & 0xff;
1478
0
    buf[1] = (u >> 16) & 0xff;
1479
0
    buf[2] = (u >>  8) & 0xff;
1480
0
    buf[3] = u & 0xff;
1481
0
    build_sig_subpkt( sig, SIGSUBPKT_SIG_CREATED, buf, 4 );
1482
1483
0
    if(sig->expiredate)
1484
0
      {
1485
0
  if(sig->expiredate>sig->timestamp)
1486
0
    u=sig->expiredate-sig->timestamp;
1487
0
  else
1488
0
    u=1; /* A 1-second expiration time is the shortest one
1489
      OpenPGP has */
1490
1491
0
  buf[0] = (u >> 24) & 0xff;
1492
0
  buf[1] = (u >> 16) & 0xff;
1493
0
  buf[2] = (u >>  8) & 0xff;
1494
0
  buf[3] = u & 0xff;
1495
1496
  /* Mark this CRITICAL, so if any implementation doesn't
1497
           understand sigs that can expire, it'll just disregard this
1498
           sig altogether. */
1499
1500
0
  build_sig_subpkt( sig, SIGSUBPKT_SIG_EXPIRE | SIGSUBPKT_FLAG_CRITICAL,
1501
0
        buf, 4 );
1502
0
      }
1503
0
}
1504
1505
void
1506
build_attribute_subpkt(PKT_user_id *uid,byte type,
1507
           const void *buf,u32 buflen,
1508
           const void *header,u32 headerlen)
1509
0
{
1510
0
  byte *attrib;
1511
0
  int idx;
1512
1513
0
  if(1+headerlen+buflen>8383)
1514
0
    idx=5;
1515
0
  else if(1+headerlen+buflen>191)
1516
0
    idx=2;
1517
0
  else
1518
0
    idx=1;
1519
1520
  /* realloc uid->attrib_data to the right size */
1521
1522
0
  uid->attrib_data=xrealloc(uid->attrib_data,
1523
0
           uid->attrib_len+idx+1+headerlen+buflen);
1524
1525
0
  attrib=&uid->attrib_data[uid->attrib_len];
1526
1527
0
  if(idx==5)
1528
0
    {
1529
0
      attrib[0]=255;
1530
0
      attrib[1]=(1+headerlen+buflen) >> 24;
1531
0
      attrib[2]=(1+headerlen+buflen) >> 16;
1532
0
      attrib[3]=(1+headerlen+buflen) >> 8;
1533
0
      attrib[4]=1+headerlen+buflen;
1534
0
    }
1535
0
  else if(idx==2)
1536
0
    {
1537
0
      attrib[0]=(1+headerlen+buflen-192) / 256 + 192;
1538
0
      attrib[1]=(1+headerlen+buflen-192) % 256;
1539
0
    }
1540
0
  else
1541
0
    attrib[0]=1+headerlen+buflen; /* Good luck finding a JPEG this small! */
1542
1543
0
  attrib[idx++]=type;
1544
1545
  /* Tack on our data at the end */
1546
1547
0
  if(headerlen>0)
1548
0
    memcpy(&attrib[idx],header,headerlen);
1549
0
  memcpy(&attrib[idx+headerlen],buf,buflen);
1550
0
  uid->attrib_len+=idx+headerlen+buflen;
1551
0
}
1552
1553
/* Returns a human-readable string corresponding to the notation.
1554
   This ignores notation->value.  The caller must free the result.  */
1555
static char *
1556
notation_value_to_human_readable_string (struct notation *notation)
1557
0
{
1558
0
  if(notation->bdat)
1559
    /* Binary data.  */
1560
0
    {
1561
0
      size_t len = notation->blen;
1562
0
      int i;
1563
0
      char preview[20];
1564
1565
0
      for (i = 0; i < len && i < sizeof (preview) - 1; i ++)
1566
0
        if (isprint (notation->bdat[i]))
1567
0
          preview[i] = notation->bdat[i];
1568
0
        else
1569
0
          preview[i] = '?';
1570
0
      preview[i] = 0;
1571
1572
0
      return xasprintf (_("[ not human readable (%zu bytes: %s%s) ]"),
1573
0
                        len, preview, i < len ? "..." : "");
1574
0
    }
1575
0
  else
1576
    /* The value is human-readable.  */
1577
0
    return xstrdup (notation->value);
1578
0
}
1579
1580
1581
/* Turn the notation described by the string STRING into a notation.
1582
 *
1583
 * STRING has the form:
1584
 *
1585
 *   - -name - Delete the notation.
1586
 *   - name@domain.name=value - Normal notation
1587
 *   - !name@domain.name=value - Notation with critical bit set.
1588
 *
1589
 * The caller must free the result using free_notation().  */
1590
struct notation *
1591
string_to_notation (const char *string, int is_utf8)
1592
0
{
1593
0
  const char *s;
1594
0
  int saw_at=0;
1595
0
  struct notation *notation;
1596
1597
0
  notation=xmalloc_clear(sizeof(*notation));
1598
1599
0
  if(*string=='-')
1600
0
    {
1601
0
      notation->flags.ignore=1;
1602
0
      string++;
1603
0
    }
1604
1605
0
  if(*string=='!')
1606
0
    {
1607
0
      notation->flags.critical=1;
1608
0
      string++;
1609
0
    }
1610
1611
  /* If and when the IETF assigns some official name tags, we'll have
1612
     to add them here. */
1613
1614
0
  for( s=string ; *s != '='; s++ )
1615
0
    {
1616
0
      if( *s=='@')
1617
0
  saw_at++;
1618
1619
      /* -notationname is legal without an = sign */
1620
0
      if(!*s && notation->flags.ignore)
1621
0
  break;
1622
1623
0
      if( !*s || !isascii (*s) || (!isgraph(*s) && !isspace(*s)) )
1624
0
  {
1625
0
    log_error(_("a notation name must have only printable characters"
1626
0
          " or spaces, and end with an '='\n") );
1627
0
    goto fail;
1628
0
  }
1629
0
    }
1630
1631
0
  notation->name=xmalloc((s-string)+1);
1632
0
  memcpy(notation->name,string,s-string);
1633
0
  notation->name[s-string]='\0';
1634
1635
0
  if(!saw_at && !opt.expert)
1636
0
    {
1637
0
      log_error(_("a user notation name must contain the '@' character\n"));
1638
0
      goto fail;
1639
0
    }
1640
1641
0
  if (saw_at > 1)
1642
0
    {
1643
0
      log_error(_("a notation name must not contain more than"
1644
0
      " one '@' character\n"));
1645
0
      goto fail;
1646
0
    }
1647
1648
0
  if(*s)
1649
0
    {
1650
0
      const char *i=s+1;
1651
0
      int highbit=0;
1652
1653
      /* we only support printable text - therefore we enforce the use
1654
   of only printable characters (an empty value is valid) */
1655
0
      for(s++; *s ; s++ )
1656
0
  {
1657
0
    if ( !isascii (*s) )
1658
0
      highbit=1;
1659
0
    else if (iscntrl(*s))
1660
0
      {
1661
0
        log_error(_("a notation value must not use any"
1662
0
        " control characters\n"));
1663
0
        goto fail;
1664
0
      }
1665
0
  }
1666
1667
0
      if(!highbit || is_utf8)
1668
0
  notation->value=xstrdup(i);
1669
0
      else
1670
0
  notation->value=native_to_utf8(i);
1671
0
    }
1672
1673
0
  return notation;
1674
1675
0
 fail:
1676
0
  free_notation(notation);
1677
0
  return NULL;
1678
0
}
1679
1680
1681
/* Turn the notation described by NAME and VALUE into a notation.
1682
 * This will be a human readble non-critical notation.
1683
 * The caller must free the result using free_notation().  */
1684
struct notation *
1685
name_value_to_notation (const char *name, const char *value)
1686
0
{
1687
0
  struct notation *notation;
1688
1689
0
  notation = xcalloc (1, sizeof *notation);
1690
0
  notation->name = xstrdup (name);
1691
0
  notation->value = xstrdup (value);
1692
0
  return notation;
1693
0
}
1694
1695
1696
/* Like string_to_notation, but store opaque data rather than human
1697
   readable data.  */
1698
struct notation *
1699
blob_to_notation(const char *name, const char *data, size_t len)
1700
0
{
1701
0
  const char *s;
1702
0
  int saw_at=0;
1703
0
  struct notation *notation;
1704
1705
0
  notation=xmalloc_clear(sizeof(*notation));
1706
1707
0
  if(*name=='-')
1708
0
    {
1709
0
      notation->flags.ignore=1;
1710
0
      name++;
1711
0
    }
1712
1713
0
  if(*name=='!')
1714
0
    {
1715
0
      notation->flags.critical=1;
1716
0
      name++;
1717
0
    }
1718
1719
  /* If and when the IETF assigns some official name tags, we'll have
1720
     to add them here. */
1721
1722
0
  for( s=name ; *s; s++ )
1723
0
    {
1724
0
      if( *s=='@')
1725
0
  saw_at++;
1726
1727
      /* -notationname is legal without an = sign */
1728
0
      if(!*s && notation->flags.ignore)
1729
0
  break;
1730
1731
0
      if (*s == '=')
1732
0
        {
1733
0
          log_error(_("a notation name may not contain an '=' character\n"));
1734
0
          goto fail;
1735
0
        }
1736
1737
0
      if (!isascii (*s) || (!isgraph(*s) && !isspace(*s)))
1738
0
  {
1739
0
    log_error(_("a notation name must have only printable characters"
1740
0
          " or spaces\n") );
1741
0
    goto fail;
1742
0
  }
1743
0
    }
1744
1745
0
  notation->name=xstrdup (name);
1746
1747
0
  if(!saw_at && !opt.expert)
1748
0
    {
1749
0
      log_error(_("a user notation name must contain the '@' character\n"));
1750
0
      goto fail;
1751
0
    }
1752
1753
0
  if (saw_at > 1)
1754
0
    {
1755
0
      log_error(_("a notation name must not contain more than"
1756
0
      " one '@' character\n"));
1757
0
      goto fail;
1758
0
    }
1759
1760
0
  notation->bdat = xmalloc (len);
1761
0
  memcpy (notation->bdat, data, len);
1762
0
  notation->blen = len;
1763
1764
0
  notation->value = notation_value_to_human_readable_string (notation);
1765
1766
0
  return notation;
1767
1768
0
 fail:
1769
0
  free_notation(notation);
1770
0
  return NULL;
1771
0
}
1772
1773
struct notation *
1774
sig_to_notation(PKT_signature *sig)
1775
0
{
1776
0
  const byte *p;
1777
0
  size_t len;
1778
0
  int seq = 0;
1779
0
  int crit;
1780
0
  notation_t list = NULL;
1781
1782
  /* See RFC 4880, 5.2.3.16 for the format of notation data.  In
1783
     short, a notation has:
1784
1785
       - 4 bytes of flags
1786
       - 2 byte name length (n1)
1787
       - 2 byte value length (n2)
1788
       - n1 bytes of name data
1789
       - n2 bytes of value data
1790
   */
1791
0
  while((p=enum_sig_subpkt (sig, 1, SIGSUBPKT_NOTATION, &len, &seq, &crit)))
1792
0
    {
1793
0
      int n1,n2;
1794
0
      struct notation *n=NULL;
1795
1796
0
      if(len<8)
1797
0
  {
1798
0
    log_info(_("WARNING: invalid notation data found\n"));
1799
0
    continue;
1800
0
  }
1801
1802
      /* name length.  */
1803
0
      n1=(p[4]<<8)|p[5];
1804
      /* value length.  */
1805
0
      n2=(p[6]<<8)|p[7];
1806
1807
0
      if(8+n1+n2!=len)
1808
0
  {
1809
0
    log_info(_("WARNING: invalid notation data found\n"));
1810
0
    continue;
1811
0
  }
1812
1813
0
      n=xmalloc_clear(sizeof(*n));
1814
0
      n->name=xmalloc(n1+1);
1815
1816
0
      memcpy(n->name,&p[8],n1);
1817
0
      n->name[n1]='\0';
1818
1819
0
      if(p[0]&0x80)
1820
        /* The value is human-readable.  */
1821
0
  {
1822
0
    n->value=xmalloc(n2+1);
1823
0
    memcpy(n->value,&p[8+n1],n2);
1824
0
    n->value[n2]='\0';
1825
0
          n->flags.human = 1;
1826
0
  }
1827
0
      else
1828
        /* Binary data.  */
1829
0
  {
1830
0
    n->bdat=xmalloc(n2);
1831
0
    n->blen=n2;
1832
0
    memcpy(n->bdat,&p[8+n1],n2);
1833
1834
0
          n->value = notation_value_to_human_readable_string (n);
1835
0
  }
1836
1837
0
      n->flags.critical=crit;
1838
1839
0
      n->next=list;
1840
0
      list=n;
1841
0
    }
1842
1843
0
  return list;
1844
0
}
1845
1846
1847
/* Return a list of notation data matching NAME.  The caller needs to
1848
 * to free the list using free_notation.  Other than sig_to_notation
1849
 * this function does not return the notation in human readable format
1850
 * but always returns the raw data.  The human readable flag is set
1851
 * anyway set but .value is always NULL.  */
1852
struct notation *
1853
search_sig_notations (PKT_signature *sig, const char *name)
1854
0
{
1855
0
  const byte *p;
1856
0
  size_t len;
1857
0
  int seq = 0;
1858
0
  int crit;
1859
0
  notation_t list = NULL;
1860
1861
0
  while((p=enum_sig_subpkt (sig, 1, SIGSUBPKT_NOTATION, &len, &seq, &crit)))
1862
0
    {
1863
0
      int n1,n2;
1864
0
      struct notation *n=NULL;
1865
1866
0
      if (len < 8)
1867
0
  {
1868
0
    log_info (_("WARNING: invalid notation data found\n"));
1869
0
    continue;
1870
0
  }
1871
1872
      /* name length.  */
1873
0
      n1=(p[4]<<8)|p[5];
1874
      /* value length.  */
1875
0
      n2=(p[6]<<8)|p[7];
1876
1877
0
      if (8 + n1 + n2 != len)
1878
0
  {
1879
0
    log_info (_("WARNING: invalid notation data found\n"));
1880
0
    continue;
1881
0
  }
1882
1883
0
      if (!name)
1884
0
        ; /* Return everything.  */
1885
0
      else if (n1 != strlen (name) || memcmp (p+8, name, n1))
1886
0
        continue; /* Not the requested name.  */
1887
1888
1889
0
      n = xmalloc_clear (sizeof *n);
1890
0
      n->name = xmalloc (n1+1);
1891
1892
0
      memcpy (n->name,p + 8, n1);
1893
0
      n->name[n1]='\0';
1894
1895
      /* In any case append a Nul. */
1896
0
      n->bdat = xmalloc (n2+1);
1897
0
      memcpy (n->bdat, p + 8 + n1, n2);
1898
0
      n->bdat[n2] = '\0';
1899
0
      n->blen = n2;
1900
0
      n->flags.human = !!(p[0] & 0x80);
1901
1902
0
      n->flags.critical = crit;
1903
1904
0
      n->next = list;
1905
0
      list = n;
1906
0
    }
1907
1908
0
  return list;
1909
0
}
1910
1911
1912
/* Release the resources associated with the *list* of notations.  To
1913
   release a single notation, make sure that notation->next is
1914
   NULL.  */
1915
void
1916
free_notation(struct notation *notation)
1917
0
{
1918
0
  while(notation)
1919
0
    {
1920
0
      struct notation *n=notation;
1921
1922
0
      xfree(n->name);
1923
0
      xfree(n->value);
1924
0
      xfree(n->altvalue);
1925
0
      xfree(n->bdat);
1926
0
      notation=n->next;
1927
0
      xfree(n);
1928
0
    }
1929
0
}
1930
1931
/* Serialize the signature packet (RFC 4880, Section 5.2) described by
1932
   SIG and write it to OUT.  */
1933
static int
1934
do_signature( IOBUF out, int ctb, PKT_signature *sig )
1935
6.47M
{
1936
6.47M
  int rc = 0;
1937
6.47M
  int n, i;
1938
6.47M
  IOBUF a = iobuf_temp();
1939
1940
6.47M
  log_assert (ctb_pkttype (ctb) == PKT_SIGNATURE);
1941
1942
6.47M
  if ( !sig->version || sig->version == 3)
1943
4.64k
    {
1944
4.64k
      iobuf_put( a, 3 );
1945
1946
      /* Version 3 packets don't support subpackets.  Actually we
1947
       * should never get to here but real life is different and thus
1948
       * we now use a log_fatal instead of a log_assert here. */
1949
4.64k
      if (sig->hashed || sig->unhashed)
1950
4.64k
        log_fatal ("trying to write a subpacket to a v3 signature (%d,%d)\n",
1951
0
                   !!sig->hashed, !!sig->unhashed);
1952
4.64k
    }
1953
6.46M
  else
1954
6.46M
    iobuf_put( a, sig->version );
1955
6.47M
  if ( sig->version < 4 )
1956
4.64k
    iobuf_put (a, 5 ); /* Constant used by pre-v4 signatures. */
1957
6.47M
  iobuf_put (a, sig->sig_class );
1958
6.47M
  if ( sig->version < 4 )
1959
4.64k
    {
1960
4.64k
      write_32(a, sig->timestamp );
1961
4.64k
      write_32(a, sig->keyid[0] );
1962
4.64k
      write_32(a, sig->keyid[1] );
1963
4.64k
    }
1964
6.47M
  iobuf_put(a, sig->pubkey_algo );
1965
6.47M
  iobuf_put(a, sig->digest_algo );
1966
6.47M
  if ( sig->version >= 4 )
1967
6.46M
    {
1968
6.46M
      size_t nn;
1969
      /* Timestamp and keyid must have been packed into the subpackets
1970
   prior to the call of this function, because these subpackets
1971
   are hashed. */
1972
6.46M
      nn = sig->hashed? sig->hashed->len : 0;
1973
6.46M
      write_16(a, nn);
1974
6.46M
      if (nn)
1975
6.46M
        iobuf_write( a, sig->hashed->data, nn );
1976
6.46M
      nn = sig->unhashed? sig->unhashed->len : 0;
1977
6.46M
      write_16(a, nn);
1978
6.46M
      if (nn)
1979
6.43M
        iobuf_write( a, sig->unhashed->data, nn );
1980
6.46M
    }
1981
6.47M
  iobuf_put(a, sig->digest_start[0] );
1982
6.47M
  iobuf_put(a, sig->digest_start[1] );
1983
6.47M
  n = pubkey_get_nsig( sig->pubkey_algo );
1984
6.47M
  if ( !n )
1985
75.6k
    write_fake_data( a, sig->data[0] );
1986
6.47M
  if (sig->pubkey_algo == PUBKEY_ALGO_ECDSA
1987
6.46M
      || sig->pubkey_algo == PUBKEY_ALGO_EDDSA)
1988
19.0M
    for (i=0; i < n && !rc ; i++ )
1989
12.6M
      rc = sos_write (a, sig->data[i], NULL);
1990
121k
  else
1991
168k
    for (i=0; i < n && !rc ; i++ )
1992
46.1k
      rc = gpg_mpi_write (a, sig->data[i], NULL);
1993
1994
6.47M
  if (!rc)
1995
6.47M
    {
1996
6.47M
      if ( is_RSA(sig->pubkey_algo) && sig->version < 4 )
1997
1.05k
        write_sign_packet_header(out, ctb, iobuf_get_temp_length(a) );
1998
6.46M
      else
1999
6.46M
        write_header(out, ctb, iobuf_get_temp_length(a) );
2000
6.47M
      rc = iobuf_write_temp( out, a );
2001
6.47M
    }
2002
2003
6.47M
  iobuf_close(a);
2004
6.47M
  return rc;
2005
6.47M
}
2006
2007
2008
/* Serialize the one-pass signature packet (RFC 4880, Section 5.4)
2009
   described by OPS and write it to OUT.  */
2010
static int
2011
do_onepass_sig( IOBUF out, int ctb, PKT_onepass_sig *ops )
2012
0
{
2013
0
    log_assert (ctb_pkttype (ctb) == PKT_ONEPASS_SIG);
2014
2015
0
    write_header(out, ctb, 4 + 8 + 1);
2016
2017
0
    iobuf_put (out, 3);  /* Version.  */
2018
0
    iobuf_put(out, ops->sig_class );
2019
0
    iobuf_put(out, ops->digest_algo );
2020
0
    iobuf_put(out, ops->pubkey_algo );
2021
0
    write_32(out, ops->keyid[0] );
2022
0
    write_32(out, ops->keyid[1] );
2023
0
    iobuf_put(out, ops->last );
2024
2025
0
    return 0;
2026
0
}
2027
2028
2029
/* Write a 16-bit quantity to OUT in big endian order.  */
2030
static int
2031
write_16(IOBUF out, u16 a)
2032
12.9M
{
2033
12.9M
    iobuf_put(out, a>>8);
2034
12.9M
    if( iobuf_put(out,a) )
2035
0
  return -1;
2036
12.9M
    return 0;
2037
12.9M
}
2038
2039
/* Write a 32-bit quantity to OUT in big endian order.  */
2040
static int
2041
write_32(IOBUF out, u32 a)
2042
329k
{
2043
329k
    iobuf_put(out, a>> 24);
2044
329k
    iobuf_put(out, a>> 16);
2045
329k
    iobuf_put(out, a>> 8);
2046
329k
    return iobuf_put(out, a);
2047
329k
}
2048
2049
2050
/****************
2051
 * calculate the length of a header.
2052
 *
2053
 * LEN is the length of the packet's body.  NEW_CTB is whether we are
2054
 * using a new or old format packet.
2055
 *
2056
 * This function does not handle indeterminate lengths or partial body
2057
 * lengths.  (If you pass LEN as 0, then this function assumes you
2058
 * really mean an empty body.)
2059
 */
2060
static int
2061
calc_header_length( u32 len, int new_ctb )
2062
0
{
2063
0
    if( new_ctb ) {
2064
0
  if( len < 192 )
2065
0
      return 2;
2066
0
  if( len < 8384 )
2067
0
      return 3;
2068
0
  else
2069
0
      return 6;
2070
0
    }
2071
0
    if( len < 256 )
2072
0
  return 2;
2073
0
    if( len < 65536 )
2074
0
  return 3;
2075
2076
0
    return 5;
2077
0
}
2078
2079
/****************
2080
 * Write the CTB and the packet length
2081
 */
2082
static int
2083
write_header( IOBUF out, int ctb, u32 len )
2084
12.9M
{
2085
12.9M
    return write_header2( out, ctb, len, 0 );
2086
12.9M
}
2087
2088
2089
static int
2090
write_sign_packet_header (IOBUF out, int ctb, u32 len)
2091
1.05k
{
2092
1.05k
  (void)ctb;
2093
2094
  /* Work around a bug in the pgp read function for signature packets,
2095
     which are not correctly coded and silently assume at some point 2
2096
     byte length headers.*/
2097
1.05k
  iobuf_put (out, 0x89 );
2098
1.05k
  iobuf_put (out, len >> 8 );
2099
1.05k
  return iobuf_put (out, len) == -1 ? -1:0;
2100
1.05k
}
2101
2102
/****************
2103
 * Write a packet header to OUT.
2104
 *
2105
 * CTB is the ctb.  It determines whether a new or old format packet
2106
 * header should be written.  The length field is adjusted, but the
2107
 * CTB is otherwise written out as is.
2108
 *
2109
 * LEN is the length of the packet's body.
2110
 *
2111
 * If HDRLEN is set, then we don't necessarily use the most efficient
2112
 * encoding to store LEN, but the specified length.  (If this is not
2113
 * possible, this is a bug.)  In this case, LEN=0 means a 0 length
2114
 * packet.  Note: setting HDRLEN is only supported for old format
2115
 * packets!
2116
 *
2117
 * If HDRLEN is not set, then the shortest encoding is used.  In this
2118
 * case, LEN=0 means the body has an indeterminate length and a
2119
 * partial body length header (if a new format packet) or an
2120
 * indeterminate length header (if an old format packet) is written
2121
 * out.  Further, if using partial body lengths, this enables partial
2122
 * body length mode on OUT.
2123
 */
2124
static int
2125
write_header2( IOBUF out, int ctb, u32 len, int hdrlen )
2126
13.2M
{
2127
13.2M
  if (ctb_new_format_p (ctb))
2128
0
    return write_new_header( out, ctb, len, hdrlen );
2129
2130
  /* An old format packet.  Refer to RFC 4880, Section 4.2.1 to
2131
     understand how lengths are encoded in this case.  */
2132
2133
  /* The length encoding is stored in the two least significant bits.
2134
     Make sure they are cleared.  */
2135
13.2M
  log_assert ((ctb & 3) == 0);
2136
2137
13.2M
  log_assert (hdrlen == 0 || hdrlen == 2 || hdrlen == 3 || hdrlen == 5);
2138
2139
13.2M
  if (hdrlen)
2140
    /* Header length is given.  */
2141
0
    {
2142
0
      if( hdrlen == 2 && len < 256 )
2143
        /* 00 => 1 byte length.  */
2144
0
  ;
2145
0
      else if( hdrlen == 3 && len < 65536 )
2146
        /* 01 => 2 byte length.  If len < 256, this is not the most
2147
           compact encoding, but it is a correct encoding.  */
2148
0
  ctb |= 1;
2149
0
      else if (hdrlen == 5)
2150
        /* 10 => 4 byte length.  If len < 65536, this is not the most
2151
           compact encoding, but it is a correct encoding.  */
2152
0
  ctb |= 2;
2153
0
      else
2154
0
        log_bug ("Can't encode length=%d in a %d byte header!\n",
2155
0
                 len, hdrlen);
2156
0
    }
2157
13.2M
  else
2158
13.2M
    {
2159
13.2M
      if( !len )
2160
        /* 11 => Indeterminate length.  */
2161
0
  ctb |= 3;
2162
13.2M
      else if( len < 256 )
2163
        /* 00 => 1 byte length.  */
2164
13.2M
  ;
2165
4.26k
      else if( len < 65536 )
2166
        /* 01 => 2 byte length.  */
2167
4.26k
  ctb |= 1;
2168
0
      else
2169
        /* 10 => 4 byte length.  */
2170
0
  ctb |= 2;
2171
13.2M
    }
2172
2173
13.2M
  if( iobuf_put(out, ctb ) )
2174
0
    return -1;
2175
2176
13.2M
  if( len || hdrlen )
2177
13.2M
    {
2178
13.2M
      if( ctb & 2 )
2179
0
  {
2180
0
    if(iobuf_put(out, len >> 24 ))
2181
0
      return -1;
2182
0
    if(iobuf_put(out, len >> 16 ))
2183
0
      return -1;
2184
0
  }
2185
2186
13.2M
      if( ctb & 3 )
2187
4.26k
  if(iobuf_put(out, len >> 8 ))
2188
0
    return -1;
2189
2190
13.2M
      if( iobuf_put(out, len ) )
2191
0
  return -1;
2192
13.2M
    }
2193
2194
13.2M
  return 0;
2195
13.2M
}
2196
2197
2198
/* Write a new format header to OUT.
2199
2200
   CTB is the ctb.
2201
2202
   LEN is the length of the packet's body.  If LEN is 0, then enables
2203
   partial body length mode (i.e., the body is of an indeterminant
2204
   length) on OUT.  Note: this function cannot be used to generate a
2205
   header for a zero length packet.
2206
2207
   HDRLEN is the length of the packet's header.  If HDRLEN is 0, the
2208
   shortest encoding is chosen based on the length of the packet's
2209
   body.  Currently, values other than 0 are not supported.
2210
2211
   Returns 0 on success.  */
2212
static int
2213
write_new_header( IOBUF out, int ctb, u32 len, int hdrlen )
2214
0
{
2215
0
    if( hdrlen )
2216
0
  log_bug("can't cope with hdrlen yet\n");
2217
2218
0
    if( iobuf_put(out, ctb ) )
2219
0
  return -1;
2220
0
    if( !len ) {
2221
0
  iobuf_set_partial_body_length_mode(out, 512 );
2222
0
    }
2223
0
    else {
2224
0
  if( len < 192 ) {
2225
0
      if( iobuf_put(out, len ) )
2226
0
    return -1;
2227
0
  }
2228
0
  else if( len < 8384 ) {
2229
0
      len -= 192;
2230
0
      if( iobuf_put( out, (len / 256) + 192) )
2231
0
    return -1;
2232
0
      if( iobuf_put( out, (len % 256) )  )
2233
0
    return -1;
2234
0
  }
2235
0
  else {
2236
0
      if( iobuf_put( out, 0xff ) )
2237
0
    return -1;
2238
0
      if( iobuf_put( out, (len >> 24)&0xff ) )
2239
0
    return -1;
2240
0
      if( iobuf_put( out, (len >> 16)&0xff ) )
2241
0
    return -1;
2242
0
      if( iobuf_put( out, (len >> 8)&0xff )  )
2243
0
    return -1;
2244
0
      if( iobuf_put( out, len & 0xff ) )
2245
0
    return -1;
2246
0
  }
2247
0
    }
2248
0
    return 0;
2249
0
}