aboutsummaryrefslogtreecommitdiffstats
path: root/g10/parse-packet.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--g10/parse-packet.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index 291128ba3..47d28e396 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -71,7 +71,6 @@ static int parse_compressed( IOBUF inp, int pkttype, unsigned long pktlen,
static int parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
PACKET *packet, int new_ctb);
-
static unsigned short
read_16(IOBUF inp)
{
@@ -432,6 +431,7 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
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 );
break;
default:
@@ -852,6 +852,7 @@ parse_sig_subpkt( const byte *buffer, sigsubpkttype_t reqtype, size_t *ret_n )
if( buflen < 2 )
goto too_short;
n = (( n - 192 ) << 8) + *buffer + 192;
+ buffer++;
buflen--;
}
if( buflen < n )
@@ -966,7 +967,7 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
}
if( n ) {
sig->hashed_data = m_alloc( n + 2 );
- sig->hashed_data[0] = n << 8;
+ sig->hashed_data[0] = n >> 8;
sig->hashed_data[1] = n;
if( iobuf_read(inp, sig->hashed_data+2, n ) != n ) {
log_error("premature eof while reading hashed signature data\n");
@@ -983,7 +984,7 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
}
if( n ) {
sig->unhashed_data = m_alloc( n + 2 );
- sig->unhashed_data[0] = n << 8;
+ sig->unhashed_data[0] = n >> 8;
sig->unhashed_data[1] = n;
if( iobuf_read(inp, sig->unhashed_data+2, n ) != n ) {
log_error("premature eof while reading unhashed signature data\n");
@@ -1536,6 +1537,25 @@ parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
ed->len = pktlen;
ed->buf = NULL;
ed->new_ctb = new_ctb;
+ ed->mdc_method = 0;
+ if( pkttype == PKT_ENCRYPTED_MDC ) {
+ /* test: this is the new encrypted_mdc packet */
+ /* fixme: add some pktlen sanity checks */
+ int version, method;
+
+ version = iobuf_get_noeof(inp); pktlen--;
+ if( version != 1 ) {
+ log_error("encrypted_mdc packet with unknown version %d\n",
+ version);
+ goto leave;
+ }
+ method = iobuf_get_noeof(inp); pktlen--;
+ if( method != DIGEST_ALGO_SHA1 ) {
+ log_error("encrypted_mdc does not use SHA1 method\n" );
+ goto leave;
+ }
+ ed->mdc_method = method;
+ }
if( pktlen && pktlen < 10 ) { /* actually this is blocksize+2 */
log_error("packet(%d) too short\n", pkttype);
skip_rest(inp, pktlen);
@@ -1546,6 +1566,8 @@ parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
printf(":encrypted data packet:\n\tlength: %lu\n", pktlen);
else
printf(":encrypted data packet:\n\tlength: unknown\n");
+ if( ed->mdc_method )
+ printf("\tmdc_method: %d\n", ed->mdc_method );
}
ed->buf = inp;
@@ -1555,5 +1577,3 @@ parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
return 0;
}
-
-