From eb5c0265e134ef7511845c93d76e4fb2b805627c Mon Sep 17 00:00:00 2001
From: David Shaw <dshaw@jabberwocky.com>
Date: Wed, 24 Jul 2002 03:29:02 +0000
Subject: [PATCH] * import.c (delete_inv_parts): Discard subkey signatures
 (0x18 and 0x28) if found in the userid section of the key.

---
 g10/ChangeLog |  3 +++
 g10/import.c  | 13 ++++++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/g10/ChangeLog b/g10/ChangeLog
index 0d45e559c..9a5e75df2 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,5 +1,8 @@
 2002-07-23  David Shaw  <dshaw@jabberwocky.com>
 
+	* import.c (delete_inv_parts): Discard subkey signatures (0x18 and
+	0x28) if found in the userid section of the key.
+
 	* sig-check.c (signature_check2): Signatures made by invalid
 	subkeys (bad/missing binding sig) are also invalid.
 
diff --git a/g10/import.c b/g10/import.c
index 40c1e85ef..ddb483105 100644
--- a/g10/import.c
+++ b/g10/import.c
@@ -1033,7 +1033,7 @@ static int
 delete_inv_parts( const char *fname, KBNODE keyblock, u32 *keyid )
 {
     KBNODE node;
-    int nvalid=0, uid_seen=0;
+    int nvalid=0, uid_seen=0, subkey_seen=0;
 
     for(node=keyblock->next; node; node = node->next ) {
 	if( node->pkt->pkttype == PKT_USER_ID ) {
@@ -1074,6 +1074,8 @@ delete_inv_parts( const char *fname, KBNODE keyblock, u32 *keyid )
 		    node = node->next;
 		}
 	    }
+	    else
+	      subkey_seen = 1;
 	}
 	else if( node->pkt->pkttype == PKT_SIGNATURE
 		 && check_pubkey_algo( node->pkt->pkt.signature->pubkey_algo)
@@ -1121,6 +1123,15 @@ delete_inv_parts( const char *fname, KBNODE keyblock, u32 *keyid )
 		}
 	    }
 	}
+	else if( node->pkt->pkttype == PKT_SIGNATURE &&
+		 (node->pkt->pkt.signature->sig_class == 0x18 ||
+		  node->pkt->pkt.signature->sig_class == 0x28) &&
+		 !subkey_seen ) {
+	    log_error( _("key %08lX: subkey signature "
+			 "in wrong place - skipped\n"),
+		       (ulong)keyid[1]);
+	    delete_kbnode( node );
+	}
 	else if( (node->flag & 4) ) /* marked for deletion */
 	    delete_kbnode( node );
     }