diff options
Diffstat (limited to 'g10/parse-packet.c')
-rw-r--r-- | g10/parse-packet.c | 81 |
1 files changed, 26 insertions, 55 deletions
diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 94bf0f38d..291128ba3 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -48,7 +48,7 @@ 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, ulong *r_pktlen ); +static void *read_rest( IOBUF inp, size_t pktlen ); static int parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ); static int parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, @@ -535,30 +535,9 @@ skip_rest( IOBUF inp, unsigned long pktlen ) } } -static void * -read_rest( IOBUF inp, ulong *r_pktlen ) -{ - byte *p; - int i; - size_t pktlen = *r_pktlen; - - if( iobuf_in_block_mode(inp) ) { - log_error("read_rest: can't store stream data\n"); - p = NULL; - } - else { - p = m_alloc( pktlen + 2 ); - p[0] = pktlen >> 8; - p[1] = pktlen & 0xff; - for(i=2; pktlen; pktlen--, i++ ) - p[i] = iobuf_get(inp); - } - *r_pktlen = 0; - return p; -} static void * -read_rest2( IOBUF inp, size_t pktlen ) +read_rest( IOBUF inp, size_t pktlen ) { byte *p; int i; @@ -1065,41 +1044,29 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen, } } - if( !sig->pubkey_algo ) { - n = pktlen; - sig->data[0] = mpi_read(inp, &n, 0 ); - pktlen -=n; - if( list_mode ) { - printf("\tMDC data: "); - mpi_print(stdout, sig->data[0], mpi_print_mode ); - putchar('\n'); - } + ndata = pubkey_get_nsig(sig->pubkey_algo); + if( !ndata ) { + if( list_mode ) + printf("\tunknown algorithm %d\n", sig->pubkey_algo ); + 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 ); + pktlen = 0; } else { - ndata = pubkey_get_nsig(sig->pubkey_algo); - if( !ndata ) { - if( list_mode ) - printf("\tunknown algorithm %d\n", sig->pubkey_algo ); - 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] = read_rest(inp, &pktlen ); - } - else { - for( i=0; i < ndata; i++ ) { - n = pktlen; - sig->data[i] = mpi_read(inp, &n, 0 ); - pktlen -=n; - if( list_mode ) { - printf("\tdata: "); - mpi_print(stdout, sig->data[i], mpi_print_mode ); - putchar('\n'); - } + for( i=0; i < ndata; i++ ) { + n = pktlen; + sig->data[i] = mpi_read(inp, &n, 0 ); + pktlen -=n; + if( list_mode ) { + printf("\tdata: "); + mpi_print(stdout, sig->data[i], mpi_print_mode ); + putchar('\n'); } } } - leave: skip_rest(inp, pktlen); return rc; @@ -1243,7 +1210,9 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen, byte temp[8]; if( !npkey ) { - sk->skey[0] = read_rest( inp, &pktlen ); + sk->skey[0] = mpi_set_opaque( NULL, + read_rest(inp, pktlen), pktlen ); + pktlen = 0; goto leave; } @@ -1361,7 +1330,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_rest2(inp, pktlen), pktlen ); + read_rest(inp, pktlen), pktlen ); pktlen = 0; if( list_mode ) { printf("\tencrypted stuff follows\n"); @@ -1393,7 +1362,9 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen, PKT_public_key *pk = pkt->pkt.public_key; if( !npkey ) { - pk->pkey[0] = read_rest( inp, &pktlen ); + pk->pkey[0] = mpi_set_opaque( NULL, + read_rest(inp, pktlen), pktlen ); + pktlen = 0; goto leave; } |