1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- using System;
- using Org.BouncyCastle.Math.EC.Endo;
- namespace Org.BouncyCastle.Math.EC.Multiplier
- {
- public class GlvMultiplier
- : AbstractECMultiplier
- {
- protected readonly ECCurve curve;
- protected readonly GlvEndomorphism glvEndomorphism;
- public GlvMultiplier(ECCurve curve, GlvEndomorphism glvEndomorphism)
- {
- if (curve == null || curve.Order == null)
- throw new ArgumentException("Need curve with known group order", "curve");
- this.curve = curve;
- this.glvEndomorphism = glvEndomorphism;
- }
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- if (!curve.Equals(p.Curve))
- throw new InvalidOperationException();
- BigInteger n = p.Curve.Order;
- BigInteger[] ab = glvEndomorphism.DecomposeScalar(k.Mod(n));
- BigInteger a = ab[0], b = ab[1];
- ECPointMap pointMap = glvEndomorphism.PointMap;
- if (glvEndomorphism.HasEfficientPointMap)
- {
- return ECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap, b);
- }
- return ECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap.Map(p), b);
- }
- }
- }
- #endif
|