diff options
Diffstat (limited to 'g10/sig-check.c')
-rw-r--r-- | g10/sig-check.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/g10/sig-check.c b/g10/sig-check.c index 74517507e..54ccae951 100644 --- a/g10/sig-check.c +++ b/g10/sig-check.c @@ -143,7 +143,7 @@ signature_check( PKT_signature *sig, MD_HANDLE digest ) md_putc( digest, a & 0xff ); } md_final( digest ); - dp = md_read( digest, 0 ); + dp = md_read( digest, DIGEST_ALGO_RMD160 ); for(i=19; i >= 0; i--, dp++ ) if( mpi_getbyte( result, i ) != *dp ) { rc = G10ERR_BAD_SIGN; @@ -187,7 +187,7 @@ signature_check( PKT_signature *sig, MD_HANDLE digest ) md_putc( digest, a & 0xff ); } md_final( digest ); - dp = md_read( digest, 0 ); + dp = md_read( digest, DIGEST_ALGO_MD5 ); for(i=15; i >= 0; i--, dp++ ) if( mpi_getbyte( result, i ) != *dp ) { rc = G10ERR_BAD_SIGN; @@ -220,7 +220,7 @@ signature_check( PKT_signature *sig, MD_HANDLE digest ) * check the signature pointed to by NODE. This is a key signatures */ int -check_key_signature( KBNODE root, KBNODE node ) +check_key_signature( KBNODE root, KBNODE node, int *is_selfsig ) { KBNODE unode; MD_HANDLE md; @@ -229,6 +229,8 @@ check_key_signature( KBNODE root, KBNODE node ) int algo; int rc; + if( is_selfsig ) + *is_selfsig = 0; assert( node->pkt->pkttype == PKT_SIGNATURE ); assert( (node->pkt->pkt.signature->sig_class&~3) == 0x10 ); assert( root->pkt->pkttype == PKT_PUBLIC_CERT ); @@ -250,6 +252,13 @@ check_key_signature( KBNODE root, KBNODE node ) if( unode && unode->pkt->pkttype == PKT_USER_ID ) { PKT_user_id *uid = unode->pkt->pkt.user_id; + if( is_selfsig ) { + u32 keyid[2]; + + keyid_from_pkc( pkc, keyid ); + if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] ) + *is_selfsig = 1; + } md = md_open( algo, 0 ); hash_public_cert( md, pkc ); md_write( md, uid->name, uid->len ); |