From c89dd16807951633fce1e2e7d34858868a4ca076 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Fri, 7 Feb 2014 12:56:46 +0700 Subject: Index precomputation info by name --- crypto/src/math/ec/ECCurve.cs | 26 +++++++++++++++++----- crypto/src/math/ec/ECPoint.cs | 3 ++- .../src/math/ec/multiplier/FixedPointUtilities.cs | 6 +++-- crypto/src/math/ec/multiplier/WNafUtilities.cs | 8 ++++--- crypto/src/math/ec/multiplier/WTauNafMultiplier.cs | 7 ++++-- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/crypto/src/math/ec/ECCurve.cs b/crypto/src/math/ec/ECCurve.cs index 82cf1367b..5c7592a92 100644 --- a/crypto/src/math/ec/ECCurve.cs +++ b/crypto/src/math/ec/ECCurve.cs @@ -116,26 +116,40 @@ namespace Org.BouncyCastle.Math.EC return coord == COORD_AFFINE; } - public virtual PreCompInfo GetPreCompInfo(ECPoint p) + public virtual PreCompInfo GetPreCompInfo(ECPoint point, string name) { - CheckPoint(p); - return p.m_preCompInfo; + CheckPoint(point); + lock (point) + { + IDictionary table = point.m_preCompTable; + return table == null ? null : (PreCompInfo)table[name]; + } } /** - * Sets the PreCompInfo for a point on this curve. Used by + * Adds PreCompInfo for a point on this curve, under a given name. Used by * ECMultipliers to save the precomputation for this ECPoint for use * by subsequent multiplication. * * @param point * The ECPoint to store precomputations for. + * @param name + * A String used to index precomputations of different types. * @param preCompInfo * The values precomputed by the ECMultiplier. */ - public virtual void SetPreCompInfo(ECPoint point, PreCompInfo preCompInfo) + public virtual void SetPreCompInfo(ECPoint point, string name, PreCompInfo preCompInfo) { CheckPoint(point); - point.m_preCompInfo = preCompInfo; + lock (point) + { + IDictionary table = point.m_preCompTable; + if (null == table) + { + point.m_preCompTable = table = Platform.CreateHashtable(4); + } + table[name] = preCompInfo; + } } public virtual ECPoint ImportPoint(ECPoint p) diff --git a/crypto/src/math/ec/ECPoint.cs b/crypto/src/math/ec/ECPoint.cs index 4b6a2cbce..f8bbf04e7 100644 --- a/crypto/src/math/ec/ECPoint.cs +++ b/crypto/src/math/ec/ECPoint.cs @@ -50,7 +50,8 @@ namespace Org.BouncyCastle.Math.EC protected internal readonly ECFieldElement[] m_zs; protected internal readonly bool m_withCompression; - protected internal PreCompInfo m_preCompInfo = null; + // Dictionary is (string -> PreCompInfo) + protected internal IDictionary m_preCompTable = null; protected ECPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression) : this(curve, x, y, GetInitialZCoords(curve), withCompression) diff --git a/crypto/src/math/ec/multiplier/FixedPointUtilities.cs b/crypto/src/math/ec/multiplier/FixedPointUtilities.cs index 8a04fcdc1..194995e08 100644 --- a/crypto/src/math/ec/multiplier/FixedPointUtilities.cs +++ b/crypto/src/math/ec/multiplier/FixedPointUtilities.cs @@ -4,6 +4,8 @@ namespace Org.BouncyCastle.Math.EC.Multiplier { public class FixedPointUtilities { + public static readonly string PRECOMP_NAME = "bc_fixed_point"; + public static int GetCombSize(ECCurve c) { BigInteger order = c.Order; @@ -25,7 +27,7 @@ namespace Org.BouncyCastle.Math.EC.Multiplier ECCurve c = p.Curve; int n = 1 << width; - FixedPointPreCompInfo info = GetFixedPointPreCompInfo(c.GetPreCompInfo(p)); + FixedPointPreCompInfo info = GetFixedPointPreCompInfo(c.GetPreCompInfo(p, PRECOMP_NAME)); ECPoint[] lookupTable = info.PreComp; if (lookupTable == null || lookupTable.Length != n) @@ -60,7 +62,7 @@ namespace Org.BouncyCastle.Math.EC.Multiplier info.PreComp = lookupTable; - c.SetPreCompInfo(p, info); + c.SetPreCompInfo(p, PRECOMP_NAME, info); } return info; diff --git a/crypto/src/math/ec/multiplier/WNafUtilities.cs b/crypto/src/math/ec/multiplier/WNafUtilities.cs index d37da8a5e..eac47222b 100644 --- a/crypto/src/math/ec/multiplier/WNafUtilities.cs +++ b/crypto/src/math/ec/multiplier/WNafUtilities.cs @@ -4,6 +4,8 @@ namespace Org.BouncyCastle.Math.EC.Multiplier { public abstract class WNafUtilities { + public static readonly string PRECOMP_NAME = "bc_wnaf"; + private static int[] DEFAULT_WINDOW_SIZE_CUTOFFS = new int[]{ 13, 41, 121, 337, 897, 2305 }; public static int[] GenerateCompactNaf(BigInteger k) @@ -188,7 +190,7 @@ namespace Org.BouncyCastle.Math.EC.Multiplier * most one is non-zero. * @param k The integer of which the Window NAF is computed. * @return The Window NAF of the given width, such that the following holds: - * k = ∑i=0l-1 ki2i + * k = &sum;i=0l-1 ki2i * , where the ki denote the elements of the * returned byte[]. */ @@ -292,7 +294,7 @@ namespace Org.BouncyCastle.Math.EC.Multiplier public static WNafPreCompInfo Precompute(ECPoint p, int width, bool includeNegated) { ECCurve c = p.Curve; - WNafPreCompInfo wnafPreCompInfo = GetWNafPreCompInfo(c.GetPreCompInfo(p)); + WNafPreCompInfo wnafPreCompInfo = GetWNafPreCompInfo(c.GetPreCompInfo(p, PRECOMP_NAME)); ECPoint[] preComp = wnafPreCompInfo.PreComp; if (preComp == null) @@ -363,7 +365,7 @@ namespace Org.BouncyCastle.Math.EC.Multiplier wnafPreCompInfo.PreCompNeg = preCompNeg; } - c.SetPreCompInfo(p, wnafPreCompInfo); + c.SetPreCompInfo(p, PRECOMP_NAME, wnafPreCompInfo); return wnafPreCompInfo; } diff --git a/crypto/src/math/ec/multiplier/WTauNafMultiplier.cs b/crypto/src/math/ec/multiplier/WTauNafMultiplier.cs index b87b87000..dda778eea 100644 --- a/crypto/src/math/ec/multiplier/WTauNafMultiplier.cs +++ b/crypto/src/math/ec/multiplier/WTauNafMultiplier.cs @@ -11,6 +11,9 @@ namespace Org.BouncyCastle.Math.EC.Multiplier public class WTauNafMultiplier : AbstractECMultiplier { + // TODO Create WTauNafUtilities class and move various functionality into it + internal static readonly string PRECOMP_NAME = "bc_wtnaf"; + /** * Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint} * by k using the reduced τ-adic NAF (RTNAF) @@ -33,7 +36,7 @@ namespace Org.BouncyCastle.Math.EC.Multiplier ZTauElement rho = Tnaf.PartModReduction(k, m, a, s, mu, (sbyte)10); - return MultiplyWTnaf(p, rho, curve.GetPreCompInfo(p), a, mu); + return MultiplyWTnaf(p, rho, curve.GetPreCompInfo(p, PRECOMP_NAME), a, mu); } /** @@ -80,7 +83,7 @@ namespace Org.BouncyCastle.Math.EC.Multiplier WTauNafPreCompInfo pre = new WTauNafPreCompInfo(); pre.PreComp = pu; - curve.SetPreCompInfo(p, pre); + curve.SetPreCompInfo(p, PRECOMP_NAME, pre); } else { -- cgit 1.4.1