1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-02 22:46:30 +02:00

List and check sigs works

This commit is contained in:
Werner Koch 1997-12-01 10:33:23 +00:00
parent 649eae8f1b
commit 5c1cca042e
35 changed files with 1007 additions and 793 deletions

View file

@ -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;
}