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

SecT163K1Point

using Org.BouncyCastle.Math.Raw; namespace Org.BouncyCastle.Math.EC.Custom.Sec { internal class SecT163K1Point : 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 SecT163K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y) : base(curve, x, y) { } internal SecT163K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs) : base(curve, x, y, zs) { } protected override ECPoint Detach() { return new SecT163K1Point(null, AffineXCoord, AffineYCoord); } public override ECPoint Add(ECPoint b) { if (base.IsInfinity) return b; if (b.IsInfinity) return this; ECCurve curve = Curve; SecT163FieldElement secT163FieldElement = (SecT163FieldElement)base.RawXCoord; SecT163FieldElement secT163FieldElement2 = (SecT163FieldElement)b.RawXCoord; if (secT163FieldElement.IsZero) { if (secT163FieldElement2.IsZero) return curve.Infinity; return b.Add(this); } SecT163FieldElement secT163FieldElement3 = (SecT163FieldElement)base.RawYCoord; SecT163FieldElement secT163FieldElement4 = (SecT163FieldElement)base.RawZCoords[0]; SecT163FieldElement secT163FieldElement5 = (SecT163FieldElement)b.RawYCoord; SecT163FieldElement secT163FieldElement6 = (SecT163FieldElement)b.RawZCoords[0]; ulong[] array = Nat192.CreateExt64(); ulong[] array2 = Nat192.Create64(); ulong[] array3 = Nat192.Create64(); ulong[] array4 = Nat192.Create64(); bool isOne = secT163FieldElement4.IsOne; if (isOne) { Nat192.Copy64(secT163FieldElement2.x, array2); Nat192.Copy64(secT163FieldElement5.x, array3); } else { SecT163Field.Multiply(secT163FieldElement2.x, secT163FieldElement4.x, array2); SecT163Field.Multiply(secT163FieldElement5.x, secT163FieldElement4.x, array3); } bool isOne2 = secT163FieldElement6.IsOne; if (isOne2) { Nat192.Copy64(secT163FieldElement.x, array4); Nat192.Copy64(secT163FieldElement3.x, array); } else { SecT163Field.Multiply(secT163FieldElement.x, secT163FieldElement6.x, array4); SecT163Field.Multiply(secT163FieldElement3.x, secT163FieldElement6.x, array); } SecT163Field.AddTo(array, array3); SecT163Field.Add(array4, array2, array); if (Nat192.IsZero64(array)) { if (Nat192.IsZero64(array3)) return Twice(); return curve.Infinity; } if (secT163FieldElement2.IsZero) { ECPoint eCPoint = Normalize(); secT163FieldElement = (SecT163FieldElement)eCPoint.XCoord; ECFieldElement yCoord = eCPoint.YCoord; ECFieldElement b2 = secT163FieldElement5; ECFieldElement eCFieldElement = yCoord.Add(b2).Divide(secT163FieldElement); ECFieldElement eCFieldElement2 = eCFieldElement.Square().Add(eCFieldElement).Add(secT163FieldElement); if (eCFieldElement2.IsZero) return new SecT163K1Point(curve, eCFieldElement2, curve.B); ECFieldElement y = eCFieldElement.Multiply(secT163FieldElement.Add(eCFieldElement2)).Add(eCFieldElement2).Add(yCoord) .Divide(eCFieldElement2) .Add(eCFieldElement2); ECFieldElement eCFieldElement3 = curve.FromBigInteger(BigInteger.One); return new SecT163K1Point(curve, eCFieldElement2, y, new ECFieldElement[1] { eCFieldElement3 }); } SecT163Field.Square(array, array); SecT163Field.Multiply(array4, array3, array4); SecT163Field.Multiply(array2, array3, array2); ulong[] array5 = array4; SecT163Field.Multiply(array5, array2, array5); if (Nat192.IsZero64(array5)) return new SecT163K1Point(curve, new SecT163FieldElement(array5), curve.B); ulong[] array6 = array3; SecT163Field.Multiply(array6, array, array6); if (!isOne2) SecT163Field.Multiply(array6, secT163FieldElement6.x, array6); ulong[] array7 = array2; SecT163Field.AddTo(array, array7); SecT163Field.SquareExt(array7, array); SecT163Field.Add(secT163FieldElement3.x, secT163FieldElement4.x, array7); SecT163Field.MultiplyAddToExt(array6, array7, array); SecT163Field.Reduce(array, array7); if (!isOne) SecT163Field.Multiply(array6, secT163FieldElement4.x, array6); return new SecT163K1Point(curve, new SecT163FieldElement(array5), new SecT163FieldElement(array7), new ECFieldElement[1] { new SecT163FieldElement(array6) }); } public override ECPoint Twice() { if (base.IsInfinity) return this; ECCurve curve = Curve; ECFieldElement rawXCoord = base.RawXCoord; if (rawXCoord.IsZero) return curve.Infinity; ECFieldElement rawYCoord = base.RawYCoord; ECFieldElement eCFieldElement = base.RawZCoords[0]; bool isOne = eCFieldElement.IsOne; ECFieldElement b = isOne ? rawYCoord : rawYCoord.Multiply(eCFieldElement); ECFieldElement b2 = isOne ? eCFieldElement : eCFieldElement.Square(); ECFieldElement eCFieldElement2 = rawYCoord.Square().Add(b).Add(b2); if (eCFieldElement2.IsZero) return new SecT163K1Point(curve, eCFieldElement2, curve.B); ECFieldElement eCFieldElement3 = eCFieldElement2.Square(); ECFieldElement eCFieldElement4 = isOne ? eCFieldElement2 : eCFieldElement2.Multiply(b2); ECFieldElement eCFieldElement5 = rawYCoord.Add(rawXCoord).Square(); ECFieldElement y = eCFieldElement5.Add(eCFieldElement2).Add(b2).Multiply(eCFieldElement5) .Add(eCFieldElement3); return new SecT163K1Point(curve, eCFieldElement3, y, new ECFieldElement[1] { eCFieldElement4 }); } 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 SecT163K1Point(curve, eCFieldElement4, curve.B); 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 SecT163K1Point(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 SecT163K1Point(Curve, rawXCoord, rawYCoord.Add(eCFieldElement), new ECFieldElement[1] { eCFieldElement }); } } }