aboutsummaryrefslogtreecommitdiffstats
path: root/g10
diff options
context:
space:
mode:
Diffstat (limited to 'g10')
-rw-r--r--g10/ChangeLog19
-rw-r--r--g10/free-packet.c1
-rw-r--r--g10/getkey.c47
-rw-r--r--g10/keydb.h1
-rw-r--r--g10/keyid.c11
-rw-r--r--g10/keylist.c5
-rw-r--r--g10/mainproc.c2
-rw-r--r--g10/packet.h2
8 files changed, 52 insertions, 36 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index e1daa0050..646fa1c51 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,20 @@
+2001-05-27 Werner Koch <[email protected]>
+
+ * keyid.c (get_lsign_letter): New.
+ * keylist.c (list_keyblock_colon): Use it here.
+ * mainproc.c (list_node): and here.
+
+ * getkey.c, packet.h, free-packet.c: Removed that useless key
+ created field; I dunno why I introducded this at all - the
+ creation time is always bound to the key packet and subject to
+ fingerprint calculation etc.
+
+ * getkey.c (fixup_uidnode): Add keycreated arg and use this
+ instead of the signature timestamp to calculate the
+ help_key_expire. Bug reported by David R. Bergstein.
+ (merge_selfsigs_main): Correct key expiration time calculation.
+ (merge_selfsigs_subkey): Ditto.
+
2001-05-25 Werner Koch <[email protected]>
* revoke.c (gen_revoke): Add a cast to a tty_printf arg.
@@ -341,7 +358,7 @@
2001-02-08 Werner Koch <[email protected]>
- * getkey.c (key_byname): I can happe that we have both, sk and pk
+ * getkey.c (key_byname): It can happen that we have both, sk and pk
NULL, fix for that.
* parse-packet.c (parse_one_sig_subpkt): Add support for
diff --git a/g10/free-packet.c b/g10/free-packet.c
index 557fdca9f..09e3de15f 100644
--- a/g10/free-packet.c
+++ b/g10/free-packet.c
@@ -151,7 +151,6 @@ copy_public_parts_to_secret_key( PKT_public_key *pk, PKT_secret_key *sk )
sk->expiredate = pk->expiredate;
sk->pubkey_algo = pk->pubkey_algo;
sk->pubkey_usage= pk->pubkey_usage;
- sk->created = pk->created;
sk->req_usage = pk->req_usage;
sk->req_algo = pk->req_algo;
sk->has_expired = pk->has_expired;
diff --git a/g10/getkey.c b/g10/getkey.c
index 6fec97064..f2f831b9b 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -1400,7 +1400,7 @@ merge_keys_and_selfsig( KBNODE keyblock )
static void
-fixup_uidnode ( KBNODE uidnode, KBNODE signode )
+fixup_uidnode ( KBNODE uidnode, KBNODE signode, u32 keycreated )
{
PKT_user_id *uid = uidnode->pkt->pkt.user_id;
PKT_signature *sig = signode->pkt->pkt.signature;
@@ -1429,8 +1429,8 @@ fixup_uidnode ( KBNODE uidnode, KBNODE signode )
/* ditto or the key expiration */
uid->help_key_expire = 0;
p = parse_sig_subpkt ( sig->hashed_data, SIGSUBPKT_KEY_EXPIRE, NULL);
- if ( p ) {
- uid->help_key_expire = sig->timestamp + buffer_to_u32(p);
+ if ( p ) {
+ uid->help_key_expire = keycreated + buffer_to_u32(p);
}
/* Set the primary user ID flag - we will later wipe out some
@@ -1456,6 +1456,7 @@ merge_selfsigs_main( KBNODE keyblock, int *r_revoked )
KBNODE signode, uidnode, uidnode2;
u32 curtime = make_timestamp ();
unsigned int key_usage = 0;
+ u32 keytimestamp = 0;
u32 key_expire = 0;
int key_expire_seen = 0;
@@ -1463,7 +1464,8 @@ merge_selfsigs_main( KBNODE keyblock, int *r_revoked )
if ( keyblock->pkt->pkttype != PKT_PUBLIC_KEY )
BUG ();
pk = keyblock->pkt->pkt.public_key;
- pk->created = 0;
+ keytimestamp = pk->timestamp;
+
keyid_from_pk( pk, kid );
pk->main_keyid[0] = kid[0];
pk->main_keyid[1] = kid[1];
@@ -1536,13 +1538,11 @@ merge_selfsigs_main( KBNODE keyblock, int *r_revoked )
p = parse_sig_subpkt ( sig->hashed_data,
SIGSUBPKT_KEY_EXPIRE, NULL);
if ( p ) {
- key_expire = sig->timestamp + buffer_to_u32(p);
+ key_expire = keytimestamp + buffer_to_u32(p);
key_expire_seen = 1;
}
}
- /* and set the created field */
- pk->created = sigdate;
- /* and mark that key as valid: one direct key signature should
+ /* mark that key as valid: one direct key signature should
* render a key as valid */
pk->is_valid = 1;
}
@@ -1556,7 +1556,7 @@ merge_selfsigs_main( KBNODE keyblock, int *r_revoked )
if ( k->pkt->pkttype == PKT_USER_ID
|| k->pkt->pkttype == PKT_PHOTO_ID ) {
if ( uidnode && signode )
- fixup_uidnode ( uidnode, signode );
+ fixup_uidnode ( uidnode, signode, keytimestamp );
uidnode = k;
signode = NULL;
if ( sigdate > uiddate )
@@ -1593,24 +1593,12 @@ merge_selfsigs_main( KBNODE keyblock, int *r_revoked )
}
}
if ( uidnode && signode ) {
- fixup_uidnode ( uidnode, signode );
+ fixup_uidnode ( uidnode, signode, keytimestamp );
pk->is_valid = 1;
}
if ( sigdate > uiddate )
uiddate = sigdate;
- /* if we do not have a direct key signature, take the key creation date
- * from the latest user ID. Hmmm, another possibilty would be to take
- * it from the latest primary user ID - but we don't implement it for
- * now */
- if ( !pk->created )
- pk->created = uiddate;
- if ( !pk->created ) {
- /* oops, still no creation date: use the timestamp */
- if (DBG_CACHE)
- log_debug( "merge_selfsigs_main: "
- "using timestamp as creation date\n");
- pk->created = pk->timestamp;
- }
+
/* Now that we had a look at all user IDs we can now get some information
* from those user IDs.
@@ -1712,6 +1700,7 @@ merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode )
KBNODE signode;
u32 curtime = make_timestamp ();
unsigned int key_usage = 0;
+ u32 keytimestamp = 0;
u32 key_expire = 0;
const byte *p;
size_t n;
@@ -1723,6 +1712,8 @@ merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode )
return; /* (actually this should never happen) */
keyid_from_pk( mainpk, mainkid );
subpk = subnode->pkt->pkt.public_key;
+ keytimestamp = subpk->timestamp;
+
subpk->is_valid = 0;
subpk->main_keyid[0] = mainpk->main_keyid[0];
subpk->main_keyid[1] = mainpk->main_keyid[1];
@@ -1760,12 +1751,10 @@ merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode )
}
if ( !signode ) {
- subpk->created = subpk->timestamp;
return; /* no valid key binding */
}
subpk->is_valid = 1;
- subpk->created = sigdate;
sig = signode->pkt->pkt.signature;
p = parse_sig_subpkt ( sig->hashed_data, SIGSUBPKT_KEY_FLAGS, &n );
@@ -1789,7 +1778,7 @@ merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode )
p = parse_sig_subpkt ( sig->hashed_data, SIGSUBPKT_KEY_EXPIRE, NULL);
if ( p )
- key_expire = sig->timestamp + buffer_to_u32(p);
+ key_expire = keytimestamp + buffer_to_u32(p);
else
key_expire = 0;
subpk->has_expired = key_expire >= curtime? 0 : key_expire;
@@ -2150,8 +2139,8 @@ finish_lookup( GETKEY_CTX ctx, KBNODE foundk )
if (DBG_CACHE)
log_debug( "\tsubkey looks fine\n");
- if ( pk->created > latest_date ) {
- latest_date = pk->created;
+ if ( pk->timestamp > latest_date ) {
+ latest_date = pk->timestamp;
latest_key = k;
}
}
@@ -2186,7 +2175,7 @@ finish_lookup( GETKEY_CTX ctx, KBNODE foundk )
if (DBG_CACHE)
log_debug( "\tprimary key may be used\n");
latest_key = keyblock;
- latest_date = pk->created;
+ latest_date = pk->timestamp;
}
}
diff --git a/g10/keydb.h b/g10/keydb.h
index b4ff7a56c..e0dc178d4 100644
--- a/g10/keydb.h
+++ b/g10/keydb.h
@@ -174,6 +174,7 @@ char*get_user_id( u32 *keyid, size_t *rn );
/*-- keyid.c --*/
int pubkey_letter( int algo );
+int get_lsign_letter ( PKT_signature *sig );
u32 keyid_from_sk( PKT_secret_key *sk, u32 *keyid );
u32 keyid_from_pk( PKT_public_key *pk, u32 *keyid );
u32 keyid_from_sig( PKT_signature *sig, u32 *keyid );
diff --git a/g10/keyid.c b/g10/keyid.c
index 6f55ac7ae..b933e7ab8 100644
--- a/g10/keyid.c
+++ b/g10/keyid.c
@@ -48,6 +48,17 @@ pubkey_letter( int algo )
}
}
+int
+get_lsign_letter ( PKT_signature *sig )
+{
+ const char *p;
+
+ if (!sig)
+ return '?';
+ p = parse_sig_subpkt2( sig, SIGSUBPKT_EXPORTABLE, NULL );
+ return (p && !*p)? 'l':'x';
+}
+
static MD_HANDLE
do_fingerprint_md( PKT_public_key *pk )
diff --git a/g10/keylist.c b/g10/keylist.c
index c89aa5440..594ed4fd1 100644
--- a/g10/keylist.c
+++ b/g10/keylist.c
@@ -603,7 +603,8 @@ list_keyblock_colon( KBNODE keyblock, int secret )
else if( sig->sig_class == 0x18 )
sigstr = "sig";
else {
- printf("sig::::::::::%02x:\n",sig->sig_class );
+ printf ("sig::::::::::%02x%c:\n",
+ sig->sig_class, get_lsign_letter (sig) );
continue;
}
if( opt.check_sigs ) {
@@ -638,7 +639,7 @@ list_keyblock_colon( KBNODE keyblock, int secret )
print_string( stdout, p, n, ':' );
m_free(p);
}
- printf(":%02x:\n", sig->sig_class );
+ printf(":%02x%c:\n", sig->sig_class, get_lsign_letter (sig) );
/* fixme: check or list other sigs here */
}
}
diff --git a/g10/mainproc.c b/g10/mainproc.c
index eb6d4f6c1..c0bd9455e 100644
--- a/g10/mainproc.c
+++ b/g10/mainproc.c
@@ -988,7 +988,7 @@ list_node( CTX c, KBNODE node )
m_free(p);
}
if( opt.with_colons )
- printf(":%02x:", sig->sig_class );
+ printf(":%02x%c:", sig->sig_class, get_lsign_letter (sig) );
putchar('\n');
}
else
diff --git a/g10/packet.h b/g10/packet.h
index 9692d5a74..bfb5e9dc3 100644
--- a/g10/packet.h
+++ b/g10/packet.h
@@ -130,7 +130,6 @@ typedef struct {
byte version;
byte pubkey_algo; /* algorithm used for public key scheme */
byte pubkey_usage; /* for now only used to pass it to getkey() */
- u32 created; /* according to the self-signature */
byte req_usage; /* hack to pass a request to getkey() */
byte req_algo; /* Ditto */
u32 has_expired; /* set to the expiration date if expired */
@@ -150,7 +149,6 @@ typedef struct {
byte version;
byte pubkey_algo; /* algorithm used for public key scheme */
byte pubkey_usage;
- u32 created; /* according to the self-signature */
byte req_usage;
byte req_algo;
u32 has_expired; /* set to the expiration date if expired */