Skip to content

Commit

Permalink
Add BigInt::square plus a speed test for BigInt multiply
Browse files Browse the repository at this point in the history
  • Loading branch information
randombit committed Apr 8, 2018
1 parent c921a1b commit 0ca00cd
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 8 deletions.
47 changes: 47 additions & 0 deletions src/cli/speed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
#include <botan/internal/os_utils.h>
#include <botan/version.h>

#if defined(BOTAN_HAS_BIGINT)
#include <botan/bigint.h>
#endif

#if defined(BOTAN_HAS_BLOCK_CIPHER)
#include <botan/block_cipher.h>
#endif
Expand Down Expand Up @@ -895,6 +899,13 @@ class Speed final : public Command
}
#endif

#if defined(BOTAN_HAS_BIGINT)
else if(algo == "mp_mul")
{
bench_mp_mul(msec);
}
#endif

#if defined(BOTAN_HAS_NUMBERTHEORY)
else if(algo == "random_prime")
{
Expand Down Expand Up @@ -1428,6 +1439,42 @@ class Speed final : public Command
}
#endif

#if defined(BOTAN_HAS_BIGINT)

void bench_mp_mul(const std::chrono::milliseconds runtime)
{
std::chrono::milliseconds runtime_per_size = runtime / 9;
for(size_t bits : { 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096 })
{
std::unique_ptr<Timer> mul_timer = make_timer("BigInt mul " + std::to_string(bits));
std::unique_ptr<Timer> sqr_timer = make_timer("BigInt sqr " + std::to_string(bits));

const Botan::BigInt y(rng(), bits);
Botan::secure_vector<Botan::word> ws;

while(mul_timer->under(runtime_per_size))
{
Botan::BigInt x(rng(), bits);

sqr_timer->start();
x.square(ws);
sqr_timer->stop();

x.mask_bits(bits);

mul_timer->start();
x.mul(y, ws);
mul_timer->stop();
}

record_result(mul_timer);
record_result(sqr_timer);
}

}

#endif

#if defined(BOTAN_HAS_DL_GROUP)

void bench_modexp(const std::chrono::milliseconds runtime)
Expand Down
16 changes: 16 additions & 0 deletions src/lib/math/bigint/big_ops2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,22 @@ BigInt& BigInt::mul(const BigInt& y, secure_vector<word>& ws)
return (*this);
}

BigInt& BigInt::square(secure_vector<word>& ws)
{
const size_t sw = sig_words();

secure_vector<word> z(2*sw);
ws.resize(z.size());

bigint_sqr(z.data(), z.size(),
data(), size(), sw,
ws.data(), ws.size());

swap_reg(z);

return (*this);
}

BigInt& BigInt::operator*=(word y)
{
if(y == 0)
Expand Down
6 changes: 6 additions & 0 deletions src/lib/math/bigint/bigint.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,12 @@ class BOTAN_PUBLIC_API(2,0) BigInt final
*/
BigInt& mul(const BigInt& y, secure_vector<word>& ws);

/**
* Square value of *this
* @param ws a temp workspace
*/
BigInt& square(secure_vector<word>& ws);

/**
* Set *this to y - *this
* @param y the BigInt to subtract from as a sequence of words
Expand Down
11 changes: 3 additions & 8 deletions src/lib/math/numbertheory/mp_numth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,9 @@ namespace Botan {
*/
BigInt square(const BigInt& x)
{
const size_t x_sw = x.sig_words();

BigInt z(BigInt::Positive, round_up(2*x_sw, 16));
secure_vector<word> workspace(z.size());

bigint_sqr(z.mutable_data(), z.size(),
x.data(), x.size(), x_sw,
workspace.data(), workspace.size());
BigInt z = x;
secure_vector<word> ws;
z.square(ws);
return z;
}

Expand Down

0 comments on commit 0ca00cd

Please sign in to comment.