summary refs log tree commit diff
path: root/crypto/src/math/ec
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2014-01-24 15:13:41 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2014-01-24 15:13:41 +0700
commit4e88394961c9ce8002e6093ca388bfa4ca943a76 (patch)
tree5bf118b929b3a78b1e8bca71135541f7d20a002f /crypto/src/math/ec
parentTrack carries for a, b to avoid unnecessary add/sub of prime modulus (diff)
downloadBouncyCastle.NET-ed25519-4e88394961c9ce8002e6093ca388bfa4ca943a76.tar.xz
Optimization in ModReduce
Diffstat (limited to 'crypto/src/math/ec')
-rw-r--r--crypto/src/math/ec/ECFieldElement.cs9
1 files changed, 6 insertions, 3 deletions
diff --git a/crypto/src/math/ec/ECFieldElement.cs b/crypto/src/math/ec/ECFieldElement.cs

index f29d1f1b0..d8813bf0b 100644 --- a/crypto/src/math/ec/ECFieldElement.cs +++ b/crypto/src/math/ec/ECFieldElement.cs
@@ -77,7 +77,8 @@ namespace Org.BouncyCastle.Math.EC internal static BigInteger CalculateResidue(BigInteger p) { int bitLength = p.BitLength; - if (bitLength > 128) + //if (bitLength > 128) + if (bitLength > 64) { /* * NOTE: Due to poor performance of BigInteger.Mod in C#, the residue-based reduction is @@ -345,11 +346,13 @@ namespace Org.BouncyCastle.Math.EC x = x.Abs(); } int qLen = q.BitLength; + BigInteger qMod = BigInteger.One.ShiftLeft(qLen); + bool rIsOne = r.Equals(BigInteger.One); while (x.BitLength > (qLen + 1)) { BigInteger u = x.ShiftRight(qLen); - BigInteger v = x.Subtract(u.ShiftLeft(qLen)); - if (!r.Equals(BigInteger.One)) + BigInteger v = x.Remainder(qMod); + if (!rIsOne) { u = u.Multiply(r); }