public override ECPoint Twice() { if (base.IsInfinity) { return(this); } ECCurve curve = this.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 eCFieldElement2 = isOne ? rawYCoord : rawYCoord.Multiply(eCFieldElement); ECFieldElement b = isOne ? eCFieldElement : eCFieldElement.Square(); ECFieldElement eCFieldElement3 = rawYCoord.Square().Add(eCFieldElement2).Add(b); if (eCFieldElement3.IsZero) { return(new SecT409R1Point(curve, eCFieldElement3, curve.B.Sqrt(), base.IsCompressed)); } ECFieldElement eCFieldElement4 = eCFieldElement3.Square(); ECFieldElement eCFieldElement5 = isOne ? eCFieldElement3 : eCFieldElement3.Multiply(b); ECFieldElement eCFieldElement6 = isOne ? rawXCoord : rawXCoord.Multiply(eCFieldElement); ECFieldElement y = eCFieldElement6.SquarePlusProduct(eCFieldElement3, eCFieldElement2).Add(eCFieldElement4).Add(eCFieldElement5); return(new SecT409R1Point(curve, eCFieldElement4, y, new ECFieldElement[] { eCFieldElement5 }, base.IsCompressed)); }
public override ECPoint Twice() { if (base.IsInfinity) { return(this); } ECCurve curve = this.Curve; ECFieldElement rawXCoord = base.RawXCoord; if (rawXCoord.IsZero) { return(curve.Infinity); } ECFieldElement rawYCoord = base.RawYCoord; ECFieldElement b = base.RawZCoords[0]; bool isOne = b.IsOne; ECFieldElement element4 = !isOne?rawYCoord.Multiply(b) : rawYCoord; ECFieldElement element5 = !isOne?b.Square() : b; ECFieldElement x = rawYCoord.Square().Add(element4).Add(element5); if (x.IsZero) { return(new SecT409R1Point(curve, x, curve.B.Sqrt(), base.IsCompressed)); } ECFieldElement element7 = x.Square(); ECFieldElement element8 = !isOne?x.Multiply(element5) : x; ECFieldElement element9 = !isOne?rawXCoord.Multiply(b) : rawXCoord; ECFieldElement y = element9.SquarePlusProduct(x, element4).Add(element7).Add(element8); return(new SecT409R1Point(curve, element7, y, new ECFieldElement[] { element8 }, base.IsCompressed)); }
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 eCFieldElement2 = (!isOne) ? rawYCoord.Multiply(eCFieldElement) : rawYCoord; ECFieldElement b = (!isOne) ? eCFieldElement.Square() : eCFieldElement; ECFieldElement eCFieldElement3 = rawYCoord.Square().Add(eCFieldElement2).Add(b); if (eCFieldElement3.IsZero) { return(new SecT571R1Point(curve, eCFieldElement3, SecT571R1Curve.SecT571R1_B_SQRT, base.IsCompressed)); } ECFieldElement eCFieldElement4 = eCFieldElement3.Square(); ECFieldElement eCFieldElement5 = (!isOne) ? eCFieldElement3.Multiply(b) : eCFieldElement3; ECFieldElement eCFieldElement6 = (!isOne) ? rawXCoord.Multiply(eCFieldElement) : rawXCoord; ECFieldElement y = eCFieldElement6.SquarePlusProduct(eCFieldElement3, eCFieldElement2).Add(eCFieldElement4).Add(eCFieldElement5); return(new SecT571R1Point(curve, eCFieldElement4, y, new ECFieldElement[1] { eCFieldElement5 }, base.IsCompressed)); }
public override ECPoint Twice() { if (this.IsInfinity) { return this; } ECCurve curve = this.Curve; ECFieldElement X1 = this.RawXCoord; if (X1.IsZero) { // A point with X == 0 is it's own Additive inverse return curve.Infinity; } ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0]; bool Z1IsOne = Z1.IsOne; ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1); ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square(); ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq); if (T.IsZero) { return new SecT163R2Point(curve, T, curve.B.Sqrt(), IsCompressed); } ECFieldElement X3 = T.Square(); ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq); ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1); ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3); return new SecT163R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed); }
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)); }