<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

SecT233R1Point

using Org.BouncyCastle.Math.Raw; namespace Org.BouncyCastle.Math.EC.Custom.Sec { internal class SecT233R1Point : 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 SecT233R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y) : base(curve, x, y) { } internal SecT233R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs) : base(curve, x, y, zs) { } protected override ECPoint Detach() { return new SecT233R1Point(null, AffineXCoord, AffineYCoord); } public override ECPoint Add(ECPoint b) { if (base.IsInfinity) return b; if (b.IsInfinity) return this; ECCurve curve = Curve; ECFieldElement rawXCoord = base.RawXCoord; ECFieldElement rawXCoord2 = b.RawXCoord; 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.XCoord; ECFieldElement yCoord = eCPoint.YCoord; ECFieldElement b2 = rawYCoord2; ECFieldElement eCFieldElement9 = yCoord.Add(b2).Divide(rawXCoord); eCFieldElement10 = eCFieldElement9.Square().Add(eCFieldElement9).Add(rawXCoord) .AddOne(); if (eCFieldElement10.IsZero) return new SecT233R1Point(curve, eCFieldElement10, curve.B.Sqrt()); 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 SecT233R1Point(curve, eCFieldElement10, curve.B.Sqrt()); 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 SecT233R1Point(curve, eCFieldElement10, y, new ECFieldElement[1] { eCFieldElement11 }); } public override ECPoint Twice() { if (base.IsInfinity) return this; ECCurve curve = Curve; SecT233FieldElement secT233FieldElement = (SecT233FieldElement)base.RawXCoord; if (secT233FieldElement.IsZero) return curve.Infinity; SecT233FieldElement secT233FieldElement2 = (SecT233FieldElement)base.RawYCoord; SecT233FieldElement secT233FieldElement3 = (SecT233FieldElement)base.RawZCoords[0]; ulong[] array = Nat256.CreateExt64(); ulong[] array2 = Nat256.Create64(); ulong[] array3 = Nat256.Create64(); ulong[] array4 = Nat256.Create64(); if (secT233FieldElement3.IsOne) { SecT233Field.Square(secT233FieldElement2.x, array4); SecT233Field.AddBothTo(secT233FieldElement2.x, secT233FieldElement3.x, array4); if (Nat256.IsZero64(array4)) return new SecT233R1Point(curve, new SecT233FieldElement(array4), curve.B.Sqrt()); SecT233Field.Square(array4, array2); SecT233Field.SquareExt(secT233FieldElement.x, array); SecT233Field.MultiplyAddToExt(array4, secT233FieldElement2.x, array); } else { ulong[] array5 = Nat256.Create64(); SecT233Field.Multiply(secT233FieldElement2.x, secT233FieldElement3.x, array5); SecT233Field.Square(secT233FieldElement3.x, array); SecT233Field.Square(secT233FieldElement2.x, array2); SecT233Field.AddBothTo(array5, array, array2); if (Nat256.IsZero64(array2)) return new SecT233R1Point(curve, new SecT233FieldElement(array2), curve.B.Sqrt()); SecT233Field.Multiply(array2, array, array4); SecT233Field.Multiply(secT233FieldElement.x, secT233FieldElement3.x, array); SecT233Field.SquareExt(array, array); SecT233Field.MultiplyAddToExt(array2, array5, array); SecT233Field.Square(array2, array2); } SecT233Field.Reduce(array, array3); SecT233Field.AddBothTo(array2, array4, array3); return new SecT233R1Point(curve, new SecT233FieldElement(array2), new SecT233FieldElement(array3), new ECFieldElement[1] { new SecT233FieldElement(array4) }); } public override ECPoint TwicePlus(ECPoint b) { if (base.IsInfinity) return b; if (b.IsInfinity) return Twice(); ECCurve curve = Curve; SecT233FieldElement secT233FieldElement = (SecT233FieldElement)base.RawXCoord; if (secT233FieldElement.IsZero) return b; SecT233FieldElement secT233FieldElement2 = (SecT233FieldElement)b.RawXCoord; SecT233FieldElement secT233FieldElement3 = (SecT233FieldElement)b.RawZCoords[0]; if (secT233FieldElement2.IsZero || !secT233FieldElement3.IsOne) return Twice().Add(b); SecT233FieldElement obj = (SecT233FieldElement)base.RawYCoord; SecT233FieldElement secT233FieldElement4 = (SecT233FieldElement)base.RawZCoords[0]; SecT233FieldElement secT233FieldElement5 = (SecT233FieldElement)b.RawYCoord; ulong[] array = Nat256.CreateExt64(); ulong[] array2 = Nat256.Create64(); ulong[] array3 = Nat256.Create64(); ulong[] array4 = Nat256.Create64(); ulong[] array5 = Nat256.Create64(); ulong[] array6 = Nat256.Create64(); SecT233Field.Square(secT233FieldElement.x, array2); SecT233Field.Square(obj.x, array3); SecT233Field.Square(secT233FieldElement4.x, array4); SecT233Field.Multiply(obj.x, secT233FieldElement4.x, array5); SecT233Field.AddBothTo(array3, array4, array5); SecT233Field.MultiplyExt(array2, array4, array); SecT233Field.Multiply(secT233FieldElement5.x, array4, array2); SecT233Field.AddTo(array3, array2); SecT233Field.MultiplyAddToExt(array5, array2, array); SecT233Field.Reduce(array, array2); SecT233Field.Multiply(secT233FieldElement2.x, array4, array3); SecT233Field.Add(array5, array3, array6); SecT233Field.Square(array6, array6); if (Nat256.IsZero64(array6)) { if (Nat256.IsZero64(array2)) return b.Twice(); return curve.Infinity; } if (Nat256.IsZero64(array2)) return new SecT233R1Point(curve, new SecT233FieldElement(array2), curve.B.Sqrt()); ulong[] array7 = array3; SecT233Field.Square(array2, array); SecT233Field.Multiply(array7, array, array7); ulong[] array8 = array4; SecT233Field.Multiply(array8, array2, array8); SecT233Field.Multiply(array8, array6, array8); ulong[] array9 = array2; SecT233Field.AddTo(array6, array9); SecT233Field.Square(array9, array9); SecT233Field.MultiplyExt(array9, array5, array); SecT233Field.MultiplyAddToExt(secT233FieldElement5.x, array8, array); SecT233Field.Reduce(array, array9); SecT233Field.AddTo(array8, array9); return new SecT233R1Point(curve, new SecT233FieldElement(array7), new SecT233FieldElement(array9), new ECFieldElement[1] { new SecT233FieldElement(array8) }); } 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 SecT233R1Point(Curve, rawXCoord, rawYCoord.Add(eCFieldElement), new ECFieldElement[1] { eCFieldElement }); } } }