aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2005-05-11 19:31:53 +0000
committerDavid Shaw <[email protected]>2005-05-11 19:31:53 +0000
commite81d88b26541d669e1b9c59ebd0815f67469a61b (patch)
tree56ed76a701cdc7c58b162bcafcb615e8250a2ba7
parent(do_close_reader): Don't do a reset before close. (diff)
downloadgnupg-e81d88b26541d669e1b9c59ebd0815f67469a61b.tar.gz
gnupg-e81d88b26541d669e1b9c59ebd0815f67469a61b.zip
* keygen.c (write_selfsigs): Rename from write_selfsig. Write the same
selfsig into both the pk and sk, so that someone importing their sk (which will get an autoconvert to the pk) won't end up with two selfsigs. (do_generate_keypair): Call it from here. * parse-packet.c (can_handle_critical_notation): New. Check for particular notation tags that we will accept when critical. Currently, that's only [email protected], since we know how to handle it (pass it through to a mail program). (can_handle_critical): Call it from here. (parse_one_sig_subpkt): Sanity check that notations are well-formed in that the internal lengths add up to the size of the subpacket.
Diffstat (limited to '')
-rw-r--r--g10/ChangeLog17
-rw-r--r--g10/keygen.c28
-rw-r--r--g10/parse-packet.c26
3 files changed, 52 insertions, 19 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index 04bac2be0..c9492c2c4 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,20 @@
+2005-05-11 David Shaw <[email protected]>
+
+ * keygen.c (write_selfsigs): Rename from write_selfsig. Write the
+ same selfsig into both the pk and sk, so that someone importing
+ their sk (which will get an autoconvert to the pk) won't end up
+ with two selfsigs.
+ (do_generate_keypair): Call it from here.
+
+ * parse-packet.c (can_handle_critical_notation): New. Check for
+ particular notation tags that we will accept when critical.
+ Currently, that's only [email protected], since we
+ know how to handle it (pass it through to a mail program).
+ (can_handle_critical): Call it from here.
+ (parse_one_sig_subpkt): Sanity check that notations are
+ well-formed in that the internal lengths add up to the size of the
+ subpacket.
+
2005-05-07 Werner Koch <[email protected]>
* ccid-driver.c (do_close_reader): Don't do a reset before close.
diff --git a/g10/keygen.c b/g10/keygen.c
index d22dde75f..c4b9dab8f 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -882,8 +882,8 @@ write_direct_sig( KBNODE root, KBNODE pub_root, PKT_secret_key *sk,
}
static int
-write_selfsig( KBNODE root, KBNODE pub_root, PKT_secret_key *sk,
- unsigned int use )
+write_selfsigs( KBNODE sec_root, KBNODE pub_root, PKT_secret_key *sk,
+ unsigned int use )
{
PACKET *pkt;
PKT_signature *sig;
@@ -896,7 +896,7 @@ write_selfsig( KBNODE root, KBNODE pub_root, PKT_secret_key *sk,
log_info(_("writing self signature\n"));
/* get the uid packet from the list */
- node = find_kbnode( root, PKT_USER_ID );
+ node = find_kbnode( pub_root, PKT_USER_ID );
if( !node )
BUG(); /* no user id packet in tree */
uid = node->pkt->pkt.user_id;
@@ -921,7 +921,12 @@ write_selfsig( KBNODE root, KBNODE pub_root, PKT_secret_key *sk,
pkt = m_alloc_clear( sizeof *pkt );
pkt->pkttype = PKT_SIGNATURE;
pkt->pkt.signature = sig;
- add_kbnode( root, new_kbnode( pkt ) );
+ add_kbnode( sec_root, new_kbnode( pkt ) );
+
+ pkt = m_alloc_clear( sizeof *pkt );
+ pkt->pkttype = PKT_SIGNATURE;
+ pkt->pkt.signature = copy_signature(NULL,sig);
+ add_kbnode( pub_root, new_kbnode( pkt ) );
return rc;
}
@@ -2848,17 +2853,16 @@ do_generate_keypair( struct para_data_s *para,
write_direct_sig(sec_root,pub_root,pri_sk,revkey);
}
- if( !rc && (s=get_parameter_value(para, pUSERID)) ) {
+ if( !rc && (s=get_parameter_value(para, pUSERID)) )
+ {
write_uid(pub_root, s );
if( !rc )
- write_uid(sec_root, s );
- if( !rc )
- rc = write_selfsig(pub_root, pub_root, pri_sk,
- get_parameter_uint (para, pKEYUSAGE));
+ write_uid(sec_root, s );
+
if( !rc )
- rc = write_selfsig(sec_root, pub_root, pri_sk,
- get_parameter_uint (para, pKEYUSAGE));
- }
+ rc = write_selfsigs(sec_root, pub_root, pri_sk,
+ get_parameter_uint (para, pKEYUSAGE));
+ }
/* Write the auth key to the card before the encryption key. This
is a partial workaround for a PGP bug (as of this writing, all
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index fde96c476..71d3d2fba 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -1,6 +1,6 @@
/* parse-packet.c - read packets
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
- * 2004, 2005 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ * 2005 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@@ -1016,7 +1016,10 @@ parse_one_sig_subpkt( const byte *buffer, size_t n, int type )
break;
return 0;
case SIGSUBPKT_NOTATION:
- if( n < 8 ) /* minimum length needed */
+ /* minimum length needed, and the subpacket must be well-formed
+ where the name length and value length all fit inside the
+ packet. */
+ if(n<8 || 8+((buffer[4]<<8)|buffer[5])+((buffer[6]<<8)|buffer[7]) != n)
break;
return 0;
case SIGSUBPKT_PRIMARY_UID:
@@ -1032,6 +1035,15 @@ parse_one_sig_subpkt( const byte *buffer, size_t n, int type )
return -2;
}
+/* Not many critical notations we understand yet... */
+static int
+can_handle_critical_notation(const byte *name,size_t len)
+{
+ if(len==32 && memcmp(name,"[email protected]",32)==0)
+ return 1;
+
+ return 0;
+}
static int
can_handle_critical( const byte *buffer, size_t n, int type )
@@ -1039,10 +1051,10 @@ 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;
-
+ if(n>=8)
+ return can_handle_critical_notation(buffer+8,(buffer[4]<<8)|buffer[5]);
+ else
+ return 0;
case SIGSUBPKT_SIGNATURE:
case SIGSUBPKT_SIG_CREATED:
case SIGSUBPKT_SIG_EXPIRE: