1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-01-08 12:44:23 +01:00

* packet.h, free-packet.c (free_encrypted, free_plaintext), parse-packet.c

(copy_packet, skip_packet, skip_rest, read_rest, parse_plaintext,
parse_encrypted, parse_gpg_control): Use a flag to indicate partial or
indeterminate encoding.  This is the first step in some minor surgery to
remove the old gpg partial length encoding.
This commit is contained in:
David Shaw 2004-03-03 00:09:16 +00:00
parent 9eb128ef9b
commit c57262fd57
4 changed files with 66 additions and 52 deletions

View File

@ -1,3 +1,12 @@
2004-03-02 David Shaw <dshaw@jabberwocky.com>
* packet.h, free-packet.c (free_encrypted, free_plaintext),
parse-packet.c (copy_packet, skip_packet, skip_rest, read_rest,
parse_plaintext, parse_encrypted, parse_gpg_control): Use a flag
to indicate partial or indeterminate encoding. This is the first
step in some minor surgery to remove the old gpg partial length
encoding.
2004-03-01 David Shaw <dshaw@jabberwocky.com>
* parse-packet.c (parse): Only data-type packets are allowed to

View File

@ -319,7 +319,7 @@ void
free_encrypted( PKT_encrypted *ed )
{
if( ed->buf ) { /* have to skip some bytes */
if( iobuf_in_block_mode(ed->buf) ) {
if( ed->is_partial ) {
while( iobuf_read( ed->buf, NULL, 1<<30 ) != -1 )
;
}
@ -341,7 +341,7 @@ void
free_plaintext( PKT_plaintext *pt )
{
if( pt->buf ) { /* have to skip some bytes */
if( iobuf_in_block_mode(pt->buf) ) {
if( pt->is_partial ) {
while( iobuf_read( pt->buf, NULL, 1<<30 ) != -1 )
;
}

View File

@ -279,6 +279,7 @@ typedef struct {
u32 len; /* length of encrypted data */
int extralen; /* this is (blocksize+2) */
byte new_ctb; /* uses a new CTB */
byte is_partial; /* partial length encoded */
byte mdc_method; /* > 0: integrity protected encrypted data packet */
IOBUF buf; /* IOBUF reference */
} PKT_encrypted;

View File

@ -47,10 +47,11 @@ static int parse( IOBUF inp, PACKET *pkt, int onlykeypkts,
#endif
);
static int copy_packet( IOBUF inp, IOBUF out, int pkttype,
unsigned long pktlen );
static void skip_packet( IOBUF inp, int pkttype, unsigned long pktlen );
static void skip_rest( IOBUF inp, unsigned long pktlen );
static void *read_rest( IOBUF inp, size_t pktlen );
unsigned long pktlen, int partial );
static void skip_packet( IOBUF inp, int pkttype,
unsigned long pktlen, int partial );
static void skip_rest( IOBUF inp, unsigned long pktlen, int partial );
static void *read_rest( IOBUF inp, size_t pktlen, int partial );
static int parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet );
static int parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen,
@ -70,15 +71,15 @@ static int parse_comment( IOBUF inp, int pkttype, unsigned long pktlen,
static void parse_trust( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet );
static int parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet, int new_ctb);
PACKET *packet, int new_ctb, int partial);
static int parse_compressed( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet, int new_ctb );
static int parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet, int new_ctb);
PACKET *packet, int new_ctb, int partial);
static int parse_mdc( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet, int new_ctb);
static int parse_gpg_control( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet );
PACKET *packet, int partial );
static unsigned short
read_16(IOBUF inp)
@ -297,7 +298,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
unsigned long pktlen;
byte hdr[8];
int hdrlen;
int new_ctb = 0;
int new_ctb = 0, partial=0;
int with_uid = (onlykeypkts == 2);
*skip = 0;
@ -328,6 +329,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
if (pkttype == PKT_COMPRESSED) {
iobuf_set_partial_block_mode(inp, c & 0xff);
pktlen = 0;/* to indicate partial length */
partial=1;
}
else {
hdr[hdrlen++] = c;
@ -369,6 +371,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
{
iobuf_set_partial_block_mode(inp, c & 0xff);
pktlen = 0;/* to indicate partial length */
partial=1;
}
else
{
@ -385,6 +388,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
lenbytes = ((ctb&3)==3)? 0 : (1<<(ctb & 3));
if( !lenbytes ) {
pktlen = 0; /* don't know the value */
partial=1;
switch (pkttype) {
case PKT_ENCRYPTED:
case PKT_PLAINTEXT:
@ -428,7 +432,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
if( iobuf_write( out, hdr, hdrlen ) == -1 )
rc = G10ERR_WRITE_FILE;
else
rc = copy_packet(inp, out, pkttype, pktlen );
rc = copy_packet(inp, out, pkttype, pktlen, partial );
goto leave;
}
@ -440,7 +444,7 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
&& pkttype != PKT_PUBLIC_KEY
&& pkttype != PKT_SECRET_SUBKEY
&& pkttype != PKT_SECRET_KEY ) ) {
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, partial);
*skip = 1;
rc = 0;
goto leave;
@ -499,23 +503,23 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
rc = 0;
break;
case PKT_PLAINTEXT:
rc = parse_plaintext(inp, pkttype, pktlen, pkt, new_ctb );
rc = parse_plaintext(inp, pkttype, pktlen, pkt, new_ctb, partial );
break;
case PKT_COMPRESSED:
rc = parse_compressed(inp, pkttype, pktlen, pkt, new_ctb );
break;
case PKT_ENCRYPTED:
case PKT_ENCRYPTED_MDC:
rc = parse_encrypted(inp, pkttype, pktlen, pkt, new_ctb );
rc = parse_encrypted(inp, pkttype, pktlen, pkt, new_ctb, partial );
break;
case PKT_MDC:
rc = parse_mdc(inp, pkttype, pktlen, pkt, new_ctb );
break;
case PKT_GPG_CONTROL:
rc = parse_gpg_control(inp, pkttype, pktlen, pkt );
rc = parse_gpg_control(inp, pkttype, pktlen, pkt, partial );
break;
default:
skip_packet(inp, pkttype, pktlen);
skip_packet(inp, pkttype, pktlen, partial);
break;
}
@ -543,12 +547,13 @@ dump_hex_line( int c, int *i )
static int
copy_packet( IOBUF inp, IOBUF out, int pkttype, unsigned long pktlen )
copy_packet( IOBUF inp, IOBUF out, int pkttype,
unsigned long pktlen, int partial )
{
int n;
char buf[100];
if( iobuf_in_block_mode(inp) ) {
if( partial ) {
while( (n = iobuf_read( inp, buf, 100 )) != -1 )
if( iobuf_write(out, buf, n ) )
return G10ERR_WRITE_FILE; /* write error */
@ -575,7 +580,7 @@ copy_packet( IOBUF inp, IOBUF out, int pkttype, unsigned long pktlen )
static void
skip_packet( IOBUF inp, int pkttype, unsigned long pktlen )
skip_packet( IOBUF inp, int pkttype, unsigned long pktlen, int partial )
{
if( list_mode ) {
if( pkttype == PKT_MARKER )
@ -586,7 +591,7 @@ skip_packet( IOBUF inp, int pkttype, unsigned long pktlen )
int c, i=0 ;
if( pkttype != PKT_MARKER )
fputs("dump:", stdout );
if( iobuf_in_block_mode(inp) ) {
if( partial ) {
while( (c=iobuf_get(inp)) != -1 )
dump_hex_line(c, &i);
}
@ -598,13 +603,13 @@ skip_packet( IOBUF inp, int pkttype, unsigned long pktlen )
return;
}
}
skip_rest(inp,pktlen);
skip_rest(inp,pktlen,partial);
}
static void
skip_rest( IOBUF inp, unsigned long pktlen )
skip_rest( IOBUF inp, unsigned long pktlen, int partial )
{
if( iobuf_in_block_mode(inp) ) {
if( partial ) {
while( iobuf_get(inp) != -1 )
;
}
@ -617,12 +622,12 @@ skip_rest( IOBUF inp, unsigned long pktlen )
static void *
read_rest( IOBUF inp, size_t pktlen )
read_rest( IOBUF inp, size_t pktlen, int partial )
{
byte *p;
int i;
if( iobuf_in_block_mode(inp) ) {
if( partial ) {
log_error("read_rest: can't store stream data\n");
p = NULL;
}
@ -727,7 +732,7 @@ parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
}
leave:
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, 0);
return rc;
}
@ -781,7 +786,7 @@ parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
}
leave:
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, 0);
return rc;
}
@ -1401,7 +1406,7 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
unknown_pubkey_warning( sig->pubkey_algo );
/* we store the plain material in data[0], so that we are able
* to write it back with build_packet() */
sig->data[0] = mpi_set_opaque(NULL, read_rest(inp, pktlen), pktlen );
sig->data[0]= mpi_set_opaque(NULL, read_rest(inp, pktlen, 0), pktlen );
pktlen = 0;
}
else {
@ -1420,7 +1425,7 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
}
leave:
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, 0);
return rc;
}
@ -1458,7 +1463,7 @@ parse_onepass_sig( IOBUF inp, int pkttype, unsigned long pktlen,
leave:
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, 0);
return rc;
}
@ -1537,7 +1542,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
}
printf("\"\n");
}
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, 0);
return 0;
}
else if( version == 4 )
@ -1625,7 +1630,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
if( !npkey ) {
sk->skey[0] = mpi_set_opaque( NULL,
read_rest(inp, pktlen), pktlen );
read_rest(inp, pktlen, 0), pktlen );
pktlen = 0;
goto leave;
}
@ -1808,7 +1813,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
* stuff up to the end of the packet into the first
* skey element */
sk->skey[npkey] = mpi_set_opaque(NULL,
read_rest(inp, pktlen), pktlen );
read_rest(inp, pktlen, 0),pktlen);
pktlen = 0;
if( list_mode ) {
printf("\tencrypted stuff follows\n");
@ -1849,7 +1854,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
if( !npkey ) {
pk->pkey[0] = mpi_set_opaque( NULL,
read_rest(inp, pktlen), pktlen );
read_rest(inp, pktlen, 0), pktlen );
pktlen = 0;
goto leave;
}
@ -1869,7 +1874,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
}
leave:
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, 0);
return rc;
}
@ -2104,30 +2109,25 @@ parse_trust( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *pkt )
if( list_mode )
printf(":trust packet: empty\n");
}
skip_rest (inp, pktlen);
skip_rest (inp, pktlen, 0);
}
static int
parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *pkt, int new_ctb )
PACKET *pkt, int new_ctb, int partial )
{
int rc = 0;
int mode, namelen, partial=0;
int mode, namelen;
PKT_plaintext *pt;
byte *p;
int c, i;
if( pktlen && pktlen < 6 ) {
if( !partial && pktlen < 6 ) {
log_error("packet(%d) too short (%lu)\n", pkttype, (ulong)pktlen);
rc = G10ERR_INVALID_PACKET;
goto leave;
}
/* A packet length of zero indicates partial body length. A zero
data length isn't a zero length packet due to the header (mode,
name, etc), so this is accurate. */
if(pktlen==0)
partial=1;
mode = iobuf_get_noeof(inp); if( pktlen ) pktlen--;
namelen = iobuf_get_noeof(inp); if( pktlen ) pktlen--;
pt = pkt->pkt.plaintext = m_alloc(sizeof *pkt->pkt.plaintext + namelen -1);
@ -2162,7 +2162,11 @@ parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen,
else
printf("\\x%02x", *p );
}
printf("\",\n\traw data: %lu bytes\n", (ulong)pt->len );
printf("\",\n\traw data: ");
if(partial)
printf("unknown length\n");
else
printf("%lu bytes\n", (ulong)pt->len );
}
leave:
@ -2193,7 +2197,7 @@ parse_compressed( IOBUF inp, int pkttype, unsigned long pktlen,
static int
parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *pkt, int new_ctb )
PACKET *pkt, int new_ctb, int partial )
{
int rc = 0;
PKT_encrypted *ed;
@ -2209,6 +2213,7 @@ parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
ed->extralen = 0;
ed->buf = NULL;
ed->new_ctb = new_ctb;
ed->is_partial = partial;
ed->mdc_method = 0;
if( pkttype == PKT_ENCRYPTED_MDC ) {
/* fixme: add some pktlen sanity checks */
@ -2229,7 +2234,7 @@ parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
if( orig_pktlen && pktlen < 10 ) { /* actually this is blocksize+2 */
log_error("packet(%d) too short\n", pkttype);
rc = G10ERR_INVALID_PACKET;
skip_rest(inp, pktlen);
skip_rest(inp, pktlen, partial);
goto leave;
}
if( list_mode ) {
@ -2242,7 +2247,6 @@ parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
}
ed->buf = inp;
pktlen = 0;
leave:
return rc;
@ -2286,8 +2290,8 @@ parse_mdc( IOBUF inp, int pkttype, unsigned long pktlen,
*/
static int
parse_gpg_control( IOBUF inp,
int pkttype, unsigned long pktlen, PACKET *packet )
parse_gpg_control( IOBUF inp, int pkttype,
unsigned long pktlen, PACKET *packet, int partial )
{
byte *p;
const byte *sesmark;
@ -2323,7 +2327,7 @@ parse_gpg_control( IOBUF inp,
i=0;
printf("- private (rest length %lu)\n", pktlen);
if( iobuf_in_block_mode(inp) ) {
if( partial ) {
while( (c=iobuf_get(inp)) != -1 )
dump_hex_line(c, &i);
}
@ -2333,7 +2337,7 @@ parse_gpg_control( IOBUF inp,
}
putchar('\n');
}
skip_rest(inp,pktlen);
skip_rest(inp,pktlen, 0);
return G10ERR_INVALID_PACKET;
}