diff options
-rw-r--r-- | mpi/ChangeLog | 5 | ||||
-rw-r--r-- | mpi/mpi-bit.c | 3 | ||||
-rw-r--r-- | mpi/mpi-cmp.c | 88 |
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; +} |