diff options
author | Moritz Schulte <mo@g10code.com> | 2005-10-09 12:29:17 +0000 |
---|---|---|
committer | Moritz Schulte <mo@g10code.com> | 2005-10-09 12:29:17 +0000 |
commit | 2cd580de1d6eab042556c50ed780cc9ac46cf660 (patch) | |
tree | 80f00730315e81bbbbb802eecd97a122fe43f826 /mpi/mpi-cmp.c | |
parent | ffc925ee22289bea3ae79ee93d51f634d1bc3e21 (diff) | |
download | libgcrypt-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.c | 88 |
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; +} |