diff options
Diffstat (limited to 'g10')
-rw-r--r-- | g10/ChangeLog | 19 | ||||
-rw-r--r-- | g10/free-packet.c | 1 | ||||
-rw-r--r-- | g10/getkey.c | 47 | ||||
-rw-r--r-- | g10/keydb.h | 1 | ||||
-rw-r--r-- | g10/keyid.c | 11 | ||||
-rw-r--r-- | g10/keylist.c | 5 | ||||
-rw-r--r-- | g10/mainproc.c | 2 | ||||
-rw-r--r-- | g10/packet.h | 2 |
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 */ |