<PackageReference Include="SSH.NET" Version="2020.0.0-beta1" />

F2mPoint

using System; namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC { internal class F2mPoint : AbstractF2mPoint { public override ECFieldElement YCoord { get { int curveCoordinateSystem = CurveCoordinateSystem; if ((uint)(curveCoordinateSystem - 5) <= 1) { ECFieldElement rawXCoord = base.RawXCoord; ECFieldElement rawYCoord = base.RawYCoord; if (base.IsInfinity || rawXCoord.IsZero) return rawYCoord; ECFieldElement eCFieldElement = rawYCoord.Add(rawXCoord).Multiply(rawXCoord); if (6 == curveCoordinateSystem) { ECFieldElement eCFieldElement2 = base.RawZCoords[0]; if (!eCFieldElement2.IsOne) eCFieldElement = eCFieldElement.Divide(eCFieldElement2); } return eCFieldElement; } return base.RawYCoord; } } protected internal override bool CompressionYTilde { get { ECFieldElement rawXCoord = base.RawXCoord; if (rawXCoord.IsZero) return false; ECFieldElement rawYCoord = base.RawYCoord; int curveCoordinateSystem = CurveCoordinateSystem; if ((uint)(curveCoordinateSystem - 5) <= 1) return rawYCoord.TestBitZero() != rawXCoord.TestBitZero(); return rawYCoord.Divide(rawXCoord).TestBitZero(); } } public F2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y) : this(curve, x, y, false) { } public F2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression) : base(curve, x, y, withCompression) { if (x == null != (y == null)) throw new ArgumentException("Exactly one of the field elements is null"); if (x != null) { F2mFieldElement.CheckFieldElements(x, y); if (curve != null) F2mFieldElement.CheckFieldElements(x, curve.A); } } internal F2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression) : base(curve, x, y, zs, withCompression) { } protected override ECPoint Detach() { return new F2mPoint(null, AffineXCoord, AffineYCoord, false); } public override ECPoint Add(ECPoint b) { if (base.IsInfinity) return b; if (!b.IsInfinity) { ECCurve curve = Curve; int coordinateSystem = curve.CoordinateSystem; ECFieldElement rawXCoord = base.RawXCoord; ECFieldElement rawXCoord2 = b.RawXCoord; switch (coordinateSystem) { case 0: { ECFieldElement rawYCoord5 = base.RawYCoord; ECFieldElement rawYCoord6 = b.RawYCoord; ECFieldElement eCFieldElement28 = rawXCoord.Add(rawXCoord2); ECFieldElement eCFieldElement29 = rawYCoord5.Add(rawYCoord6); if (eCFieldElement28.IsZero) { if (eCFieldElement29.IsZero) return Twice(); return curve.Infinity; } ECFieldElement eCFieldElement30 = eCFieldElement29.Divide(eCFieldElement28); ECFieldElement eCFieldElement31 = eCFieldElement30.Square().Add(eCFieldElement30).Add(eCFieldElement28) .Add(curve.A); ECFieldElement y3 = eCFieldElement30.Multiply(rawXCoord.Add(eCFieldElement31)).Add(eCFieldElement31).Add(rawYCoord5); return new F2mPoint(curve, eCFieldElement31, y3, base.IsCompressed); } case 1: { ECFieldElement rawYCoord3 = base.RawYCoord; ECFieldElement eCFieldElement15 = base.RawZCoords[0]; ECFieldElement rawYCoord4 = b.RawYCoord; ECFieldElement eCFieldElement16 = b.RawZCoords[0]; bool isOne3 = eCFieldElement15.IsOne; ECFieldElement eCFieldElement17 = rawYCoord4; ECFieldElement eCFieldElement18 = rawXCoord2; if (!isOne3) { eCFieldElement17 = eCFieldElement17.Multiply(eCFieldElement15); eCFieldElement18 = eCFieldElement18.Multiply(eCFieldElement15); } bool isOne4 = eCFieldElement16.IsOne; ECFieldElement eCFieldElement19 = rawYCoord3; ECFieldElement eCFieldElement20 = rawXCoord; if (!isOne4) { eCFieldElement19 = eCFieldElement19.Multiply(eCFieldElement16); eCFieldElement20 = eCFieldElement20.Multiply(eCFieldElement16); } ECFieldElement eCFieldElement21 = eCFieldElement17.Add(eCFieldElement19); ECFieldElement eCFieldElement22 = eCFieldElement18.Add(eCFieldElement20); if (eCFieldElement22.IsZero) { if (eCFieldElement21.IsZero) return Twice(); return curve.Infinity; } ECFieldElement eCFieldElement23 = eCFieldElement22.Square(); ECFieldElement eCFieldElement24 = eCFieldElement23.Multiply(eCFieldElement22); ECFieldElement b3 = isOne3 ? eCFieldElement16 : (isOne4 ? eCFieldElement15 : eCFieldElement15.Multiply(eCFieldElement16)); ECFieldElement eCFieldElement25 = eCFieldElement21.Add(eCFieldElement22); ECFieldElement eCFieldElement26 = eCFieldElement25.MultiplyPlusProduct(eCFieldElement21, eCFieldElement23, curve.A).Multiply(b3).Add(eCFieldElement24); ECFieldElement x = eCFieldElement22.Multiply(eCFieldElement26); ECFieldElement b4 = isOne4 ? eCFieldElement23 : eCFieldElement23.Multiply(eCFieldElement16); ECFieldElement y2 = eCFieldElement21.MultiplyPlusProduct(rawXCoord, eCFieldElement22, rawYCoord3).MultiplyPlusProduct(b4, eCFieldElement25, eCFieldElement26); ECFieldElement eCFieldElement27 = eCFieldElement24.Multiply(b3); return new F2mPoint(curve, x, y2, new ECFieldElement[1] { eCFieldElement27 }, base.IsCompressed); } case 6: { if (rawXCoord.IsZero) { if (rawXCoord2.IsZero) return curve.Infinity; return b.Add(this); } ECFieldElement rawYCoord = base.RawYCoord; ECFieldElement eCFieldElement = base.RawZCoords[0]; ECFieldElement rawYCoord2 = b.RawYCoord; ECFieldElement eCFieldElement2 = b.RawZCoords[0]; bool isOne = eCFieldElement.IsOne; ECFieldElement eCFieldElement3 = rawXCoord2; ECFieldElement eCFieldElement4 = rawYCoord2; if (!isOne) { eCFieldElement3 = eCFieldElement3.Multiply(eCFieldElement); eCFieldElement4 = eCFieldElement4.Multiply(eCFieldElement); } bool isOne2 = eCFieldElement2.IsOne; ECFieldElement eCFieldElement5 = rawXCoord; ECFieldElement eCFieldElement6 = rawYCoord; if (!isOne2) { eCFieldElement5 = eCFieldElement5.Multiply(eCFieldElement2); eCFieldElement6 = eCFieldElement6.Multiply(eCFieldElement2); } ECFieldElement eCFieldElement7 = eCFieldElement6.Add(eCFieldElement4); ECFieldElement eCFieldElement8 = eCFieldElement5.Add(eCFieldElement3); if (eCFieldElement8.IsZero) { if (eCFieldElement7.IsZero) return Twice(); return curve.Infinity; } ECFieldElement eCFieldElement10; ECFieldElement y; ECFieldElement eCFieldElement11; if (rawXCoord2.IsZero) { ECPoint eCPoint = Normalize(); rawXCoord = eCPoint.RawXCoord; ECFieldElement yCoord = eCPoint.YCoord; ECFieldElement b2 = rawYCoord2; ECFieldElement eCFieldElement9 = yCoord.Add(b2).Divide(rawXCoord); eCFieldElement10 = eCFieldElement9.Square().Add(eCFieldElement9).Add(rawXCoord) .Add(curve.A); if (eCFieldElement10.IsZero) return new F2mPoint(curve, eCFieldElement10, curve.B.Sqrt(), base.IsCompressed); y = eCFieldElement9.Multiply(rawXCoord.Add(eCFieldElement10)).Add(eCFieldElement10).Add(yCoord) .Divide(eCFieldElement10) .Add(eCFieldElement10); eCFieldElement11 = curve.FromBigInteger(BigInteger.One); } else { eCFieldElement8 = eCFieldElement8.Square(); ECFieldElement eCFieldElement12 = eCFieldElement7.Multiply(eCFieldElement5); ECFieldElement eCFieldElement13 = eCFieldElement7.Multiply(eCFieldElement3); eCFieldElement10 = eCFieldElement12.Multiply(eCFieldElement13); if (eCFieldElement10.IsZero) return new F2mPoint(curve, eCFieldElement10, curve.B.Sqrt(), base.IsCompressed); ECFieldElement eCFieldElement14 = eCFieldElement7.Multiply(eCFieldElement8); if (!isOne2) eCFieldElement14 = eCFieldElement14.Multiply(eCFieldElement2); y = eCFieldElement13.Add(eCFieldElement8).SquarePlusProduct(eCFieldElement14, rawYCoord.Add(eCFieldElement)); eCFieldElement11 = eCFieldElement14; if (!isOne) eCFieldElement11 = eCFieldElement11.Multiply(eCFieldElement); } return new F2mPoint(curve, eCFieldElement10, y, new ECFieldElement[1] { eCFieldElement11 }, base.IsCompressed); } default: throw new InvalidOperationException("unsupported coordinate system"); } } return this; } public override ECPoint Twice() { if (base.IsInfinity) return this; ECCurve curve = Curve; ECFieldElement rawXCoord = base.RawXCoord; if (!rawXCoord.IsZero) { switch (curve.CoordinateSystem) { case 0: { ECFieldElement eCFieldElement10 = base.RawYCoord.Divide(rawXCoord).Add(rawXCoord); ECFieldElement x = eCFieldElement10.Square().Add(eCFieldElement10).Add(curve.A); ECFieldElement y = rawXCoord.SquarePlusProduct(x, eCFieldElement10.AddOne()); return new F2mPoint(curve, x, y, base.IsCompressed); } case 1: { ECFieldElement rawYCoord2 = base.RawYCoord; ECFieldElement eCFieldElement11 = base.RawZCoords[0]; bool isOne2 = eCFieldElement11.IsOne; ECFieldElement eCFieldElement12 = isOne2 ? rawXCoord : rawXCoord.Multiply(eCFieldElement11); ECFieldElement b3 = isOne2 ? rawYCoord2 : rawYCoord2.Multiply(eCFieldElement11); ECFieldElement eCFieldElement13 = rawXCoord.Square(); ECFieldElement eCFieldElement14 = eCFieldElement13.Add(b3); ECFieldElement eCFieldElement15 = eCFieldElement12; ECFieldElement eCFieldElement16 = eCFieldElement15.Square(); ECFieldElement eCFieldElement17 = eCFieldElement14.Add(eCFieldElement15); ECFieldElement eCFieldElement18 = eCFieldElement17.MultiplyPlusProduct(eCFieldElement14, eCFieldElement16, curve.A); ECFieldElement x2 = eCFieldElement15.Multiply(eCFieldElement18); ECFieldElement y2 = eCFieldElement13.Square().MultiplyPlusProduct(eCFieldElement15, eCFieldElement18, eCFieldElement17); ECFieldElement eCFieldElement19 = eCFieldElement15.Multiply(eCFieldElement16); return new F2mPoint(curve, x2, y2, new ECFieldElement[1] { eCFieldElement19 }, base.IsCompressed); } case 6: { ECFieldElement rawYCoord = base.RawYCoord; ECFieldElement eCFieldElement = base.RawZCoords[0]; bool isOne = eCFieldElement.IsOne; ECFieldElement eCFieldElement2 = isOne ? rawYCoord : rawYCoord.Multiply(eCFieldElement); ECFieldElement eCFieldElement3 = isOne ? eCFieldElement : eCFieldElement.Square(); ECFieldElement a = curve.A; ECFieldElement eCFieldElement4 = isOne ? a : a.Multiply(eCFieldElement3); ECFieldElement eCFieldElement5 = rawYCoord.Square().Add(eCFieldElement2).Add(eCFieldElement4); if (eCFieldElement5.IsZero) return new F2mPoint(curve, eCFieldElement5, curve.B.Sqrt(), base.IsCompressed); ECFieldElement eCFieldElement6 = eCFieldElement5.Square(); ECFieldElement eCFieldElement7 = isOne ? eCFieldElement5 : eCFieldElement5.Multiply(eCFieldElement3); ECFieldElement b = curve.B; ECFieldElement eCFieldElement9; if (b.BitLength < curve.FieldSize >> 1) { ECFieldElement eCFieldElement8 = rawYCoord.Add(rawXCoord).Square(); ECFieldElement b2 = (!b.IsOne) ? eCFieldElement4.SquarePlusProduct(b, eCFieldElement3.Square()) : eCFieldElement4.Add(eCFieldElement3).Square(); eCFieldElement9 = eCFieldElement8.Add(eCFieldElement5).Add(eCFieldElement3).Multiply(eCFieldElement8) .Add(b2) .Add(eCFieldElement6); if (a.IsZero) eCFieldElement9 = eCFieldElement9.Add(eCFieldElement7); else if (!a.IsOne) { eCFieldElement9 = eCFieldElement9.Add(a.AddOne().Multiply(eCFieldElement7)); } } else eCFieldElement9 = (isOne ? rawXCoord : rawXCoord.Multiply(eCFieldElement)).SquarePlusProduct(eCFieldElement5, eCFieldElement2).Add(eCFieldElement6).Add(eCFieldElement7); return new F2mPoint(curve, eCFieldElement6, eCFieldElement9, new ECFieldElement[1] { eCFieldElement7 }, base.IsCompressed); } default: throw new InvalidOperationException("unsupported coordinate system"); } } return curve.Infinity; } public override ECPoint TwicePlus(ECPoint b) { if (base.IsInfinity) return b; if (b.IsInfinity) return Twice(); ECCurve curve = Curve; ECFieldElement rawXCoord = base.RawXCoord; if (rawXCoord.IsZero) return b; if (curve.CoordinateSystem == 6) { ECFieldElement rawXCoord2 = b.RawXCoord; ECFieldElement eCFieldElement = b.RawZCoords[0]; if (rawXCoord2.IsZero || !eCFieldElement.IsOne) return Twice().Add(b); ECFieldElement rawYCoord = base.RawYCoord; ECFieldElement eCFieldElement2 = base.RawZCoords[0]; ECFieldElement rawYCoord2 = b.RawYCoord; ECFieldElement x = rawXCoord.Square(); ECFieldElement b2 = rawYCoord.Square(); ECFieldElement eCFieldElement3 = eCFieldElement2.Square(); ECFieldElement b3 = rawYCoord.Multiply(eCFieldElement2); ECFieldElement b4 = curve.A.Multiply(eCFieldElement3).Add(b2).Add(b3); ECFieldElement eCFieldElement4 = rawYCoord2.AddOne(); ECFieldElement eCFieldElement5 = curve.A.Add(eCFieldElement4).Multiply(eCFieldElement3).Add(b2) .MultiplyPlusProduct(b4, x, eCFieldElement3); ECFieldElement eCFieldElement6 = rawXCoord2.Multiply(eCFieldElement3); ECFieldElement eCFieldElement7 = eCFieldElement6.Add(b4).Square(); if (eCFieldElement7.IsZero) { if (eCFieldElement5.IsZero) return b.Twice(); return curve.Infinity; } if (eCFieldElement5.IsZero) return new F2mPoint(curve, eCFieldElement5, curve.B.Sqrt(), base.IsCompressed); ECFieldElement x2 = eCFieldElement5.Square().Multiply(eCFieldElement6); ECFieldElement eCFieldElement8 = eCFieldElement5.Multiply(eCFieldElement7).Multiply(eCFieldElement3); ECFieldElement y = eCFieldElement5.Add(eCFieldElement7).Square().MultiplyPlusProduct(b4, eCFieldElement4, eCFieldElement8); return new F2mPoint(curve, x2, y, new ECFieldElement[1] { eCFieldElement8 }, base.IsCompressed); } return Twice().Add(b); } public override ECPoint Negate() { if (base.IsInfinity) return this; ECFieldElement rawXCoord = base.RawXCoord; if (!rawXCoord.IsZero) { ECCurve curve = Curve; switch (curve.CoordinateSystem) { case 0: { ECFieldElement rawYCoord4 = base.RawYCoord; return new F2mPoint(curve, rawXCoord, rawYCoord4.Add(rawXCoord), base.IsCompressed); } case 1: { ECFieldElement rawYCoord3 = base.RawYCoord; ECFieldElement eCFieldElement2 = base.RawZCoords[0]; return new F2mPoint(curve, rawXCoord, rawYCoord3.Add(rawXCoord), new ECFieldElement[1] { eCFieldElement2 }, base.IsCompressed); } case 5: { ECFieldElement rawYCoord2 = base.RawYCoord; return new F2mPoint(curve, rawXCoord, rawYCoord2.AddOne(), base.IsCompressed); } case 6: { ECFieldElement rawYCoord = base.RawYCoord; ECFieldElement eCFieldElement = base.RawZCoords[0]; return new F2mPoint(curve, rawXCoord, rawYCoord.Add(eCFieldElement), new ECFieldElement[1] { eCFieldElement }, base.IsCompressed); } default: throw new InvalidOperationException("unsupported coordinate system"); } } return this; } } }