summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mpi/ChangeLog5
-rw-r--r--mpi/mpi-bit.c3
-rw-r--r--mpi/mpi-cmp.c88
3 files changed, 59 insertions, 37 deletions
diff --git a/mpi/ChangeLog b/mpi/ChangeLog
index 10965ee1..2439e564 100644
--- a/mpi/ChangeLog
+++ b/mpi/ChangeLog
@@ -1,3 +1,8 @@
+2005-10-09 Moritz Schulte <moritz@g10code.com>
+
+ * mpi-cmp.c (gcry_mpi_cmp_ui): Rewritten; correctly handle case of
+ zero limbs in U.
+
2005-04-27 Moritz Schulte <moritz@g10code.com>
* mpiutil.c (gcry_mpi_randomize): Store random data in secure
diff --git a/mpi/mpi-bit.c b/mpi/mpi-bit.c
index 26853efd..2d917995 100644
--- a/mpi/mpi-bit.c
+++ b/mpi/mpi-bit.c
@@ -163,7 +163,8 @@ gcry_mpi_clear_highbit( gcry_mpi_t a, unsigned int n )
bitno = n % BITS_PER_MPI_LIMB;
if( limbno >= a->nlimbs )
- return; /* not allocated, so need to clear bits :-) */
+ return; /* not allocated, therefore no need to clear bits
+ :-) */
for( ; bitno < BITS_PER_MPI_LIMB; bitno++ )
a->d[limbno] &= ~(A_LIMB_1 << bitno);
diff --git a/mpi/mpi-cmp.c b/mpi/mpi-cmp.c
index 6036255c..9dd10830 100644
--- a/mpi/mpi-cmp.c
+++ b/mpi/mpi-cmp.c
@@ -1,5 +1,5 @@
/* mpi-cmp.c - MPI functions
- * Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2001, 2002, 2005 Free Software Foundation, Inc.
*
* This file is part of Libgcrypt.
*
@@ -24,51 +24,67 @@
#include "mpi-internal.h"
int
-gcry_mpi_cmp_ui( gcry_mpi_t u, unsigned long v )
+gcry_mpi_cmp_ui (gcry_mpi_t u, unsigned long v)
{
- mpi_limb_t limb = v;
+ mpi_limb_t limb = v;
- _gcry_mpi_normalize( u );
- if( !u->nlimbs && !limb )
- return 0;
- if( u->sign )
- return -1;
- if( u->nlimbs > 1 )
- return 1;
+ _gcry_mpi_normalize (u);
+
+ /* Handle the case that U contains no limb. */
+ if (u->nlimbs == 0)
+ return -(limb != 0);
+
+ /* Handle the case that U is negative. */
+ if (u->sign)
+ return -1;
+
+ if (u->nlimbs == 1)
+ {
+ /* Handle the case that U contains exactly one limb. */
- if( u->d[0] == limb )
- return 0;
- else if( u->d[0] > limb )
+ if (u->d[0] > limb)
return 1;
- else
+ if (u->d[0] < limb)
return -1;
+ return 0;
+ }
+ else
+ /* Handle the case that U contains more than one limb. */
+ return 1;
}
int
-gcry_mpi_cmp( gcry_mpi_t u, gcry_mpi_t v )
+gcry_mpi_cmp (gcry_mpi_t u, gcry_mpi_t v)
{
- mpi_size_t usize, vsize;
- int cmp;
+ mpi_size_t usize;
+ mpi_size_t vsize;
+ int cmp;
- _gcry_mpi_normalize( u );
- _gcry_mpi_normalize( v );
- usize = u->nlimbs;
- vsize = v->nlimbs;
- if( !u->sign && v->sign )
- return 1;
- if( u->sign && !v->sign )
- return -1;
- if( usize != vsize && !u->sign && !v->sign )
- return usize - vsize;
- if( usize != vsize && u->sign && v->sign )
- return vsize + usize;
- if( !usize )
- return 0;
- if( !(cmp = _gcry_mpih_cmp( u->d, v->d, usize )) )
- return 0;
- if( (cmp < 0?1:0) == (u->sign?1:0))
- return 1;
+ _gcry_mpi_normalize (u);
+ _gcry_mpi_normalize (v);
+
+ usize = u->nlimbs;
+ vsize = v->nlimbs;
+
+ /* Compare sign bits. */
+
+ if (!u->sign && v->sign)
+ return 1;
+ if (u->sign && !v->sign)
return -1;
-}
+ /* U and V are either both positive or both negative. */
+
+ if( usize != vsize && !u->sign && !v->sign )
+ return usize - vsize;
+ if( usize != vsize && u->sign && v->sign )
+ return vsize + usize;
+ if( !usize )
+ return 0;
+ if( !(cmp = _gcry_mpih_cmp( u->d, v->d, usize )) )
+ return 0;
+ if( (cmp < 0?1:0) == (u->sign?1:0))
+ return 1;
+ return -1;
+}