summaryrefslogtreecommitdiff
path: root/mpi/mpi-cmp.c
diff options
context:
space:
mode:
authorMoritz Schulte <mo@g10code.com>2005-10-09 12:29:17 +0000
committerMoritz Schulte <mo@g10code.com>2005-10-09 12:29:17 +0000
commit2cd580de1d6eab042556c50ed780cc9ac46cf660 (patch)
tree80f00730315e81bbbbb802eecd97a122fe43f826 /mpi/mpi-cmp.c
parentffc925ee22289bea3ae79ee93d51f634d1bc3e21 (diff)
downloadlibgcrypt-2cd580de1d6eab042556c50ed780cc9ac46cf660.tar.gz
mpi/ChangeLog:
2005-10-09 Moritz Schulte <moritz@g10code.com> * mpi-cmp.c (gcry_mpi_cmp_ui): Rewritten; correctly handle case of zero limbs in U.
Diffstat (limited to 'mpi/mpi-cmp.c')
-rw-r--r--mpi/mpi-cmp.c88
1 files changed, 52 insertions, 36 deletions
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;
+}