diff options
author | Jack Lloyd <[email protected]> | 2018-11-26 20:42:28 -0500 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2018-11-26 20:42:28 -0500 |
commit | 00b6842a547c07e95f8e8205231e5f08d66ec4ec (patch) | |
tree | b123a370c59d24dce1802a2931160702acf3dcef /src/lib/math/bigint/bigint.h | |
parent | a512d682fbaf5533b68edefc971e113a68c37037 (diff) |
Make more BigInt functions const-time
In particular comparisons, calc sig words, and mod_sub are const time now.
Diffstat (limited to 'src/lib/math/bigint/bigint.h')
-rw-r--r-- | src/lib/math/bigint/bigint.h | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index 64e408798..1de3f7bc5 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -314,7 +314,7 @@ class BOTAN_PUBLIC_API(2,0) BigInt final * * Assumes that *this is (if anything) only slightly larger than * mod and performs repeated subtractions. It should not be used if - * *this is much larger than mod, instead of modulo operator. + * *this is much larger than mod, instead use modulo operator. */ void reduce_below(const BigInt& mod, secure_vector<word> &ws); @@ -334,6 +334,20 @@ class BOTAN_PUBLIC_API(2,0) BigInt final int32_t cmp(const BigInt& n, bool check_signs = true) const; /** + * Compare this to another BigInt + * @param n the BigInt value to compare with + * @result true if this == n or false otherwise + */ + bool is_equal(const BigInt& n) const; + + /** + * Compare this to another BigInt + * @param n the BigInt value to compare with + * @result true if this < n or false otherwise + */ + bool is_less_than(const BigInt& n) const; + + /** * Compare this to an integer * @param n the value to compare with * @result if (this<n) return -1, if (this>n) return 1, if both @@ -562,7 +576,7 @@ class BOTAN_PUBLIC_API(2,0) BigInt final * Increase internal register buffer to at least n words * @param n new size of register */ - void grow_to(size_t n) { m_data.grow_to(n); } + void grow_to(size_t n) const { m_data.grow_to(n); } /** * Resize the vector to the minimum word size to hold the integer, or @@ -896,7 +910,7 @@ class BOTAN_PUBLIC_API(2,0) BigInt final } } - void grow_to(size_t n) + void grow_to(size_t n) const { if(n > size()) { @@ -954,7 +968,7 @@ class BOTAN_PUBLIC_API(2,0) BigInt final size_t calc_sig_words() const; - secure_vector<word> m_reg; + mutable secure_vector<word> m_reg; mutable size_t m_sig_words = sig_words_npos; }; @@ -986,17 +1000,17 @@ BigInt BOTAN_PUBLIC_API(2,0) operator>>(const BigInt& x, size_t n); * Comparison Operators */ inline bool operator==(const BigInt& a, const BigInt& b) - { return (a.cmp(b) == 0); } + { return a.is_equal(b); } inline bool operator!=(const BigInt& a, const BigInt& b) - { return (a.cmp(b) != 0); } + { return !a.is_equal(b); } inline bool operator<=(const BigInt& a, const BigInt& b) { return (a.cmp(b) <= 0); } inline bool operator>=(const BigInt& a, const BigInt& b) { return (a.cmp(b) >= 0); } inline bool operator<(const BigInt& a, const BigInt& b) - { return (a.cmp(b) < 0); } + { return a.is_less_than(b); } inline bool operator>(const BigInt& a, const BigInt& b) - { return (a.cmp(b) > 0); } + { return b.is_less_than(a); } inline bool operator==(const BigInt& a, word b) { return (a.cmp_word(b) == 0); } |