diff options
author | Werner Koch <wk@gnupg.org> | 2011-02-01 16:13:37 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2011-02-01 16:13:37 +0100 |
commit | dbf7709d6339f74d7a88c96440e92576f3109486 (patch) | |
tree | a284528d6b0342c931cf04081d5b7a0a6132bed3 /mpi/mpi-cmp.c | |
parent | 5c4179860ef0b31b4c6ba957be9fa707a0ba7d9b (diff) | |
download | libgcrypt-dbf7709d6339f74d7a88c96440e92576f3109486.tar.gz |
Handle opaque MPIs in gcry_mpi_cmp
Diffstat (limited to 'mpi/mpi-cmp.c')
-rw-r--r-- | mpi/mpi-cmp.c | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/mpi/mpi-cmp.c b/mpi/mpi-cmp.c index 9dd10830..30e1fce9 100644 --- a/mpi/mpi-cmp.c +++ b/mpi/mpi-cmp.c @@ -53,6 +53,7 @@ gcry_mpi_cmp_ui (gcry_mpi_t u, unsigned long v) return 1; } + int gcry_mpi_cmp (gcry_mpi_t u, gcry_mpi_t v) { @@ -60,31 +61,47 @@ gcry_mpi_cmp (gcry_mpi_t u, gcry_mpi_t v) mpi_size_t vsize; int cmp; - _gcry_mpi_normalize (u); - _gcry_mpi_normalize (v); - - usize = u->nlimbs; - vsize = v->nlimbs; + if (mpi_is_opaque (u) || mpi_is_opaque (v)) + { + if (mpi_is_opaque (u) && !mpi_is_opaque (v)) + return -1; + if (!mpi_is_opaque (u) && mpi_is_opaque (v)) + return 1; + if (!u->sign && !v->sign) + return 0; /* Empty buffers are identical. */ + if (u->sign < v->sign) + return -1; + if (u->sign > v->sign) + return 1; + return memcmp (u->d, v->d, (u->sign+7)/8); + } + else + { + _gcry_mpi_normalize (u); + _gcry_mpi_normalize (v); - /* Compare sign bits. */ + usize = u->nlimbs; + vsize = v->nlimbs; - if (!u->sign && v->sign) - return 1; - if (u->sign && !v->sign) - return -1; + /* Compare sign bits. */ - /* U and V are either both positive or both negative. */ + 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; + /* 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; } |