1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-23 10:29:58 +01:00

* pkclist.c (do_we_trust_pre): If an untrusted key was chosen by a

particular user ID, use that ID as the one to ask about when prompting
whether to use the key anyway. (build_pk_list): Similar change here when
adding keys to the recipient list.

* trustdb.c (update_validity): Fix bug that prevented more than one
validity record per trust record. (get_validity): When retrieving validity
for a (user) supplied user ID, return the validity for that user ID only,
and do not fall back to the general key validity. (validate_one_keyblock):
Some commentary on whether non-self-signed user IDs belong in the web of
trust (arguably, they do).
This commit is contained in:
David Shaw 2003-04-30 04:45:25 +00:00
parent f09fe68e76
commit 4b502c70bf
3 changed files with 82 additions and 25 deletions

View File

@ -1,3 +1,20 @@
2003-04-30 David Shaw <dshaw@jabberwocky.com>
* pkclist.c (do_we_trust_pre): If an untrusted key was chosen by a
particular user ID, use that ID as the one to ask about when
prompting whether to use the key anyway.
(build_pk_list): Similar change here when adding keys to the
recipient list.
* trustdb.c (update_validity): Fix bug that prevented more than
one validity record per trust record.
(get_validity): When retrieving validity for a (user) supplied
user ID, return the validity for that user ID only, and do not
fall back to the general key validity.
(validate_one_keyblock): Some commentary on whether
non-self-signed user IDs belong in the web of trust (arguably,
they do).
2003-04-29 Werner Koch <wk@gnupg.org> 2003-04-29 Werner Koch <wk@gnupg.org>
* sig-check.c (check_key_signature2): Made "no subkey for subkey * sig-check.c (check_key_signature2): Made "no subkey for subkey

View File

