summaryrefslogtreecommitdiff
path: root/integer.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2021-10-08 15:51:17 -0400
committerJeffrey Walton <noloader@gmail.com>2021-10-08 15:51:17 -0400
commit5331e36173df627bd99df0a313212884c02809e7 (patch)
treec593ca346d8e0c9fbb9a69ad1c17d96a82593771 /integer.cpp
parent43e7c2c8c564498e93c071fd457a1bb0f93be1e4 (diff)
downloadcryptopp-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.cpp54
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;
}
}