WNafL2RMultiplier
using System;
namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier
{
internal class WNafL2RMultiplier : AbstractECMultiplier
{
protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
{
int num = System.Math.Max(2, System.Math.Min(16, GetWindowSize(k.BitLength)));
WNafPreCompInfo wNafPreCompInfo = WNafUtilities.Precompute(p, num, true);
ECPoint[] preComp = wNafPreCompInfo.PreComp;
ECPoint[] preCompNeg = wNafPreCompInfo.PreCompNeg;
int[] array = WNafUtilities.GenerateCompactWindowNaf(num, k);
ECPoint eCPoint = p.Curve.Infinity;
int num2 = array.Length;
if (num2 > 1) {
int num3 = array[--num2];
int num4 = num3 >> 16;
int num5 = num3 & 65535;
int num6 = System.Math.Abs(num4);
ECPoint[] array2 = (num4 < 0) ? preCompNeg : preComp;
if (num6 << 2 < 1 << num) {
int num7 = LongArray.BitLengths[num6];
int num8 = num - num7;
int num9 = num6 ^ (1 << num7 - 1);
int num10 = (1 << num - 1) - 1;
int num11 = (num9 << num8) + 1;
eCPoint = array2[num10 >> 1].Add(array2[num11 >> 1]);
num5 -= num8;
} else
eCPoint = array2[num6 >> 1];
eCPoint = eCPoint.TimesPow2(num5);
}
while (num2 > 0) {
int num12 = array[--num2];
int num13 = num12 >> 16;
int e = num12 & 65535;
int num14 = System.Math.Abs(num13);
ECPoint b = ((num13 < 0) ? preCompNeg : preComp)[num14 >> 1];
eCPoint = eCPoint.TwicePlus(b);
eCPoint = eCPoint.TimesPow2(e);
}
return eCPoint;
}
protected virtual int GetWindowSize(int bits)
{
return WNafUtilities.GetWindowSize(bits);
}
}
}