@ -525,17 +525,23 @@ do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
return 0; return 0;
if( !opt.batch && !rc ) { if( !opt.batch && !rc ) {
char *p;
u32 keyid[2]; u32 keyid[2];
size_t n;
keyid_from_pk( pk, keyid); keyid_from_pk( pk, keyid);
tty_printf( "%4u%c/%08lX %s \"", tty_printf( "%4u%c/%08lX %s \"",
nbits_from_pk( pk ), pubkey_letter( pk->pubkey_algo ), nbits_from_pk( pk ), pubkey_letter( pk->pubkey_algo ),
(ulong)keyid[1], datestr_from_pk( pk ) ); (ulong)keyid[1], datestr_from_pk( pk ) );
p = get_user_id( keyid, &n ); /* If the pk was chosen by a particular user ID, this is the
tty_print_utf8_string( p, n ), one to ask about. */
m_free(p); if(pk->user_id)
tty_print_utf8_string(pk->user_id->name,pk->user_id->len);
else
{
size_t n;
char *p = get_user_id( keyid, &n );
tty_print_utf8_string( p, n );
m_free(p);
}
tty_printf("\"\n"); tty_printf("\"\n");
print_fingerprint (pk, NULL, 2); print_fingerprint (pk, NULL, 2);
tty_printf("\n"); tty_printf("\n");
@ -889,8 +895,8 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
} }
else { else {
int trustlevel; int trustlevel;
trustlevel = get_validity (pk, NULL); trustlevel = get_validity (pk, pk->user_id);
if( (trustlevel & TRUST_FLAG_DISABLED) ) { if( (trustlevel & TRUST_FLAG_DISABLED) ) {
tty_printf(_("Public key is disabled.\n") ); tty_printf(_("Public key is disabled.\n") );
} }
@ -903,8 +909,6 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
} }
else { else {
PK_LIST r; PK_LIST r;
char *p;
size_t n;
u32 keyid[2]; u32 keyid[2];
keyid_from_pk( pk, keyid); keyid_from_pk( pk, keyid);
@ -913,9 +917,16 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
pubkey_letter( pk->pubkey_algo ), pubkey_letter( pk->pubkey_algo ),
(ulong)keyid[1], (ulong)keyid[1],
datestr_from_pk( pk ) ); datestr_from_pk( pk ) );
p = get_user_id( keyid, &n ); if(pk->user_id)
tty_print_utf8_string( p, n ); tty_print_utf8_string(pk->user_id->name,
m_free(p); pk->user_id->len);
else
{
size_t n;
char *p = get_user_id( keyid, &n );
tty_print_utf8_string( p, n );
m_free(p);
}
tty_printf("\"\n"); tty_printf("\"\n");
r = m_alloc( sizeof *r ); r = m_alloc( sizeof *r );
@ -985,7 +996,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
else if( !(rc=check_pubkey_algo2(pk->pubkey_algo, use )) ) { else if( !(rc=check_pubkey_algo2(pk->pubkey_algo, use )) ) {
int trustlevel; int trustlevel;
trustlevel = get_validity (pk, NULL); trustlevel = get_validity (pk, pk->user_id);
if( (trustlevel & TRUST_FLAG_DISABLED) ) { if( (trustlevel & TRUST_FLAG_DISABLED) ) {
free_public_key(pk); pk = NULL; free_public_key(pk); pk = NULL;
log_info(_("%s: skipped: public key is disabled\n"), log_info(_("%s: skipped: public key is disabled\n"),

View File

@ -692,13 +692,13 @@ update_validity (PKT_public_key *pk, PKT_user_id *uid,
vrec.rectype = RECTYPE_VALID; vrec.rectype = RECTYPE_VALID;
memcpy (vrec.r.valid.namehash, namehash, 20); memcpy (vrec.r.valid.namehash, namehash, 20);
vrec.r.valid.next = trec.r.trust.validlist; vrec.r.valid.next = trec.r.trust.validlist;
trec.r.trust.validlist = vrec.recnum;
} }
vrec.r.valid.validity = validity; vrec.r.valid.validity = validity;
vrec.r.valid.full_count = uid->help_full_count; vrec.r.valid.full_count = uid->help_full_count;
vrec.r.valid.marginal_count = uid->help_marginal_count; vrec.r.valid.marginal_count = uid->help_marginal_count;
write_record (&vrec); write_record (&vrec);
trec.r.trust.depth = depth; trec.r.trust.depth = depth;
trec.r.trust.validlist = vrec.recnum;
write_record (&trec); write_record (&trec);
} }
@ -739,7 +739,6 @@ clear_validity (PKT_public_key *pk)
return any; return any;
} }
/*********************************************** /***********************************************
********* Query trustdb values ************** ********* Query trustdb values **************
***********************************************/ ***********************************************/
@ -804,7 +803,7 @@ get_validity (PKT_public_key *pk, PKT_user_id *uid)
else else
rmd160_hash_buffer (namehash, uid->name, uid->len ); rmd160_hash_buffer (namehash, uid->name, uid->len );
} }
init_trustdb (); init_trustdb ();
if (!did_nextcheck) if (!did_nextcheck)
{ {
@ -861,16 +860,30 @@ get_validity (PKT_public_key *pk, PKT_user_id *uid)
while (recno) while (recno)
{ {
read_record (recno, &vrec, RECTYPE_VALID); read_record (recno, &vrec, RECTYPE_VALID);
if ( validity < (vrec.r.valid.validity & TRUST_MASK) )
validity = (vrec.r.valid.validity & TRUST_MASK); if(uid)
if ( uid && !memcmp (vrec.r.valid.namehash, namehash, 20) ) {
break; /* If a user ID is given we return the validity for that
user ID ONLY. If the namehash is not found, then there
is no validity at all (i.e. the user ID wasn't
signed). */
if(memcmp(vrec.r.valid.namehash,namehash,20)==0)
{
validity=(vrec.r.valid.validity & TRUST_MASK);
break;
}
}
else
{
/* If no namehash is given, we take the maximum validity
over all user IDs */
if ( validity < (vrec.r.valid.validity & TRUST_MASK) )
validity = (vrec.r.valid.validity & TRUST_MASK);
}
recno = vrec.r.valid.next; recno = vrec.r.valid.next;
} }
if (recno) /* okay, use the user ID associated one */
validity = (vrec.r.valid.validity & TRUST_MASK);
if ( (trec.r.trust.ownertrust & TRUST_FLAG_DISABLED) ) if ( (trec.r.trust.ownertrust & TRUST_FLAG_DISABLED) )
validity |= TRUST_FLAG_DISABLED; validity |= TRUST_FLAG_DISABLED;
@ -1304,6 +1317,16 @@ validate_one_keyblock (KBNODE kb, struct key_item *klist,
keyid_from_pk(pk, main_kid); keyid_from_pk(pk, main_kid);
for (node=kb; node; node = node->next) for (node=kb; node; node = node->next)
{ {
/* A bit of discussion here: is it better for the web of trust
to be built among only self-signed uids? On the one hand, a
self-signed uid is a statement that the key owner definitely
intended that uid to be there, but on the other hand, a
signed (but not self-signed) uid does carry trust, of a sort,
even if it is a statement being made by people other than the
key owner "through" the uids on the key owner's key. I'm
going with the latter. -dshaw */
/* && node->pkt->pkt.user_id->created) */
if (node->pkt->pkttype == PKT_USER_ID) if (node->pkt->pkttype == PKT_USER_ID)
{ {
if (uidnode && issigned) if (uidnode && issigned)
@ -1318,13 +1341,19 @@ validate_one_keyblock (KBNODE kb, struct key_item *klist,
} }
uidnode = node; uidnode = node;
uid=uidnode->pkt->pkt.user_id; uid=uidnode->pkt->pkt.user_id;
#if 0
/* If the selfsig is going to expire... This is disabled as
we do count un-self-signed uids in the web of trust. */
if(uid->expiredate && uid->expiredate<*next_expire)
*next_expire = uid->expiredate;
#endif
issigned = 0; issigned = 0;
get_validity_counts(pk,uid); get_validity_counts(pk,uid);
mark_usable_uid_certs (kb, uidnode, main_kid, klist, mark_usable_uid_certs (kb, uidnode, main_kid, klist,
curtime, next_expire); curtime, next_expire);
} }
else if (node->pkt->pkttype == PKT_SIGNATURE else if (node->pkt->pkttype == PKT_SIGNATURE
&& (node->flag & (1<<8)) && uid) && (node->flag & (1<<8)) && uid)
{ {
PKT_signature *sig = node->pkt->pkt.signature; PKT_signature *sig = node->pkt->pkt.signature;