* export.c (do_export_stream) [ENABLE_SELINUX_HACKS]: Don't allow
[gnupg.git] / g10 / parse-packet.c
index 0a2892a..48035ad 100644 (file)
@@ -50,14 +50,11 @@ static int  copy_packet( IOBUF inp, IOBUF out, int pkttype,
                         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,
                                                             PACKET *packet );
-static int  parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
-                                                        PKT_signature *sig );
 static int  parse_onepass_sig( IOBUF inp, int pkttype, unsigned long pktlen,
                                                        PKT_onepass_sig *ops );
 static int  parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
@@ -436,7 +433,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, partial);
+       iobuf_skip_rest(inp, pktlen, partial);
        *skip = 1;
        rc = 0;
        goto leave;
@@ -595,21 +592,7 @@ skip_packet( IOBUF inp, int pkttype, unsigned long pktlen, int partial )
            return;
        }
     }
-    skip_rest(inp,pktlen,partial);
-}
-
-static void
-skip_rest( IOBUF inp, unsigned long pktlen, int partial )
-{
-    if( partial ) {
-       while( iobuf_get(inp) != -1 )
-               ;
-    }
-    else {
-       for( ; pktlen; pktlen-- )
-           if( iobuf_get(inp) == -1 )
-               break;
-    }
+    iobuf_skip_rest(inp,pktlen,partial);
 }
 
 
@@ -724,7 +707,7 @@ parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
     }
 
   leave:
-    skip_rest(inp, pktlen, 0);
+    iobuf_skip_rest(inp, pktlen, 0);
     return rc;
 }
 
@@ -778,7 +761,7 @@ parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
     }
 
   leave:
-    skip_rest(inp, pktlen, 0);
+    iobuf_skip_rest(inp, pktlen, 0);
     return rc;
 }
 
@@ -949,6 +932,17 @@ dump_sig_subpkt( int hashed, int type, int critical,
         for( i=0; i < length; i++ )
             printf(" %02x", buffer[i] );
        break;
+      case SIGSUBPKT_SIGNATURE:
+       fputs("signature: ",stdout);
+       if(length<17)
+         p="[too short]";
+       else
+         printf("v%d, class 0x%02X, algo %d, digest algo %d",
+                buffer[0],
+                buffer[0]==3?buffer[2]:buffer[1],
+                buffer[0]==3?buffer[15]:buffer[2],
+                buffer[0]==3?buffer[16]:buffer[3]);
+       break;
       default:
        if(type>=100 && type<=110)
          p="experimental / private subpacket";
@@ -969,89 +963,90 @@ dump_sig_subpkt( int hashed, int type, int critical,
 int
 parse_one_sig_subpkt( const byte *buffer, size_t n, int type )
 {
-    switch( type ) {
-      case SIGSUBPKT_REV_KEY:
-       if(n < 22)
-         break;
-       return 0;
-      case SIGSUBPKT_SIG_CREATED:
-      case SIGSUBPKT_SIG_EXPIRE:
-      case SIGSUBPKT_KEY_EXPIRE:
-       if( n < 4 )
-           break;
-       return 0;
-      case SIGSUBPKT_KEY_FLAGS:
-      case SIGSUBPKT_KS_FLAGS:
-      case SIGSUBPKT_PREF_SYM:
-      case SIGSUBPKT_PREF_HASH:
-      case SIGSUBPKT_PREF_COMPR:
-      case SIGSUBPKT_POLICY:
-      case SIGSUBPKT_PREF_KS:
-      case SIGSUBPKT_FEATURES:
-      case SIGSUBPKT_REGEXP:
-       return 0;
-      case SIGSUBPKT_EXPORTABLE:
-      case SIGSUBPKT_REVOCABLE:
-       if( !n )
-           break;
-       return 0;
-      case SIGSUBPKT_ISSUER: /* issuer key ID */
-       if( n < 8 )
-           break;
-       return 0;
-      case SIGSUBPKT_NOTATION:
-       if( n < 8 ) /* minimum length needed */
-           break;
-       return 0;
-      case SIGSUBPKT_REVOC_REASON:
-       if( !n  )
-           break;
-       return 0;
-      case SIGSUBPKT_PRIMARY_UID:
-          if ( n != 1 )
-              break;
-          return 0;   
-      case SIGSUBPKT_TRUST:
-         if ( n != 2 )
-             break;
-         return 0;
-      default: return -1;
+  switch( type )
+    {
+    case SIGSUBPKT_REV_KEY:
+      if(n < 22)
+       break;
+      return 0;
+    case SIGSUBPKT_SIG_CREATED:
+    case SIGSUBPKT_SIG_EXPIRE:
+    case SIGSUBPKT_KEY_EXPIRE:
+      if( n < 4 )
+       break;
+      return 0;
+    case SIGSUBPKT_KEY_FLAGS:
+    case SIGSUBPKT_KS_FLAGS:
+    case SIGSUBPKT_PREF_SYM:
+    case SIGSUBPKT_PREF_HASH:
+    case SIGSUBPKT_PREF_COMPR:
+    case SIGSUBPKT_POLICY:
+    case SIGSUBPKT_PREF_KS:
+    case SIGSUBPKT_FEATURES:
+    case SIGSUBPKT_REGEXP:
+      return 0;
+    case SIGSUBPKT_SIGNATURE:
+    case SIGSUBPKT_EXPORTABLE:
+    case SIGSUBPKT_REVOCABLE:
+    case SIGSUBPKT_REVOC_REASON:
+      if( !n )
+       break;
+      return 0;
+    case SIGSUBPKT_ISSUER: /* issuer key ID */
+      if( n < 8 )
+       break;
+      return 0;
+    case SIGSUBPKT_NOTATION:
+      if( n < 8 ) /* minimum length needed */
+       break;
+      return 0;
+    case SIGSUBPKT_PRIMARY_UID:
+      if ( n != 1 )
+       break;
+      return 0;
+    case SIGSUBPKT_TRUST:
+      if ( n != 2 )
+       break;
+      return 0;
+    default: return -1;
     }
-    return -3;
+  return -3;
 }
 
 
 static int
 can_handle_critical( const byte *buffer, size_t n, int type )
 {
-    switch( type ) {
-      case SIGSUBPKT_NOTATION:
-       if( n >= 8 && (*buffer & 0x80) )
-           return 1; /* human readable is handled */
-       return 0;
-
-      case SIGSUBPKT_SIG_CREATED:
-      case SIGSUBPKT_SIG_EXPIRE:
-      case SIGSUBPKT_KEY_EXPIRE:
-      case SIGSUBPKT_EXPORTABLE:
-      case SIGSUBPKT_REVOCABLE:
-      case SIGSUBPKT_REV_KEY:
-      case SIGSUBPKT_ISSUER:/* issuer key ID */
-      case SIGSUBPKT_PREF_SYM:
-      case SIGSUBPKT_PREF_HASH:
-      case SIGSUBPKT_PREF_COMPR:
-      case SIGSUBPKT_KEY_FLAGS:
-      case SIGSUBPKT_PRIMARY_UID:
-      case SIGSUBPKT_FEATURES:
-      case SIGSUBPKT_TRUST:
-      case SIGSUBPKT_REGEXP:
-       /* Is it enough to show the policy or keyserver? */
-      case SIGSUBPKT_POLICY:
-      case SIGSUBPKT_PREF_KS:
-       return 1;
-
-      default:
-       return 0;
+  switch( type )
+    {
+    case SIGSUBPKT_NOTATION:
+      if( n >= 8 && (*buffer & 0x80) )
+       return 1; /* human readable is handled */
+      return 0;
+
+    case SIGSUBPKT_SIGNATURE:
+    case SIGSUBPKT_SIG_CREATED:
+    case SIGSUBPKT_SIG_EXPIRE:
+    case SIGSUBPKT_KEY_EXPIRE:
+    case SIGSUBPKT_EXPORTABLE:
+    case SIGSUBPKT_REVOCABLE:
+    case SIGSUBPKT_REV_KEY:
+    case SIGSUBPKT_ISSUER:/* issuer key ID */
+    case SIGSUBPKT_PREF_SYM:
+    case SIGSUBPKT_PREF_HASH:
+    case SIGSUBPKT_PREF_COMPR:
+    case SIGSUBPKT_KEY_FLAGS:
+    case SIGSUBPKT_PRIMARY_UID:
+    case SIGSUBPKT_FEATURES:
+    case SIGSUBPKT_TRUST:
+    case SIGSUBPKT_REGEXP:
+      /* Is it enough to show the policy or keyserver? */
+    case SIGSUBPKT_POLICY:
+    case SIGSUBPKT_PREF_KS:
+      return 1;
+
+    default:
+      return 0;
     }
 }
 
@@ -1211,7 +1206,7 @@ void parse_revkeys(PKT_signature *sig)
     }
 }
 
-static int
+int
 parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
                                          PKT_signature *sig )
 {
@@ -1417,7 +1412,7 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
     }
 
   leave:
-    skip_rest(inp, pktlen, 0);
+    iobuf_skip_rest(inp, pktlen, 0);
     return rc;
 }
 
