aboutsummaryrefslogtreecommitdiffstats
path: root/cipher/elgamal.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>1998-02-11 03:25:44 +0000
committerWerner Koch <[email protected]>1998-02-11 03:25:44 +0000
commit4c0c155922b70b62793905490e210e9af4e3b18d (patch)
treea0d8d84a89cfd4579817a993715e750917961c3e /cipher/elgamal.c
parentrelease 0.2.3 (diff)
downloadgnupg-4c0c155922b70b62793905490e210e9af4e3b18d.tar.gz
gnupg-4c0c155922b70b62793905490e210e9af4e3b18d.zip
a couple of changes; but some parts are now broken
Diffstat (limited to 'cipher/elgamal.c')
-rw-r--r--cipher/elgamal.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/cipher/elgamal.c b/cipher/elgamal.c
index 5e6bd0c84..13b8579fe 100644
--- a/cipher/elgamal.c
+++ b/cipher/elgamal.c
@@ -311,25 +311,37 @@ elg_verify(MPI a, MPI b, MPI input, ELG_public_key *pkey )
int rc;
MPI t1;
MPI t2;
+ MPI base[4];
+ MPI exp[4];
if( !(mpi_cmp_ui( a, 0 ) > 0 && mpi_cmp( a, pkey->p ) < 0) )
return 0; /* assertion 0 < a < p failed */
t1 = mpi_alloc( mpi_get_nlimbs(a) );
t2 = mpi_alloc( mpi_get_nlimbs(a) );
- /* t1 = (y^a mod p) * (a^b mod p) mod p
- * fixme: should be calculated by a call which evalutes
- * t1 = y^a * a^b mod p
- * direct.
- */
- mpi_powm( t1, pkey->y, a, pkey->p );
- mpi_powm( t2, a, b, pkey->p );
- mpi_mulm( t1, t1, t2, pkey->p );
+
+ #if 0
+ /* t1 = (y^a mod p) * (a^b mod p) mod p */
+ base[0] = pkey->y; exp[0] = a;
+ base[1] = a; exp[1] = b;
+ base[2] = NULL; exp[2] = NULL;
+ mpi_mulpowm( t1, base, exp, pkey->p );
/* t2 = g ^ input mod p */
mpi_powm( t2, pkey->g, input, pkey->p );
rc = !mpi_cmp( t1, t2 );
+ #else
+ /* t1 = g ^ - input * y ^ a * a ^ b mod p */
+ mpi_invm(t2, pkey->g, pkey->p );
+ base[0] = t2 ; exp[0] = input;
+ base[1] = pkey->y; exp[1] = a;
+ base[2] = a; exp[2] = b;
+ base[3] = NULL; exp[3] = NULL;
+ mpi_mulpowm( t1, base, exp, pkey->p );
+ rc = !mpi_cmp_ui( t1, 1 );
+
+ #endif
mpi_free(t1);
mpi_free(t2);