1 /* parse-packet.c - read packets
2 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3 * 2007 Free Software Foundation, Inc.
5 * This file is part of GnuPG.
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.
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.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
38 static int mpi_print_mode
;
42 static int parse( IOBUF inp
, PACKET
*pkt
, int onlykeypkts
,
43 off_t
*retpos
, int *skip
, IOBUF out
, int do_skip
44 #ifdef DEBUG_PARSE_PACKET
45 ,const char *dbg_w
, const char *dbg_f
, int dbg_l
48 static int copy_packet( IOBUF inp
, IOBUF out
, int pkttype
,
49 unsigned long pktlen
, int partial
);
50 static void skip_packet( IOBUF inp
, int pkttype
,
51 unsigned long pktlen
, int partial
);
52 static void *read_rest( IOBUF inp
, size_t pktlen
, int partial
);
53 static int parse_marker( IOBUF inp
, int pkttype
, unsigned long pktlen
);
54 static int parse_symkeyenc( IOBUF inp
, int pkttype
, unsigned long pktlen
,
56 static int parse_pubkeyenc( IOBUF inp
, int pkttype
, unsigned long pktlen
,
58 static int parse_onepass_sig( IOBUF inp
, int pkttype
, unsigned long pktlen
,
59 PKT_onepass_sig
*ops
);
60 static int parse_key( IOBUF inp
, int pkttype
, unsigned long pktlen
,
61 byte
*hdr
, int hdrlen
, PACKET
*packet
);
62 static int parse_user_id( IOBUF inp
, int pkttype
, unsigned long pktlen
,
64 static int parse_attribute( IOBUF inp
, int pkttype
, unsigned long pktlen
,
66 static int parse_comment( IOBUF inp
, int pkttype
, unsigned long pktlen
,
68 static void parse_trust( IOBUF inp
, int pkttype
, unsigned long pktlen
,
70 static int parse_plaintext( IOBUF inp
, int pkttype
, unsigned long pktlen
,
71 PACKET
*packet
, int new_ctb
, int partial
);
72 static int parse_compressed( IOBUF inp
, int pkttype
, unsigned long pktlen
,
73 PACKET
*packet
, int new_ctb
);
74 static int parse_encrypted( IOBUF inp
, int pkttype
, unsigned long pktlen
,
75 PACKET
*packet
, int new_ctb
, int partial
);
76 static int parse_mdc( IOBUF inp
, int pkttype
, unsigned long pktlen
,
77 PACKET
*packet
, int new_ctb
);
78 static int parse_gpg_control( IOBUF inp
, int pkttype
, unsigned long pktlen
,
79 PACKET
*packet
, int partial
);
85 a
= iobuf_get_noeof(inp
) << 8;
86 a
|= iobuf_get_noeof(inp
);
94 a
= iobuf_get_noeof(inp
) << 24;
95 a
|= iobuf_get_noeof(inp
) << 16;
96 a
|= iobuf_get_noeof(inp
) << 8;
97 a
|= iobuf_get_noeof(inp
);
102 /* Read an external representation of an mpi and return the MPI. The
103 * external format is a 16 bit unsigned value stored in network byte
104 * order, giving the number of bits for the following integer. The
105 * integer is stored with MSB first (left padded with zeroes to align
106 * on a byte boundary).
109 mpi_read (iobuf_t inp
, unsigned int *ret_nread
, int secure
)
111 /*FIXME: Needs to be synced with gnupg14/mpi/mpicoder.c*/
114 unsigned int nbits
, nbytes
;
120 if ( (c
= c1
= iobuf_get (inp
)) == -1 )
123 if ( (c
= c2
= iobuf_get (inp
)) == -1 )
126 if ( nbits
> MAX_EXTERN_MPI_BITS
)
128 log_error("mpi too large (%u bits)\n", nbits
);
132 nbytes
= (nbits
+7) / 8;
133 buf
= secure
? gcry_xmalloc_secure (nbytes
+ 2) : gcry_xmalloc (nbytes
+ 2);
137 for ( i
=0 ; i
< nbytes
; i
++ )
139 p
[i
+2] = iobuf_get(inp
) & 0xff;
142 if ( gcry_mpi_scan( &a
, GCRYMPI_FMT_PGP
, buf
, nread
, &nread
) )
147 if ( nread
> *ret_nread
)
148 log_bug ("mpi larger than packet");
158 set_packet_list_mode( int mode
)
162 /* FIXME(gcrypt) mpi_print_mode = DBG_MPI; */
163 /* We use stdout print only if invoked by the --list-packets
164 command but switch to stderr in all otehr cases. This breaks
165 the previous behaviour but that seems to be more of a bug than
166 intentional. I don't believe that any application makes use of
167 this long standing annoying way of printing to stdout except
168 when doing a --list-packets. If this assumption fails, it will
169 be easy to add an option for the listing stream. Note that we
170 initialize it only once; mainly because some code may switch
171 the option value later back to 1 and we want to have all output
174 Using stderr is not actually very clean because it bypasses the
175 logging code but it is a special thing anyay. I am not sure
176 whether using log_stream() would be better. Perhaps we should
177 enable the list mdoe only with a special option. */
179 listfp
= opt
.list_packets
== 2 ? stdout
: stderr
;
184 unknown_pubkey_warning( int algo
)
186 static byte unknown_pubkey_algos
[256];
189 if( !unknown_pubkey_algos
[algo
] ) {
191 log_info(_("can't handle public key algorithm %d\n"), algo
);
192 unknown_pubkey_algos
[algo
] = 1;
197 * Parse a Packet and return it in packet
198 * Returns: 0 := valid packet in pkt
199 * -1 := no more packets
201 * Note: The function may return an error and a partly valid packet;
202 * caller must free this packet.
204 #ifdef DEBUG_PARSE_PACKET
206 dbg_parse_packet( IOBUF inp
, PACKET
*pkt
, const char *dbg_f
, int dbg_l
)
211 rc
= parse( inp
, pkt
, 0, NULL
, &skip
, NULL
, 0, "parse", dbg_f
, dbg_l
);
217 parse_packet( IOBUF inp
, PACKET
*pkt
)
222 rc
= parse( inp
, pkt
, 0, NULL
, &skip
, NULL
, 0 );
229 * Like parse packet, but only return secret or public (sub)key packets.
231 #ifdef DEBUG_PARSE_PACKET
233 dbg_search_packet( IOBUF inp
, PACKET
*pkt
, off_t
*retpos
, int with_uid
,
234 const char *dbg_f
, int dbg_l
)
239 rc
= parse( inp
, pkt
, with_uid
?2:1, retpos
, &skip
, NULL
, 0, "search", dbg_f
, dbg_l
);
245 search_packet( IOBUF inp
, PACKET
*pkt
, off_t
*retpos
, int with_uid
)
250 rc
= parse( inp
, pkt
, with_uid
?2:1, retpos
, &skip
, NULL
, 0 );
257 * Copy all packets from INP to OUT, thereby removing unused spaces.
259 #ifdef DEBUG_PARSE_PACKET
261 dbg_copy_all_packets( IOBUF inp
, IOBUF out
,
262 const char *dbg_f
, int dbg_l
)
268 } while( !(rc
= parse( inp
, &pkt
, 0, NULL
, &skip
, out
, 0, "copy", dbg_f
, dbg_l
)));
273 copy_all_packets( IOBUF inp
, IOBUF out
)
279 } while( !(rc
= parse( inp
, &pkt
, 0, NULL
, &skip
, out
, 0 )));
285 * Copy some packets from INP to OUT, thereby removing unused spaces.
286 * Stop at offset STOPoff (i.e. don't copy packets at this or later offsets)
288 #ifdef DEBUG_PARSE_PACKET
290 dbg_copy_some_packets( IOBUF inp
, IOBUF out
, off_t stopoff
,
291 const char *dbg_f
, int dbg_l
)
296 if( iobuf_tell(inp
) >= stopoff
)
299 } while( !(rc
= parse( inp
, &pkt
, 0, NULL
, &skip
, out
, 0,
300 "some", dbg_f
, dbg_l
)) );
305 copy_some_packets( IOBUF inp
, IOBUF out
, off_t stopoff
)
310 if( iobuf_tell(inp
) >= stopoff
)
313 } while( !(rc
= parse( inp
, &pkt
, 0, NULL
, &skip
, out
, 0 )) );
319 * Skip over N packets
321 #ifdef DEBUG_PARSE_PACKET
323 dbg_skip_some_packets( IOBUF inp
, unsigned n
,
324 const char *dbg_f
, int dbg_l
)
329 for( ;n
&& !rc
; n
--) {
331 rc
= parse( inp
, &pkt
, 0, NULL
, &skip
, NULL
, 1, "skip", dbg_f
, dbg_l
);
337 skip_some_packets( IOBUF inp
, unsigned n
)
342 for( ;n
&& !rc
; n
--) {
344 rc
= parse( inp
, &pkt
, 0, NULL
, &skip
, NULL
, 1 );
352 * Parse packet. Set the variable skip points to 1 if the packet
353 * should be skipped; this is the case if either ONLYKEYPKTS is set
354 * and the parsed packet isn't one or the
355 * packet-type is 0, indicating deleted stuff.
356 * if OUT is not NULL, a special copymode is used.
359 parse( IOBUF inp
, PACKET
*pkt
, int onlykeypkts
, off_t
*retpos
,
360 int *skip
, IOBUF out
, int do_skip
361 #ifdef DEBUG_PARSE_PACKET
362 ,const char *dbg_w
, const char *dbg_f
, int dbg_l
366 int rc
=0, c
, ctb
, pkttype
, lenbytes
;
367 unsigned long pktlen
;
370 int new_ctb
= 0, partial
=0;
371 int with_uid
= (onlykeypkts
== 2);
374 assert( !pkt
->pkt
.generic
);
376 *retpos
= iobuf_tell(inp
);
378 if( (ctb
= iobuf_get(inp
)) == -1 ) {
384 if( !(ctb
& 0x80) ) {
385 log_error("%s: invalid packet (ctb=%02x)\n", iobuf_where(inp
), ctb
);
386 rc
= gpg_error (GPG_ERR_INV_PACKET
);
390 new_ctb
= !!(ctb
& 0x40);
392 pkttype
= ctb
& 0x3f;
393 if( (c
= iobuf_get(inp
)) == -1 ) {
394 log_error("%s: 1st length byte missing\n", iobuf_where(inp
) );
395 rc
= gpg_error (GPG_ERR_INV_PACKET
);
399 /* The follwing code has been here for ages (2002-08-30) but it is
400 clearly wrong: For example passing a 0 as second argument to
401 iobuf_set_partial_block_mode stops the partial block mode which we
402 definitely do not want. Also all values < 224 or 255 are not
403 valid. Let's disable it and put PKT_COMPRESSED into the list of
404 allowed packets with partial header until someone complains. */
405 /* if (pkttype == PKT_COMPRESSED) { */
406 /* iobuf_set_partial_block_mode(inp, c & 0xff); */
407 /* pktlen = 0; /\* to indicate partial length *\/ */
417 pktlen
= (c
- 192) * 256;
418 if( (c
= iobuf_get(inp
)) == -1 )
420 log_error("%s: 2nd length byte missing\n",
422 rc
= gpg_error (GPG_ERR_INV_PACKET
);
430 pktlen
= (hdr
[hdrlen
++] = iobuf_get_noeof(inp
)) << 24;
431 pktlen
|= (hdr
[hdrlen
++] = iobuf_get_noeof(inp
)) << 16;
432 pktlen
|= (hdr
[hdrlen
++] = iobuf_get_noeof(inp
)) << 8;
433 if( (c
= iobuf_get(inp
)) == -1 )
435 log_error("%s: 4 byte length invalid\n",
437 rc
= gpg_error (GPG_ERR_INV_PACKET
);
440 pktlen
|= (hdr
[hdrlen
++] = c
);
444 /* Partial body length. */
449 case PKT_ENCRYPTED_MDC
:
451 iobuf_set_partial_block_mode(inp
, c
& 0xff);
452 pktlen
= 0;/* To indicate partial length. */
457 log_error("%s: partial length for invalid"
458 " packet type %d\n", iobuf_where(inp
),pkttype
);
459 rc
= gpg_error (GPG_ERR_INV_PACKET
);
467 pkttype
= (ctb
>>2)&0xf;
468 lenbytes
= ((ctb
&3)==3)? 0 : (1<<(ctb
& 3));
471 pktlen
= 0; /* don't know the value */
472 /* This isn't really partial, but we can treat it the same
473 in a "read until the end" sort of way. */
475 if(pkttype
!=PKT_ENCRYPTED
&& pkttype
!=PKT_PLAINTEXT
476 && pkttype
!=PKT_COMPRESSED
)
478 log_error ("%s: indeterminate length for invalid"
479 " packet type %d\n", iobuf_where(inp
), pkttype
);
480 rc
= gpg_error (GPG_ERR_INV_PACKET
);
486 for( ; lenbytes
; lenbytes
-- )
489 pktlen
|= hdr
[hdrlen
++] = iobuf_get_noeof(inp
);
494 if (pktlen
== 0xffffffff) {
495 /* with a some probability this is caused by a problem in the
496 * the uncompressing layer - in some error cases it just loops
497 * and spits out 0xff bytes. */
498 log_error ("%s: garbled packet detected\n", iobuf_where(inp
) );
502 if( out
&& pkttype
) {
503 rc
= iobuf_write (out
, hdr
, hdrlen
);
505 rc
= copy_packet(inp
, out
, pkttype
, pktlen
, partial
);
509 if (with_uid
&& pkttype
== PKT_USER_ID
)
513 || (onlykeypkts
&& pkttype
!= PKT_PUBLIC_SUBKEY
514 && pkttype
!= PKT_PUBLIC_KEY
515 && pkttype
!= PKT_SECRET_SUBKEY
516 && pkttype
!= PKT_SECRET_KEY
) ) {
517 iobuf_skip_rest(inp
, pktlen
, partial
);
524 #ifdef DEBUG_PARSE_PACKET
525 log_debug("parse_packet(iob=%d): type=%d length=%lu%s (%s.%s.%d)\n",
526 iobuf_id(inp
), pkttype
, pktlen
, new_ctb
?" (new_ctb)":"",
527 dbg_w
, dbg_f
, dbg_l
);
529 log_debug("parse_packet(iob=%d): type=%d length=%lu%s\n",
530 iobuf_id(inp
), pkttype
, pktlen
, new_ctb
?" (new_ctb)":"" );
533 pkt
->pkttype
= pkttype
;
534 rc
= G10ERR_UNKNOWN_PACKET
; /* default error */
537 case PKT_PUBLIC_SUBKEY
:
538 pkt
->pkt
.public_key
= xmalloc_clear(sizeof *pkt
->pkt
.public_key
);
539 rc
= parse_key(inp
, pkttype
, pktlen
, hdr
, hdrlen
, pkt
);
542 case PKT_SECRET_SUBKEY
:
543 pkt
->pkt
.secret_key
= xmalloc_clear(sizeof *pkt
->pkt
.secret_key
);
544 rc
= parse_key(inp
, pkttype
, pktlen
, hdr
, hdrlen
, pkt
);
547 rc
= parse_symkeyenc( inp
, pkttype
, pktlen
, pkt
);
550 rc
= parse_pubkeyenc(inp
, pkttype
, pktlen
, pkt
);
553 pkt
->pkt
.signature
= xmalloc_clear(sizeof *pkt
->pkt
.signature
);
554 rc
= parse_signature(inp
, pkttype
, pktlen
, pkt
->pkt
.signature
);
556 case PKT_ONEPASS_SIG
:
557 pkt
->pkt
.onepass_sig
= xmalloc_clear(sizeof *pkt
->pkt
.onepass_sig
);
558 rc
= parse_onepass_sig(inp
, pkttype
, pktlen
, pkt
->pkt
.onepass_sig
);
561 rc
= parse_user_id(inp
, pkttype
, pktlen
, pkt
);
564 pkt
->pkttype
= pkttype
= PKT_USER_ID
; /* we store it in the userID */
565 rc
= parse_attribute(inp
, pkttype
, pktlen
, pkt
);
567 case PKT_OLD_COMMENT
:
569 rc
= parse_comment(inp
, pkttype
, pktlen
, pkt
);
572 parse_trust(inp
, pkttype
, pktlen
, pkt
);
576 rc
= parse_plaintext(inp
, pkttype
, pktlen
, pkt
, new_ctb
, partial
);
579 rc
= parse_compressed(inp
, pkttype
, pktlen
, pkt
, new_ctb
);
582 case PKT_ENCRYPTED_MDC
:
583 rc
= parse_encrypted(inp
, pkttype
, pktlen
, pkt
, new_ctb
, partial
);
586 rc
= parse_mdc(inp
, pkttype
, pktlen
, pkt
, new_ctb
);
588 case PKT_GPG_CONTROL
:
589 rc
= parse_gpg_control(inp
, pkttype
, pktlen
, pkt
, partial
);
592 rc
= parse_marker(inp
,pkttype
,pktlen
);
595 skip_packet(inp
, pkttype
, pktlen
, partial
);
600 if( !rc
&& iobuf_error(inp
) )
601 rc
= G10ERR_INV_KEYRING
;
606 dump_hex_line( int c
, int *i
)
608 if( *i
&& !(*i
%8) ) {
610 fprintf (listfp
, "\n%4d:", *i
);
615 fprintf (listfp
, " EOF" );
617 fprintf (listfp
, " %02x", c
);
623 copy_packet( IOBUF inp
, IOBUF out
, int pkttype
,
624 unsigned long pktlen
, int partial
)
631 while( (n
= iobuf_read( inp
, buf
, 100 )) != -1 )
632 if( (rc
=iobuf_write(out
, buf
, n
)) )
633 return rc
; /* write error */
635 else if( !pktlen
&& pkttype
== PKT_COMPRESSED
) {
636 log_debug("copy_packet: compressed!\n");
637 /* compressed packet, copy till EOF */
638 while( (n
= iobuf_read( inp
, buf
, 100 )) != -1 )
639 if( (rc
=iobuf_write(out
, buf
, n
)) )
640 return rc
; /* write error */
643 for( ; pktlen
; pktlen
-= n
) {
644 n
= pktlen
> 100 ? 100 : pktlen
;
645 n
= iobuf_read( inp
, buf
, n
);
647 return gpg_error (GPG_ERR_EOF
);
648 if( (rc
=iobuf_write(out
, buf
, n
)) )
649 return rc
; /* write error */
657 skip_packet( IOBUF inp
, int pkttype
, unsigned long pktlen
, int partial
)
661 fprintf (listfp
, ":unknown packet: type %2d, length %lu\n",
666 fputs("dump:", listfp
);
669 while( (c
=iobuf_get(inp
)) != -1 )
670 dump_hex_line(c
, &i
);
674 for( ; pktlen
; pktlen
-- )
675 dump_hex_line(iobuf_get(inp
), &i
);
681 iobuf_skip_rest(inp
,pktlen
,partial
);
685 read_rest( IOBUF inp
, size_t pktlen
, int partial
)
691 log_error("read_rest: can't store stream data\n");
695 p
= xmalloc( pktlen
);
696 for(i
=0; pktlen
; pktlen
--, i
++ )
697 p
[i
] = iobuf_get(inp
);
703 parse_marker( IOBUF inp
, int pkttype
, unsigned long pktlen
)
710 if(iobuf_get(inp
)!='P')
716 if(iobuf_get(inp
)!='G')
722 if(iobuf_get(inp
)!='P')
729 fputs(":marker packet: PGP\n", listfp
);
734 log_error("invalid marker packet\n");
735 iobuf_skip_rest(inp
,pktlen
,0);
736 return G10ERR_INVALID_PACKET
;
740 parse_symkeyenc( IOBUF inp
, int pkttype
, unsigned long pktlen
, PACKET
*packet
)
744 int i
, version
, s2kmode
, cipher_algo
, hash_algo
, seskeylen
, minlen
;
747 log_error("packet(%d) too short\n", pkttype
);
748 rc
= gpg_error (GPG_ERR_INV_PACKET
);
751 version
= iobuf_get_noeof(inp
); pktlen
--;
753 log_error("packet(%d) with unknown version %d\n", pkttype
, version
);
754 rc
= gpg_error (GPG_ERR_INV_PACKET
);
757 if( pktlen
> 200 ) { /* (we encode the seskeylen in a byte) */
758 log_error("packet(%d) too large\n", pkttype
);
759 rc
= gpg_error (GPG_ERR_INV_PACKET
);
762 cipher_algo
= iobuf_get_noeof(inp
); pktlen
--;
763 s2kmode
= iobuf_get_noeof(inp
); pktlen
--;
764 hash_algo
= iobuf_get_noeof(inp
); pktlen
--;
766 case 0: /* simple s2k */
769 case 1: /* salted s2k */
772 case 3: /* iterated+salted s2k */
776 log_error("unknown S2K %d\n", s2kmode
);
779 if( minlen
> pktlen
) {
780 log_error("packet with S2K %d too short\n", s2kmode
);
781 rc
= gpg_error (GPG_ERR_INV_PACKET
);
784 seskeylen
= pktlen
- minlen
;
785 k
= packet
->pkt
.symkey_enc
= xmalloc_clear( sizeof *packet
->pkt
.symkey_enc
787 k
->version
= version
;
788 k
->cipher_algo
= cipher_algo
;
789 k
->s2k
.mode
= s2kmode
;
790 k
->s2k
.hash_algo
= hash_algo
;
791 if( s2kmode
== 1 || s2kmode
== 3 ) {
792 for(i
=0; i
< 8 && pktlen
; i
++, pktlen
-- )
793 k
->s2k
.salt
[i
] = iobuf_get_noeof(inp
);
796 k
->s2k
.count
= iobuf_get(inp
); pktlen
--;
798 k
->seskeylen
= seskeylen
;
801 for(i
=0; i
< seskeylen
&& pktlen
; i
++, pktlen
-- )
802 k
->seskey
[i
] = iobuf_get_noeof(inp
);
804 /* What we're watching out for here is a session key decryptor
805 with no salt. The RFC says that using salt for this is a
807 if(s2kmode
!=1 && s2kmode
!=3)
808 log_info(_("WARNING: potentially insecure symmetrically"
809 " encrypted session key\n"));
814 fprintf (listfp
, ":symkey enc packet: version %d, cipher %d, s2k %d, hash %d",
815 version
, cipher_algo
, s2kmode
, hash_algo
);
817 fprintf (listfp
, ", seskey %d bits",(seskeylen
-1)*8);
818 fprintf (listfp
, "\n");
819 if( s2kmode
== 1 || s2kmode
== 3 ) {
820 fprintf (listfp
, "\tsalt ");
821 for(i
=0; i
< 8; i
++ )
822 fprintf (listfp
, "%02x", k
->s2k
.salt
[i
]);
824 fprintf (listfp
, ", count %lu (%lu)",
825 S2K_DECODE_COUNT((ulong
)k
->s2k
.count
),
826 (ulong
)k
->s2k
.count
);
827 fprintf (listfp
, "\n");
832 iobuf_skip_rest(inp
, pktlen
, 0);
837 parse_pubkeyenc( IOBUF inp
, int pkttype
, unsigned long pktlen
, PACKET
*packet
)
844 k
= packet
->pkt
.pubkey_enc
= xmalloc_clear(sizeof *packet
->pkt
.pubkey_enc
);
846 log_error("packet(%d) too short\n", pkttype
);
847 rc
= gpg_error (GPG_ERR_INV_PACKET
);
850 k
->version
= iobuf_get_noeof(inp
); pktlen
--;
851 if( k
->version
!= 2 && k
->version
!= 3 ) {
852 log_error("packet(%d) with unknown version %d\n", pkttype
, k
->version
);
853 rc
= gpg_error (GPG_ERR_INV_PACKET
);
856 k
->keyid
[0] = read_32(inp
); pktlen
-= 4;
857 k
->keyid
[1] = read_32(inp
); pktlen
-= 4;
858 k
->pubkey_algo
= iobuf_get_noeof(inp
); pktlen
--;
859 k
->throw_keyid
= 0; /* only used as flag for build_packet */
861 fprintf (listfp
, ":pubkey enc packet: version %d, algo %d, keyid %08lX%08lX\n",
862 k
->version
, k
->pubkey_algo
, (ulong
)k
->keyid
[0], (ulong
)k
->keyid
[1]);
864 ndata
= pubkey_get_nenc(k
->pubkey_algo
);
867 fprintf (listfp
, "\tunsupported algorithm %d\n", k
->pubkey_algo
);
868 unknown_pubkey_warning( k
->pubkey_algo
);
869 k
->data
[0] = NULL
; /* no need to store the encrypted data */
872 for( i
=0; i
< ndata
; i
++ ) {
874 k
->data
[i
] = mpi_read(inp
, &n
, 0); pktlen
-=n
;
876 fprintf (listfp
, "\tdata: ");
877 mpi_print(listfp
, k
->data
[i
], mpi_print_mode
);
881 rc
= gpg_error (GPG_ERR_INV_PACKET
);
886 iobuf_skip_rest(inp
, pktlen
, 0);
892 dump_sig_subpkt( int hashed
, int type
, int critical
,
893 const byte
*buffer
, size_t buflen
, size_t length
)
898 /* The CERT has warning out with explains how to use GNUPG to
899 * detect the ARRs - we print our old message here when it is a faked
900 * ARR and add an additional notice */
901 if ( type
== SIGSUBPKT_ARR
&& !hashed
) {
903 "\tsubpkt %d len %u (additional recipient request)\n"
904 "WARNING: PGP versions > 5.0 and < 6.5.8 will automagically "
905 "encrypt to this key and thereby reveal the plaintext to "
906 "the owner of this ARR key. Detailed info follows:\n",
907 type
, (unsigned)length
);
913 fprintf (listfp
, "\t%s%ssubpkt %d len %u (", /*)*/
914 critical
? "critical ":"",
915 hashed
? "hashed ":"", type
, (unsigned)length
);
916 if( length
> buflen
) {
917 fprintf (listfp
, "too short: buffer is only %u)\n", (unsigned)buflen
);
921 case SIGSUBPKT_SIG_CREATED
:
923 fprintf (listfp
, "sig created %s", strtimestamp( buffer_to_u32(buffer
) ) );
925 case SIGSUBPKT_SIG_EXPIRE
:
928 if(buffer_to_u32(buffer
))
929 fprintf (listfp
, "sig expires after %s",
930 strtimevalue( buffer_to_u32(buffer
) ) );
932 fprintf (listfp
, "sig does not expire");
935 case SIGSUBPKT_EXPORTABLE
:
937 fprintf (listfp
, "%sexportable", *buffer
? "":"not ");
939 case SIGSUBPKT_TRUST
:
941 p
="[invalid trust subpacket]";
943 fprintf (listfp
, "trust signature of depth %d, value %d",buffer
[0],buffer
[1]);
945 case SIGSUBPKT_REGEXP
:
947 p
="[invalid regexp subpacket]";
949 fprintf (listfp
, "regular expression: \"%s\"",buffer
);
951 case SIGSUBPKT_REVOCABLE
:
953 fprintf (listfp
, "%srevocable", *buffer
? "":"not ");
955 case SIGSUBPKT_KEY_EXPIRE
:
958 if(buffer_to_u32(buffer
))
959 fprintf (listfp
, "key expires after %s",
960 strtimevalue( buffer_to_u32(buffer
) ) );
962 fprintf (listfp
, "key does not expire");
965 case SIGSUBPKT_PREF_SYM
:
966 fputs("pref-sym-algos:", listfp
);
967 for( i
=0; i
< length
; i
++ )
968 fprintf (listfp
, " %d", buffer
[i
] );
970 case SIGSUBPKT_REV_KEY
:
971 fputs("revocation key: ", listfp
);
975 fprintf (listfp
, "c=%02x a=%d f=", buffer
[0], buffer
[1] );
976 for( i
=2; i
< length
; i
++ )
977 fprintf (listfp
, "%02X", buffer
[i
] );
980 case SIGSUBPKT_ISSUER
:
982 fprintf (listfp
, "issuer key ID %08lX%08lX",
983 (ulong
)buffer_to_u32(buffer
),
984 (ulong
)buffer_to_u32(buffer
+4) );
986 case SIGSUBPKT_NOTATION
:
988 fputs("notation: ", listfp
);
992 const byte
*s
= buffer
;
995 n1
= (s
[4] << 8) | s
[5];
996 n2
= (s
[6] << 8) | s
[7];
998 if( 8+n1
+n2
!= length
)
1001 print_string( listfp
, s
, n1
, ')' );
1002 putc( '=', listfp
);
1004 if( *buffer
& 0x80 )
1005 print_string( listfp
, s
+n1
, n2
, ')' );
1007 p
= "[not human readable]";
1012 case SIGSUBPKT_PREF_HASH
:
1013 fputs("pref-hash-algos:", listfp
);
1014 for( i
=0; i
< length
; i
++ )
1015 fprintf (listfp
, " %d", buffer
[i
] );
1017 case SIGSUBPKT_PREF_COMPR
:
1018 fputs("pref-zip-algos:", listfp
);
1019 for( i
=0; i
< length
; i
++ )
1020 fprintf (listfp
, " %d", buffer
[i
] );
1022 case SIGSUBPKT_KS_FLAGS
:
1023 fputs("key server preferences:",listfp
);
1024 for(i
=0;i
<length
;i
++)
1025 fprintf (listfp
, " %02X", buffer
[i
]);
1027 case SIGSUBPKT_PREF_KS
:
1028 fputs("preferred key server: ", listfp
);
1029 print_string( listfp
, buffer
, length
, ')' );
1031 case SIGSUBPKT_PRIMARY_UID
:
1032 p
= "primary user ID";
1034 case SIGSUBPKT_POLICY
:
1035 fputs("policy: ", listfp
);
1036 print_string( listfp
, buffer
, length
, ')' );
1038 case SIGSUBPKT_KEY_FLAGS
:
1039 fputs ( "key flags:", listfp
);
1040 for( i
=0; i
< length
; i
++ )
1041 fprintf (listfp
, " %02X", buffer
[i
] );
1043 case SIGSUBPKT_SIGNERS_UID
:
1044 p
= "signer's user ID";
1046 case SIGSUBPKT_REVOC_REASON
:
1048 fprintf (listfp
, "revocation reason 0x%02x (", *buffer
);
1049 print_string( listfp
, buffer
+1, length
-1, ')' );
1054 fputs("Big Brother's key (ignored): ", listfp
);
1058 fprintf (listfp
, "c=%02x a=%d f=", buffer
[0], buffer
[1] );
1059 for( i
=2; i
< length
; i
++ )
1060 fprintf (listfp
, "%02X", buffer
[i
] );
1063 case SIGSUBPKT_FEATURES
:
1064 fputs ( "features:", listfp
);
1065 for( i
=0; i
< length
; i
++ )
1066 fprintf (listfp
, " %02x", buffer
[i
] );
1068 case SIGSUBPKT_SIGNATURE
:
1069 fputs("signature: ",listfp
);
1073 fprintf (listfp
, "v%d, class 0x%02X, algo %d, digest algo %d",
1075 buffer
[0]==3?buffer
[2]:buffer
[1],
1076 buffer
[0]==3?buffer
[15]:buffer
[2],
1077 buffer
[0]==3?buffer
[16]:buffer
[3]);
1080 if(type
>=100 && type
<=110)
1081 p
="experimental / private subpacket";
1087 fprintf (listfp
, "%s)\n", p
? p
: "");
1091 * Returns: >= 0 use this offset into buffer
1092 * -1 explicitly reject returning this type
1093 * -2 subpacket too short
1096 parse_one_sig_subpkt( const byte
*buffer
, size_t n
, int type
)
1100 case SIGSUBPKT_REV_KEY
:
1104 case SIGSUBPKT_SIG_CREATED
:
1105 case SIGSUBPKT_SIG_EXPIRE
:
1106 case SIGSUBPKT_KEY_EXPIRE
:
1110 case SIGSUBPKT_KEY_FLAGS
:
1111 case SIGSUBPKT_KS_FLAGS
:
1112 case SIGSUBPKT_PREF_SYM
:
1113 case SIGSUBPKT_PREF_HASH
:
1114 case SIGSUBPKT_PREF_COMPR
:
1115 case SIGSUBPKT_POLICY
:
1116 case SIGSUBPKT_PREF_KS
:
1117 case SIGSUBPKT_FEATURES
:
1118 case SIGSUBPKT_REGEXP
:
1120 case SIGSUBPKT_SIGNATURE
:
1121 case SIGSUBPKT_EXPORTABLE
:
1122 case SIGSUBPKT_REVOCABLE
:
1123 case SIGSUBPKT_REVOC_REASON
:
1127 case SIGSUBPKT_ISSUER
: /* issuer key ID */
1131 case SIGSUBPKT_NOTATION
:
1132 /* minimum length needed, and the subpacket must be well-formed
1133 where the name length and value length all fit inside the
1135 if(n
<8 || 8+((buffer
[4]<<8)|buffer
[5])+((buffer
[6]<<8)|buffer
[7]) != n
)
1138 case SIGSUBPKT_PRIMARY_UID
:
1142 case SIGSUBPKT_TRUST
:
1151 /* Not many critical notations we understand yet... */
1153 can_handle_critical_notation(const byte
*name
,size_t len
)
1155 if(len
==32 && memcmp(name
,"preferred-email-encoding@pgp.com",32)==0)
1157 if(len
==21 && memcmp(name
,"pka-address@gnupg.org",21)==0)
1164 can_handle_critical( const byte
*buffer
, size_t n
, int type
)
1168 case SIGSUBPKT_NOTATION
:
1170 return can_handle_critical_notation(buffer
+8,(buffer
[4]<<8)|buffer
[5]);
1173 case SIGSUBPKT_SIGNATURE
:
1174 case SIGSUBPKT_SIG_CREATED
:
1175 case SIGSUBPKT_SIG_EXPIRE
:
1176 case SIGSUBPKT_KEY_EXPIRE
:
1177 case SIGSUBPKT_EXPORTABLE
:
1178 case SIGSUBPKT_REVOCABLE
:
1179 case SIGSUBPKT_REV_KEY
:
1180 case SIGSUBPKT_ISSUER
:/* issuer key ID */
1181 case SIGSUBPKT_PREF_SYM
:
1182 case SIGSUBPKT_PREF_HASH
:
1183 case SIGSUBPKT_PREF_COMPR
:
1184 case SIGSUBPKT_KEY_FLAGS
:
1185 case SIGSUBPKT_PRIMARY_UID
:
1186 case SIGSUBPKT_FEATURES
:
1187 case SIGSUBPKT_TRUST
:
1188 case SIGSUBPKT_REGEXP
:
1189 /* Is it enough to show the policy or keyserver? */
1190 case SIGSUBPKT_POLICY
:
1191 case SIGSUBPKT_PREF_KS
:
1201 enum_sig_subpkt( const subpktarea_t
*pktbuf
, sigsubpkttype_t reqtype
,
1202 size_t *ret_n
, int *start
, int *critical
)
1211 int reqseq
= start
? *start
: 0;
1214 critical
=&critical_dummy
;
1216 if( !pktbuf
|| reqseq
== -1 ) {
1217 /* return some value different from NULL to indicate that
1218 * there is no critical bit we do not understand. The caller
1219 * will never use the value. Yes I know, it is an ugly hack */
1220 return reqtype
== SIGSUBPKT_TEST_CRITICAL
? (const byte
*)&pktbuf
: NULL
;
1222 buffer
= pktbuf
->data
;
1223 buflen
= pktbuf
->len
;
1225 n
= *buffer
++; buflen
--;
1226 if( n
== 255 ) { /* 4 byte length header */
1229 n
= (buffer
[0] << 24) | (buffer
[1] << 16)
1230 | (buffer
[2] << 8) | buffer
[3];
1234 else if( n
>= 192 ) { /* 2 byte special encoded length header */
1237 n
= (( n
- 192 ) << 8) + *buffer
+ 192;
1250 if( !(++seq
> reqseq
) )
1252 else if( reqtype
== SIGSUBPKT_TEST_CRITICAL
) {
1254 if( n
-1 > buflen
+1 )
1256 if( !can_handle_critical(buffer
+1, n
-1, type
) )
1259 log_info(_("subpacket of type %d has "
1260 "critical bit set\n"),type
);
1263 return NULL
; /* this is an error */
1267 else if( reqtype
< 0 ) /* list packets */
1268 dump_sig_subpkt( reqtype
== SIGSUBPKT_LIST_HASHED
,
1269 type
, *critical
, buffer
, buflen
, n
);
1270 else if( type
== reqtype
) { /* found */
1277 offset
= parse_one_sig_subpkt(buffer
, n
, type
);
1280 log_error("subpacket of type %d too short\n", type
);
1289 return buffer
+offset
;
1291 buffer
+= n
; buflen
-=n
;
1293 if( reqtype
== SIGSUBPKT_TEST_CRITICAL
)
1294 return buffer
; /* as value true to indicate that there is no */
1295 /* critical bit we don't understand */
1298 return NULL
; /* end of packets; not found */
1302 log_info("buffer shorter than subpacket\n");
1310 parse_sig_subpkt (const subpktarea_t
*buffer
, sigsubpkttype_t reqtype
,
1313 return enum_sig_subpkt( buffer
, reqtype
, ret_n
, NULL
, NULL
);
1317 parse_sig_subpkt2 (PKT_signature
*sig
, sigsubpkttype_t reqtype
,
1322 p
= parse_sig_subpkt (sig
->hashed
, reqtype
, ret_n
);
1324 p
= parse_sig_subpkt (sig
->unhashed
, reqtype
, ret_n
);
1328 /* Find all revocation keys. Look in hashed area only. */
1329 void parse_revkeys(PKT_signature
*sig
)
1331 struct revocation_key
*revkey
;
1335 if(sig
->sig_class
!=0x1F)
1339 (struct revocation_key
*)enum_sig_subpkt(sig
->hashed
,
1343 if(len
==sizeof(struct revocation_key
) &&
1344 (revkey
->class&0x80)) /* 0x80 bit must be set */
1346 sig
->revkey
=xrealloc(sig
->revkey
,
1347 sizeof(struct revocation_key
*)*(sig
->numrevkeys
+1));
1348 sig
->revkey
[sig
->numrevkeys
]=revkey
;
1355 parse_signature( IOBUF inp
, int pkttype
, unsigned long pktlen
,
1356 PKT_signature
*sig
)
1365 log_error("packet(%d) too short\n", pkttype
);
1368 sig
->version
= iobuf_get_noeof(inp
); pktlen
--;
1369 if( sig
->version
== 4 )
1371 else if( sig
->version
!= 2 && sig
->version
!= 3 ) {
1372 log_error("packet(%d) with unknown version %d\n",
1373 pkttype
, sig
->version
);
1374 rc
= gpg_error (GPG_ERR_INV_PACKET
);
1379 md5_len
= iobuf_get_noeof(inp
); pktlen
--;
1381 sig
->sig_class
= iobuf_get_noeof(inp
); pktlen
--;
1383 sig
->timestamp
= read_32(inp
); pktlen
-= 4;
1384 sig
->keyid
[0] = read_32(inp
); pktlen
-= 4;
1385 sig
->keyid
[1] = read_32(inp
); pktlen
-= 4;
1387 sig
->pubkey_algo
= iobuf_get_noeof(inp
); pktlen
--;
1388 sig
->digest_algo
= iobuf_get_noeof(inp
); pktlen
--;
1389 sig
->flags
.exportable
=1;
1390 sig
->flags
.revocable
=1;
1391 if( is_v4
) { /* read subpackets */
1392 n
= read_16(inp
); pktlen
-= 2; /* length of hashed data */
1394 log_error("signature packet: hashed data too long\n");
1395 rc
= G10ERR_INVALID_PACKET
;
1399 sig
->hashed
= xmalloc (sizeof (*sig
->hashed
) + n
- 1 );
1400 sig
->hashed
->size
= n
;
1401 sig
->hashed
->len
= n
;
1402 if( iobuf_read (inp
, sig
->hashed
->data
, n
) != n
) {
1403 log_error ("premature eof while reading "
1404 "hashed signature data\n");
1410 n
= read_16(inp
); pktlen
-= 2; /* length of unhashed data */
1412 log_error("signature packet: unhashed data too long\n");
1413 rc
= G10ERR_INVALID_PACKET
;
1417 sig
->unhashed
= xmalloc (sizeof(*sig
->unhashed
) + n
- 1 );
1418 sig
->unhashed
->size
= n
;
1419 sig
->unhashed
->len
= n
;
1420 if( iobuf_read(inp
, sig
->unhashed
->data
, n
) != n
) {
1421 log_error("premature eof while reading "
1422 "unhashed signature data\n");
1430 if( pktlen
< 5 ) { /* sanity check */
1431 log_error("packet(%d) too short\n", pkttype
);
1432 rc
= G10ERR_INVALID_PACKET
;
1436 sig
->digest_start
[0] = iobuf_get_noeof(inp
); pktlen
--;
1437 sig
->digest_start
[1] = iobuf_get_noeof(inp
); pktlen
--;
1439 if( is_v4
&& sig
->pubkey_algo
)
1440 { /*extract required information */
1444 /* set sig->flags.unknown_critical if there is a
1445 * critical bit set for packets which we do not understand */
1446 if( !parse_sig_subpkt (sig
->hashed
, SIGSUBPKT_TEST_CRITICAL
, NULL
)
1447 || !parse_sig_subpkt (sig
->unhashed
, SIGSUBPKT_TEST_CRITICAL
,
1449 sig
->flags
.unknown_critical
= 1;
1451 p
= parse_sig_subpkt (sig
->hashed
, SIGSUBPKT_SIG_CREATED
, NULL
);
1453 sig
->timestamp
= buffer_to_u32(p
);
1454 else if(!(sig
->pubkey_algo
>=100 && sig
->pubkey_algo
<=110)
1456 log_info ("signature packet without timestamp\n");
1458 p
= parse_sig_subpkt2( sig
, SIGSUBPKT_ISSUER
, NULL
);
1461 sig
->keyid
[0] = buffer_to_u32(p
);
1462 sig
->keyid
[1] = buffer_to_u32(p
+4);
1464 else if(!(sig
->pubkey_algo
>=100 && sig
->pubkey_algo
<=110)
1466 log_info ("signature packet without keyid\n");
1468 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_SIG_EXPIRE
,NULL
);
1469 if(p
&& buffer_to_u32(p
))
1470 sig
->expiredate
=sig
->timestamp
+buffer_to_u32(p
);
1471 if(sig
->expiredate
&& sig
->expiredate
<=make_timestamp())
1472 sig
->flags
.expired
=1;
1474 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_POLICY
,NULL
);
1476 sig
->flags
.policy_url
=1;
1478 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_PREF_KS
,NULL
);
1480 sig
->flags
.pref_ks
=1;
1482 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_NOTATION
,NULL
);
1484 sig
->flags
.notation
=1;
1486 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_REVOCABLE
,NULL
);
1488 sig
->flags
.revocable
=0;
1490 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_TRUST
,&len
);
1493 sig
->trust_depth
=p
[0];
1494 sig
->trust_value
=p
[1];
1496 /* Only look for a regexp if there is also a trust
1499 parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_REGEXP
,&len
);
1501 /* If the regular expression is of 0 length, there is no
1502 regular expression. */
1504 sig
->trust_regexp
=NULL
;
1507 /* We accept the exportable subpacket from either the hashed
1508 or unhashed areas as older versions of gpg put it in the
1509 unhashed area. In theory, anyway, we should never see this
1510 packet off of a local keyring. */
1512 p
=parse_sig_subpkt2(sig
,SIGSUBPKT_EXPORTABLE
,NULL
);
1514 sig
->flags
.exportable
=0;
1516 /* Find all revocation keys. */
1517 if(sig
->sig_class
==0x1F)
1522 fprintf (listfp
, ":signature packet: algo %d, keyid %08lX%08lX\n"
1523 "\tversion %d, created %lu, md5len %d, sigclass 0x%02x\n"
1524 "\tdigest algo %d, begin of digest %02x %02x\n",
1526 (ulong
)sig
->keyid
[0], (ulong
)sig
->keyid
[1],
1527 sig
->version
, (ulong
)sig
->timestamp
, md5_len
, sig
->sig_class
,
1529 sig
->digest_start
[0], sig
->digest_start
[1] );
1531 parse_sig_subpkt (sig
->hashed
, SIGSUBPKT_LIST_HASHED
, NULL
);
1532 parse_sig_subpkt (sig
->unhashed
, SIGSUBPKT_LIST_UNHASHED
, NULL
);
1536 ndata
= pubkey_get_nsig(sig
->pubkey_algo
);
1539 fprintf (listfp
, "\tunknown algorithm %d\n", sig
->pubkey_algo
);
1540 unknown_pubkey_warning( sig
->pubkey_algo
);
1541 /* We store the plain material in data[0], so that we are able
1542 * to write it back with build_packet() */
1543 if (pktlen
> (5 * MAX_EXTERN_MPI_BITS
/8))
1545 /* However we include a limit to avoid too trivial DoS
1546 attacks by having gpg allocate too much memory. */
1547 log_error ("signature packet: too much data\n");
1548 rc
= G10ERR_INVALID_PACKET
;
1552 sig
->data
[0]= gcry_mpi_set_opaque (NULL
, read_rest(inp
, pktlen
, 0),
1558 for( i
=0; i
< ndata
; i
++ ) {
1560 sig
->data
[i
] = mpi_read(inp
, &n
, 0 );
1563 fprintf (listfp
, "\tdata: ");
1564 mpi_print(listfp
, sig
->data
[i
], mpi_print_mode
);
1565 putc ('\n', listfp
);
1568 rc
= G10ERR_INVALID_PACKET
;
1573 iobuf_skip_rest(inp
, pktlen
, 0);
1579 parse_onepass_sig( IOBUF inp
, int pkttype
, unsigned long pktlen
,
1580 PKT_onepass_sig
*ops
)
1586 log_error("packet(%d) too short\n", pkttype
);
1587 rc
= gpg_error (GPG_ERR_INV_PACKET
);
1590 version
= iobuf_get_noeof(inp
); pktlen
--;
1591 if( version
!= 3 ) {
1592 log_error("onepass_sig with unknown version %d\n", version
);
1593 rc
= gpg_error (GPG_ERR_INV_PACKET
);
1596 ops
->sig_class
= iobuf_get_noeof(inp
); pktlen
--;
1597 ops
->digest_algo
= iobuf_get_noeof(inp
); pktlen
--;
1598 ops
->pubkey_algo
= iobuf_get_noeof(inp
); pktlen
--;
1599 ops
->keyid
[0] = read_32(inp
); pktlen
-= 4;
1600 ops
->keyid
[1] = read_32(inp
); pktlen
-= 4;
1601 ops
->last
= iobuf_get_noeof(inp
); pktlen
--;
1604 ":onepass_sig packet: keyid %08lX%08lX\n"
1605 "\tversion %d, sigclass 0x%02x, digest %d, pubkey %d, "
1607 (ulong
)ops
->keyid
[0], (ulong
)ops
->keyid
[1],
1608 version
, ops
->sig_class
,
1609 ops
->digest_algo
, ops
->pubkey_algo
, ops
->last
);
1613 iobuf_skip_rest(inp
, pktlen
, 0);
1619 read_protected_v3_mpi (IOBUF inp
, unsigned long *length
)
1622 unsigned int nbits
, nbytes
;
1623 unsigned char *buf
, *p
;
1628 log_error ("mpi too small\n");
1632 if ((c
=iobuf_get (inp
)) == -1)
1636 if ((c
=iobuf_get(inp
)) == -1)
1643 log_error ("mpi too large (%u bits)\n", nbits
);
1646 nbytes
= (nbits
+7) / 8;
1647 buf
= p
= xmalloc (2 + nbytes
);
1650 for (; nbytes
&& *length
; nbytes
--, --*length
)
1651 *p
++ = iobuf_get (inp
);
1654 log_error ("packet shorter than mpi\n");
1659 /* convert buffer into an opaque MPI */
1660 val
= gcry_mpi_set_opaque (NULL
, buf
, (p
-buf
)*8);
1666 parse_key (IOBUF inp
, int pkttype
, unsigned long pktlen
,
1667 byte
*hdr
, int hdrlen
, PACKET
*pkt
)
1669 int i
, version
, algorithm
;
1671 unsigned long timestamp
, expiredate
, max_expiredate
;
1678 version
= iobuf_get_noeof(inp
); pktlen
--;
1679 if( pkttype
== PKT_PUBLIC_SUBKEY
&& version
== '#' ) {
1680 /* early versions of G10 use old PGP comments packets;
1681 * luckily all those comments are started by a hash */
1683 fprintf (listfp
, ":rfc1991 comment packet: \"" );
1684 for( ; pktlen
; pktlen
-- ) {
1686 c
= iobuf_get_noeof(inp
);
1687 if( c
>= ' ' && c
<= 'z' )
1690 fprintf (listfp
, "\\x%02x", c
);
1692 fprintf (listfp
, "\"\n");
1694 iobuf_skip_rest(inp
, pktlen
, 0);
1697 else if( version
== 4 )
1699 else if( version
!= 2 && version
!= 3 ) {
1700 log_error("packet(%d) with unknown version %d\n", pkttype
, version
);
1701 rc
= gpg_error (GPG_ERR_INV_PACKET
);
1706 log_error("packet(%d) too short\n", pkttype
);
1707 rc
= gpg_error (GPG_ERR_INV_PACKET
);
1711 timestamp
= read_32(inp
); pktlen
-= 4;
1713 expiredate
= 0; /* have to get it from the selfsignature */
1717 unsigned short ndays
;
1718 ndays
= read_16(inp
); pktlen
-= 2;
1720 expiredate
= timestamp
+ ndays
* 86400L;
1724 max_expiredate
=expiredate
;
1726 algorithm
= iobuf_get_noeof(inp
); pktlen
--;
1728 fprintf (listfp
, ":%s key packet:\n"
1729 "\tversion %d, algo %d, created %lu, expires %lu\n",
1730 pkttype
== PKT_PUBLIC_KEY
? "public" :
1731 pkttype
== PKT_SECRET_KEY
? "secret" :
1732 pkttype
== PKT_PUBLIC_SUBKEY
? "public sub" :
1733 pkttype
== PKT_SECRET_SUBKEY
? "secret sub" : "??",
1734 version
, algorithm
, timestamp
, expiredate
);
1736 if( pkttype
== PKT_SECRET_KEY
|| pkttype
== PKT_SECRET_SUBKEY
) {
1737 PKT_secret_key
*sk
= pkt
->pkt
.secret_key
;
1739 sk
->timestamp
= timestamp
;
1740 sk
->expiredate
= expiredate
;
1741 sk
->max_expiredate
= max_expiredate
;
1742 sk
->hdrbytes
= hdrlen
;
1743 sk
->version
= version
;
1744 sk
->is_primary
= pkttype
== PKT_SECRET_KEY
;
1745 sk
->pubkey_algo
= algorithm
;
1747 sk
->pubkey_usage
= 0; /* not yet used */
1750 PKT_public_key
*pk
= pkt
->pkt
.public_key
;
1752 pk
->timestamp
= timestamp
;
1753 pk
->expiredate
= expiredate
;
1754 pk
->max_expiredate
= max_expiredate
;
1755 pk
->hdrbytes
= hdrlen
;
1756 pk
->version
= version
;
1757 pk
->is_primary
= pkttype
== PKT_PUBLIC_KEY
;
1758 pk
->pubkey_algo
= algorithm
;
1760 pk
->pubkey_usage
= 0; /* not yet used */
1762 pk
->is_disabled
= 0;
1766 nskey
= pubkey_get_nskey( algorithm
);
1767 npkey
= pubkey_get_npkey( algorithm
);
1770 fprintf (listfp
, "\tunknown algorithm %d\n", algorithm
);
1771 unknown_pubkey_warning( algorithm
);
1775 if( pkttype
== PKT_SECRET_KEY
|| pkttype
== PKT_SECRET_SUBKEY
) {
1776 PKT_secret_key
*sk
= pkt
->pkt
.secret_key
;
1781 sk
->skey
[0] = gcry_mpi_set_opaque (NULL
, read_rest(inp
, pktlen
, 0),
1787 for(i
=0; i
< npkey
; i
++ ) {
1788 n
= pktlen
; sk
->skey
[i
] = mpi_read(inp
, &n
, 0 ); pktlen
-=n
;
1790 fprintf (listfp
, "\tskey[%d]: ", i
);
1791 mpi_print(listfp
, sk
->skey
[i
], mpi_print_mode
);
1792 putc ('\n', listfp
);
1795 rc
= G10ERR_INVALID_PACKET
;
1797 if (rc
) /* one of the MPIs were bad */
1799 sk
->protect
.algo
= iobuf_get_noeof(inp
); pktlen
--;
1800 sk
->protect
.sha1chk
= 0;
1801 if( sk
->protect
.algo
) {
1802 sk
->is_protected
= 1;
1803 sk
->protect
.s2k
.count
= 0;
1804 if( sk
->protect
.algo
== 254 || sk
->protect
.algo
== 255 ) {
1806 rc
= G10ERR_INVALID_PACKET
;
1809 sk
->protect
.sha1chk
= (sk
->protect
.algo
== 254);
1810 sk
->protect
.algo
= iobuf_get_noeof(inp
); pktlen
--;
1811 /* Note that a sk->protect.algo > 110 is illegal, but
1812 I'm not erroring on it here as otherwise there
1813 would be no way to delete such a key. */
1814 sk
->protect
.s2k
.mode
= iobuf_get_noeof(inp
); pktlen
--;
1815 sk
->protect
.s2k
.hash_algo
= iobuf_get_noeof(inp
); pktlen
--;
1816 /* check for the special GNU extension */
1817 if( is_v4
&& sk
->protect
.s2k
.mode
== 101 ) {
1818 for(i
=0; i
< 4 && pktlen
; i
++, pktlen
-- )
1819 temp
[i
] = iobuf_get_noeof(inp
);
1820 if( i
< 4 || memcmp( temp
, "GNU", 3 ) ) {
1822 fprintf (listfp
, "\tunknown S2K %d\n",
1823 sk
->protect
.s2k
.mode
);
1824 rc
= G10ERR_INVALID_PACKET
;
1827 /* here we know that it is a gnu extension
1828 * What follows is the GNU protection mode:
1829 * All values have special meanings
1830 * and they are mapped in the mode with a base of 1000.
1832 sk
->protect
.s2k
.mode
= 1000 + temp
[3];
1834 switch( sk
->protect
.s2k
.mode
) {
1837 for(i
=0; i
< 8 && pktlen
; i
++, pktlen
-- )
1838 temp
[i
] = iobuf_get_noeof(inp
);
1839 memcpy(sk
->protect
.s2k
.salt
, temp
, 8 );
1842 switch( sk
->protect
.s2k
.mode
) {
1843 case 0: if( list_mode
) fprintf (listfp
, "\tsimple S2K" );
1845 case 1: if( list_mode
) fprintf (listfp
, "\tsalted S2K" );
1847 case 3: if( list_mode
) fprintf (listfp
, "\titer+salt S2K" );
1849 case 1001: if( list_mode
) fprintf (listfp
,
1850 "\tgnu-dummy S2K" );
1852 case 1002: if (list_mode
) fprintf (listfp
,
1853 "\tgnu-divert-to-card S2K");
1857 fprintf (listfp
, "\tunknown %sS2K %d\n",
1858 sk
->protect
.s2k
.mode
< 1000? "":"GNU ",
1859 sk
->protect
.s2k
.mode
);
1860 rc
= G10ERR_INVALID_PACKET
;
1865 fprintf (listfp
, ", algo: %d,%s hash: %d",
1867 sk
->protect
.sha1chk
?" SHA1 protection,"
1868 :" simple checksum,",
1869 sk
->protect
.s2k
.hash_algo
);
1870 if( sk
->protect
.s2k
.mode
== 1
1871 || sk
->protect
.s2k
.mode
== 3 ) {
1872 fprintf (listfp
, ", salt: ");
1873 for(i
=0; i
< 8; i
++ )
1874 fprintf (listfp
, "%02x", sk
->protect
.s2k
.salt
[i
]);
1876 putc ('\n', listfp
);
1879 if( sk
->protect
.s2k
.mode
== 3 ) {
1881 rc
= G10ERR_INVALID_PACKET
;
1884 sk
->protect
.s2k
.count
= iobuf_get(inp
);
1887 fprintf (listfp
, "\tprotect count: %lu\n",
1888 (ulong
)sk
->protect
.s2k
.count
);
1890 else if( sk
->protect
.s2k
.mode
== 1002 ) {
1891 /* Read the serial number. */
1893 rc
= G10ERR_INVALID_PACKET
;
1896 snlen
= iobuf_get (inp
);
1898 if (pktlen
< snlen
|| snlen
== -1) {
1899 rc
= G10ERR_INVALID_PACKET
;
1904 /* Note that a sk->protect.algo > 110 is illegal, but I'm
1905 not erroring on it here as otherwise there would be no
1906 way to delete such a key. */
1907 else { /* old version; no S2K, so we set mode to 0, hash MD5 */
1908 sk
->protect
.s2k
.mode
= 0;
1909 sk
->protect
.s2k
.hash_algo
= DIGEST_ALGO_MD5
;
1911 fprintf (listfp
, "\tprotect algo: %d (hash algo: %d)\n",
1912 sk
->protect
.algo
, sk
->protect
.s2k
.hash_algo
);
1914 /* It is really ugly that we don't know the size
1915 * of the IV here in cases we are not aware of the algorithm.
1917 * sk->protect.ivlen = cipher_get_blocksize(sk->protect.algo);
1918 * won't work. The only solution I see is to hardwire it.
1919 * NOTE: if you change the ivlen above 16, don't forget to
1922 sk
->protect
.ivlen
= openpgp_cipher_blocklen (sk
->protect
.algo
);
1923 assert (sk
->protect
.ivlen
<= sizeof (temp
));
1925 if( sk
->protect
.s2k
.mode
== 1001 )
1926 sk
->protect
.ivlen
= 0;
1927 else if( sk
->protect
.s2k
.mode
== 1002 )
1928 sk
->protect
.ivlen
= snlen
< 16? snlen
: 16;
1930 if( pktlen
< sk
->protect
.ivlen
) {
1931 rc
= G10ERR_INVALID_PACKET
;
1934 for(i
=0; i
< sk
->protect
.ivlen
&& pktlen
; i
++, pktlen
-- )
1935 temp
[i
] = iobuf_get_noeof(inp
);
1938 sk
->protect
.s2k
.mode
== 1002? "\tserial-number: "
1939 : "\tprotect IV: ");
1940 for(i
=0; i
< sk
->protect
.ivlen
; i
++ )
1941 fprintf (listfp
, " %02x", temp
[i
] );
1942 putc ('\n', listfp
);
1944 memcpy(sk
->protect
.iv
, temp
, sk
->protect
.ivlen
);
1947 sk
->is_protected
= 0;
1948 /* It does not make sense to read it into secure memory.
1949 * If the user is so careless, not to protect his secret key,
1950 * we can assume, that he operates an open system :=(.
1951 * So we put the key into secure memory when we unprotect it. */
1952 if( sk
->protect
.s2k
.mode
== 1001
1953 || sk
->protect
.s2k
.mode
== 1002 ) {
1954 /* better set some dummy stuff here */
1955 sk
->skey
[npkey
] = gcry_mpi_set_opaque(NULL
,
1956 xstrdup("dummydata"), 10*8);
1959 else if( is_v4
&& sk
->is_protected
) {
1960 /* ugly; the length is encrypted too, so we read all
1961 * stuff up to the end of the packet into the first
1963 sk
->skey
[npkey
] = gcry_mpi_set_opaque (NULL
,
1964 read_rest(inp
, pktlen
, 0),
1968 fprintf (listfp
, "\tencrypted stuff follows\n");
1971 else { /* v3 method: the mpi length is not encrypted */
1972 for(i
=npkey
; i
< nskey
; i
++ ) {
1973 if ( sk
->is_protected
) {
1974 sk
->skey
[i
] = read_protected_v3_mpi (inp
, &pktlen
);
1976 fprintf (listfp
, "\tskey[%d]: [encrypted]\n", i
);
1980 sk
->skey
[i
] = mpi_read(inp
, &n
, 0 );
1983 fprintf (listfp
, "\tskey[%d]: ", i
);
1984 mpi_print(listfp
, sk
->skey
[i
], mpi_print_mode
);
1985 putc ('\n', listfp
);
1990 rc
= G10ERR_INVALID_PACKET
;
1995 sk
->csum
= read_16(inp
); pktlen
-= 2;
1997 fprintf (listfp
, "\tchecksum: %04hx\n", sk
->csum
);
2002 PKT_public_key
*pk
= pkt
->pkt
.public_key
;
2005 pk
->pkey
[0] = gcry_mpi_set_opaque ( NULL
,
2006 read_rest(inp
, pktlen
, 0),
2012 for(i
=0; i
< npkey
; i
++ ) {
2013 n
= pktlen
; pk
->pkey
[i
] = mpi_read(inp
, &n
, 0 ); pktlen
-=n
;
2015 fprintf (listfp
, "\tpkey[%d]: ", i
);
2016 mpi_print(listfp
, pk
->pkey
[i
], mpi_print_mode
);
2017 putc ('\n', listfp
);
2020 rc
= G10ERR_INVALID_PACKET
;
2027 iobuf_skip_rest(inp
, pktlen
, 0);
2031 /* Attribute subpackets have the same format as v4 signature
2032 subpackets. This is not part of OpenPGP, but is done in several
2033 versions of PGP nevertheless. */
2035 parse_attribute_subpkts(PKT_user_id
*uid
)
2039 struct user_attribute
*attribs
=NULL
;
2040 const byte
*buffer
=uid
->attrib_data
;
2041 int buflen
=uid
->attrib_len
;
2044 xfree(uid
->attribs
);
2048 n
= *buffer
++; buflen
--;
2049 if( n
== 255 ) { /* 4 byte length header */
2052 n
= (buffer
[0] << 24) | (buffer
[1] << 16)
2053 | (buffer
[2] << 8) | buffer
[3];
2057 else if( n
>= 192 ) { /* 2 byte special encoded length header */
2060 n
= (( n
- 192 ) << 8) + *buffer
+ 192;
2067 attribs
=xrealloc(attribs
,(count
+1)*sizeof(struct user_attribute
));
2068 memset(&attribs
[count
],0,sizeof(struct user_attribute
));
2075 attribs
[count
].type
=type
;
2076 attribs
[count
].data
=buffer
;
2077 attribs
[count
].len
=n
;
2083 uid
->attribs
=attribs
;
2084 uid
->numattribs
=count
;
2089 log_info("buffer shorter than attribute subpacket\n");
2090 uid
->attribs
=attribs
;
2091 uid
->numattribs
=count
;
2097 parse_user_id( IOBUF inp
, int pkttype
, unsigned long pktlen
, PACKET
*packet
)
2101 /* Cap the size of a user ID at 2k: a value absurdly large enough
2102 that there is no sane user ID string (which is printable text
2103 as of RFC2440bis) that won't fit in it, but yet small enough to
2104 avoid allocation problems. A large pktlen may not be
2105 allocatable, and a very large pktlen could actually cause our
2106 allocation to wrap around in xmalloc to a small number. */
2110 log_error ("packet(%d) too large\n", pkttype
);
2111 iobuf_skip_rest(inp
, pktlen
, 0);
2112 return G10ERR_INVALID_PACKET
;
2115 packet
->pkt
.user_id
= xmalloc_clear(sizeof *packet
->pkt
.user_id
+ pktlen
);
2116 packet
->pkt
.user_id
->len
= pktlen
;
2117 packet
->pkt
.user_id
->ref
=1;
2119 p
= packet
->pkt
.user_id
->name
;
2120 for( ; pktlen
; pktlen
--, p
++ )
2121 *p
= iobuf_get_noeof(inp
);
2125 int n
= packet
->pkt
.user_id
->len
;
2126 fprintf (listfp
, ":user ID packet: \"");
2127 /* fixme: Hey why don't we replace this with print_string?? */
2128 for(p
=packet
->pkt
.user_id
->name
; n
; p
++, n
-- ) {
2129 if( *p
>= ' ' && *p
<= 'z' )
2132 fprintf (listfp
, "\\x%02x", *p
);
2134 fprintf (listfp
, "\"\n");
2141 make_attribute_uidname(PKT_user_id
*uid
, size_t max_namelen
)
2143 assert ( max_namelen
> 70 );
2144 if(uid
->numattribs
<=0)
2145 sprintf(uid
->name
,"[bad attribute packet of size %lu]",uid
->attrib_len
);
2146 else if(uid
->numattribs
>1)
2147 sprintf(uid
->name
,"[%d attributes of size %lu]",
2148 uid
->numattribs
,uid
->attrib_len
);
2151 /* Only one attribute, so list it as the "user id" */
2153 if(uid
->attribs
->type
==ATTRIB_IMAGE
)
2158 if(parse_image_header(uid
->attribs
,&type
,&len
))
2159 sprintf(uid
->name
,"[%.20s image of size %lu]",
2160 image_type_to_string(type
,1),(ulong
)len
);
2162 sprintf(uid
->name
,"[invalid image]");
2165 sprintf(uid
->name
,"[unknown attribute of size %lu]",
2166 (ulong
)uid
->attribs
->len
);
2169 uid
->len
= strlen(uid
->name
);
2173 parse_attribute( IOBUF inp
, int pkttype
, unsigned long pktlen
, PACKET
*packet
)
2179 #define EXTRA_UID_NAME_SPACE 71
2180 packet
->pkt
.user_id
= xmalloc_clear(sizeof *packet
->pkt
.user_id
2181 + EXTRA_UID_NAME_SPACE
);
2182 packet
->pkt
.user_id
->ref
=1;
2183 packet
->pkt
.user_id
->attrib_data
= xmalloc(pktlen
);
2184 packet
->pkt
.user_id
->attrib_len
= pktlen
;
2186 p
= packet
->pkt
.user_id
->attrib_data
;
2187 for( ; pktlen
; pktlen
--, p
++ )
2188 *p
= iobuf_get_noeof(inp
);
2190 /* Now parse out the individual attribute subpackets. This is
2191 somewhat pointless since there is only one currently defined
2192 attribute type (jpeg), but it is correct by the spec. */
2193 parse_attribute_subpkts(packet
->pkt
.user_id
);
2195 make_attribute_uidname(packet
->pkt
.user_id
, EXTRA_UID_NAME_SPACE
);
2198 fprintf (listfp
, ":attribute packet: %s\n", packet
->pkt
.user_id
->name
);
2205 parse_comment( IOBUF inp
, int pkttype
, unsigned long pktlen
, PACKET
*packet
)
2209 /* Cap comment packet at a reasonable value to avoid an integer
2210 overflow in the malloc below. Comment packets are actually not
2211 anymore define my OpenPGP and we even stopped to use our
2212 private comment packet. */
2215 log_error ("packet(%d) too large\n", pkttype
);
2216 iobuf_skip_rest (inp
, pktlen
, 0);
2217 return G10ERR_INVALID_PACKET
;
2219 packet
->pkt
.comment
= xmalloc(sizeof *packet
->pkt
.comment
+ pktlen
- 1);
2220 packet
->pkt
.comment
->len
= pktlen
;
2221 p
= packet
->pkt
.comment
->data
;
2222 for( ; pktlen
; pktlen
--, p
++ )
2223 *p
= iobuf_get_noeof(inp
);
2226 int n
= packet
->pkt
.comment
->len
;
2227 fprintf (listfp
, ":%scomment packet: \"", pkttype
== PKT_OLD_COMMENT
?
2228 "OpenPGP draft " : "" );
2229 for(p
=packet
->pkt
.comment
->data
; n
; p
++, n
-- ) {
2230 if( *p
>= ' ' && *p
<= 'z' )
2233 fprintf (listfp
, "\\x%02x", *p
);
2235 fprintf (listfp
, "\"\n");
2242 parse_trust( IOBUF inp
, int pkttype
, unsigned long pktlen
, PACKET
*pkt
)
2250 c
= iobuf_get_noeof(inp
);
2252 pkt
->pkt
.ring_trust
= xmalloc( sizeof *pkt
->pkt
.ring_trust
);
2253 pkt
->pkt
.ring_trust
->trustval
= c
;
2254 pkt
->pkt
.ring_trust
->sigcache
= 0;
2255 if (!c
&& pktlen
==1)
2257 c
= iobuf_get_noeof (inp
);
2259 /* we require that bit 7 of the sigcache is 0 (easier eof handling)*/
2261 pkt
->pkt
.ring_trust
->sigcache
= c
;
2264 fprintf (listfp
, ":trust packet: flag=%02x sigcache=%02x\n",
2265 pkt
->pkt
.ring_trust
->trustval
,
2266 pkt
->pkt
.ring_trust
->sigcache
);
2271 fprintf (listfp
, ":trust packet: empty\n");
2273 iobuf_skip_rest (inp
, pktlen
, 0);
2278 parse_plaintext( IOBUF inp
, int pkttype
, unsigned long pktlen
,
2279 PACKET
*pkt
, int new_ctb
, int partial
)
2287 if( !partial
&& pktlen
< 6 ) {
2288 log_error("packet(%d) too short (%lu)\n", pkttype
, (ulong
)pktlen
);
2289 rc
= gpg_error (GPG_ERR_INV_PACKET
);
2292 mode
= iobuf_get_noeof(inp
); if( pktlen
) pktlen
--;
2293 namelen
= iobuf_get_noeof(inp
); if( pktlen
) pktlen
--;
2294 /* Note that namelen will never exceed 255 bytes. */
2295 pt
= pkt
->pkt
.plaintext
= xmalloc(sizeof *pkt
->pkt
.plaintext
+ namelen
-1);
2296 pt
->new_ctb
= new_ctb
;
2298 pt
->namelen
= namelen
;
2299 pt
->is_partial
= partial
;
2301 for( i
=0; pktlen
> 4 && i
< namelen
; pktlen
--, i
++ )
2302 pt
->name
[i
] = iobuf_get_noeof(inp
);
2305 for( i
=0; i
< namelen
; i
++ )
2306 if( (c
=iobuf_get(inp
)) == -1 )
2311 pt
->timestamp
= read_32(inp
); if( pktlen
) pktlen
-= 4;
2317 fprintf (listfp
, ":literal data packet:\n"
2318 "\tmode %c (%X), created %lu, name=\"",
2319 mode
>= ' ' && mode
<'z'? mode
: '?', mode
,
2320 (ulong
)pt
->timestamp
);
2321 for(p
=pt
->name
,i
=0; i
< namelen
; p
++, i
++ ) {
2322 if( *p
>= ' ' && *p
<= 'z' )
2325 fprintf (listfp
, "\\x%02x", *p
);
2327 fprintf (listfp
, "\",\n\traw data: ");
2329 fprintf (listfp
, "unknown length\n");
2331 fprintf (listfp
, "%lu bytes\n", (ulong
)pt
->len
);
2340 parse_compressed( IOBUF inp
, int pkttype
, unsigned long pktlen
,
2341 PACKET
*pkt
, int new_ctb
)
2345 /* PKTLEN is here 0, but data follows (this should be the last
2346 object in a file or the compress algorithm should know the
2351 zd
= pkt
->pkt
.compressed
= xmalloc (sizeof *pkt
->pkt
.compressed
);
2352 zd
->algorithm
= iobuf_get_noeof(inp
);
2353 zd
->len
= 0; /* not used */
2354 zd
->new_ctb
= new_ctb
;
2357 fprintf (listfp
, ":compressed packet: algo=%d\n", zd
->algorithm
);
2363 parse_encrypted( IOBUF inp
, int pkttype
, unsigned long pktlen
,
2364 PACKET
*pkt
, int new_ctb
, int partial
)
2368 unsigned long orig_pktlen
= pktlen
;
2370 ed
= pkt
->pkt
.encrypted
= xmalloc(sizeof *pkt
->pkt
.encrypted
);
2372 /* we don't know the extralen which is (cipher_blocksize+2)
2373 because the algorithm ist not specified in this packet.
2374 However, it is only important to know this for some sanity
2375 checks on the packet length - it doesn't matter that we can't
2379 ed
->new_ctb
= new_ctb
;
2380 ed
->is_partial
= partial
;
2382 if( pkttype
== PKT_ENCRYPTED_MDC
) {
2383 /* fixme: add some pktlen sanity checks */
2386 version
= iobuf_get_noeof(inp
);
2389 if( version
!= 1 ) {
2390 log_error("encrypted_mdc packet with unknown version %d\n",
2392 /*skip_rest(inp, pktlen); should we really do this? */
2393 rc
= gpg_error (GPG_ERR_INV_PACKET
);
2396 ed
->mdc_method
= DIGEST_ALGO_SHA1
;
2398 if( orig_pktlen
&& pktlen
< 10 ) { /* actually this is blocksize+2 */
2399 log_error("packet(%d) too short\n", pkttype
);
2400 rc
= G10ERR_INVALID_PACKET
;
2401 iobuf_skip_rest(inp
, pktlen
, partial
);
2406 fprintf (listfp
, ":encrypted data packet:\n\tlength: %lu\n",
2409 fprintf (listfp
, ":encrypted data packet:\n\tlength: unknown\n");
2410 if( ed
->mdc_method
)
2411 fprintf (listfp
, "\tmdc_method: %d\n", ed
->mdc_method
);
2421 /* Note, that this code is not anymore used in real life because now
2422 the MDC checking is done right after the encryption in
2425 parse_mdc (IOBUF inp
, int pkttype
, unsigned long pktlen
,
2426 PACKET
*pkt
, int new_ctb
)
2434 mdc
= pkt
->pkt
.mdc
= xmalloc(sizeof *pkt
->pkt
.mdc
);
2436 fprintf (listfp
, ":mdc packet: length=%lu\n", pktlen
);
2437 if (!new_ctb
|| pktlen
!= 20)
2439 log_error("mdc_packet with invalid encoding\n");
2440 rc
= gpg_error (GPG_ERR_INV_PACKET
);
2444 for (; pktlen
; pktlen
--, p
++)
2445 *p
= iobuf_get_noeof(inp
);
2453 * This packet is internally generated by PGG (by armor.c) to
2454 * transfer some information to the lower layer. To make sure that
2455 * this packet is really a GPG faked one and not one comming from outside,
2456 * we first check that tehre is a unique tag in it.
2457 * The format of such a control packet is:
2458 * n byte session marker
2459 * 1 byte control type CTRLPKT_xxxxx
2460 * m byte control data
2464 parse_gpg_control (IOBUF inp
, int pkttype
, unsigned long pktlen
,
2465 PACKET
*packet
, int partial
)
2468 const byte
*sesmark
;
2475 fprintf (listfp
, ":packet 63: length %lu ", pktlen
);
2477 sesmark
= get_session_marker ( &sesmarklen
);
2478 if ( pktlen
< sesmarklen
+1 ) /* 1 is for the control bytes */
2480 for( i
=0; i
< sesmarklen
; i
++, pktlen
-- ) {
2481 if ( sesmark
[i
] != iobuf_get_noeof(inp
) )
2485 goto skipit
; /* Definitely too large. We skip it to avoid an
2486 overflow in the malloc. */
2488 puts ("- gpg control packet");
2490 packet
->pkt
.gpg_control
= xmalloc(sizeof *packet
->pkt
.gpg_control
2492 packet
->pkt
.gpg_control
->control
= iobuf_get_noeof(inp
); pktlen
--;
2493 packet
->pkt
.gpg_control
->datalen
= pktlen
;
2494 p
= packet
->pkt
.gpg_control
->data
;
2495 for( ; pktlen
; pktlen
--, p
++ )
2496 *p
= iobuf_get_noeof(inp
);
2505 fprintf (listfp
, "- private (rest length %lu)\n", pktlen
);
2507 while( (c
=iobuf_get(inp
)) != -1 )
2508 dump_hex_line(c
, &i
);
2511 for( ; pktlen
; pktlen
-- )
2512 dump_hex_line(iobuf_get(inp
), &i
);
2514 putc ('\n', listfp
);
2516 iobuf_skip_rest(inp
,pktlen
, 0);
2517 return gpg_error (GPG_ERR_INV_PACKET
);
2520 /* create a gpg control packet to be used internally as a placeholder */
2522 create_gpg_control( ctrlpkttype_t type
, const byte
*data
, size_t datalen
)
2527 packet
= xmalloc( sizeof *packet
);
2528 init_packet(packet
);
2529 packet
->pkttype
= PKT_GPG_CONTROL
;
2530 packet
->pkt
.gpg_control
= xmalloc(sizeof *packet
->pkt
.gpg_control
2532 packet
->pkt
.gpg_control
->control
= type
;
2533 packet
->pkt
.gpg_control
->datalen
= datalen
;
2534 p
= packet
->pkt
.gpg_control
->data
;
2535 for( ; datalen
; datalen
--, p
++ )