aboutsummaryrefslogtreecommitdiffstats
path: root/g10/sig-check.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/sig-check.c')
-rw-r--r--g10/sig-check.c71
1 files changed, 26 insertions, 45 deletions
diff --git a/g10/sig-check.c b/g10/sig-check.c
index fb3b409cf..841423878 100644
--- a/g10/sig-check.c
+++ b/g10/sig-check.c
@@ -38,9 +38,9 @@
* is able to append some data, before getting the digest.
*/
int
-signature_check( PKT_signature *sig, MD_HANDLE digest )
+signature_check( PKT_signature *sig, MD_HANDLE *digest )
{
- PKT_pubkey_cert *pkc = m_alloc_clear( sizeof *pkc );
+ PKT_public_cert *pkc = m_alloc_clear( sizeof *pkc );
MPI result = NULL;
int rc=0, i, j, c, old_enc;
byte *dp;
@@ -54,35 +54,17 @@ signature_check( PKT_signature *sig, MD_HANDLE digest )
if( pkc->pubkey_algo == PUBKEY_ALGO_ELGAMAL ) {
ELG_public_key pkey;
- if( sig->d.elg.digest_algo == DIGEST_ALGO_RMD160 ) {
- /* complete the digest */
- rmd160_putchar( digest.u.rmd, sig->sig_class );
- { u32 a = sig->timestamp;
- rmd160_putchar( digest.u.rmd, (a >> 24) & 0xff );
- rmd160_putchar( digest.u.rmd, (a >> 16) & 0xff );
- rmd160_putchar( digest.u.rmd, (a >> 8) & 0xff );
- rmd160_putchar( digest.u.rmd, a & 0xff );
- }
- dp = rmd160_final( digest.u.rmd );
- result = encode_rmd160_value( dp, 20, mpi_get_nbits(pkc->d.elg.p));
- }
- else if( sig->d.elg.digest_algo == DIGEST_ALGO_MD5 ) {
- md5_putchar( digest.u.md5, sig->sig_class );
- { u32 a = sig->timestamp;
- md5_putchar( digest.u.md5, (a >> 24) & 0xff );
- md5_putchar( digest.u.md5, (a >> 16) & 0xff );
- md5_putchar( digest.u.md5, (a >> 8) & 0xff );
- md5_putchar( digest.u.md5, a & 0xff );
- }
- md5_final( digest.u.md5 );
- dp = md5_read( digest.u.md5 );
- result = encode_md5_value( dp, 16, mpi_get_nbits(pkc->d.elg.p));
- }
- else {
- rc = G10ERR_DIGEST_ALGO;
+ if( (rc=md_okay(sig->d.elg.digest_algo)) )
goto leave;
+ /* complete the digest */
+ md_putchar( digest, sig->sig_class );
+ { u32 a = sig->timestamp;
+ md_putchar( digest, (a >> 24) & 0xff );
+ md_putchar( digest, (a >> 16) & 0xff );
+ md_putchar( digest, (a >> 8) & 0xff );
+ md_putchar( digest, a & 0xff );
}
-
+ result = encode_md_value( digest, mpi_get_nbits(pkc->d.elg.p));
pkey.p = pkc->d.elg.p;
pkey.g = pkc->d.elg.g;
pkey.y = pkc->d.elg.y;
@@ -131,7 +113,7 @@ signature_check( PKT_signature *sig, MD_HANDLE digest )
for(i=20,j=0; (c=mpi_getbyte(result, i)) != -1 && j < 18; i++, j++ )
if( asn[j] != c )
break;
- if( j != 18 || c ) { /* ASN is wrong */
+ if( j != 18 || mpi_getbyte(result, i) ) { /* ASN is wrong */
rc = G10ERR_BAD_PUBKEY;
goto leave;
}
@@ -152,14 +134,14 @@ signature_check( PKT_signature *sig, MD_HANDLE digest )
}
/* complete the digest */
- rmd160_putchar( digest.u.rmd, sig->sig_class );
+ md_putchar( digest, sig->sig_class );
{ u32 a = sig->timestamp;
- rmd160_putchar( digest.u.rmd, (a >> 24) & 0xff );
- rmd160_putchar( digest.u.rmd, (a >> 16) & 0xff );
- rmd160_putchar( digest.u.rmd, (a >> 8) & 0xff );
- rmd160_putchar( digest.u.rmd, a & 0xff );
+ md_putchar( digest, (a >> 24) & 0xff );
+ md_putchar( digest, (a >> 16) & 0xff );
+ md_putchar( digest, (a >> 8) & 0xff );
+ md_putchar( digest, a & 0xff );
}
- dp = rmd160_final( digest.u.rmd );
+ dp = md_final( digest );
for(i=19; i >= 0; i--, dp++ )
if( mpi_getbyte( result, i ) != *dp ) {
rc = G10ERR_BAD_SIGN;
@@ -174,7 +156,7 @@ signature_check( PKT_signature *sig, MD_HANDLE digest )
for(i=16,j=0; j < 18 && (c=mpi_getbyte(result, i)) != -1; i++, j++ )
if( asn[j] != c )
break;
- if( j != 18 || c ) { /* ASN is wrong */
+ if( j != 18 || mpi_getbyte(result, i) ) { /* ASN is wrong */
rc = G10ERR_BAD_PUBKEY;
goto leave;
}
@@ -195,15 +177,14 @@ signature_check( PKT_signature *sig, MD_HANDLE digest )
}
/* complete the digest */
- md5_putchar( digest.u.md5, sig->sig_class );
+ md_putchar( digest, sig->sig_class );
{ u32 a = sig->timestamp;
- md5_putchar( digest.u.md5, (a >> 24) & 0xff );
- md5_putchar( digest.u.md5, (a >> 16) & 0xff );
- md5_putchar( digest.u.md5, (a >> 8) & 0xff );
- md5_putchar( digest.u.md5, a & 0xff );
+ md_putchar( digest, (a >> 24) & 0xff );
+ md_putchar( digest, (a >> 16) & 0xff );
+ md_putchar( digest, (a >> 8) & 0xff );
+ md_putchar( digest, a & 0xff );
}
- md5_final( digest.u.md5 );
- dp = md5_read( digest.u.md5 );
+ dp = md_final( digest );
for(i=15; i >= 0; i--, dp++ )
if( mpi_getbyte( result, i ) != *dp ) {
rc = G10ERR_BAD_SIGN;
@@ -226,7 +207,7 @@ signature_check( PKT_signature *sig, MD_HANDLE digest )
leave:
if( pkc )
- free_pubkey_cert( pkc );
+ free_public_cert( pkc );
mpi_free( result );
return rc;
}