diff options
author | Jeffrey Walton <noloader@gmail.com> | 2021-10-08 15:51:17 -0400 |
---|---|---|
committer | Jeffrey Walton <noloader@gmail.com> | 2021-10-08 15:51:17 -0400 |
commit | 5331e36173df627bd99df0a313212884c02809e7 (patch) | |
tree | c593ca346d8e0c9fbb9a69ad1c17d96a82593771 /integer.cpp | |
parent | 43e7c2c8c564498e93c071fd457a1bb0f93be1e4 (diff) | |
download | cryptopp-git-5331e36173df627bd99df0a313212884c02809e7.tar.gz |
Optimize Integer bit operations fix (GH #1072)
This fix uses IntegerSecBlock directly. It avoids the potential second allocation during Grow at the expense of a potential slightly larger SecBlock
Diffstat (limited to 'integer.cpp')
-rw-r--r-- | integer.cpp | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/integer.cpp b/integer.cpp index 6f645d00..4a13c329 100644 --- a/integer.cpp +++ b/integer.cpp @@ -3809,20 +3809,22 @@ Integer Integer::And(const Integer& t) const }
else if (reg.size() >= t.reg.size())
{
- Integer result(t);
- result.reg.Grow(t.reg.size());
- AndWords(result.reg, reg, t.reg.size());
+ IntegerSecBlock temp(t.reg.size());
+ AndWords(temp, reg, t.reg, t.reg.size());
+
+ Integer result;
+ std::swap(result.reg, temp);
- result.sign = POSITIVE;
return result;
}
else // reg.size() < t.reg.size()
{
- Integer result(*this);
- result.reg.Grow(reg.size());
- AndWords(result.reg, t.reg, reg.size());
+ IntegerSecBlock temp(reg.size());
+ AndWords(temp, reg, t.reg, reg.size());
+
+ Integer result;
+ std::swap(result.reg, temp);
- result.sign = POSITIVE;
return result;
}
}
@@ -3841,20 +3843,22 @@ Integer Integer::Or(const Integer& t) const }
else if (reg.size() >= t.reg.size())
{
- Integer result(*this);
- result.reg.Grow(t.reg.size());
- OrWords(result.reg, t.reg, t.reg.size());
+ IntegerSecBlock temp(reg, reg.size());
+ OrWords(temp, t.reg, t.reg.size());
+
+ Integer result;
+ std::swap(result.reg, temp);
- result.sign = POSITIVE;
return result;
}
else // reg.size() < t.reg.size()
{
- Integer result(t);
- result.reg.Grow(reg.size());
- OrWords(result.reg, reg, reg.size());
+ IntegerSecBlock temp(t.reg, t.reg.size());
+ OrWords(temp, reg, reg.size());
+
+ Integer result;
+ std::swap(result.reg, temp);
- result.sign = POSITIVE;
return result;
}
}
@@ -3873,20 +3877,22 @@ Integer Integer::Xor(const Integer& t) const }
else if (reg.size() >= t.reg.size())
{
- Integer result(*this);
- result.reg.Grow(t.reg.size());
- XorWords(result.reg, t.reg, t.reg.size());
+ IntegerSecBlock temp(reg, reg.size());
+ XorWords(temp, t.reg, t.reg.size());
+
+ Integer result;
+ std::swap(result.reg, temp);
- result.sign = POSITIVE;
return result;
}
else // reg.size() < t.reg.size()
{
- Integer result(t);
- result.reg.Grow(reg.size());
- XorWords(result.reg, reg, reg.size());
+ IntegerSecBlock temp(t.reg, t.reg.size());
+ XorWords(temp, reg, reg.size());
+
+ Integer result;
+ std::swap(result.reg, temp);
- result.sign = POSITIVE;
return result;
}
}
|