summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2014-01-03 13:10:23 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2014-01-03 13:10:23 +0700
commit9a6645ec73dc40ddb37c92222f78df625fd19bb4 (patch)
tree701daba9b01d667b4799c00b3e7a13519f85a080
parentFix tabs (diff)
downloadBouncyCastle.NET-ed25519-9a6645ec73dc40ddb37c92222f78df625fd19bb4.tar.xz
Registerize top accumulator word in Montgomery multiplication/squaring
-rw-r--r--crypto/src/math/BigInteger.cs18
1 files changed, 12 insertions, 6 deletions
diff --git a/crypto/src/math/BigInteger.cs b/crypto/src/math/BigInteger.cs

index fa7cdda3e..04c04a55d 100644 --- a/crypto/src/math/BigInteger.cs +++ b/crypto/src/math/BigInteger.cs
@@ -2269,6 +2269,7 @@ namespace Org.BouncyCastle.Math } uint y0 = (uint)y[n - 1]; + int aMax; { ulong xi = (uint)x[n - 1]; @@ -2292,7 +2293,7 @@ namespace Org.BouncyCastle.Math } a[1] = (int)carry; - a[0] = (int)(carry >> 32); + aMax = (int)(carry >> 32); } for (int i = n - 2; i >= 0; --i) @@ -2319,11 +2320,13 @@ namespace Org.BouncyCastle.Math carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32); } - carry += (uint)a[0]; + carry += (uint)aMax; a[1] = (int)carry; - a[0] = (int)(carry >> 32); + aMax = (int)(carry >> 32); } + a[0] = aMax; + if (!smallMontyModulus && CompareTo(0, a, 0, m) >= 0) { Subtract(0, a, 0, m); @@ -2345,6 +2348,7 @@ namespace Org.BouncyCastle.Math } ulong x0 = (uint)x[n - 1]; + int aMax; { ulong carry = x0 * x0; @@ -2366,7 +2370,7 @@ namespace Org.BouncyCastle.Math } a[1] = (int)carry; - a[0] = (int)(carry >> 32); + aMax = (int)(carry >> 32); } for (int i = n - 2; i >= 0; --i) @@ -2406,11 +2410,13 @@ namespace Org.BouncyCastle.Math carry = (carry >> 32) + (prod1 >> 31) + (prod2 >> 32); } - carry += (uint)a[0]; + carry += (uint)aMax; a[1] = (int)carry; - a[0] = (int)(carry >> 32); + aMax = (int)(carry >> 32); } + a[0] = aMax; + if (!smallMontyModulus && CompareTo(0, a, 0, m) >= 0) { Subtract(0, a, 0, m);