aboutsummaryrefslogtreecommitdiffstats
path: root/g10/sig-check.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>1999-02-26 16:59:48 +0000
committerWerner Koch <[email protected]>1999-02-26 16:59:48 +0000
commit694099b9af96d53ad4a4f9bc70e08c2f393f9f4e (patch)
treeff5ddc557b85093cbf4076374bd43b2e958ce804 /g10/sig-check.c
parentSee ChangeLog: Thu Feb 25 18:47:39 CET 1999 Werner Koch (diff)
downloadgnupg-694099b9af96d53ad4a4f9bc70e08c2f393f9f4e.tar.gz
gnupg-694099b9af96d53ad4a4f9bc70e08c2f393f9f4e.zip
See ChangeLog: Fri Feb 26 17:55:41 CET 1999 Werner Koch
Diffstat (limited to '')
-rw-r--r--g10/sig-check.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/g10/sig-check.c b/g10/sig-check.c
index 0eb29eafb..4cb1ea65e 100644
--- a/g10/sig-check.c
+++ b/g10/sig-check.c
@@ -64,6 +64,34 @@ signature_check( PKT_signature *sig, MD_HANDLE digest )
rc = do_check( pk, sig, digest );
free_public_key( pk );
+
+ if( !rc && is_status_enabled()
+ && ( sig->pubkey_algo == PUBKEY_ALGO_DSA
+ || sig->pubkey_algo == PUBKEY_ALGO_ELGAMAL ) ) {
+ /* If we are using these public key algorithms we can
+ * calculate an unique signature id, which may be useful
+ * in an application to prevent replac attacks */
+ MD_HANDLE md;
+ int i, nsig = pubkey_get_nsig( sig->pubkey_algo );
+ byte *p;
+
+ md = md_open( DIGEST_ALGO_RMD160, 0);
+ for(i=0; i < nsig; i++ ) {
+ unsigned n = mpi_get_nbits( sig->data[i]);
+
+ md_putc( md, n>>8);
+ md_putc( md, n );
+ p = mpi_get_buffer( sig->data[i], &n, NULL );
+ md_write( md, p, n );
+ m_free(p);
+ }
+ md_final( md );
+ p = make_radix64_string( md_read( md, 0 ), 20 );
+ write_status_text( STATUS_SIG_ID, p );
+ m_free(p);
+ md_close(md);
+ }
+
return rc;
}