SecT571R1Point
using Org.BouncyCastle.Math.Raw;
using System;
namespace Org.BouncyCastle.Math.EC.Custom.Sec
{
internal class SecT571R1Point : AbstractF2mPoint
{
public override ECFieldElement YCoord {
get {
ECFieldElement rawXCoord = base.RawXCoord;
ECFieldElement rawYCoord = base.RawYCoord;
if (base.IsInfinity || rawXCoord.IsZero)
return rawYCoord;
ECFieldElement eCFieldElement = rawYCoord.Add(rawXCoord).Multiply(rawXCoord);
ECFieldElement eCFieldElement2 = base.RawZCoords[0];
if (!eCFieldElement2.IsOne)
eCFieldElement = eCFieldElement.Divide(eCFieldElement2);
return eCFieldElement;
}
}
protected internal override bool CompressionYTilde {
get {
ECFieldElement rawXCoord = base.RawXCoord;
if (rawXCoord.IsZero)
return false;
return base.RawYCoord.TestBitZero() != rawXCoord.TestBitZero();
}
}
internal SecT571R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
: base(curve, x, y)
{
}
internal SecT571R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs)
: base(curve, x, y, zs)
{
}
protected override ECPoint Detach()
{
return new SecT571R1Point(null, AffineXCoord, AffineYCoord);
}
public unsafe override ECPoint Add(ECPoint b)
{
if (base.IsInfinity)
return b;
if (b.IsInfinity)
return this;
ECCurve curve = Curve;
SecT571FieldElement secT571FieldElement = (SecT571FieldElement)base.RawXCoord;
SecT571FieldElement secT571FieldElement2 = (SecT571FieldElement)b.RawXCoord;
if (secT571FieldElement.IsZero) {
if (secT571FieldElement2.IsZero)
return curve.Infinity;
return b.Add(this);
}
SecT571FieldElement secT571FieldElement3 = (SecT571FieldElement)base.RawYCoord;
SecT571FieldElement secT571FieldElement4 = (SecT571FieldElement)base.RawZCoords[0];
SecT571FieldElement secT571FieldElement5 = (SecT571FieldElement)b.RawYCoord;
SecT571FieldElement secT571FieldElement6 = (SecT571FieldElement)b.RawZCoords[0];
ulong[] array = Nat576.Create64();
ulong[] array2 = Nat576.Create64();
ulong[] array3 = Nat576.Create64();
ulong[] array4 = Nat576.Create64();
ulong[] array5 = secT571FieldElement4.IsOne ? null : SecT571Field.PrecompMultiplicand(secT571FieldElement4.x);
ulong[] array6;
ulong[] array7;
if (array5 == null) {
array6 = secT571FieldElement2.x;
array7 = secT571FieldElement5.x;
} else {
SecT571Field.MultiplyPrecomp(secT571FieldElement2.x, array5, array6 = array2);
SecT571Field.MultiplyPrecomp(secT571FieldElement5.x, array5, array7 = array4);
}
ulong[] array8 = secT571FieldElement6.IsOne ? null : SecT571Field.PrecompMultiplicand(secT571FieldElement6.x);
ulong[] array9;
ulong[] array10;
if (array8 == null) {
array9 = secT571FieldElement.x;
array10 = secT571FieldElement3.x;
} else {
SecT571Field.MultiplyPrecomp(secT571FieldElement.x, array8, array9 = array);
SecT571Field.MultiplyPrecomp(secT571FieldElement3.x, array8, array10 = array3);
}
ulong[] array11 = array3;
SecT571Field.Add(array10, array7, array11);
ulong[] array12 = array4;
SecT571Field.Add(array9, array6, array12);
if (Nat576.IsZero64(array12)) {
if (Nat576.IsZero64(array11))
return Twice();
return curve.Infinity;
}
SecT571FieldElement secT571FieldElement7;
SecT571FieldElement secT571FieldElement8;
SecT571FieldElement secT571FieldElement9;
if (secT571FieldElement2.IsZero) {
ECPoint eCPoint = Normalize();
secT571FieldElement = (SecT571FieldElement)eCPoint.XCoord;
ECFieldElement yCoord = eCPoint.YCoord;
ECFieldElement b2 = secT571FieldElement5;
ECFieldElement eCFieldElement = yCoord.Add(b2).Divide(secT571FieldElement);
secT571FieldElement7 = (SecT571FieldElement)eCFieldElement.Square().Add(eCFieldElement).Add(secT571FieldElement)
.AddOne();
if (secT571FieldElement7.IsZero)
return new SecT571R1Point(curve, secT571FieldElement7, SecT571R1Curve.SecT571R1_B_SQRT);
secT571FieldElement8 = (SecT571FieldElement)eCFieldElement.Multiply(secT571FieldElement.Add(secT571FieldElement7)).Add(secT571FieldElement7).Add(yCoord)
.Divide(secT571FieldElement7)
.Add(secT571FieldElement7);
secT571FieldElement9 = (SecT571FieldElement)curve.FromBigInteger(BigInteger.One);
} else {
SecT571Field.Square(array12, array12);
ulong[] precomp = SecT571Field.PrecompMultiplicand(array11);
ulong[] array13 = array;
ulong[] array14 = array2;
SecT571Field.MultiplyPrecomp(array9, precomp, array13);
SecT571Field.MultiplyPrecomp(array6, precomp, array14);
secT571FieldElement7 = new SecT571FieldElement(array);
SecT571Field.Multiply(array13, array14, secT571FieldElement7.x);
if (secT571FieldElement7.IsZero)
return new SecT571R1Point(curve, secT571FieldElement7, SecT571R1Curve.SecT571R1_B_SQRT);
secT571FieldElement9 = new SecT571FieldElement(array3);
SecT571Field.MultiplyPrecomp(array12, precomp, secT571FieldElement9.x);
if (array8 != null)
SecT571Field.MultiplyPrecomp(secT571FieldElement9.x, array8, secT571FieldElement9.x);
Span<ulong> span = new Span<ulong>(stackalloc byte[144], 18);
SecT571Field.Add(array14, array12, array4);
SecT571Field.SquareExt(array4, span);
SecT571Field.Add(secT571FieldElement3.x, secT571FieldElement4.x, array4);
SecT571Field.MultiplyAddToExt(array4, secT571FieldElement9.x, span);
secT571FieldElement8 = new SecT571FieldElement(array4);
SecT571Field.Reduce(span, secT571FieldElement8.x);
if (array5 != null)
SecT571Field.MultiplyPrecomp(secT571FieldElement9.x, array5, secT571FieldElement9.x);
}
return new SecT571R1Point(curve, secT571FieldElement7, secT571FieldElement8, new ECFieldElement[1] {
secT571FieldElement9
});
}
public unsafe override ECPoint Twice()
{
if (base.IsInfinity)
return this;
ECCurve curve = Curve;
SecT571FieldElement secT571FieldElement = (SecT571FieldElement)base.RawXCoord;
if (secT571FieldElement.IsZero)
return curve.Infinity;
SecT571FieldElement secT571FieldElement2 = (SecT571FieldElement)base.RawYCoord;
SecT571FieldElement secT571FieldElement3 = (SecT571FieldElement)base.RawZCoords[0];
ulong[] array = Nat576.Create64();
ulong[] array2 = Nat576.Create64();
ulong[] array3 = secT571FieldElement3.IsOne ? null : SecT571Field.PrecompMultiplicand(secT571FieldElement3.x);
ulong[] array4;
ulong[] array5;
if (array3 == null) {
array4 = secT571FieldElement2.x;
array5 = secT571FieldElement3.x;
} else {
SecT571Field.MultiplyPrecomp(secT571FieldElement2.x, array3, array4 = array);
SecT571Field.Square(secT571FieldElement3.x, array5 = array2);
}
ulong[] array6 = Nat576.Create64();
SecT571Field.Square(secT571FieldElement2.x, array6);
SecT571Field.AddBothTo(array4, array5, array6);
if (Nat576.IsZero64(array6))
return new SecT571R1Point(curve, new SecT571FieldElement(array6), SecT571R1Curve.SecT571R1_B_SQRT);
Span<ulong> span = new Span<ulong>(stackalloc byte[144], 18);
SecT571Field.MultiplyAddToExt(array6, array4, span);
SecT571FieldElement secT571FieldElement4 = new SecT571FieldElement(array);
SecT571Field.Square(array6, secT571FieldElement4.x);
SecT571FieldElement secT571FieldElement5 = new SecT571FieldElement(array6);
if (array3 != null)
SecT571Field.Multiply(secT571FieldElement5.x, array5, secT571FieldElement5.x);
ulong[] array7;
if (array3 == null)
array7 = secT571FieldElement.x;
else
SecT571Field.MultiplyPrecomp(secT571FieldElement.x, array3, array7 = array2);
SecT571Field.SquareAddToExt(array7, span);
SecT571Field.Reduce(span, array2);
SecT571Field.AddBothTo(secT571FieldElement4.x, secT571FieldElement5.x, array2);
SecT571FieldElement y = new SecT571FieldElement(array2);
return new SecT571R1Point(curve, secT571FieldElement4, y, new ECFieldElement[1] {
secT571FieldElement5
});
}
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;
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 = eCFieldElement3.Add(b2).Add(b3);
ECFieldElement eCFieldElement4 = rawYCoord2.Multiply(eCFieldElement3).Add(b2).MultiplyPlusProduct(b4, x, eCFieldElement3);
ECFieldElement eCFieldElement5 = rawXCoord2.Multiply(eCFieldElement3);
ECFieldElement eCFieldElement6 = eCFieldElement5.Add(b4).Square();
if (eCFieldElement6.IsZero) {
if (eCFieldElement4.IsZero)
return b.Twice();
return curve.Infinity;
}
if (eCFieldElement4.IsZero)
return new SecT571R1Point(curve, eCFieldElement4, SecT571R1Curve.SecT571R1_B_SQRT);
ECFieldElement x2 = eCFieldElement4.Square().Multiply(eCFieldElement5);
ECFieldElement eCFieldElement7 = eCFieldElement4.Multiply(eCFieldElement6).Multiply(eCFieldElement3);
ECFieldElement y = eCFieldElement4.Add(eCFieldElement6).Square().MultiplyPlusProduct(b4, rawYCoord2.AddOne(), eCFieldElement7);
return new SecT571R1Point(curve, x2, y, new ECFieldElement[1] {
eCFieldElement7
});
}
public override ECPoint Negate()
{
if (base.IsInfinity)
return this;
ECFieldElement rawXCoord = base.RawXCoord;
if (rawXCoord.IsZero)
return this;
ECFieldElement rawYCoord = base.RawYCoord;
ECFieldElement eCFieldElement = base.RawZCoords[0];
return new SecT571R1Point(Curve, rawXCoord, rawYCoord.Add(eCFieldElement), new ECFieldElement[1] {
eCFieldElement
});
}
}
}