mpi/ChangeLog:
authorMoritz Schulte <mo@g10code.com>
Sun, 9 Oct 2005 12:29:17 +0000 (12:29 +0000)
committerMoritz Schulte <mo@g10code.com>
Sun, 9 Oct 2005 12:29:17 +0000 (12:29 +0000)
2005-10-09  Moritz Schulte  <moritz@g10code.com>

* mpi-cmp.c (gcry_mpi_cmp_ui): Rewritten; correctly handle case of
zero limbs in U.

mpi/ChangeLog
mpi/mpi-bit.c
mpi/mpi-cmp.c

index 10965ee..2439e56 100644 (file)
@@ -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
index 26853ef..2d91799 100644 (file)
@@ -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);
index 6036255..9dd1083 100644 (file)
@@ -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.
  *
 #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;
+}