AbstractF2mPoint
using System;
namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC
{
internal abstract class AbstractF2mPoint : ECPointBase
{
protected AbstractF2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
: base(curve, x, y, withCompression)
{
}
protected AbstractF2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
: base(curve, x, y, zs, withCompression)
{
}
protected override bool SatisfiesCurveEquation()
{
ECCurve curve = Curve;
ECFieldElement rawXCoord = base.RawXCoord;
ECFieldElement rawYCoord = base.RawYCoord;
ECFieldElement eCFieldElement = curve.A;
ECFieldElement eCFieldElement2 = curve.B;
int coordinateSystem = curve.CoordinateSystem;
ECFieldElement eCFieldElement5;
ECFieldElement eCFieldElement4;
if (coordinateSystem == 6) {
ECFieldElement eCFieldElement3 = base.RawZCoords[0];
bool isOne = eCFieldElement3.IsOne;
if (rawXCoord.IsZero) {
eCFieldElement4 = rawYCoord.Square();
eCFieldElement5 = eCFieldElement2;
if (!isOne) {
ECFieldElement b = eCFieldElement3.Square();
eCFieldElement5 = eCFieldElement5.Multiply(b);
}
} else {
ECFieldElement eCFieldElement6 = rawYCoord;
ECFieldElement eCFieldElement7 = rawXCoord.Square();
if (isOne) {
eCFieldElement4 = eCFieldElement6.Square().Add(eCFieldElement6).Add(eCFieldElement);
eCFieldElement5 = eCFieldElement7.Square().Add(eCFieldElement2);
} else {
ECFieldElement eCFieldElement8 = eCFieldElement3.Square();
ECFieldElement y = eCFieldElement8.Square();
eCFieldElement4 = eCFieldElement6.Add(eCFieldElement3).MultiplyPlusProduct(eCFieldElement6, eCFieldElement, eCFieldElement8);
eCFieldElement5 = eCFieldElement7.SquarePlusProduct(eCFieldElement2, y);
}
eCFieldElement4 = eCFieldElement4.Multiply(eCFieldElement7);
}
} else {
eCFieldElement4 = rawYCoord.Add(rawXCoord).Multiply(rawYCoord);
switch (coordinateSystem) {
case 1: {
ECFieldElement eCFieldElement9 = base.RawZCoords[0];
if (!eCFieldElement9.IsOne) {
ECFieldElement b2 = eCFieldElement9.Square();
ECFieldElement b3 = eCFieldElement9.Multiply(b2);
eCFieldElement4 = eCFieldElement4.Multiply(eCFieldElement9);
eCFieldElement = eCFieldElement.Multiply(eCFieldElement9);
eCFieldElement2 = eCFieldElement2.Multiply(b3);
}
break;
}
default:
throw new InvalidOperationException("unsupported coordinate system");
case 0:
break;
}
eCFieldElement5 = rawXCoord.Add(eCFieldElement).Multiply(rawXCoord.Square()).Add(eCFieldElement2);
}
return eCFieldElement4.Equals(eCFieldElement5);
}
protected override bool SatisfiesOrder()
{
ECCurve curve = Curve;
BigInteger cofactor = curve.Cofactor;
if (BigInteger.Two.Equals(cofactor))
return ((AbstractF2mFieldElement)Normalize().AffineXCoord.Add(curve.A)).Trace() == 0;
if (BigInteger.ValueOf(4).Equals(cofactor)) {
ECPoint eCPoint = Normalize();
ECFieldElement affineXCoord = eCPoint.AffineXCoord;
ECFieldElement eCFieldElement = ((AbstractF2mCurve)curve).SolveQuadraticEquation(affineXCoord.Add(curve.A));
if (eCFieldElement == null)
return false;
ECFieldElement eCFieldElement2 = affineXCoord.Multiply(eCFieldElement).Add(eCPoint.AffineYCoord).Add(curve.A);
if (((AbstractF2mFieldElement)eCFieldElement2).Trace() != 0)
return ((AbstractF2mFieldElement)eCFieldElement2.Add(affineXCoord)).Trace() == 0;
return true;
}
return base.SatisfiesOrder();
}
public override ECPoint ScaleX(ECFieldElement scale)
{
if (!base.IsInfinity) {
switch (CurveCoordinateSystem) {
case 5: {
ECFieldElement rawXCoord2 = base.RawXCoord;
ECFieldElement rawYCoord2 = base.RawYCoord;
ECFieldElement b2 = rawXCoord2.Multiply(scale);
ECFieldElement y2 = rawYCoord2.Add(rawXCoord2).Divide(scale).Add(b2);
return Curve.CreateRawPoint(rawXCoord2, y2, base.RawZCoords, base.IsCompressed);
}
case 6: {
ECFieldElement rawXCoord = base.RawXCoord;
ECFieldElement rawYCoord = base.RawYCoord;
ECFieldElement eCFieldElement = base.RawZCoords[0];
ECFieldElement b = rawXCoord.Multiply(scale.Square());
ECFieldElement y = rawYCoord.Add(rawXCoord).Add(b);
ECFieldElement eCFieldElement2 = eCFieldElement.Multiply(scale);
return Curve.CreateRawPoint(rawXCoord, y, new ECFieldElement[1] {
eCFieldElement2
}, base.IsCompressed);
}
default:
return base.ScaleX(scale);
}
}
return this;
}
public override ECPoint ScaleY(ECFieldElement scale)
{
if (base.IsInfinity)
return this;
int curveCoordinateSystem = CurveCoordinateSystem;
if ((uint)(curveCoordinateSystem - 5) <= 1) {
ECFieldElement rawXCoord = base.RawXCoord;
ECFieldElement y = base.RawYCoord.Add(rawXCoord).Multiply(scale).Add(rawXCoord);
return Curve.CreateRawPoint(rawXCoord, y, base.RawZCoords, base.IsCompressed);
}
return base.ScaleY(scale);
}
public override ECPoint Subtract(ECPoint b)
{
if (b.IsInfinity)
return this;
return Add(b.Negate());
}
public virtual AbstractF2mPoint Tau()
{
if (!base.IsInfinity) {
ECCurve curve = Curve;
int coordinateSystem = curve.CoordinateSystem;
ECFieldElement rawXCoord = base.RawXCoord;
switch (coordinateSystem) {
case 0:
case 5: {
ECFieldElement rawYCoord2 = base.RawYCoord;
return (AbstractF2mPoint)curve.CreateRawPoint(rawXCoord.Square(), rawYCoord2.Square(), base.IsCompressed);
}
case 1:
case 6: {
ECFieldElement rawYCoord = base.RawYCoord;
ECFieldElement eCFieldElement = base.RawZCoords[0];
return (AbstractF2mPoint)curve.CreateRawPoint(rawXCoord.Square(), rawYCoord.Square(), new ECFieldElement[1] {
eCFieldElement.Square()
}, base.IsCompressed);
}
default:
throw new InvalidOperationException("unsupported coordinate system");
}
}
return this;
}
public virtual AbstractF2mPoint TauPow(int pow)
{
if (!base.IsInfinity) {
ECCurve curve = Curve;
int coordinateSystem = curve.CoordinateSystem;
ECFieldElement rawXCoord = base.RawXCoord;
switch (coordinateSystem) {
case 0:
case 5: {
ECFieldElement rawYCoord2 = base.RawYCoord;
return (AbstractF2mPoint)curve.CreateRawPoint(rawXCoord.SquarePow(pow), rawYCoord2.SquarePow(pow), base.IsCompressed);
}
case 1:
case 6: {
ECFieldElement rawYCoord = base.RawYCoord;
ECFieldElement eCFieldElement = base.RawZCoords[0];
return (AbstractF2mPoint)curve.CreateRawPoint(rawXCoord.SquarePow(pow), rawYCoord.SquarePow(pow), new ECFieldElement[1] {
eCFieldElement.SquarePow(pow)
}, base.IsCompressed);
}
default:
throw new InvalidOperationException("unsupported coordinate system");
}
}
return this;
}
}
}