aboutsummaryrefslogtreecommitdiffstats
path: root/g10/sig-check.c
diff options
context:
space:
mode:
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;
}