@@ -1455,7 +1450,7 @@ parse_onepass_sig( IOBUF inp, int pkttype, unsigned long pktlen,
 
 
   leave:
-    skip_rest(inp, pktlen, 0);
+    iobuf_skip_rest(inp, pktlen, 0);
     return rc;
 }
 
@@ -1534,7 +1529,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
            }
            printf("\"\n");
        }
-       skip_rest(inp, pktlen, 0);
+       iobuf_skip_rest(inp, pktlen, 0);
        return 0;
     }
     else if( version == 4 )
@@ -1866,7 +1861,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
     }
 
   leave:
-    skip_rest(inp, pktlen, 0);
+    iobuf_skip_rest(inp, pktlen, 0);
     return rc;
 }
 
@@ -2101,7 +2096,7 @@ parse_trust( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *pkt )
       if( list_mode )
        printf(":trust packet: empty\n");
     }
-  skip_rest (inp, pktlen, 0);
+  iobuf_skip_rest (inp, pktlen, 0);
 }
 
 
@@ -2145,8 +2140,8 @@ parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen,
 
     if( list_mode ) {
        printf(":literal data packet:\n"
-              "\tmode %c, created %lu, name=\"",
-                   mode >= ' ' && mode <'z'? mode : '?',
+              "\tmode %c (%X), created %lu, name=\"",
+                   mode >= ' ' && mode <'z'? mode : '?', mode,
                    (ulong)pt->timestamp );
        for(p=pt->name,i=0; i < namelen; p++, i++ ) {
            if( *p >= ' ' && *p <= 'z' )
@@ -2226,7 +2221,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, partial);
+       iobuf_skip_rest(inp, pktlen, partial);
        goto leave;
     }
     if( list_mode ) {
@@ -2329,7 +2324,7 @@ parse_gpg_control( IOBUF inp, int pkttype,
         }
         putchar('\n');
     }
-    skip_rest(inp,pktlen, 0);
+    iobuf_skip_rest(inp,pktlen, 0);
     return G10ERR_INVALID_PACKET;
 }